On Wed, Apr 24, 2013 at 08:36:50AM +0200, Mathias Fröhlich wrote: > > Hi all, > > On Monday, April 22, 2013 09:39:02 Eric Anholt wrote: > > We format our comments as: > > > > + /* Ok, not nice but should be safe due to all threads working > > + * on the same type of context. > > + */ > > Now v4 is attached with the changed comment. > Could somebody apply and push this test please? > > greetings and thanks >
Pushed. Thanks for the patch! -Tom > > -- > Mathias Fröhlich > From 5af2967b3f19e27755ffc5d6cb8408ceab959e11 Mon Sep 17 00:00:00 2001 > Message-Id: > <5af2967b3f19e27755ffc5d6cb8408ceab959e11.1366782138.git.mathias.froehl...@gmx.net> > From: Mathias Froehlich <[email protected]> > Date: Wed, 24 Apr 2013 07:37:09 +0200 > Subject: [PATCH] Add test for concurrent shader compiler use. > > Add a test that creates two contexts and concurrently > compiles shader programs to test race conditions of > the shader compiler. > > v3: (Tom Stellard) > - Report pass at the end of the tests > - Add as a concurrent test > > v4: (Mathias Froehlich) > - Fix comment style > > Signed-off-by: Mathias Froehlich <[email protected]> > Reviewed-by: Tom Stellard <[email protected]> > Reviewed-by: Eric Anholt <[email protected]> > --- > tests/all.tests | 1 + > tests/glx/CMakeLists.gl.txt | 2 + > tests/glx/glx-multithread-shader-compile.c | 118 > +++++++++++++++++++++++++++++ > 3 files changed, 121 insertions(+) > create mode 100644 tests/glx/glx-multithread-shader-compile.c > > diff --git a/tests/all.tests b/tests/all.tests > index b827e12..d6c8f45 100644 > --- a/tests/all.tests > +++ b/tests/all.tests > @@ -352,6 +352,7 @@ add_plain_test(glx, 'glx-multithread-makecurrent-1') > add_plain_test(glx, 'glx-multithread-makecurrent-2') > add_plain_test(glx, 'glx-multithread-makecurrent-3') > add_plain_test(glx, 'glx-multithread-makecurrent-4') > +add_concurrent_test(glx, 'glx-multithread-shader-compile') > add_plain_test(glx, 'glx-shader-sharing') > add_plain_test(glx, 'glx-swap-exchange') > glx['glx-swap-event_event'] = PlainExecTest(['glx-swap-event', '-auto', > '--event']) > diff --git a/tests/glx/CMakeLists.gl.txt b/tests/glx/CMakeLists.gl.txt > index e75e492..ca85317 100644 > --- a/tests/glx/CMakeLists.gl.txt > +++ b/tests/glx/CMakeLists.gl.txt > @@ -41,6 +41,8 @@ IF(PIGLIT_BUILD_GLX_TESTS) > target_link_libraries(glx-multithread-makecurrent-3 pthread) > piglit_add_executable (glx-multithread-makecurrent-4 > glx-multithread-makecurrent-4.c) > target_link_libraries(glx-multithread-makecurrent-4 pthread) > + piglit_add_executable (glx-multithread-shader-compile > glx-multithread-shader-compile.c) > + target_link_libraries(glx-multithread-shader-compile pthread) > piglit_add_executable (glx-make-current glx-make-current.c) > piglit_add_executable (glx-swap-event glx-swap-event.c) > piglit_add_executable (glx-make-glxdrawable-current > glx-make-glxdrawable-current.c) > diff --git a/tests/glx/glx-multithread-shader-compile.c > b/tests/glx/glx-multithread-shader-compile.c > new file mode 100644 > index 0000000..b04c1b2 > --- /dev/null > +++ b/tests/glx/glx-multithread-shader-compile.c > @@ -0,0 +1,118 @@ > +/* > + * Copyright (c) 2012 Mathias Fröhlich > + * > + * 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. > + */ > + > +/** > + * @file glx-multithread-shader-compile.c > + * @author Mathias Fröhlich > + * > + * Create two GLX contexts and concurrently compile shaders. > + * Exercises a race conditon with the r600 llvm compiler. > + */ > + > +#include "piglit-util-gl-common.h" > +#include "piglit-glx-util.h" > +#include "pthread.h" > + > +static const char *vert_shader_text = > + "void main() \n" > + "{ \n" > + " gl_Position = ftransform(); \n" > + " gl_FrontColor = gl_Color; \n" > + "} \n"; > + > +static const char *frag_shader_text = > + "void main() \n" > + "{ \n" > + " gl_FragColor = vec4(1.0) - gl_Color; \n" > + "} \n"; > + > +static pthread_mutex_t mutex; > + > +static void * > +thread_func(void *arg) > +{ > + Display *dpy; > + XVisualInfo *visinfo; > + Window win; > + unsigned i; > + > + dpy = piglit_get_glx_display(); > + visinfo = piglit_get_glx_visual(dpy); > + win = piglit_get_glx_window(dpy, visinfo); > + > + for (i = 0; i < 100; ++i) { > + GLXContext ctx; > + GLuint vert_shader, frag_shader; > + GLuint program; > + > + ctx = piglit_get_glx_context(dpy, visinfo); > + glXMakeCurrent(dpy, win, ctx); > + > + /* Ok, not nice but should be safe due to all threads working > + * on the same type of context. > + */ > + pthread_mutex_lock(&mutex); > + piglit_dispatch_default_init(); > + pthread_mutex_unlock(&mutex); > + > + vert_shader = piglit_compile_shader_text(GL_VERTEX_SHADER, > vert_shader_text); > + piglit_check_gl_error(GL_NO_ERROR); > + > + frag_shader = piglit_compile_shader_text(GL_FRAGMENT_SHADER, > frag_shader_text); > + piglit_check_gl_error(GL_NO_ERROR); > + > + program = piglit_link_simple_program(vert_shader, frag_shader); > + piglit_check_gl_error(GL_NO_ERROR); > + > + glUseProgram(program); > + piglit_check_gl_error(GL_NO_ERROR); > + > + glXDestroyContext(dpy, ctx); > + } > + > + return NULL; > +} > + > +int > +main(int argc, char **argv) > +{ > + int ret; > + pthread_t thread1, thread2; > + > + pthread_mutex_init(&mutex, NULL); > + > + /* Now, spawn some threads that compile simple shaders. > + */ > + pthread_create(&thread1, NULL, thread_func, NULL); > + pthread_create(&thread2, NULL, thread_func, NULL); > + > + ret = pthread_join(thread1, NULL); > + assert(ret == 0); > + ret = pthread_join(thread2, NULL); > + assert(ret == 0); > + > + pthread_mutex_destroy(&mutex); > + > + piglit_report_result(PIGLIT_PASS); > + return 0; > +} > -- > 1.8.1.4 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
