diff --git a/tests/Makefile.am b/tests/Makefile.am index bd985f4..8dcf6b8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -57,18 +57,23 @@ AM_CFLAGS = \ TESTS += testgldispatch_static.sh +TESTS += testgldispatch_static_thr.sh TESTS += testgldispatch_generated.sh +TESTS += testgldispatch_generated_thr.sh TESTS += testgldispatch_patched.sh +TESTS += testgldispatch_patched_thr.sh check_PROGRAMS += testgldispatch testgldispatch_SOURCES = \ testgldispatch.c testgldispatch_CFLAGS = \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/GLdispatch + -I$(top_srcdir)/src/GLdispatch \ + $(PTHREAD_CFLAGS) testgldispatch_LDADD = $(top_builddir)/src/GLdispatch/libGLdispatch.la testgldispatch_LDADD += $(top_builddir)/src/OpenGL/libOpenGL.la testgldispatch_LDADD += dummy/libpatchentrypoints.la testgldispatch_LDADD += $(top_builddir)/src/util/libutils_misc.la +testgldispatch_LDADD += $(PTHREAD_LIBS) # Start of GLX-specific tests. # Notes that the TESTS_GLX variable must be defined outside the conditional, so diff --git a/tests/testgldispatch.c b/tests/testgldispatch.c index 21042a8..4aedcfe 100644 --- a/tests/testgldispatch.c +++ b/tests/testgldispatch.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,8 @@ typedef struct DummyVendorLibRec { static void InitDummyVendors(void); static void CleanupDummyVendors(void); +static void *ForceMultiThreadedProc(void *param); + static GLboolean TestDispatch(int vendorIndex, GLboolean testStatic, GLboolean testGenerated); @@ -103,13 +106,14 @@ static pfn_glVertex3fv ptr_glDummyTestProc; static GLboolean enableStaticTest = GL_FALSE; static GLboolean enableGeneratedTest = GL_FALSE; static GLboolean enablePatching = GL_FALSE; +static GLboolean forceMultiThreaded = GL_FALSE; int main(int argc, char **argv) { int i; while (1) { - int opt = getopt(argc, argv, "sgp"); + int opt = getopt(argc, argv, "sgpt"); if (opt == -1) { break; } @@ -123,6 +127,9 @@ int main(int argc, char **argv) case 'p': enablePatching = GL_TRUE; break; + case 't': + forceMultiThreaded = GL_TRUE; + break; default: return 1; } @@ -131,6 +138,15 @@ int main(int argc, char **argv) __glDispatchInit(); InitDummyVendors(); + if (forceMultiThreaded) { + pthread_t thr; + + printf("Forcing libGLdispatch into multi-threaded mode.\n"); + __glDispatchCheckMultithreaded(); + pthread_create(&thr, NULL, ForceMultiThreadedProc, NULL); + pthread_join(thr, NULL); + } + ptr_glVertex3fv = (pfn_glVertex3fv) __glDispatchGetProcAddress("glVertex3fv"); if (ptr_glVertex3fv == NULL) { printf("Can't find dispatch function for glVertex3fv\n"); @@ -154,6 +170,12 @@ int main(int argc, char **argv) return 0; } +static void *ForceMultiThreadedProc(void *param) +{ + __glDispatchCheckMultithreaded(); + return NULL; +} + static void InitDummyVendors(void) { int i; diff --git a/tests/testgldispatch_generated_thr.sh b/tests/testgldispatch_generated_thr.sh new file mode 100755 index 0000000..bf74be8 --- /dev/null +++ b/tests/testgldispatch_generated_thr.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./testgldispatch -g -t + diff --git a/tests/testgldispatch_patched_thr.sh b/tests/testgldispatch_patched_thr.sh new file mode 100755 index 0000000..78e4288 --- /dev/null +++ b/tests/testgldispatch_patched_thr.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./testgldispatch -s -g -p + diff --git a/tests/testgldispatch_static_thr.sh b/tests/testgldispatch_static_thr.sh new file mode 100755 index 0000000..f31f490 --- /dev/null +++ b/tests/testgldispatch_static_thr.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./testgldispatch -s -t +