diff options
Diffstat (limited to 'src/classes/com/sun/opengl/impl/x11')
4 files changed, 41 insertions, 37 deletions
diff --git a/src/classes/com/sun/opengl/impl/x11/X11GLContext.java b/src/classes/com/sun/opengl/impl/x11/X11GLContext.java index 5ae52fb1d..54d1c62f3 100644 --- a/src/classes/com/sun/opengl/impl/x11/X11GLContext.java +++ b/src/classes/com/sun/opengl/impl/x11/X11GLContext.java @@ -128,8 +128,6 @@ public abstract class X11GLContext extends GLContextImpl { } protected int makeCurrentImpl() throws GLException { - // FIXME: in offscreen (non-pbuffer) case this is run without the - // AWT lock held boolean created = false; if (context == 0) { create(); @@ -143,7 +141,7 @@ public abstract class X11GLContext extends GLContextImpl { throw new GLException("Error making context current"); } else { mostRecentDisplay = drawable.getDisplay(); - if (DEBUG && VERBOSE) { + if (DEBUG && (VERBOSE || created)) { System.err.println(getThreadName() + ": glXMakeCurrent(display " + toHexString(drawable.getDisplay()) + ", drawable " + toHexString(drawable.getDrawable()) + ", context " + toHexString(context) + ") succeeded"); @@ -158,14 +156,25 @@ public abstract class X11GLContext extends GLContextImpl { } protected void releaseImpl() throws GLException { - if (!GLX.glXMakeCurrent(drawable.getDisplay(), 0, 0)) { - throw new GLException("Error freeing OpenGL context"); + lockToolkit(); + try { + if (!GLX.glXMakeCurrent(mostRecentDisplay, 0, 0)) { + throw new GLException("Error freeing OpenGL context"); + } + } finally { + unlockToolkit(); } } protected void destroyImpl() throws GLException { lockToolkit(); if (context != 0) { + if (DEBUG) { + System.err.println("glXDestroyContext(0x" + + Long.toHexString(mostRecentDisplay) + + ", 0x" + + Long.toHexString(context) + ")"); + } GLX.glXDestroyContext(mostRecentDisplay, context); if (DEBUG) { System.err.println("!!! Destroyed OpenGL context " + context); @@ -199,7 +208,7 @@ public abstract class X11GLContext extends GLContextImpl { } public synchronized String getPlatformExtensionsString() { - if (drawable.getDisplay() == 0) { + if (mostRecentDisplay == 0) { throw new GLException("Context not current"); } if (!glXQueryExtensionsStringInitialized) { @@ -210,7 +219,7 @@ public abstract class X11GLContext extends GLContextImpl { if (glXQueryExtensionsStringAvailable) { lockToolkit(); try { - String ret = GLX.glXQueryExtensionsString(drawable.getDisplay(), GLX.DefaultScreen(drawable.getDisplay())); + String ret = GLX.glXQueryExtensionsString(mostRecentDisplay, GLX.DefaultScreen(mostRecentDisplay)); if (DEBUG) { System.err.println("!!! GLX extensions: " + ret); } @@ -249,11 +258,16 @@ public abstract class X11GLContext extends GLContextImpl { public void setSwapInterval(int interval) { - // FIXME: make the context current first? Currently assumes that - // will not be necessary. Make the caller do this? - GLXExt glXExt = getGLXExt(); - if (glXExt.isExtensionAvailable("GLX_SGI_swap_control")) { - glXExt.glXSwapIntervalSGI(interval); + lockToolkit(); + try { + // FIXME: make the context current first? Currently assumes that + // will not be necessary. Make the caller do this? + GLXExt glXExt = getGLXExt(); + if (glXExt.isExtensionAvailable("GLX_SGI_swap_control")) { + glXExt.glXSwapIntervalSGI(interval); + } + } finally { + unlockToolkit(); } } diff --git a/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java index e1c8eb3d1..132573f7b 100644 --- a/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java +++ b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java @@ -68,6 +68,15 @@ public class X11OffscreenGLContext extends X11GLContext { return true; } + protected int makeCurrentImpl() throws GLException { + lockToolkit(); + try { + return super.makeCurrentImpl(); + } finally { + unlockToolkit(); + } + } + protected void create() { createContext(false); } diff --git a/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java index d6b79cb8f..e666fc152 100644 --- a/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java +++ b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java @@ -54,38 +54,19 @@ public class X11OnscreenGLContext extends X11GLContext { } protected int makeCurrentImpl() throws GLException { + int lockRes = drawable.lockSurface(); try { - int lockRes = drawable.lockSurface(); if (lockRes == X11OnscreenGLDrawable.LOCK_SURFACE_NOT_READY) { return CONTEXT_NOT_CURRENT; } if (lockRes == X11OnscreenGLDrawable.LOCK_SURFACE_CHANGED) { - if (context != 0) { - GLX.glXDestroyContext(mostRecentDisplay, context); - GLContextShareSet.contextDestroyed(this); - if (DEBUG) { - System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + toHexString(context) + " due to JAWT_LOCK_SURFACE_CHANGED"); - } - context = 0; - } + destroyImpl(); } - int ret = super.makeCurrentImpl(); - return ret; - } catch (RuntimeException e) { - try { + return super.makeCurrentImpl(); + } finally { + if (lockRes != X11OnscreenGLDrawable.LOCK_SURFACE_NOT_READY) { drawable.unlockSurface(); - } catch (Exception e2) { - // do nothing if unlockSurface throws } - throw(e); - } - } - - protected void releaseImpl() throws GLException { - try { - super.releaseImpl(); - } finally { - drawable.unlockSurface(); } } diff --git a/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java index 3b0d51f13..5ff3bd86c 100644 --- a/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java +++ b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java @@ -90,7 +90,7 @@ public class X11PbufferGLContext extends X11GLContext { throw new GLException("Error making context current"); } else { mostRecentDisplay = drawable.getDisplay(); - if (DEBUG && VERBOSE) { + if (DEBUG && (VERBOSE || created)) { System.err.println(getThreadName() + ": glXMakeCurrent(display " + toHexString(drawable.getDisplay()) + ", drawable " + toHexString(drawable.getDrawable()) + ", context " + toHexString(context) + ") succeeded"); |