summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java57
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXDrawable.java4
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java103
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OffscreenGLXContext.java4
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OnscreenGLXContext.java4
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java4
6 files changed, 83 insertions, 93 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
index 027fb0065..c9a12c85b 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
@@ -216,11 +216,11 @@ public class WindowsWGLContext extends GLContextImpl {
// utilize the shared context's GLXExt in case it was using the ARB method and it already exists
if( null!=factory.getSharedContext() && factory.getSharedContext().isCreatedWithARBMethod() ) {
- if(DEBUG) {
- System.err.println("WindowsWGLContext.createContext using shared Context: "+factory.getSharedContext());
- }
contextHandle = createContextARB(share, true, major, minor, ctp);
createContextARBTried = true;
+ if (DEBUG && 0!=contextHandle) {
+ System.err.println(getThreadName() + ": createImpl: OK (ARB, using sharedContext) share "+share);
+ }
}
long temp_ctx = 0;
@@ -234,34 +234,29 @@ public class WindowsWGLContext extends GLContextImpl {
if (!WGL.wglMakeCurrent(drawable.getHandle(), temp_ctx)) {
throw new GLException("Error making temp context current: 0x" + toHexString(temp_ctx) + ", werr: 0x"+Integer.toHexString(GDI.GetLastError()));
}
- setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
-
- if( createContextARBTried ||
- !isFunctionAvailable("wglCreateContextAttribsARB") ||
- !isExtensionAvailable("WGL_ARB_create_context") ) {
- if(glCaps.getGLProfile().isGL3()) {
- WGL.wglMakeCurrent(0, 0);
- WGL.wglDeleteContext(temp_ctx);
- throw new GLException("Unable to create OpenGL >= 3.1 context (no WGL_ARB_create_context)");
+ setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY); // use GL_VERSION
+ WGL.wglMakeCurrent(0, 0); // release temp context
+
+ if( !createContextARBTried &&
+ isFunctionAvailable("wglCreateContextAttribsARB") &&
+ isExtensionAvailable("WGL_ARB_create_context") ) {
+ // initial ARB context creation
+ contextHandle = createContextARB(share, true, major, minor, ctp);
+ createContextARBTried=true;
+ if (DEBUG && 0!=contextHandle) {
+ System.err.println(getThreadName() + ": createImpl: OK (ARB, initial) share "+share);
}
-
- // continue with temp context for GL < 3.0
- contextHandle = temp_ctx;
- setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
- return true;
- }
- contextHandle = createContextARB(share, true, major, minor, ctp);
- createContextARBTried=true;
+ }
}
if(0!=contextHandle) {
- share = 0; // mark as shared ..
-
- WGL.wglMakeCurrent(0, 0);
- WGL.wglDeleteContext(temp_ctx);
-
- if (!wglMakeContextCurrent(drawable.getHandle(), drawableRead.getHandle(), contextHandle)) {
- throw new GLException("Cannot make previous verified context current: 0x" + toHexString(contextHandle) + ", werr: 0x" + Integer.toHexString(GDI.GetLastError()));
+ share = 0; // mark as shared thx to the ARB create method
+ if(0!=temp_ctx) {
+ WGL.wglMakeCurrent(0, 0);
+ WGL.wglDeleteContext(temp_ctx);
+ if (!wglMakeContextCurrent(drawable.getHandle(), drawableRead.getHandle(), contextHandle)) {
+ throw new GLException("Cannot make previous verified context current: 0x" + toHexString(contextHandle) + ", werr: 0x" + Integer.toHexString(GDI.GetLastError()));
+ }
}
} else {
if(glCaps.getGLProfile().isGL3()) {
@@ -280,6 +275,9 @@ public class WindowsWGLContext extends GLContextImpl {
WGL.wglDeleteContext(contextHandle);
throw new GLException("Error making old context current: 0x" + toHexString(contextHandle) + ", werr: 0x" + Integer.toHexString(GDI.GetLastError()));
}
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": createImpl: OK (old) share "+share);
+ }
}
if(0!=share) {
@@ -289,7 +287,6 @@ public class WindowsWGLContext extends GLContextImpl {
Integer.toHexString(GDI.GetLastError()));
}
}
- setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
return true;
}
@@ -348,7 +345,7 @@ public class WindowsWGLContext extends GLContextImpl {
if(null != table) {
wglExtProcAddressTable = table;
if(DEBUG) {
- System.err.println("GLContext WGL ProcAddressTable reusing key("+major+","+minor+","+ctp+") -> "+table.hashCode());
+ System.err.println(getThreadName() + ": !!! GLContext WGL ProcAddressTable reusing key("+major+","+minor+","+ctp+") -> "+table.hashCode());
}
} else {
if (wglExtProcAddressTable == null) {
@@ -360,7 +357,7 @@ public class WindowsWGLContext extends GLContextImpl {
synchronized(mappedProcAddressLock) {
mappedGLXProcAddress.put(key, getWGLExtProcAddressTable());
if(DEBUG) {
- System.err.println("GLContext WGL ProcAddressTable mapping key("+major+","+minor+","+ctp+") -> "+getWGLExtProcAddressTable().hashCode());
+ System.err.println(getThreadName() + ": !!! GLContext WGL ProcAddressTable mapping key("+major+","+minor+","+ctp+") -> "+getWGLExtProcAddressTable().hashCode());
}
}
}
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXDrawable.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXDrawable.java
index b83703ef1..f0270fd2a 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXDrawable.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXDrawable.java
@@ -101,9 +101,5 @@ public class X11ExternalGLXDrawable extends X11GLXDrawable {
Context(X11GLXDrawable drawable, GLContext shareWith) {
super(drawable, shareWith);
}
-
- protected boolean createImpl() {
- return createContext(true);
- }
}
}
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
index 697ee6353..494972e7a 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
@@ -50,6 +50,8 @@ import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver;
import com.jogamp.nativewindow.impl.x11.X11Util;
public abstract class X11GLXContext extends GLContextImpl {
+ protected static final boolean TRACE_CONTEXT_CURRENT = false; // true;
+
private boolean glXQueryExtensionsStringInitialized;
private boolean glXQueryExtensionsStringAvailable;
private static final Map/*<String, String>*/ functionNameMap;
@@ -58,6 +60,7 @@ public abstract class X11GLXContext extends GLContextImpl {
// Table that holds the addresses of the native C-language entry points for
// GLX extension functions.
private GLXExtProcAddressTable glXExtProcAddressTable;
+ private int hasSwapIntervalSGI = 0;
// This indicates whether the context we have created is indirect
// and therefore requires the toolkit to be locked around all GL
@@ -107,8 +110,6 @@ public abstract class X11GLXContext extends GLContextImpl {
protected Map/*<String, String>*/ getExtensionNameMap() { return extensionNameMap; }
- protected static final boolean TRACE_CONTEXT_CURRENT = false; // true;
-
protected boolean glXMakeContextCurrent(long dpy, long writeDrawable, long readDrawable, long ctx) {
boolean res = false;
@@ -118,13 +119,7 @@ public abstract class X11GLXContext extends GLContextImpl {
toHexString(writeDrawable)+", "+toHexString(readDrawable)+", "+toHexString(ctx)+")");
t.printStackTrace();
}
- // at least on ATI we receive 'often' SEGV in case of
- // highly multithreaded MakeContextCurrent calls with writeDrawable==readDrawable
- if(writeDrawable==readDrawable) {
- res = GLX.glXMakeCurrent(dpy, writeDrawable, ctx);
- } else {
- res = GLX.glXMakeContextCurrent(dpy, writeDrawable, readDrawable, ctx);
- }
+ res = GLX.glXMakeContextCurrent(dpy, writeDrawable, readDrawable, ctx);
} catch (RuntimeException re) {
if(DEBUG) {
System.err.println("Warning: X11GLXContext.glXMakeContextCurrent failed: "+re+", with "+
@@ -148,6 +143,7 @@ public abstract class X11GLXContext extends GLContextImpl {
protected long createContextARBImpl(long share, boolean direct, int ctp, int major, int minor) {
X11GLXDrawableFactory factory = (X11GLXDrawableFactory)drawable.getFactoryImpl();
+
X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration().getNativeGraphicsConfiguration();
long display = config.getScreen().getDevice().getHandle();
@@ -199,30 +195,45 @@ public abstract class X11GLXContext extends GLContextImpl {
ctx = glXExt.glXCreateContextAttribsARB(display, config.getFBConfig(), share, direct, attribs, 0);
} catch (RuntimeException re) {
if(DEBUG) {
- System.err.println("Warning: X11GLXContext.createContextARB glXCreateContextAttribsARB failed: "+re+", with "+getGLVersion(major, minor, ctp, "@creation"));
- re.printStackTrace();
+ Throwable t = new Throwable("Info: X11GLXContext.createContextARBImpl glXCreateContextAttribsARB failed with "+getGLVersion(major, minor, ctp, "@creation"), re);
+ t.printStackTrace();
}
}
if(0!=ctx) {
if (!glXMakeContextCurrent(display, drawable.getHandle(), drawableRead.getHandle(), ctx)) {
if(DEBUG) {
- System.err.println("X11GLXContext.createContextARB couldn't make current "+getGLVersion(major, minor, ctp, "@creation"));
+ System.err.println("X11GLXContext.createContextARBImpl couldn't make current "+getGLVersion(major, minor, ctp, "@creation"));
}
+ // release & destroy
glXMakeContextCurrent(display, 0, 0, 0);
GLX.glXDestroyContext(display, ctx);
ctx = 0;
+ } else {
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": createContextARBImpl: OK "+getGLVersion(major, minor, ctp, "@creation")+", share "+share+", direct "+direct+", hasSharedContext "+(null!=factory.getSharedContext()));
+ }
}
+ } else if (DEBUG) {
+ System.err.println(getThreadName() + ": createContextARBImpl: NO "+getGLVersion(major, minor, ctp, "@creation"));
}
+
return ctx;
}
- /**
- * Creates and initializes an appropriate OpenGL context. Should only be
- * called by {@link #create()}.
- * Note: The direct parameter may be overwritten by the direct state of a shared context.
- */
- protected boolean createContext(boolean direct) {
- isDirect = false; // default
+ protected boolean createImpl() {
+ // covers the whole context creation loop incl createContextARBImpl and destroyContextARBImpl
+ X11Util.setX11ErrorHandler(true);
+ try {
+ return createImplRaw();
+ } finally {
+ X11Util.setX11ErrorHandler(false);
+ }
+ }
+
+ private boolean createImplRaw() {
+ boolean direct = true; // try direct always
+ isDirect = false; // fall back
+
X11GLXDrawableFactory factory = (X11GLXDrawableFactory)drawable.getFactoryImpl();
X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration().getNativeGraphicsConfiguration();
long display = config.getScreen().getDevice().getHandle();
@@ -255,6 +266,9 @@ public abstract class X11GLXContext extends GLContextImpl {
}
setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY); // use GL_VERSION
isDirect = GLX.glXIsDirect(display, contextHandle);
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": createContextImpl: OK (old-1) share "+share+", direct "+isDirect+"/"+direct);
+ }
return true;
}
@@ -265,11 +279,11 @@ public abstract class X11GLXContext extends GLContextImpl {
// utilize the shared context's GLXExt in case it was using the ARB method and it already exists
if(null!=factory.getSharedContext() && factory.getSharedContext().isCreatedWithARBMethod()) {
- if(DEBUG) {
- System.err.println("X11GLXContext.createContext using shared Context: "+factory.getSharedContext());
- }
contextHandle = createContextARB(share, direct, major, minor, ctp);
createContextARBTried = true;
+ if (DEBUG && 0!=contextHandle) {
+ System.err.println(getThreadName() + ": createContextImpl: OK (ARB, using sharedContext) share "+share);
+ }
}
long temp_ctx = 0;
@@ -284,26 +298,18 @@ public abstract class X11GLXContext extends GLContextImpl {
throw new GLException("Error making temp context(1) current: display "+toHexString(display)+", context "+toHexString(temp_ctx)+", drawable "+drawable);
}
setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY); // use GL_VERSION
-
- if( createContextARBTried ||
- !isFunctionAvailable("glXCreateContextAttribsARB") ||
- !isExtensionAvailable("GLX_ARB_create_context") ) {
- if(glp.isGL3()) {
- glXMakeContextCurrent(display, 0, 0, 0);
- GLX.glXDestroyContext(display, temp_ctx);
- throw new GLException("Unable to create OpenGL >= 3.1 context (failed GLX_ARB_create_context), GLProfile "+glp+", Drawable "+drawable);
- }
- if(DEBUG) {
- System.err.println("X11GLXContext.createContext: createContextARBTried "+createContextARBTried+", hasFunc glXCreateContextAttribsARB: "+isFunctionAvailable("glXCreateContextAttribsARB")+", hasExt GLX_ARB_create_context: "+isExtensionAvailable("GLX_ARB_create_context"));
+ glXMakeContextCurrent(display, 0, 0, 0); // release temp context
+
+ if( !createContextARBTried &&
+ isFunctionAvailable("glXCreateContextAttribsARB") &&
+ isExtensionAvailable("GLX_ARB_create_context") ) {
+ // initial ARB context creation
+ contextHandle = createContextARB(share, direct, major, minor, ctp);
+ createContextARBTried=true;
+ if (DEBUG && 0!=contextHandle) {
+ System.err.println(getThreadName() + ": createContextImpl: OK (ARB, initial) share "+share);
}
-
- // continue with temp context for GL < 3.0
- contextHandle = temp_ctx;
- isDirect = GLX.glXIsDirect(display, contextHandle);
- return true;
}
- contextHandle = createContextARB(share, direct, major, minor, ctp);
- createContextARBTried=true;
}
if(0!=contextHandle) {
@@ -318,10 +324,10 @@ public abstract class X11GLXContext extends GLContextImpl {
if(glp.isGL3()) {
glXMakeContextCurrent(display, 0, 0, 0);
GLX.glXDestroyContext(display, temp_ctx);
- throw new GLException("X11GLXContext.createContext failed, but context > GL2 requested "+getGLVersion(major[0], minor[0], ctp[0], "@creation")+", ");
+ throw new GLException("X11GLXContext.createContextImpl failed, but context > GL2 requested "+getGLVersion(major[0], minor[0], ctp[0], "@creation")+", ");
}
if(DEBUG) {
- System.err.println("X11GLXContext.createContext failed, fall back to !ARB context "+getGLVersion(major[0], minor[0], ctp[0], "@creation"));
+ System.err.println("X11GLXContext.createContextImpl failed, fall back to !ARB context "+getGLVersion(major[0], minor[0], ctp[0], "@creation"));
}
// continue with temp context for GL <= 3.0
@@ -331,8 +337,14 @@ public abstract class X11GLXContext extends GLContextImpl {
GLX.glXDestroyContext(display, temp_ctx);
throw new GLException("Error making context(1) current: display "+toHexString(display)+", context "+toHexString(contextHandle)+", drawable "+drawable);
}
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": createContextImpl: OK (old-2) share "+share);
+ }
}
isDirect = GLX.glXIsDirect(display, contextHandle);
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": createContextImpl: OK direct "+isDirect+"/"+direct);
+ }
return true;
}
@@ -400,7 +412,7 @@ public abstract class X11GLXContext extends GLContextImpl {
if(null != table) {
glXExtProcAddressTable = table;
if(DEBUG) {
- System.err.println("GLContext GLX ProcAddressTable reusing key("+major+","+minor+","+ctp+") -> "+table.hashCode());
+ System.err.println(getThreadName() + ": !!! GLContext GLX ProcAddressTable reusing key("+major+","+minor+","+ctp+") -> "+table.hashCode());
}
} else {
if (glXExtProcAddressTable == null) {
@@ -410,7 +422,7 @@ public abstract class X11GLXContext extends GLContextImpl {
synchronized(mappedProcAddressLock) {
mappedGLXProcAddress.put(key, getGLXExtProcAddressTable());
if(DEBUG) {
- System.err.println("GLContext GLX ProcAddressTable mapping key("+major+","+minor+","+ctp+") -> "+getGLXExtProcAddressTable().hashCode());
+ System.err.println(getThreadName() + ": !!! GLContext GLX ProcAddressTable mapping key("+major+","+minor+","+ctp+") -> "+getGLXExtProcAddressTable().hashCode());
}
}
}
@@ -444,9 +456,6 @@ public abstract class X11GLXContext extends GLContextImpl {
return super.isExtensionAvailable(glExtensionName);
}
-
- private int hasSwapIntervalSGI = 0;
-
protected void setSwapIntervalImpl(int interval) {
X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration().getNativeGraphicsConfiguration();
GLCapabilities glCaps = (GLCapabilities) config.getChosenCapabilities();
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OffscreenGLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OffscreenGLXContext.java
index bde65f3bb..7054faa0c 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OffscreenGLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OffscreenGLXContext.java
@@ -67,8 +67,4 @@ public class X11OffscreenGLXContext extends X11GLXContext {
// of the Pixmap or GLXPixmap
return true;
}
-
- protected boolean createImpl() {
- return createContext(false);
- }
}
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OnscreenGLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OnscreenGLXContext.java
index e231aba4b..ba6a566e6 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OnscreenGLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11OnscreenGLXContext.java
@@ -45,8 +45,4 @@ public class X11OnscreenGLXContext extends X11GLXContext {
public X11OnscreenGLXContext(X11OnscreenGLXDrawable drawable, GLContext shareWith) {
super(drawable, shareWith);
}
-
- protected boolean createImpl() {
- return createContext(true);
- }
}
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
index 85bbade24..7ee5d51d4 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
@@ -61,8 +61,4 @@ public class X11PbufferGLXContext extends X11GLXContext {
public int getFloatingPointMode() {
return ((X11PbufferGLXDrawable)drawable).getFloatingPointMode();
}
-
- protected boolean createImpl() {
- return createContext(true);
- }
}