aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/Java2D.java2
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java3
-rw-r--r--src/classes/javax/media/opengl/GLJPanel.java4
-rwxr-xr-xsrc/classes/javax/media/opengl/Threading.java59
4 files changed, 37 insertions, 31 deletions
diff --git a/src/classes/com/sun/opengl/impl/Java2D.java b/src/classes/com/sun/opengl/impl/Java2D.java
index 3d14f3003..de3d477e3 100755
--- a/src/classes/com/sun/opengl/impl/Java2D.java
+++ b/src/classes/com/sun/opengl/impl/Java2D.java
@@ -412,11 +412,13 @@ public class Java2D {
// similar rather than keeping one share context in a global
// variable.
initializedJ2DFBOShareContext = true;
+ System.err.println("Starting initialization of J2D FBO share context");
invokeWithOGLSharedContextCurrent(gc, new Runnable() {
public void run() {
j2dFBOShareContext = GLDrawableFactory.getFactory().createExternalGLContext();
}
});
+ System.err.println("Ending initialization of J2D FBO share context");
}
}
}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java
index a78c3baf0..7a4b73351 100644
--- a/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java
@@ -121,6 +121,9 @@ public class WindowsGLContext extends GLContextImpl {
if (hglrc == 0) {
throw new GLException("Unable to create OpenGL context for device context " + toHexString(drawable.getHDC()));
}
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created OpenGL context " + toHexString(hglrc) + " for " + this + ", device context " + toHexString(drawable.getHDC()) + ", not yet sharing");
+ }
// Windows can set up sharing of display lists after creation time
WindowsGLContext other = (WindowsGLContext) GLContextShareSet.getShareContext(this);
long hglrc2 = 0;
diff --git a/src/classes/javax/media/opengl/GLJPanel.java b/src/classes/javax/media/opengl/GLJPanel.java
index a6a8b608d..b4b6b2c52 100644
--- a/src/classes/javax/media/opengl/GLJPanel.java
+++ b/src/classes/javax/media/opengl/GLJPanel.java
@@ -136,10 +136,6 @@ public class GLJPanel extends JPanel implements GLAutoDrawable {
private int[] alignment = new int[1];
// Implementation using Java2D OpenGL pipeline's back buffer
- private static boolean swingBufferPerWindow =
- Debug.isPropertyDefined("swing.bufferPerWindow") ?
- Debug.getBooleanProperty("swing.bufferPerWindow") :
- true;
private boolean oglPipelineEnabled =
Java2D.isOGLPipelineActive() &&
!Debug.isPropertyDefined("jogl.gljpanel.noogl");
diff --git a/src/classes/javax/media/opengl/Threading.java b/src/classes/javax/media/opengl/Threading.java
index 896e945d8..d3712c4c5 100755
--- a/src/classes/javax/media/opengl/Threading.java
+++ b/src/classes/javax/media/opengl/Threading.java
@@ -125,6 +125,9 @@ public class Threading {
private static final int AWT = 1;
private static final int WORKER = 2;
private static int mode;
+ // We need to know whether we're running on X11 platforms to change
+ // our behavior when the Java2D/JOGL bridge is active
+ private static boolean isX11;
static {
AccessController.doPrivileged(new PrivilegedAction() {
@@ -138,7 +141,9 @@ public class Threading {
// while holding the AWT lock. The optimization of
// makeCurrent / release calls isn't worth these stability
// problems.
- boolean isWindows = System.getProperty("os.name").startsWith("Windows");
+ String osName = System.getProperty("os.name");
+ boolean isWindows = osName.startsWith("Windows");
+ isX11 = !(isWindows || osName.startsWith("Mac OS"));
// int defaultMode = (isWindows ? WORKER : AWT);
int defaultMode = AWT;
mode = defaultMode;
@@ -205,24 +210,22 @@ public class Threading {
case AWT:
if (Java2D.isOGLPipelineActive()) {
// FIXME: ideally only the QFT would be considered to be the
- // "OpenGL thread", but we can not currently run all of JOGL's
- // OpenGL work on that thread. For now, run the GLJPanel's
- // Java2D/JOGL bridge on the QFT but everything else on the
- // EDT, except when we're already on the QFT.
+ // "OpenGL thread", but we can not currently run all of
+ // JOGL's OpenGL work on that thread. See the FIXME in
+ // invokeOnOpenGLThread.
return (Java2D.isQueueFlusherThread() ||
- EventQueue.isDispatchThread());
+ (isX11 && EventQueue.isDispatchThread()));
} else {
return EventQueue.isDispatchThread();
}
case WORKER:
if (Java2D.isOGLPipelineActive()) {
// FIXME: ideally only the QFT would be considered to be the
- // "OpenGL thread", but we can not currently run all of JOGL's
- // OpenGL work on that thread. For now, run the GLJPanel's
- // Java2D/JOGL bridge on the QFT but everything else on the
- // worker thread, except when we're already on the QFT.
+ // "OpenGL thread", but we can not currently run all of
+ // JOGL's OpenGL work on that thread. See the FIXME in
+ // invokeOnOpenGLThread.
return (Java2D.isQueueFlusherThread() ||
- GLWorkerThread.isWorkerThread());
+ (isX11 && GLWorkerThread.isWorkerThread()));
} else {
return GLWorkerThread.isWorkerThread();
}
@@ -252,22 +255,24 @@ public class Threading {
switch (mode) {
case AWT:
// FIXME: ideally should run all OpenGL work on the Java2D QFT
- // thread when it's enabled, but there are issues with this when
- // the GLJPanel is not using the Java2D bridge; would like to run
- // its OpenGL work on the QFT, but do the image drawing from the
- // EDT. Other issues still remain with the GLCanvas as well.
-
- // if (Java2D.isOGLPipelineActive()) {
- // Java2D.invokeWithOGLContextCurrent(null, r);
- // } else {
- try {
- EventQueue.invokeAndWait(r);
- } catch (InvocationTargetException e) {
- throw new GLException(e.getTargetException());
- } catch (InterruptedException e) {
- throw new GLException(e);
- }
- // }
+ // thread when it's enabled, but unfortunately there are
+ // deadlock issues on X11 platforms when making our
+ // heavyweight OpenGL contexts current on the QFT because we
+ // perform the JAWT lock inside the makeCurrent()
+ // implementation, which attempts to grab the AWT lock on the
+ // QFT which is not allowed. For now, on X11 platforms,
+ // continue to perform this work on the EDT.
+ if (Java2D.isOGLPipelineActive() && !isX11) {
+ Java2D.invokeWithOGLContextCurrent(null, r);
+ } else {
+ try {
+ EventQueue.invokeAndWait(r);
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (InterruptedException e) {
+ throw new GLException(e);
+ }
+ }
break;
case WORKER: