diff options
author | Sven Gothel <[email protected]> | 2015-03-26 16:33:55 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2015-03-26 16:33:55 +0100 |
commit | e0ed09f8e2df570a9542f606a133c8fde074cbfe (patch) | |
tree | bf6df61a15771999212290b369a88620ddc8040d /src/jogl/classes/jogamp/opengl/GLContextImpl.java | |
parent | 590b5bed36622933f452caf1db18b4dd16a75669 (diff) |
Bug 1150 - Fix GLContextImpl.createImpl(..) NoARBCreateContext and '!ARB GL >= 3.1' issues
This fix solves the described issues below.
Test cases added for onscreen and offscreen drawables,
the latter includes Window's bitmap special case.
GLContextImpl.createImpl(..): Fix NoARBCreateContext and '!ARB GL >= 3.1' issues:
=================================================================================
GLContextImpl.createImpl(..) implementation of X11GLXContext and WindowsWGLContext
wrongly handles the case of NoARBCreateContext.
Here the !ARB created context shall allow GL >= 3.1,
since ARB context creation is disabled and 'no mix' can occur.
The latter was already intended due to failure criteris 'createContextARBTried'
in:
if( glCaps.getGLProfile().isGL3() && createContextARBTried ) {
failure("createImpl ctx !ARB but ARB is used, profile > GL2 requested");
}
Further, WindowsWGLContext treats glCaps.isBitmap()
within the 'createContextARBTried=true' case, but it shall never
tried using the ARB context creation method.
This even lead to the issue of creating a 1.1 context,
but having the ProcAddressTable being still on the GL > 2 cached table.
This is due to 'setGLFunctionAvailability(..)'.
Ensure 'setGLFunctionAvailability(..)' is functional
====================================================
Caller shall either throws an exception if method returns false
or issues a state reset.
In case 'setGLFunctionAvailability(..)' throws an exception itself,
the states are no issue.
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/GLContextImpl.java')
-rw-r--r-- | src/jogl/classes/jogamp/opengl/GLContextImpl.java | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java index c56dc74da..401ea29c6 100644 --- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java @@ -851,18 +851,25 @@ public abstract class GLContextImpl extends GLContext { } /** - * Platform dependent entry point for context creation.<br> - * - * This method is called from {@link #makeCurrentWithinLock()} .. {@link #makeCurrent()} .<br> - * + * Platform dependent entry point for context creation. + * <p> + * This method is called from {@link #makeCurrentWithinLock()} .. {@link #makeCurrent()} . + * </p> + * <p> * The implementation shall verify this context with a - * <code>MakeContextCurrent</code> call.<br> - * - * The implementation <b>must</b> leave the context current.<br> - * + * <code>MakeContextCurrent</code> call. + * </p> + * <p> + * The implementation <b>must</b> leave the context current. + * </p> + * <p> + * Non fatal context creation failure via return {@code false} + * is currently implemented for: {@code MacOSXCGLContext}. + * </p> * @param sharedWithHandle the shared context handle or 0 - * @return true if successful, or false - * @throws GLException + * @return {@code true} if successful. Method returns {@code false} if the context creation failed non fatally, + * hence it may be created at a later time. Otherwise method throws {@link GLException}. + * @throws GLException if method fatally fails creating the context and no attempt shall be made at a later time. */ protected abstract boolean createImpl(long sharedWithHandle) throws GLException ; @@ -908,6 +915,15 @@ public abstract class GLContextImpl extends GLContext { */ protected abstract void destroyContextARBImpl(long context); + protected final boolean isCreateContextARBAvail(final AbstractGraphicsDevice device) { + return !GLProfile.disableOpenGLARBContext && + !GLRendererQuirks.existStickyDeviceQuirk(device, GLRendererQuirks.NoARBCreateContext); + } + protected final String getCreateContextARBAvailStr(final AbstractGraphicsDevice device) { + final boolean noARBCreateContext = GLRendererQuirks.existStickyDeviceQuirk(device, GLRendererQuirks.NoARBCreateContext); + return "disabled "+GLProfile.disableOpenGLARBContext+", quirk "+noARBCreateContext; + } + /** * Platform independent part of using the <code>ARB_create_context</code> * mechanism to create a context.<br> @@ -929,25 +945,12 @@ public abstract class GLContextImpl extends GLContext { */ protected final long createContextARB(final long share, final boolean direct) { - if( GLProfile.disableOpenGLARBContext || - GLRendererQuirks.existStickyDeviceQuirk(drawable.getNativeSurface().getGraphicsConfiguration().getScreen().getDevice(), - GLRendererQuirks.NoARBCreateContext) ) { - if( DEBUG ) { - System.err.println(getThreadName() + ": createContextARB: Disabled "+ - "- property disableOpenGLARBContext "+ GLProfile.disableOpenGLARBContext + - ", quirk NoARBCreateContext "+GLRendererQuirks.existStickyDeviceQuirk(drawable.getNativeSurface().getGraphicsConfiguration().getScreen().getDevice(), - GLRendererQuirks.NoARBCreateContext)); - } - return 0; - } final AbstractGraphicsConfiguration config = drawable.getNativeSurface().getGraphicsConfiguration(); final AbstractGraphicsDevice device = config.getScreen().getDevice(); - if (DEBUG) { System.err.println(getThreadName() + ": createContextARB: mappedVersionsAvailableSet("+device.getConnection()+"): "+ GLContext.getAvailableGLVersionsSet(device)); } - final GLCapabilitiesImmutable glCaps = (GLCapabilitiesImmutable) config.getChosenCapabilities(); final GLProfile glp = glCaps.getGLProfile(); @@ -1016,7 +1019,7 @@ public abstract class GLContextImpl extends GLContext { System.err.println("Quirk Triggerd: "+GLRendererQuirks.toString(GLRendererQuirks.GL4NeedsGL3Request)+": cause: OS "+Platform.getOSType()+", OS Version "+Platform.getOSVersionNumber()); } } - resetStates(false); // clean this context states, since creation was temporary + resetStates(false); // clean the context states, since creation was temporary } } } @@ -1468,9 +1471,14 @@ public abstract class GLContextImpl extends GLContext { * the cache of which GL functions are available for calling through this * context. See {@link #isFunctionAvailable(String)} for more information on * the definition of "available". - * <br> + * <p> * All ProcaddressTables are being determined and cached, the GL version is being set * and the extension cache is determined as well. + * </p> + * <p> + * It is the callers responsibility to issue {@link #resetStates(boolean)} + * in case this method returns {@code false} or throws a {@link GLException}. + * </p> * * @param force force the setting, even if is already being set. * This might be useful if you change the OpenGL implementation. @@ -1489,13 +1497,16 @@ public abstract class GLContextImpl extends GLContext { * @return returns <code>true</code> if successful, otherwise <code>false</code>.<br> * If <code>strictMatch</code> is <code>false</code> method shall always return <code>true</code> or throw an exception. * If <code>false</code> is returned, no data has been cached or mapped, i.e. ProcAddressTable, Extensions, Version, etc. + * @throws GLException in case of an unexpected OpenGL related issue, e.g. missing expected GL function pointer. * @see #setContextVersion * @see com.jogamp.opengl.GLContext#CTX_OPTION_ANY * @see com.jogamp.opengl.GLContext#CTX_PROFILE_COMPAT * @see com.jogamp.opengl.GLContext#CTX_IMPL_ES2_COMPAT */ protected final boolean setGLFunctionAvailability(final boolean force, int major, int minor, int ctxProfileBits, - final boolean strictMatch, final boolean withinGLVersionsMapping) { + final boolean strictMatch, final boolean withinGLVersionsMapping) + throws GLException + { if( null != this.gl && null != glProcAddressTable && !force ) { return true; // already done and not forced } @@ -1695,7 +1706,7 @@ public abstract class GLContextImpl extends GLContext { synchronized(mappedContextTypeObjectLock) { table = mappedGLProcAddress.get( contextFQN ); if(null != table && !verifyInstance(glp, "ProcAddressTable", table)) { - throw new InternalError("GLContext GL ProcAddressTable mapped key("+contextFQN+" - " + GLContext.getGLVersion(major, minor, ctxProfileBits, null)+ + throw new GLException("GLContext GL ProcAddressTable mapped key("+contextFQN+" - " + GLContext.getGLVersion(major, minor, ctxProfileBits, null)+ ") -> "+ table.getClass().getName()+" not matching "+glp.getGLImplBaseClassName()); } } |