diff options
author | Sven Gothel <[email protected]> | 2011-09-09 15:43:51 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-09-09 15:43:51 +0200 |
commit | 8def3e243401a0fe8ce606de6a54381a65626f15 (patch) | |
tree | f41e107ade84b5eedcd64063b997f791073d4117 | |
parent | 2083ba25be5ce9b55cc2f5a420f17c3bb5ff1750 (diff) |
*GLContext: resetStates(); getPlatformExtensionsString(); GLX/WGL NV_swap_group support; setSwapInterval();
resetStates()
- fixes a bug where X11GLXContext impl. resetState() !!
- marked all with @Override tag
- ensured super.resetStates() is called at end (oops)
getPlatformExtensionsStringImpl()*
- fixes a bug where X11GLXContext overrides GLContext cached GLX extension string query
- marked 'final' in GLContext to avoid bugs
- using abstract 'getPlatformExtensionsStringImpl()' called by ExtensionAvailabilityCache
Add premiliry GLX/WGL NV_swap_group support
- thought it might be a solution to sync swap of 2 windows
- none of my drivers/platforms support it, event though extension is avail on Linux
Promote setSwapInterval() (1 up)
- bumped above API up to public GLContext
- those extension should not spam the GL interfaces .. hmm
10 files changed, 326 insertions, 91 deletions
diff --git a/src/jogl/classes/javax/media/opengl/GLContext.java b/src/jogl/classes/javax/media/opengl/GLContext.java index 0727dad1b..47a453484 100644 --- a/src/jogl/classes/javax/media/opengl/GLContext.java +++ b/src/jogl/classes/javax/media/opengl/GLContext.java @@ -549,6 +549,48 @@ public abstract class GLContext { return isGL2ES2() ; } + public final void setSwapInterval(int interval) { + if (!isCurrent()) { + throw new GLException("This context is not current. Current context: "+getCurrent()+", this context "+this); + } + setSwapIntervalImpl(interval); + } + protected void setSwapIntervalImpl(int interval) { /** nop per default .. **/ } + protected int currentSwapInterval = -1; // default: not set yet .. + public int getSwapInterval() { + return currentSwapInterval; + } + + public final boolean queryMaxSwapGroups(int[] maxGroups, int maxGroups_offset, + int[] maxBarriers, int maxBarriers_offset) { + + if (!isCurrent()) { + throw new GLException("This context is not current. Current context: "+getCurrent()+", this context "+this); + } + return queryMaxSwapGroupsImpl(maxGroups, maxGroups_offset, maxBarriers, maxBarriers_offset); + } + protected boolean queryMaxSwapGroupsImpl(int[] maxGroups, int maxGroups_offset, + int[] maxBarriers, int maxBarriers_offset) { return false; } + public final boolean joinSwapGroup(int group) { + if (!isCurrent()) { + throw new GLException("This context is not current. Current context: "+getCurrent()+", this context "+this); + } + return joinSwapGroupImpl(group); + } + protected boolean joinSwapGroupImpl(int group) { /** nop per default .. **/ return false; } + protected int currentSwapGroup = -1; // default: not set yet .. + public int getSwapGroup() { + return currentSwapGroup; + } + public final boolean bindSwapBarrier(int group, int barrier) { + if (!isCurrent()) { + throw new GLException("This context is not current. Current context: "+getCurrent()+", this context "+this); + } + return bindSwapBarrierImpl(group, barrier); + } + protected boolean bindSwapBarrierImpl(int group, int barrier) { /** nop per default .. **/ return false; } + + /** * @return The extension implementing the GLDebugOutput feature, * either <i>GL_ARB_debug_output</i> or <i>GL_AMD_debug_output</i>. diff --git a/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java b/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java index 971b32d47..a35137f15 100644 --- a/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java +++ b/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java @@ -41,6 +41,7 @@ package jogamp.opengl; import javax.media.opengl.*; + import java.util.*; /** @@ -132,9 +133,9 @@ final class ExtensionAvailabilityCache { if(useGetStringi) { GL2GL3 gl2gl3 = gl.getGL2GL3(); int[] numExtensions = { 0 } ; - gl2gl3.glGetIntegerv(gl2gl3.GL_NUM_EXTENSIONS, numExtensions, 0); + gl2gl3.glGetIntegerv(GL2GL3.GL_NUM_EXTENSIONS, numExtensions, 0); for (int i = 0; i < numExtensions[0]; i++) { - sb.append(gl2gl3.glGetStringi(gl2gl3.GL_EXTENSIONS, i)); + sb.append(gl2gl3.glGetStringi(GL.GL_EXTENSIONS, i)); if(i < numExtensions[0]) { sb.append(" "); } @@ -151,8 +152,21 @@ final class ExtensionAvailabilityCache { sb.append(gl.glGetString(GL.GL_EXTENSIONS)); } glExtensions = sb.toString(); - glXExtensions = context.getPlatformExtensionsString(); - + + // Platform Extensions + { + // unify platform extension .. might have duplicates + HashSet<String> platformSet = new HashSet<String>(50); + StringTokenizer tok = new StringTokenizer(context.getPlatformExtensionsStringImpl().toString()); + while (tok.hasMoreTokens()) { + platformSet.add(tok.nextToken().trim()); + } + final StringBuffer sb2 = new StringBuffer(); + for(Iterator<String> iter = platformSet.iterator(); iter.hasNext(); ) { + sb2.append(iter.next()).append(" "); + } + glXExtensions = sb2.toString(); + } sb.append(" "); sb.append(glXExtensions); @@ -210,7 +224,7 @@ final class ExtensionAvailabilityCache { private boolean initialized = false; private String glExtensions = null; private String glXExtensions = null; - private HashSet availableExtensionCache = new HashSet(50); + private HashSet<String> availableExtensionCache = new HashSet<String>(50); private GLContextImpl context; static String getThreadName() { diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java index cf4a71a8a..c3fcc5057 100644 --- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java @@ -126,6 +126,7 @@ public abstract class GLContextImpl extends GLContext { this.glDebugHandler = new GLDebugMessageHandler(this); } + @Override protected void resetStates() { // Because we don't know how many other contexts we might be // sharing with (and it seems too complicated to implement the @@ -800,24 +801,10 @@ public abstract class GLContextImpl extends GLContext { public abstract ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3); - public final void setSwapInterval(final int interval) { - GLContext current = getCurrent(); - if (current != this) { - throw new GLException("This context is not current. Current context: "+current+ - ", this context "+this); - } - setSwapIntervalImpl(interval); - } - protected void setSwapIntervalImpl(final int interval) { /** nop per default .. **/ } - protected int currentSwapInterval = -1; // default: not set yet .. - public int getSwapInterval() { - return currentSwapInterval; - } - /** Maps the given "platform-independent" function name to a real function name. Currently this is only used to map "glAllocateMemoryNV" and associated routines to wglAllocateMemoryNV / glXAllocateMemoryNV. */ - protected String mapToRealGLFunctionName(String glFunctionName) { + protected final String mapToRealGLFunctionName(String glFunctionName) { Map<String, String> map = getFunctionNameMap(); String lookup = ( null != map ) ? map.get(glFunctionName) : null; if (lookup != null) { @@ -832,7 +819,7 @@ public abstract class GLContextImpl extends GLContext { "GL_ARB_pbuffer" to "WGL_ARB_pbuffer/GLX_SGIX_pbuffer" and "GL_ARB_pixel_format" to "WGL_ARB_pixel_format/n.a." */ - protected String mapToRealGLExtensionName(String glExtensionName) { + protected final String mapToRealGLExtensionName(String glExtensionName) { Map<String, String> map = getExtensionNameMap(); String lookup = ( null != map ) ? map.get(glExtensionName) : null; if (lookup != null) { @@ -844,7 +831,7 @@ public abstract class GLContextImpl extends GLContext { /** Helper routine which resets a ProcAddressTable generated by the GLEmitter by looking up anew all of its function pointers. */ - protected void resetProcAddressTable(ProcAddressTable table) { + protected final void resetProcAddressTable(ProcAddressTable table) { table.reset(getDrawableImpl().getGLDynamicLookupHelper() ); } @@ -957,6 +944,8 @@ public abstract class GLContextImpl extends GLContext { */ protected abstract void updateGLXProcAddressTable(); + protected abstract StringBuffer getPlatformExtensionsStringImpl(); + /** * Returns true if the specified OpenGL core- or extension-function can be * successfully called using this GL context given the current host (OpenGL @@ -968,7 +957,7 @@ public abstract class GLContextImpl extends GLContext { * "glPolygonOffsetEXT" or "glPolygonOffset" to check if the {@link * javax.media.opengl.GL#glPolygonOffset(float,float)} is available). */ - public boolean isFunctionAvailable(String glFunctionName) { + public final boolean isFunctionAvailable(String glFunctionName) { // Check GL 1st (cached) ProcAddressTable pTable = getGLProcAddressTable(); // null if ctx not created once if(null!=pTable) { @@ -1023,14 +1012,14 @@ public abstract class GLContextImpl extends GLContext { return false; } - public String getPlatformExtensionsString() { + public final String getPlatformExtensionsString() { if(null!=extensionAvailability) { return extensionAvailability.getPlatformExtensionsString(); } return null; } - public String getGLExtensionsString() { + public final String getGLExtensionsString() { if(null!=extensionAvailability) { return extensionAvailability.getGLExtensionsString(); } diff --git a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java index e04ced6fa..704f71457 100644 --- a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java @@ -44,6 +44,8 @@ import java.nio.*; import javax.media.nativewindow.*; import javax.media.opengl.*; +import com.jogamp.common.util.VersionNumber; + /** Extends GLDrawableFactory with a few methods for handling typically software-accelerated offscreen rendering (Device Independent Bitmaps on Windows, pixmaps on X11). Direct access to @@ -51,6 +53,11 @@ import javax.media.opengl.*; they may be instantiated by the GLJPanel implementation. */ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { protected static final boolean DEBUG = GLDrawableImpl.DEBUG; + public static final VersionNumber versionOneZero = new VersionNumber(1, 0, 0); + public static final VersionNumber versionOneOne = new VersionNumber(1, 1, 0); + public static final VersionNumber versionOneTwo = new VersionNumber(1, 2, 0); + public static final VersionNumber versionOneThree = new VersionNumber(1, 3, 0); + public static final VersionNumber versionOneFour = new VersionNumber(1, 4, 0); protected GLDrawableFactoryImpl() { super(); diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java index 4d39472a4..2deae65fb 100644 --- a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java +++ b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java @@ -42,13 +42,14 @@ import com.jogamp.gluegen.runtime.ProcAddressTable; import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver; import java.nio.*; import java.util.*; + import javax.media.nativewindow.AbstractGraphicsConfiguration; import javax.media.nativewindow.AbstractGraphicsDevice; public abstract class EGLContext extends GLContextImpl { private boolean eglQueryStringInitialized; private boolean eglQueryStringAvailable; - private EGLExt eglExt; + private EGLExt _eglExt; // Table that holds the addresses of the native C-language entry points for // EGL extension functions. private EGLExtProcAddressTable eglExtProcAddressTable; @@ -58,15 +59,23 @@ public abstract class EGLContext extends GLContextImpl { super(drawable, shareWith); } + @Override + protected void resetStates() { + eglQueryStringInitialized = false; + eglQueryStringAvailable = false; + // no inner state _eglExt = null; + super.resetStates(); + } + public Object getPlatformGLExtensions() { return getEGLExt(); } public EGLExt getEGLExt() { - if (eglExt == null) { - eglExt = new EGLExtImpl(this); + if (_eglExt == null) { + _eglExt = new EGLExtImpl(this); } - return eglExt; + return _eglExt; } public final ProcAddressTable getPlatformExtProcAddressTable() { @@ -237,22 +246,22 @@ public abstract class EGLContext extends GLContextImpl { } } - public synchronized String getPlatformExtensionsString() { + protected final StringBuffer getPlatformExtensionsStringImpl() { + StringBuffer sb = new StringBuffer(); if (!eglQueryStringInitialized) { eglQueryStringAvailable = getDrawableImpl().getGLDynamicLookupHelper().dynamicLookupFunction("eglQueryString") != 0; eglQueryStringInitialized = true; } if (eglQueryStringAvailable) { - String ret = EGL.eglQueryString(((EGLDrawable)drawable).getDisplay(), - EGL.EGL_EXTENSIONS); + final String ret = EGL.eglQueryString(((EGLDrawable)drawable).getDisplay(), + EGL.EGL_EXTENSIONS); if (DEBUG) { System.err.println("!!! EGL extensions: " + ret); } - return ret; - } else { - return ""; + sb.append(ret); } + return sb; } protected void setSwapIntervalImpl(int interval) { diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java index f6fe16eae..150a5e105 100644 --- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java +++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java @@ -51,7 +51,7 @@ import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver; public abstract class MacOSXCGLContext extends GLContextImpl { protected boolean isNSContext; - private CGLExt cglExt; + private CGLExt _cglExt; // Table that holds the addresses of the native C-language entry points for // CGL extension functions. private CGLExtProcAddressTable cglExtProcAddressTable; @@ -61,6 +61,13 @@ public abstract class MacOSXCGLContext extends GLContextImpl super(drawable, shareWith); } + @Override + protected void resetStates() { + isNSContext = false; + // no inner state _cglExt = null; + super.resetStates(); + } + public Object getPlatformGLExtensions() { return getCGLExt(); } @@ -68,10 +75,10 @@ public abstract class MacOSXCGLContext extends GLContextImpl protected boolean isNSContext() { return isNSContext; } public CGLExt getCGLExt() { - if (cglExt == null) { - cglExt = new CGLExtImpl(this); + if (_cglExt == null) { + _cglExt = new CGLExtImpl(this); } - return cglExt; + return _cglExt; } public final ProcAddressTable getPlatformExtProcAddressTable() { @@ -255,9 +262,8 @@ public abstract class MacOSXCGLContext extends GLContextImpl } } - public String getPlatformExtensionsString() - { - return ""; + protected final StringBuffer getPlatformExtensionsStringImpl() { + return new StringBuffer(); } protected void swapBuffers() { diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java index d48f76c13..b95b7edbf 100644 --- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java +++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java @@ -46,6 +46,7 @@ import java.util.Map; import javax.media.nativewindow.AbstractGraphicsConfiguration; import javax.media.nativewindow.AbstractGraphicsDevice; +import javax.media.nativewindow.NativeSurface; import javax.media.opengl.GLContext; import javax.media.opengl.GLException; import javax.media.opengl.GLCapabilitiesImmutable; @@ -64,10 +65,12 @@ public class WindowsWGLContext extends GLContextImpl { private boolean wglGetExtensionsStringEXTAvailable; private boolean wglGLReadDrawableAvailableSet; private boolean wglGLReadDrawableAvailable; - private WGLExt wglExt; + private WGLExt _wglExt; // Table that holds the addresses of the native C-language entry points for // WGL extension functions. private WGLExtProcAddressTable wglExtProcAddressTable; + private int hasSwapIntervalSGI = 0; + private int hasSwapGroupNV = 0; static { functionNameMap = new HashMap<String, String>(); @@ -85,13 +88,17 @@ public class WindowsWGLContext extends GLContextImpl { super(drawable, shareWith); } - protected void resetState() { + @Override + protected void resetStates() { wglGetExtensionsStringEXTInitialized=false; wglGetExtensionsStringEXTAvailable=false; wglGLReadDrawableAvailableSet=false; wglGLReadDrawableAvailable=false; // no inner state _wglExt=null; wglExtProcAddressTable=null; + hasSwapIntervalSGI = 0; + hasSwapGroupNV = 0; + super.resetStates(); } public Object getPlatformGLExtensions() { @@ -102,10 +109,10 @@ public class WindowsWGLContext extends GLContextImpl { if( null == getWGLExtProcAddressTable()) { throw new InternalError("Null WGLExtProcAddressTable"); } - if (wglExt == null) { - wglExt = new WGLExtImpl(this); + if (_wglExt == null) { + _wglExt = new WGLExtImpl(this); } - return wglExt; + return _wglExt; } public final boolean isGLReadDrawableAvailable() { @@ -141,8 +148,8 @@ public class WindowsWGLContext extends GLContextImpl { int werr = ( !ok ) ? GDI.GetLastError() : GDI.ERROR_SUCCESS; if(DEBUG && !ok) { Throwable t = new Throwable ("Info: wglMakeContextCurrent draw "+ - this.toHexString(hDrawDC) + ", read " + this.toHexString(hReadDC) + - ", ctx " + this.toHexString(ctx) + ", werr " + werr); + GLContext.toHexString(hDrawDC) + ", read " + GLContext.toHexString(hReadDC) + + ", ctx " + GLContext.toHexString(ctx) + ", werr " + werr); t.printStackTrace(); } if(!ok && 0==hDrawDC && 0==hReadDC) { @@ -427,27 +434,95 @@ public class WindowsWGLContext extends GLContextImpl { } } - public String getPlatformExtensionsString() { + protected final StringBuffer getPlatformExtensionsStringImpl() { + StringBuffer sb = new StringBuffer(); + if (!wglGetExtensionsStringEXTInitialized) { wglGetExtensionsStringEXTAvailable = (WGL.wglGetProcAddress("wglGetExtensionsStringEXT") != 0); wglGetExtensionsStringEXTInitialized = true; } if (wglGetExtensionsStringEXTAvailable) { - return getWGLExt().wglGetExtensionsStringEXT(); - } else { - return ""; + sb.append(getWGLExt().wglGetExtensionsStringEXT()); } + return sb; } - + + @Override protected void setSwapIntervalImpl(int interval) { WGLExt wglExt = getWGLExt(); - if (wglExt.isExtensionAvailable("WGL_EXT_swap_control")) { - if ( wglExt.wglSwapIntervalEXT(interval) ) { - currentSwapInterval = interval ; - } + if(0==hasSwapIntervalSGI) { + try { + hasSwapIntervalSGI = wglExt.isExtensionAvailable("WGL_EXT_swap_control")?1:-1; + } catch (Throwable t) { hasSwapIntervalSGI=1; } + } + if (hasSwapIntervalSGI>0) { + try { + if ( wglExt.wglSwapIntervalEXT(interval) ) { + currentSwapInterval = interval ; + } + } catch (Throwable t) { hasSwapIntervalSGI=-1; } } } - + + private final int initSwapGroupImpl(WGLExt wglExt) { + if(0==hasSwapGroupNV) { + try { + hasSwapGroupNV = wglExt.isExtensionAvailable("WGL_NV_swap_group")?1:-1; + } catch (Throwable t) { hasSwapGroupNV=1; } + if(DEBUG) { + System.err.println("initSwapGroupImpl: hasSwapGroupNV: "+hasSwapGroupNV); + } + } + return hasSwapGroupNV; + } + + @Override + protected final boolean queryMaxSwapGroupsImpl(int[] maxGroups, int maxGroups_offset, + int[] maxBarriers, int maxBarriers_offset) { + boolean res = false; + WGLExt wglExt = getWGLExt(); + if (initSwapGroupImpl(wglExt)>0) { + final NativeSurface ns = drawable.getNativeSurface(); + try { + if( wglExt.wglQueryMaxSwapGroupsNV(ns.getDisplayHandle(), + maxGroups, maxGroups_offset, + maxBarriers, maxBarriers_offset) ) { + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + + @Override + protected final boolean joinSwapGroupImpl(int group) { + boolean res = false; + WGLExt wglExt = getWGLExt(); + if (initSwapGroupImpl(wglExt)>0) { + try { + if( wglExt.wglJoinSwapGroupNV(drawable.getHandle(), group) ) { + currentSwapGroup = group; + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + + @Override + protected final boolean bindSwapBarrierImpl(int group, int barrier) { + boolean res = false; + WGLExt wglExt = getWGLExt(); + if (initSwapGroupImpl(wglExt)>0) { + try { + if( wglExt.wglBindSwapBarrierNV(group, barrier) ) { + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) { return getWGLExt().wglAllocateMemoryNV(arg0, arg1, arg2, arg3); } diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java index 104fc031e..26ad41fc7 100644 --- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java +++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java @@ -60,14 +60,14 @@ public abstract class X11GLXContext extends GLContextImpl { private static final Map<String, String> functionNameMap; private static final Map<String, String> extensionNameMap; private VersionNumber glXVersion; + private boolean glXVersionOneOneCapable; private boolean glXVersionOneThreeCapable; - private boolean glXQueryExtensionsStringInitialized; - private boolean glXQueryExtensionsStringAvailable; - private GLXExt glXExt; + private GLXExt _glXExt; // Table that holds the addresses of the native C-language entry points for // GLX extension functions. private GLXExtProcAddressTable glXExtProcAddressTable; private int hasSwapIntervalSGI = 0; + private int hasSwapGroupNV = 0; // This indicates whether the context we have created is indirect // and therefore requires the toolkit to be locked around all GL @@ -89,15 +89,17 @@ public abstract class X11GLXContext extends GLContextImpl { super(drawable, shareWith); } - protected void resetState() { + @Override + protected void resetStates() { glXVersion = null; + glXVersionOneOneCapable = false; glXVersionOneThreeCapable = false; - glXQueryExtensionsStringInitialized=false; - glXQueryExtensionsStringAvailable=false; - // no inner state glXExt=null; + // no inner state _glXExt=null; glXExtProcAddressTable = null; hasSwapIntervalSGI = 0; + hasSwapGroupNV = 0; isDirect = false; + super.resetStates(); } public final ProcAddressTable getPlatformExtProcAddressTable() { @@ -113,24 +115,32 @@ public abstract class X11GLXContext extends GLContextImpl { } public GLXExt getGLXExt() { - if (glXExt == null) { - glXExt = new GLXExtImpl(this); + if (_glXExt == null) { + _glXExt = new GLXExtImpl(this); } - return glXExt; + return _glXExt; } protected Map<String, String> getFunctionNameMap() { return functionNameMap; } protected Map<String, String> getExtensionNameMap() { return extensionNameMap; } - public final boolean isGLXVersionGreaterEqualOneThree() { + private final void initGLXVersion() { if(null == glXVersion) { X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration().getNativeGraphicsConfiguration(); X11GraphicsDevice device = (X11GraphicsDevice) config.getScreen().getDevice(); glXVersion = X11GLXDrawableFactory.getGLXVersion(device); - glXVersionOneThreeCapable = ( null != glXVersion ) ? glXVersion.compareTo(X11GLXDrawableFactory.versionOneThree) >= 0 : false ; - } + glXVersionOneOneCapable = ( null != glXVersion ) ? glXVersion.compareTo(GLDrawableFactoryImpl.versionOneOne) >= 0 : false ; + glXVersionOneThreeCapable = ( null != glXVersion ) ? glXVersion.compareTo(GLDrawableFactoryImpl.versionOneThree) >= 0 : false ; + } + } + public final boolean isGLXVersionGreaterEqualOneOne() { + initGLXVersion(); + return glXVersionOneOneCapable; + } + public final boolean isGLXVersionGreaterEqualOneThree() { + initGLXVersion(); return glXVersionOneThreeCapable; } @@ -470,9 +480,6 @@ public abstract class X11GLXContext extends GLContextImpl { if (DEBUG) { System.err.println(getThreadName() + ": !!! Initializing GLX extension address table: "+key); } - glXQueryExtensionsStringInitialized = false; - glXQueryExtensionsStringAvailable = false; - ProcAddressTable table = null; synchronized(mappedContextTypeObjectLock) { table = mappedGLXProcAddress.get( key ); @@ -497,22 +504,36 @@ public abstract class X11GLXContext extends GLContextImpl { } } - public synchronized String getPlatformExtensionsString() { - if (!glXQueryExtensionsStringInitialized) { - glXQueryExtensionsStringAvailable = - getDrawableImpl().getGLDynamicLookupHelper().dynamicLookupFunction("glXQueryExtensionsString") != 0; - glXQueryExtensionsStringInitialized = true; + protected final StringBuffer getPlatformExtensionsStringImpl() { + StringBuffer sb = new StringBuffer(); + if (DEBUG) { + System.err.println("!!! GLX Version "+glXVersion); } - if (glXQueryExtensionsStringAvailable) { - NativeSurface ns = drawable.getNativeSurface(); - String ret = GLX.glXQueryExtensionsString(ns.getDisplayHandle(), ns.getScreenIndex()); - if (DEBUG) { - System.err.println("!!! GLX extensions: " + ret); + if(isGLXVersionGreaterEqualOneOne()) { + final NativeSurface ns = drawable.getNativeSurface(); + { + final String ret = GLX.glXGetClientString(ns.getDisplayHandle(), GLX.GLX_EXTENSIONS); + if (DEBUG) { + System.err.println("!!! GLX extensions (glXGetClientString): " + ret); + } + sb.append(ret).append(" "); + } + { + final String ret = GLX.glXQueryExtensionsString(ns.getDisplayHandle(), ns.getScreenIndex()); + if (DEBUG) { + System.err.println("!!! GLX extensions (glXQueryExtensionsString): " + ret); + } + sb.append(ret).append(" "); + } + { + final String ret = GLX.glXQueryServerString(ns.getDisplayHandle(), ns.getScreenIndex(), GLX.GLX_EXTENSIONS); + if (DEBUG) { + System.err.println("!!! GLX extensions (glXQueryServerString): " + ret); + } + sb.append(ret).append(" "); } - return ret; - } else { - return ""; } + return sb; } public boolean isExtensionAvailable(String glExtensionName) { @@ -524,6 +545,7 @@ public abstract class X11GLXContext extends GLContextImpl { return super.isExtensionAvailable(glExtensionName); } + @Override protected void setSwapIntervalImpl(int interval) { X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration().getNativeGraphicsConfiguration(); GLCapabilitiesImmutable glCaps = (GLCapabilitiesImmutable) config.getChosenCapabilities(); @@ -544,6 +566,66 @@ public abstract class X11GLXContext extends GLContextImpl { } } + private final int initSwapGroupImpl(GLXExt glXExt) { + if(0==hasSwapGroupNV) { + try { + hasSwapGroupNV = glXExt.isExtensionAvailable("GLX_NV_swap_group")?1:-1; + } catch (Throwable t) { hasSwapGroupNV=1; } + if(DEBUG) { + System.err.println("initSwapGroupImpl: hasSwapGroupNV: "+hasSwapGroupNV); + } + } + return hasSwapGroupNV; + } + + @Override + protected final boolean queryMaxSwapGroupsImpl(int[] maxGroups, int maxGroups_offset, + int[] maxBarriers, int maxBarriers_offset) { + boolean res = false; + GLXExt glXExt = getGLXExt(); + if (initSwapGroupImpl(glXExt)>0) { + final NativeSurface ns = drawable.getNativeSurface(); + try { + if( glXExt.glXQueryMaxSwapGroupsNV(ns.getDisplayHandle(), ns.getScreenIndex(), + maxGroups, maxGroups_offset, + maxBarriers, maxBarriers_offset) ) { + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + + @Override + protected final boolean joinSwapGroupImpl(int group) { + boolean res = false; + GLXExt glXExt = getGLXExt(); + if (initSwapGroupImpl(glXExt)>0) { + try { + if( glXExt.glXJoinSwapGroupNV(drawable.getNativeSurface().getDisplayHandle(), drawable.getHandle(), group) ) { + currentSwapGroup = group; + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + + @Override + protected final boolean bindSwapBarrierImpl(int group, int barrier) { + boolean res = false; + GLXExt glXExt = getGLXExt(); + if (initSwapGroupImpl(glXExt)>0) { + try { + if( glXExt.glXBindSwapBarrierNV(drawable.getNativeSurface().getDisplayHandle(), group, barrier) ) { + res = true; + } + } catch (Throwable t) { hasSwapGroupNV=-1; } + } + return res; + } + + @Override public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) { return getGLXExt().glXAllocateMemoryNV(arg0, arg1, arg2, arg3); } diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java index d37d6c53a..51316dc77 100644 --- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java +++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java @@ -56,7 +56,6 @@ import jogamp.nativewindow.x11.*; public class X11GLXDrawableFactory extends GLDrawableFactoryImpl { private static final DesktopGLDynamicLookupHelper x11GLXDynamicLookupHelper; - static final VersionNumber versionOneThree = new VersionNumber(1, 3, 0); static { DesktopGLDynamicLookupHelper tmp = null; diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java index 7567679d4..296a3604a 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java @@ -37,6 +37,7 @@ import java.nio.FloatBuffer; import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; import javax.media.opengl.GLAutoDrawable; +import javax.media.opengl.GLContext; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.GLUniformData; @@ -173,6 +174,19 @@ public class GearsES2 implements GLEventListener { new com.jogamp.newt.event.awt.AWTKeyAdapter(gearsKeys).addTo(comp); } st.useProgram(gl, false); + + int[] maxVals = new int[] { -1, -1 } ; + GLContext glc = drawable.getContext(); + boolean r = glc.queryMaxSwapGroups(maxVals, 0, maxVals, 1); + System.err.println("swap group max groups "+maxVals[0]+", barriers "+maxVals[0]+", "+r); + if(maxVals[0]>0) { + System.err.println("swap group joing 1: "+glc.joinSwapGroup(1)); + if(maxVals[1]>0) { + System.err.println("swap group bind 1-1: "+glc.bindSwapBarrier(1, 1)); + } + } + glc.setSwapInterval(swapInterval); + System.err.println(Thread.currentThread()+" GearsES2.init FIN"); } @@ -181,8 +195,6 @@ public class GearsES2 implements GLEventListener { Assert.assertEquals("not init or already disposed", true, initialized); GL2ES2 gl = drawable.getGL().getGL2ES2(); - gl.setSwapInterval(swapInterval); - float h = (float)height / (float)width; st.useProgram(gl, true); |