diff options
Diffstat (limited to 'src/jogl/classes/jogamp/opengl')
4 files changed, 96 insertions, 60 deletions
diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java index 74bc59c7c..3657cacda 100644 --- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java @@ -49,6 +49,7 @@ import com.jogamp.common.os.DynamicLookupHelper; import com.jogamp.common.os.Platform; import com.jogamp.common.util.ReflectionUtil; import com.jogamp.common.util.VersionNumber; +import com.jogamp.common.util.VersionNumberString; import com.jogamp.common.util.locks.RecursiveLock; import com.jogamp.gluegen.runtime.FunctionAddressResolver; import com.jogamp.gluegen.runtime.ProcAddressTable; @@ -1023,7 +1024,7 @@ public abstract class GLContextImpl extends GLContext { * If major > 0 || minor > 0 : Use passed values, determined at creation time * Otherwise .. don't touch .. */ - private final void setContextVersion(int major, int minor, int ctp, boolean setVersionString) { + private final void setContextVersion(int major, int minor, int ctp, VersionNumberString glVendorVersion, boolean useGL) { if ( 0 == ctp ) { throw new GLException("Invalid GL Version "+major+"."+minor+", ctp "+toHexString(ctp)); } @@ -1032,9 +1033,10 @@ public abstract class GLContextImpl extends GLContext { throw new GLException("Invalid GL Version "+major+"."+minor+", ctp "+toHexString(ctp)); } ctxVersion = new VersionNumber(major, minor, 0); + ctxVersionString = getGLVersion(major, minor, ctxOptions, glVersion); + ctxVendorVersion = glVendorVersion; ctxOptions = ctp; - if(setVersionString) { - ctxVersionString = getGLVersion(major, minor, ctxOptions, gl.glGetString(GL.GL_VERSION)); + if(useGL) { ctxGLSLVersion = null; if(major >= 2) { // >= ES2 || GL2.0 final String glslVersion = gl.glGetString(GL2ES2.GL_SHADING_LANGUAGE_VERSION); @@ -1192,7 +1194,7 @@ public abstract class GLContextImpl extends GLContext { */ private static final VersionNumber getGLVersionNumber(int ctp, String glVersionStr) { if( null != glVersionStr ) { - final GLVersionNumber version = new GLVersionNumber(glVersionStr); + final GLVersionNumber version = GLVersionNumber.create(glVersionStr); if ( version.isValid() ) { int[] major = new int[] { version.getMajor() }; int[] minor = new int[] { version.getMinor() }; @@ -1384,7 +1386,9 @@ public abstract class GLContextImpl extends GLContext { ctxProfileBits &= ~GLContext.CTX_IMPL_ES2_COMPAT; } - setRendererQuirks(major, minor, ctxProfileBits); + final VersionNumberString vendorVersion = GLVersionNumber.createVendorVersion(glVersion); + + setRendererQuirks(major, minor, ctxProfileBits, vendorVersion); if( strictMatch && glRendererQuirks.exist(GLRendererQuirks.GLNonCompliant) ) { if(DEBUG) { @@ -1445,7 +1449,7 @@ public abstract class GLContextImpl extends GLContext { } } else { extensionAvailability = new ExtensionAvailabilityCache(); - setContextVersion(major, minor, ctxProfileBits, false); // pre-set of GL version, required for extension cache usage + setContextVersion(major, minor, ctxProfileBits, vendorVersion, false); // pre-set of GL version, required for extension cache usage extensionAvailability.reset(this); synchronized(mappedContextTypeObjectLock) { mappedExtensionAvailabilityCache.put(contextFQN, extensionAvailability); @@ -1469,7 +1473,7 @@ public abstract class GLContextImpl extends GLContext { // // Set GL Version (complete w/ version string) // - setContextVersion(major, minor, ctxProfileBits, true); + setContextVersion(major, minor, ctxProfileBits, vendorVersion, true); setDefaultSwapInterval(); @@ -1481,7 +1485,7 @@ public abstract class GLContextImpl extends GLContext { return true; } - private final void setRendererQuirks(int major, int minor, int ctp) { + private final void setRendererQuirks(int major, int minor, int ctp, VersionNumberString vendorVersion) { int[] quirks = new int[GLRendererQuirks.COUNT]; int i = 0; @@ -1555,6 +1559,7 @@ public abstract class GLContextImpl extends GLContext { } if( glRendererLowerCase.contains("intel(r)") && compatCtx && ( major>3 || major==3 && minor>=1 ) ) { + // FIXME: Apply vendor version constraints! final int quirk = GLRendererQuirks.GLNonCompliant; if(DEBUG) { System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: Renderer " + glRenderer); @@ -1562,43 +1567,28 @@ public abstract class GLContextImpl extends GLContext { quirks[i++] = quirk; } } - - // - // Mesa RENDERER related quirks - // if( glRendererLowerCase.contains("mesa") ) { - // Added March 30, 2013 - // Martin C. Hegedus - if ( glRendererLowerCase.contains("x11") && getMesaMajorVersion(glVersion) < 8.0 ) { - final int quirk = GLRendererQuirks.DontCloseX11DisplayConnection; + if ( glRendererLowerCase.contains("x11") && vendorVersion.compareTo(Version80) < 0 ) { + final int quirk = GLRendererQuirks.DontCloseX11Display; if(DEBUG) { - System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: Mesa X11 < 8 : Renderer=" + glRenderer + ", Version=" +glVersion); + System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: Renderer=" + glRenderer + ", Version=[vendor " + vendorVersion + ", GL " + glVersion+"]"); } quirks[i++] = quirk; - } + } + } + if( glRendererLowerCase.contains("ati technologies") || glRendererLowerCase.startsWith("ati ") ) { + { + final int quirk = GLRendererQuirks.DontCloseX11Display; + if(DEBUG) { + System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: Renderer=" + glRenderer); + } + quirks[i++] = quirk; + } } glRendererQuirks = new GLRendererQuirks(quirks, 0, i); } - // Added by Martin C. Hegedus, March 30, 2013 - private static final int getMesaMajorVersion(String version) { - if (version == null || version.length() <= 0) return -1; - String[] strings = version.trim().split("\\s+"); - if (strings.length <= 0) return -1; - version = strings[strings.length-1]; - int index = version.indexOf("."); - if (index == 0) return -1; - if (index != -1) version = version.substring(0,index); - try { - Integer iNumber = new Integer(version); - return (iNumber == null) ? -1 : iNumber.intValue(); - } catch (Throwable t) { - return -1; - } - } - - private static final boolean hasFBOImpl(int major, int ctp, ExtensionAvailabilityCache extCache) { return ( 0 != (ctp & CTX_PROFILE_ES) && major >= 2 ) || // ES >= 2.0 diff --git a/src/jogl/classes/jogamp/opengl/GLVersionNumber.java b/src/jogl/classes/jogamp/opengl/GLVersionNumber.java index 83815f7a4..1784cd772 100644 --- a/src/jogl/classes/jogamp/opengl/GLVersionNumber.java +++ b/src/jogl/classes/jogamp/opengl/GLVersionNumber.java @@ -32,24 +32,23 @@ import java.util.StringTokenizer; import javax.media.opengl.GLContext; -import com.jogamp.common.util.VersionNumber; +import com.jogamp.common.util.VersionNumberString; /** * A class for storing and comparing OpenGL version numbers. * This only works for desktop OpenGL at the moment. */ -class GLVersionNumber extends VersionNumber { +class GLVersionNumber extends VersionNumberString { - protected boolean valid; + private final boolean valid; - public GLVersionNumber(int majorRev, int minorRev, int subMinorRev) { - super(majorRev, minorRev, subMinorRev); - valid = true; + private GLVersionNumber(int[] val, String versionString, boolean valid) { + super(val[0], val[1], val[2], versionString); + this.valid = valid; } - - public GLVersionNumber(String versionString) { - super(); - valid = false; + + public static GLVersionNumber create(String versionString) { + int[] val = new int[] { 0, 0, 0 }; try { if (versionString.startsWith("GL_VERSION_")) { StringTokenizer tok = new StringTokenizer(versionString, "_"); @@ -57,19 +56,19 @@ class GLVersionNumber extends VersionNumber { tok.nextToken(); // VERSION_ if (!tok.hasMoreTokens()) { val[0] = 0; - return; - } - val[0] = Integer.valueOf(tok.nextToken()).intValue(); - if (!tok.hasMoreTokens()) { - val[1] = 0; - return; - } - val[1] = Integer.valueOf(tok.nextToken()).intValue(); - if (!tok.hasMoreTokens()) { - val[2] = 0; - return; + } else { + val[0] = Integer.valueOf(tok.nextToken()).intValue(); + if (!tok.hasMoreTokens()) { + val[1] = 0; + } else { + val[1] = Integer.valueOf(tok.nextToken()).intValue(); + if (!tok.hasMoreTokens()) { + val[2] = 0; + } else { + val[2] = Integer.valueOf(tok.nextToken()).intValue(); + } + } } - val[2] = Integer.valueOf(tok.nextToken()).intValue(); } else { int radix = 10; if (versionString.length() > 2) { @@ -105,7 +104,7 @@ class GLVersionNumber extends VersionNumber { } } } - valid = true; + return new GLVersionNumber(val, versionString, true); } catch (Exception e) { e.printStackTrace(); // FIXME: refactor desktop OpenGL dependencies and make this @@ -118,11 +117,41 @@ class GLVersionNumber extends VersionNumber { new IllegalArgumentException( "Illegally formatted version identifier: \"" + versionString + "\"") .initCause(e); - */ + */ } + return new GLVersionNumber(val, versionString, false); } public final boolean isValid() { return valid; } + + /** + * Returns the optional vendor version at the end of the + * <code>GL_VERSION</code> string if exists, otherwise <code>null</code>. + * <pre> + * 2.1 Mesa 7.0.3-rc2 -> 7.0.3 (7.0.3-rc2) + * 4.2.12171 Compatibility Profile Context 9.01.8 -> 9.1.8 (9.01.8) + * 4.3.0 NVIDIA 310.32 -> 310.32 (310.32) + * </pre> + */ + public static final VersionNumberString createVendorVersion(String versionString) { + if (versionString == null || versionString.length() <= 0) { + return null; + } + final String[] strings = versionString.trim().split("\\s+"); + if ( strings.length <= 0 ) { + return null; + } + // Test all segments backwards from [len-1..1], skipping the 1st entry (GL version) + // If a segment represents a valid VersionNumber - use it. + for(int i=strings.length-1; i>=1; i--) { + final String s = strings[i]; + final VersionNumberString version = new VersionNumberString(s, "."); + if( !version.isZero() ) { + return version; + } + } + return null; + } } diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java index be3729a7d..9b87860cb 100644 --- a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java +++ b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java @@ -113,6 +113,7 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl { // Check for other underlying stuff .. if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(true)) { + hasX11 = true; try { ReflectionUtil.createInstance("jogamp.opengl.x11.glx.X11GLXGraphicsConfigurationFactory", EGLDrawableFactory.class.getClassLoader()); } catch (Exception jre) { /* n/a .. */ } @@ -262,6 +263,7 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl { private EGLGraphicsDevice defaultDevice = null; private SharedResource defaultSharedResource = null; private boolean isANGLE = false; + private boolean hasX11 = false; static class SharedResource { private final EGLGraphicsDevice device; @@ -568,6 +570,10 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl { // avoid exception due to double 'set' - carefull exception of the rule. EGLContext.setAvailableGLVersionsSet(adevice); } + if( hasX11 ) { + handleDontCloseX11DisplayQuirk(rendererQuirksES1[0]); + handleDontCloseX11DisplayQuirk(rendererQuirksES2[0]); + } final SharedResource sr = new SharedResource(defaultDevice, madeCurrentES1, hasPBufferES1[0], rendererQuirksES1[0], ctpES1[0], madeCurrentES2, hasPBufferES2[0], rendererQuirksES2[0], ctpES2[0]); @@ -582,6 +588,12 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl { } return sr; } + + private void handleDontCloseX11DisplayQuirk(GLRendererQuirks quirks) { + if( null != quirks && quirks.exist( GLRendererQuirks.DontCloseX11Display ) ) { + jogamp.nativewindow.x11.X11Util.markAllDisplaysUnclosable(); + } + } @Override protected final Thread getSharedResourceThread() { diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java index 2f3940baa..9486b5875 100644 --- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java +++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java @@ -73,6 +73,7 @@ import jogamp.opengl.SharedResourceRunner; import com.jogamp.common.util.VersionNumber; import com.jogamp.nativewindow.x11.X11GraphicsDevice; import com.jogamp.nativewindow.x11.X11GraphicsScreen; +import com.jogamp.opengl.GLRendererQuirks; public class X11GLXDrawableFactory extends GLDrawableFactoryImpl { @@ -236,6 +237,7 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl { res = GLXUtil.isGLXAvailableOnServer(x11Device); } finally { x11Device.unlock(); + x11Device.close(); } if(DEBUG) { System.err.println("GLX "+(res ? "is" : "not")+" available on device/server: "+x11Device); @@ -276,6 +278,9 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl { } finally { sharedContext.release(); } + if( sharedContext.hasRendererQuirk( GLRendererQuirks.DontCloseX11Display ) ) { + X11Util.markAllDisplaysUnclosable(); + } if (DEBUG) { System.err.println("SharedDevice: " + sharedDevice); System.err.println("SharedScreen: " + sharedScreen); |