diff options
author | Eric Anholt <eric@anholt.net> | 2009-11-25 09:15:40 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-11-25 09:15:40 -0800 |
commit | d693c38968b490566d2b7aafe905e439fd56c826 (patch) | |
tree | 3607bc3cf5411a1425ebdcf2c9ef6e0ff127fec6 | |
parent | fef57bd81113e3d0666756e48629c39b14ccc7a9 (diff) |
glx-multithread-makecurrent: New test for MESA_multithread_makecurrentmesa-multithread-makecurrent
-rw-r--r-- | tests/all.tests | 1 | ||||
-rw-r--r-- | tests/glx/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/glx/glx-multithread-makecurrent.c | 137 |
3 files changed, 139 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests index 695bbb5ff..1d7ec39c7 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -204,6 +204,7 @@ add_plain_test(bugs, 'fdo24066') glx = Group() add_plain_test(glx, 'glx-multithread') +add_plain_test(glx, 'glx-multithread-makecurrent') texturing = Group() add_plain_test(texturing, 'copytexsubimage') diff --git a/tests/glx/CMakeLists.txt b/tests/glx/CMakeLists.txt index 10d8c7ee9..0a5cbfe3c 100644 --- a/tests/glx/CMakeLists.txt +++ b/tests/glx/CMakeLists.txt @@ -20,3 +20,4 @@ link_libraries ( ) add_executable (glx-multithread glx-multithread.c) +add_executable (glx-multithread-makecurrent glx-multithread-makecurrent.c) diff --git a/tests/glx/glx-multithread-makecurrent.c b/tests/glx/glx-multithread-makecurrent.c new file mode 100644 index 000000000..77e35d448 --- /dev/null +++ b/tests/glx/glx-multithread-makecurrent.c @@ -0,0 +1,137 @@ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt <eric@anholt.net> + * + */ + +/** @file glx-multithread-makecurrent.c + * + * First test of GLX_MESA_multithread_makecurrent: Bind one context into + * multiple threads and make sure that synchronized rendering from both + * threads works correctly. + */ + +#include "piglit-util.h" +#include "piglit-glx-util.h" +#include "pthread.h" + +int piglit_width = 50, piglit_height = 50; +static Display *dpy; +static Window win; +static GLXContext ctx; +static pthread_mutex_t mutex; + +static void * +thread_func(void *arg) +{ + int *x = arg; + + pthread_mutex_lock(&mutex); + glXMakeCurrent(dpy, win, ctx); + + glColor4f(0.0, 1.0, 0.0, 0.0); + piglit_draw_rect(*x, 10, 10, 10); + glFlush(); + pthread_mutex_unlock(&mutex); + + return NULL; +} + +enum piglit_result +draw(Display *dpy) +{ + GLboolean pass = GL_TRUE; + float green[] = {0.0, 1.0, 0.0, 0.0}; + pthread_t thread1, thread2; + void *retval; + int ret; + int x1 = 10, x2 = 30; + + piglit_require_glx_extension(dpy, "MESA_multithread_makecurrent"); + + glXMakeCurrent(dpy, win, ctx); + + /* Clear background to gray */ + glClearColor(0.5, 0.5, 0.5, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); + + pthread_mutex_init(&mutex, NULL); + glFlush(); + /* Now, spawn some threads that do some drawing, both with this + * context + */ + pthread_create(&thread1, NULL, thread_func, &x1); + pthread_create(&thread2, NULL, thread_func, &x2); + + ret = pthread_join(thread1, &retval); + assert(ret == 0); + ret = pthread_join(thread2, &retval); + assert(ret == 0); + + pthread_mutex_destroy(&mutex); + glFlush(); + + glColor4f(0.0, 1.0, 0.0, 0.0); + piglit_draw_rect(40, 10, 10, 10); + + pass &= piglit_probe_pixel_rgb(15, 15, green); + pass &= piglit_probe_pixel_rgb(35, 15, green); + glFlush(); + glXSwapBuffers(dpy, win); + + return pass ? PIGLIT_SUCCESS : PIGLIT_FAILURE; +} + +int +main(int argc, char **argv) +{ + int i; + XVisualInfo *visinfo; + + for(i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-auto")) + piglit_automatic = 1; + else + fprintf(stderr, "Unknown option: %s\n", argv[i]); + } + + dpy = XOpenDisplay(NULL); + if (dpy == NULL) { + fprintf(stderr, "couldn't open display\n"); + piglit_report_result(PIGLIT_FAILURE); + } + visinfo = piglit_get_glx_visual(dpy); + win = piglit_get_glx_window(dpy, visinfo); + ctx = piglit_get_glx_context(dpy, visinfo); + + XFree(visinfo); + + XMapWindow(dpy, win); + + piglit_glx_event_loop(dpy, draw); + + return 0; +} |