summaryrefslogtreecommitdiffstats
path: root/make
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2010-04-13 21:24:44 +0200
committerSven Gothel <[email protected]>2010-04-13 21:24:44 +0200
commit2df3bea10859ee2f2c4b3622f3b610b17a5749d6 (patch)
tree9bb948241aef06fdaf1dd4d09f1b31989c76f858 /make
parent1c1053c6a8b669c067ae1316b9770871e213ea05 (diff)
ATI (fglrx) PBuffer/X11Display bug workaround/cleanup
- See https://bugzilla.mozilla.org/show_bug.cgi?id=486277 - Description: - To use PBuffer, a context must be current - X11Display cannot be switched while using the PBuffer [within one thread]. Hence we shall try harder to reuse _the_ user configured X11Display - whenever possible. This is actually a good thing, ie cleanup up our code again. - Changes to workaround/cleanup: - GLDrawableFactory* methods 'canCreate*()' are changed to 'canCreate*(AbstractGraphicsDevice)' to allow pipelining the X11Display. This reduces the overhead of using a local TLS X11Display. - WindowsDummyWGLDrawable cstr gets the GLProfile as a parameter now, this is done while adding X11DummyGLXDrawable - forseeing the usecase to query available GLProfiles at startup. - X11DummyGLXDrawable added, following the WindowsDummyWGLDrawable path to have a dummy GLContext current to fix the ATI bug. NativeWindow X11: - Add XIOErrorHandler to identify the fatal failure of closing a Display (-> ATI bug). Build: - Adding ant.jar and ant-junit.jar to the junit compile/run classpath - Misc: - Fix: CreateDummyWindow(..) returns a HWND, not a HDC - mapToRealGLFunctionName: Added mapping for X11/GLX. - X11GLXGraphicsConfigurationFactory: Uncommented dead code 'createDefaultGraphicsConfigurationFBConfig' Tests: Passed (Linux64bit: NVidia/ATI) Todo: More tests on ATI, especially multithreading/X11Display usage.
Diffstat (limited to 'make')
-rw-r--r--make/build-common.xml8
-rw-r--r--make/build-jogl.xml2
-rw-r--r--make/build-junit.xml2
-rwxr-xr-xmake/config/nativewindow/x11-CustomCCode.c61
-rw-r--r--make/config/nativewindow/x11-CustomJavaCode.java5
-rw-r--r--make/config/nativewindow/x11-lib.cfg5
-rw-r--r--make/stub_includes/win32/wingdi.h2
7 files changed, 79 insertions, 6 deletions
diff --git a/make/build-common.xml b/make/build-common.xml
index 10f37c3e4..d6c39c1ed 100644
--- a/make/build-common.xml
+++ b/make/build-common.xml
@@ -121,6 +121,8 @@
<property name="obj.gluegen" value="${build.gluegen}/obj"/>
<property name="gluegen.jar" value="${build.gluegen}/gluegen.jar" />
<property name="junit.jar" value="${gluegen.make}/lib/junit-4.5.jar" />
+ <property name="ant.jar" value="${ant.home}/lib/ant.jar" />
+ <property name="ant-junit.jar" value="${ant.home}/lib/ant-junit.jar" />
<property name="nativewindow.make" value="." />
<property name="nativewindow.build.xml" value="${nativewindow.make}/build-nativewindow.xml" />
@@ -179,6 +181,8 @@
<path id="junit_jogl_newt.compile.classpath">
<pathelement location="${junit.jar}" />
+ <pathelement location="${ant.jar}" />
+ <pathelement location="${ant-junit.jar}" />
<pathelement location="${gluegen-rt.jar}" />
<pathelement location="${nativewindow.all.jar}" />
<pathelement location="${jogl.all.jar}" />
@@ -187,6 +191,8 @@
<path id="junit_jogl_newt.run.classpath">
<pathelement location="${junit.jar}" />
+ <pathelement location="${ant.jar}" />
+ <pathelement location="${ant-junit.jar}" />
<pathelement location="${gluegen-rt.jar}" />
<pathelement location="${nativewindow.all.jar}" />
<pathelement location="${jogl.all.jar}" />
@@ -194,7 +200,7 @@
<pathelement location="${jogl.test.jar}" />
</path>
<property name="junit_jogl_newt.run.jars"
- value="${junit.jar}${path.separator}${gluegen-rt.jar}${path.separator}${nativewindow.all.jar}${path.separator}${jogl.all.jar}${path.separator}${newt.all.jar}${path.separator}${jogl.test.jar}"/>
+ value="${junit.jar}${path.separator}${ant.jar}${path.separator}${ant-junit.jar}${path.separator}${gluegen-rt.jar}${path.separator}${nativewindow.all.jar}${path.separator}${jogl.all.jar}${path.separator}${newt.all.jar}${path.separator}${jogl.test.jar}"/>
<!-- JavaSE combinations . NO.AWT -->
<property name="nativewindow.all-noawt.jar" value="${build.nativewindow}/nativewindow.all-noawt.jar" />
diff --git a/make/build-jogl.xml b/make/build-jogl.xml
index b1f0a02eb..93cf7bf6f 100644
--- a/make/build-jogl.xml
+++ b/make/build-jogl.xml
@@ -396,7 +396,7 @@
<and>
<isset property="java.generate.skip.es1"/>
<isset property="java.generate.skip.es2"/>
- <!--isset property="java.generate.skip.gl2"/-->
+ <isset property="java.generate.skip.gl2"/>
<isset property="java.generate.skip.glu"/>
</and>
</condition>
diff --git a/make/build-junit.xml b/make/build-junit.xml
index 58e8e3b7f..887060084 100644
--- a/make/build-junit.xml
+++ b/make/build-junit.xml
@@ -113,7 +113,7 @@
relative="true"
failonerror="false">
<env key="${system.env.library.path}" path="${obj.all.paths}"/>
- <env key="CLASSPATH" value="${ant.home}/lib/ant.jar${path.separator}${ant.home}/lib/ant-junit.jar${path.separator}${junit_jogl_newt.run.jars}"/>
+ <env key="CLASSPATH" value="${junit_jogl_newt.run.jars}"/>
<arg value="-Djava.library.path=${obj.all.paths}"/>
<arg line="${jvmarg.newt}"/>
<arg line="com.jogamp.newt.util.MainThread"/>
diff --git a/make/config/nativewindow/x11-CustomCCode.c b/make/config/nativewindow/x11-CustomCCode.c
index 8eded9aa2..982a39f7e 100755
--- a/make/config/nativewindow/x11-CustomCCode.c
+++ b/make/config/nativewindow/x11-CustomCCode.c
@@ -167,3 +167,64 @@ Java_com_jogamp_nativewindow_impl_x11_X11Lib_XGetVisualInfoCopied1__JJLjava_nio_
return jbyteCopy;
}
+
+static XIOErrorHandler origIOErrorHandler = NULL;
+
+static int displayIOErrorHandler(Display *dpy)
+{
+ fprintf(stderr, "Fatal: Nativewindow X11 IOError: Display %p not available\n", dpy);
+ origIOErrorHandler(dpy);
+ return 0;
+}
+
+static void displayIOErrorHandlerEnable(int onoff) {
+ if(onoff) {
+ if(NULL==origIOErrorHandler) {
+ origIOErrorHandler = XSetIOErrorHandler(displayIOErrorHandler);
+ }
+ } else {
+ XSetIOErrorHandler(origIOErrorHandler);
+ origIOErrorHandler = NULL;
+ }
+}
+
+/* Java->C glue code:
+ * Java package: com.jogamp.nativewindow.impl.x11.X11Lib
+ * Java method: int XCloseDisplay(long display)
+ * C function: int XCloseDisplay(Display * display);
+ */
+JNIEXPORT jint JNICALL
+Java_com_jogamp_nativewindow_impl_x11_X11Lib_XCloseDisplay__J(JNIEnv *env, jclass _unused, jlong display) {
+ int _res;
+ // fprintf(stderr, "X11Lib.XCloseDisplay: %p\n", (Display *) (intptr_t) display);
+ displayIOErrorHandlerEnable(1);
+ _res = XCloseDisplay((Display *) (intptr_t) display);
+ displayIOErrorHandlerEnable(0);
+ return _res;
+}
+
+/* Java->C glue code:
+ * Java package: com.jogamp.nativewindow.impl.x11.X11Lib
+ * Java method: long XOpenDisplay(java.lang.String arg0)
+ * C function: Display * XOpenDisplay(const char * );
+ */
+JNIEXPORT jlong JNICALL
+Java_com_jogamp_nativewindow_impl_x11_X11Lib_XOpenDisplay__Ljava_lang_String_2(JNIEnv *env, jclass _unused, jstring arg0) {
+ const char* _strchars_arg0 = NULL;
+ Display * _res;
+ if ( NULL != arg0 ) {
+ _strchars_arg0 = (*env)->GetStringUTFChars(env, arg0, (jboolean*)NULL);
+ if ( NULL == _strchars_arg0 ) {
+ (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"),
+ "Failed to get UTF-8 chars for argument \"arg0\" in native dispatcher for \"XOpenDisplay\"");
+ return 0;
+ }
+ }
+ _res = XOpenDisplay((char *) _strchars_arg0);
+ // fprintf(stderr, "X11Lib.XOpenDisplay: %s -> %p\n", _strchars_arg0, _res);
+ if ( NULL != arg0 ) {
+ (*env)->ReleaseStringUTFChars(env, arg0, _strchars_arg0);
+ }
+ return (jlong) (intptr_t) _res;
+}
+
diff --git a/make/config/nativewindow/x11-CustomJavaCode.java b/make/config/nativewindow/x11-CustomJavaCode.java
index 5c269c6c8..d631c92cb 100644
--- a/make/config/nativewindow/x11-CustomJavaCode.java
+++ b/make/config/nativewindow/x11-CustomJavaCode.java
@@ -24,3 +24,8 @@
/** Entry point to C language function: <code> XVisualInfo * XGetVisualInfo(Display * , long, XVisualInfo * , int * ); </code> */
private static native java.nio.ByteBuffer XGetVisualInfoCopied1(long arg0, long arg1, java.nio.ByteBuffer arg2, Object arg3, int arg3_byte_offset);
+ public static native long XOpenDisplay(String arg0);
+ public static native int XCloseDisplay(long display);
+ public static native long dlopen(String name);
+ public static native long dlsym(String name);
+
diff --git a/make/config/nativewindow/x11-lib.cfg b/make/config/nativewindow/x11-lib.cfg
index 7a64307da..394dd230a 100644
--- a/make/config/nativewindow/x11-lib.cfg
+++ b/make/config/nativewindow/x11-lib.cfg
@@ -20,8 +20,9 @@ Opaque long Display *
Opaque boolean Bool
Opaque long GLXFBConfig
-CustomJavaCode X11Lib public static native long dlopen(String name);
-CustomJavaCode X11Lib public static native long dlsym(String name);
+# Manually implement XOpenDisplay, XCloseDisplay, catching XIOError
+ManuallyImplement XCloseDisplay
+ManuallyImplement XOpenDisplay
IncludeAs CustomJavaCode X11Lib x11-CustomJavaCode.java
IncludeAs CustomCCode x11-CustomCCode.c
diff --git a/make/stub_includes/win32/wingdi.h b/make/stub_includes/win32/wingdi.h
index 46aeec2b6..fbf2ec5ec 100644
--- a/make/stub_includes/win32/wingdi.h
+++ b/make/stub_includes/win32/wingdi.h
@@ -212,7 +212,7 @@ WINGDIAPI HGDIOBJ WINAPI SelectObject(HDC, HGDIOBJ);
// Routines for creation of a dummy window, device context and OpenGL
// context for the purposes of getting wglChoosePixelFormatARB and
// associated routines
-HDC CreateDummyWindow(int,int,int,int);
+HWND CreateDummyWindow( int x, int y, int width, int height ) ;
WINUSERAPI BOOL WINAPI ShowWindow(HWND hWnd, int nCmdShow);
WINUSERAPI HDC WINAPI GetDC(HWND);
WINUSERAPI int WINAPI ReleaseDC(HWND hWnd, HDC hDC);