aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-08-31 15:33:22 +0200
committerSven Gothel <[email protected]>2011-08-31 15:33:22 +0200
commitb54497155815852744adb657816cb4057948dae2 (patch)
treee55f600951148661e8ad7611b5766581e3a18c17
parentc75785dcc4758b3d865c5ccf6677389ab112d2fb (diff)
Workaround for X11/ATI fglrx bug 515 - Multiple Display Connections
https://jogamp.org/bugzilla/show_bug.cgi?id=515
-rw-r--r--src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java4
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java28
2 files changed, 31 insertions, 1 deletions
diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
index 39bcd2f37..d2c555a1c 100644
--- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
@@ -177,6 +177,10 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl {
sharedDevice.lock();
try {
String glXVendorName = GLXUtil.getVendorName(sharedDevice.getHandle());
+ if(X11Util.ATI_HAS_XCLOSEDISPLAY_BUG && GLXUtil.isVendorATI(glXVendorName)) {
+ X11Util.setMarkAllDisplaysUnclosable(true);
+ X11Util.markDisplayUncloseable(sharedDevice.getHandle());
+ }
X11GraphicsScreen sharedScreen = new X11GraphicsScreen(sharedDevice, 0);
if (null == sharedScreen) {
diff --git a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
index 28d75ea06..0964dbeb0 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
@@ -51,6 +51,21 @@ import javax.media.nativewindow.util.Point;
* Contains a thread safe X11 utility to retrieve display connections.
*/
public class X11Util {
+ /**
+ * See Bug 515 - https://jogamp.org/bugzilla/show_bug.cgi?id=515
+ *
+ * It is observed that ATI X11 drivers, eg. fglrx 8.78.6 and fglrx 11.08/8.881,
+ * are quite sensitive to multiple Display connections.
+ * Here, closing displays shall happen in the same order as
+ * they were opened, -OR- shall not be closed at all!
+ * Otherwise some driver related bug appears and brings down the JVM.
+ * You may test this, ie just reverse the destroy order below.
+ * See also native test: jogl/test/native/displayMultiple02.c
+ *
+ * Our current 'workaround' is to not close them at all if driver vendor is ATI.
+ */
+ public static final boolean ATI_HAS_XCLOSEDISPLAY_BUG = true;
+
public static final boolean XINITTHREADS_ALWAYS_ENABLED = true;
private static final boolean DEBUG = Debug.debug("X11Util");
@@ -59,6 +74,7 @@ public class X11Util {
private static volatile String nullDisplayName = null;
private static boolean requiresX11Lock = false;
private static boolean isInit = false;
+ private static boolean markAllDisplaysUnclosable = false; // ATI/AMD X11 driver issues
private static int setX11ErrorHandlerRecCount = 0;
private static Object setX11ErrorHandlerLock = new Object();
@@ -143,7 +159,14 @@ public class X11Util {
}
return nullDisplayName;
}
-
+
+ public static boolean getMarkAllDisplaysUnclosable() {
+ return markAllDisplaysUnclosable;
+ }
+ public static void setMarkAllDisplaysUnclosable(boolean v) {
+ markAllDisplaysUnclosable = v;
+ }
+
private X11Util() {}
// not exactly thread safe, but good enough for our purpose,
@@ -320,6 +343,9 @@ public class X11Util {
openDisplayList.add(namedDpy);
pendingDisplayList.add(namedDpy);
}
+ if(markAllDisplaysUnclosable) {
+ namedDpy.setUncloseable(true);
+ }
if(DEBUG) {
Exception e = new Exception("X11Util.Display: Created new "+namedDpy+". Thread "+Thread.currentThread().getName());
e.printStackTrace();