aboutsummaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/opengl/impl/x11
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/com/sun/opengl/impl/x11')
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11GLContext.java38
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java9
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java29
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java2
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");