[Piglit] [PATCH] Add test for concurrent shader compiler use. v3

Tom Stellard tom at stellard.net
Wed Apr 24 07:19:42 PDT 2013


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.Froehlich at gmx.net>
> From: Mathias Froehlich <Mathias.Froehlich at web.de>
> 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 <Mathias.Froehlich at web.de>
> Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> Reviewed-by: Eric Anholt <eric at anholt.net>
> ---
>  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



More information about the Piglit mailing list