diff options
author | Sven Gothel <[email protected]> | 2011-10-13 13:02:32 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-10-13 13:02:32 +0200 |
commit | 5d33b0a3ef993ff2d257c90abc3d84bc93269cd0 (patch) | |
tree | b6a0a984ce20f8f57a37932476cde851ab31d72e /src/jogl/classes/jogamp/opengl/macosx/cgl | |
parent | a8c14db739c8d7765d1a204f73b5708faac07fdd (diff) |
MacOSX: Fix shared ctx release [onMainThread]; Make GLContextShareSet lifecycle deterministic; Remove warnings
Fix shared ctx release [onMainThread]
- Releasing the shared contexts caused a freeze of about 10s from one of the shared release operations.
[NSOpenGLContext release]
- Thorough triage concluded the workaround to release the shared ctx on the main thread.
- Using enhanced GLContextShareSet, see below
Make GLContextShareSet lifecycle deterministic
- Programmatically control the lifecycle of tracked shared ctx allows us using 'hard' references.
- Features queries for isShared() and ofc unregister a share set if all are destroyed.
Remove warnings
- MacOSXWindowSystemInterface.m used 'long', where 'GLint' was requested.
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/macosx/cgl')
3 files changed, 25 insertions, 19 deletions
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java index 6d6b79b42..b35e38d02 100644 --- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java +++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java @@ -42,9 +42,11 @@ package jogamp.opengl.macosx.cgl; import java.nio.*; import java.util.*; + import javax.media.opengl.*; import javax.media.nativewindow.*; import jogamp.opengl.*; + import com.jogamp.gluegen.runtime.ProcAddressTable; import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver; @@ -204,14 +206,15 @@ public abstract class MacOSXCGLContext extends GLContextImpl throw new GLException("Unable to delete OpenGL Context (CGL)"); } if (DEBUG) { - System.err.println("!!! Destroyed OpenGL Context (CGL) " + contextHandle); + System.err.println("!!! Destroyed OpenGL Context (CGL) " + toHexString(contextHandle)); } } else { - if (!CGL.deleteContext(contextHandle)) { - throw new GLException("Unable to delete OpenGL Context (NS)"); + final boolean isSharedContext = GLContextShareSet.isShared(this); + if (!CGL.deleteContext(contextHandle, isSharedContext)) { + throw new GLException("Unable to delete OpenGL Context (NS) "+toHexString(contextHandle)+", isShared "+isSharedContext); } if (DEBUG) { - System.err.println("!!! Destroyed OpenGL Context (NS) " + contextHandle); + System.err.println("!!! Destroyed OpenGL Context (NS.s0) " + toHexString(contextHandle)+", isShared "+isSharedContext); } } } diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXOnscreenCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXOnscreenCGLContext.java index 393bd398b..b387c28c8 100644 --- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXOnscreenCGLContext.java +++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXOnscreenCGLContext.java @@ -39,8 +39,8 @@ package jogamp.opengl.macosx.cgl; - -import javax.media.opengl.*; +import javax.media.opengl.GLContext; +import javax.media.opengl.GLException; public class MacOSXOnscreenCGLContext extends MacOSXCGLContext { @@ -82,7 +82,10 @@ public class MacOSXOnscreenCGLContext extends MacOSXCGLContext { @Override protected boolean createImpl() { boolean res = create(false, false); - if(res && isNSContext) { + if(!isNSContext) { + throw new InternalError("XXX0"); + } + if(res) { if(0 != updateHandle) { throw new InternalError("XXX1"); } @@ -100,7 +103,7 @@ public class MacOSXOnscreenCGLContext extends MacOSXCGLContext { CGL.updateContextUnregister(updateHandle); updateHandle = 0; } - super.destroyImpl(); + super.destroyImpl(); } @Override diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLContext.java index 75b54504a..efc70e3dd 100644 --- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLContext.java +++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLContext.java @@ -117,12 +117,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext { } protected void destroyImpl() throws GLException { - if (!impl.destroy(contextHandle)) { - throw new GLException("Unable to delete OpenGL context"); - } - if (DEBUG) { - System.err.println("!!! Destroyed OpenGL context " + contextHandle); - } + impl.destroy(contextHandle); } protected void setSwapIntervalImpl(int interval) { @@ -212,7 +207,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext { interface Impl { public boolean isNSContext(); public long create(); - public boolean destroy(long ctx); + public void destroy(long ctx); public boolean makeCurrent(long ctx); public boolean release(long ctx); public void setSwapInterval(long ctx, int interval); @@ -237,8 +232,8 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext { return contextHandle; } - public boolean destroy(long ctx) { - return CGL.deleteContext(ctx); + public void destroy(long ctx) { + MacOSXPbufferCGLContext.super.destroyImpl(); } public boolean makeCurrent(long ctx) { @@ -344,8 +339,13 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext { return ctx.get(0); } - public boolean destroy(long ctx) { - return (CGL.CGLDestroyContext(ctx) == CGL.kCGLNoError); + public void destroy(long ctx) { + if (CGL.CGLDestroyContext(ctx) != CGL.kCGLNoError) { + throw new GLException("Unable to delete OpenGL context (cgl)"); + } + if (DEBUG) { + System.err.println("!!! Destroyed OpenGL context (cgl)" + contextHandle); + } } public boolean makeCurrent(long ctx) { |