enum piglit_result draw(Display *dpy) { pthread_t draw_thread, load_thread; void *draw_ret, *load_ret; int ret, i; GLXContext my_ctx; my_ctx = piglit_get_glx_context_share(dpy, visinfo, NULL); draw_ctx = piglit_get_glx_context_share(dpy, visinfo, my_ctx); load_ctx = piglit_get_glx_context_share(dpy, visinfo, my_ctx); ret = glXMakeCurrent(dpy, draw_win, my_ctx); assert(ret); piglit_dispatch_default_init(PIGLIT_DISPATCH_GL); glEnable(GL_TEXTURE_2D); for (i = 0; i < ARRAY_SIZE(texture); ++i) { glGenTextures(1, &texture[i].id); texture[i].color = -1; texture[i].user = NONE; glBindTexture(GL_TEXTURE_2D, texture[i].id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } texture[0].user = DRAW; texture[1].user = LOAD; pthread_mutex_init(&mutex, NULL); pthread_create(&draw_thread, NULL, draw_func, NULL); pthread_create(&load_thread, NULL, load_func, NULL); ret = pthread_join(draw_thread, &draw_ret); assert(ret == 0); ret = pthread_join(load_thread, &load_ret); assert(ret == 0); pthread_mutex_destroy(&mutex); glXDestroyContext(dpy, load_ctx); glXDestroyContext(dpy, draw_ctx); glXDestroyContext(dpy, my_ctx); return draw_ret && load_ret ? PIGLIT_PASS : PIGLIT_FAIL; }
GLXContext piglit_get_glx_context(Display *dpy, XVisualInfo *visinfo) { return piglit_get_glx_context_share(dpy, visinfo, NULL); }