Commit 13196c50 authored by Eric Anholt's avatar Eric Anholt

glx-multithread: New test for GLX multithreaded rendering.

parent 7012e2a1
......@@ -4,6 +4,7 @@ add_subdirectory (bugs)
add_subdirectory (fbo)
add_subdirectory (general)
add_subdirectory (glean)
add_subdirectory (glx)
add_subdirectory (glslparsertest)
add_subdirectory (asmparsertest)
add_subdirectory (shaders)
......
......@@ -224,6 +224,9 @@ add_plain_test(bugs, 'fdo23670-drawpix_stencil')
add_plain_test(bugs, 'fdo24066')
add_plain_test(bugs, 'fdo25614-genmipmap')
glx = Group()
add_plain_test(glx, 'glx-multithread')
texturing = Group()
add_plain_test(texturing, 'copytexsubimage')
add_plain_test(texturing, 'cubemap')
......
include_directories(
${OPENGL_INCLUDE_PATH}
${GLUT_INCLUDE_DIR}
${piglit_SOURCE_DIR}/tests/util
${GLEW_INCLUDE_DIR}
)
link_directories (
${piglit_SOURCE_DIR}/tests/util
)
link_libraries (
piglitglxutil
${OPENGL_gl_LIBRARY}
${OPENGL_glu_LIBRARY}
${GLUT_glut_LIBRARY}
${TIFF_LIBRARY}
${GLEW_glew_LIBRARY}
)
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_executable (glx-multithread glx-multithread.c)
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
/*
* 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.c
*
* Test that rendering two plain colored rectangles in two different threads
* to the same GLX window 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 pthread_mutex_t mutex;
static XVisualInfo *visinfo;
static void *
thread_func(void *arg)
{
GLXContext ctx;
int *x = arg;
Bool ret;
pthread_mutex_lock(&mutex);
ctx = piglit_get_glx_context(dpy, visinfo);
ret = glXMakeCurrent(dpy, win, ctx);
assert(ret);
piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
glColor4f(0.0, 1.0, 0.0, 0.0);
piglit_draw_rect(*x, 10, 10, 10);
glFlush();
glXDestroyContext(dpy, ctx);
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;
GLXContext ctx;
ctx = piglit_get_glx_context(dpy, visinfo);
glXMakeCurrent(dpy, win, ctx);
/* Clear background to gray */
glClearColor(0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
pthread_mutex_init(&mutex, NULL);
/* 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);
pass &= piglit_probe_pixel_rgb(15, 15, green);
pass &= piglit_probe_pixel_rgb(35, 15, green);
glXSwapBuffers(dpy, win);
return pass ? PIGLIT_SUCCESS : PIGLIT_FAILURE;
}
int
main(int argc, char **argv)
{
int i;
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);
XMapWindow(dpy, win);
piglit_glx_event_loop(dpy, draw);
return 0;
}
......@@ -12,3 +12,10 @@ add_library (piglitutil
shader-load.c
piglit-framework.c
)
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_library (piglitglxutil
piglit-util.c
piglit-glx-util.c
)
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
/*
* 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>
*
*/
#include "piglit-util.h"
#include "piglit-glx-util.h"
Bool piglit_automatic = GL_FALSE;
XVisualInfo *
piglit_get_glx_visual(Display *dpy)
{
XVisualInfo *visinfo;
int attrib[] = {
GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
GLX_DOUBLEBUFFER,
None
};
int screen = DefaultScreen(dpy);
visinfo = glXChooseVisual(dpy, screen, attrib);
if (visinfo == NULL) {
fprintf(stderr,
"Couldn't get an RGBA, double-buffered visual\n");
piglit_report_result(PIGLIT_FAILURE);
exit(1);
}
return visinfo;
}
GLXContext
piglit_get_glx_context(Display *dpy, XVisualInfo *visinfo)
{
GLXContext ctx;
ctx = glXCreateContext(dpy, visinfo, NULL, True);
if (ctx == None) {
fprintf(stderr, "glXCreateContext failed\n");
piglit_report_result(PIGLIT_FAILURE);
}
return ctx;
}
Window
piglit_get_glx_window(Display *dpy, XVisualInfo *visinfo)
{
XSetWindowAttributes window_attr;
unsigned long mask;
int screen = DefaultScreen(dpy);
Window root_win = RootWindow(dpy, screen);
Window win;
window_attr.background_pixel = 0;
window_attr.border_pixel = 0;
window_attr.colormap = XCreateColormap(dpy, root_win,
visinfo->visual, AllocNone);
window_attr.event_mask = StructureNotifyMask | ExposureMask |
KeyPressMask;
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
win = XCreateWindow(dpy, root_win, 0, 0,
piglit_width, piglit_height,
0, visinfo->depth, InputOutput,
visinfo->visual, mask, &window_attr);
XMapWindow(dpy, win);
return win;
}
void
piglit_require_glx_extension(Display *dpy, const char *name)
{
const char *glx_extension_list;
int screen = DefaultScreen(dpy);
/* This is a bogus way of checking for the extension.
* Needs more GLEW.
*/
glx_extension_list = glXQueryExtensionsString(dpy, screen);
if (strstr(glx_extension_list, name) == NULL) {
fprintf(stderr, "Test requires %s\n", name);
piglit_report_result(PIGLIT_SKIP);
}
}
void
piglit_glx_event_loop(Display *dpy, enum piglit_result (*draw)(Display *dpy))
{
for (;;) {
XEvent event;
XNextEvent (dpy, &event);
if (event.type == KeyPress) {
KeySym sym = XKeycodeToKeysym (dpy,
event.xkey.keycode, 0);
if (sym == XK_Escape || sym == XK_q || sym == XK_Q)
break;
else
draw(dpy);
} else if (event.type == Expose) {
enum piglit_result result = draw(dpy);
if (piglit_automatic)
piglit_report_result(result);
}
}
}
/*
* 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>
*
*/
#include "GL/glx.h"
XVisualInfo * piglit_get_glx_visual(Display *dpy);
GLXContext piglit_get_glx_context(Display *dpy, XVisualInfo *visinfo);
Window piglit_get_glx_window(Display *dpy, XVisualInfo *visinfo);
void piglit_require_glx_extension(Display *dpy, const char *name);
void piglit_glx_event_loop(Display *dpy,
enum piglit_result (*draw)(Display *dpy));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment