diff options
author | Kenneth Russel <[email protected]> | 2006-02-05 18:09:25 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2006-02-05 18:09:25 +0000 |
commit | ced30725fdaa23c108605104d0d364055e629a63 (patch) | |
tree | 05b00a2e9e623854b2e1262d038811d56282f45b /src/classes/com/sun/opengl/impl/GLContextImpl.java | |
parent | e3699308d1478ec35b2cc3fdcef2046a8b1b695f (diff) |
Intermediate checkin for FBO support in Java2D/JOGL bridge. Needed to
keep track of server-side OpenGL objects, like textures and display
lists, created by the end user to preserve the illusion of independent
contexts even though they will all share textures and display lists
with the Java2D OpenGL context in order to access its FBO. Added
GLObjectTracker class to track creation and destruction of these
objects and to support cleanup when the last referring context has
been destroyed. Modified GLContextShareSet to create and install
GLObjectTrackers when necessary and GLContext to ref and unref tracker
appropriately. Changed GlueGen's JavaPrologue and JavaEpilogue
directives (and their documentation) to perform argument name
substitution. Wrote documentation section on argument name
substitution and specified behavior for primitive arrays (converts to
string "array_name, array_name_offset" in substitution). Rephrased
GlueGen's RangeCheck directives in terms of JavaPrologue directives
and deleted old specialized code. Fixed bug in handling of VBO support
in GLConfiguration when JavaPrologue was present for affected
functions. Added JavaPrologue and JavaEpilogue directives to all
existing OpenGL routines creating server-side objects (though it's
possible some were missed) to call GLObjectTracker when necessary.
Added RangeCheck directives for these routines as well. Worked around
bug in JOGL demos where shutdownDemo() was being called more than once.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@584 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/classes/com/sun/opengl/impl/GLContextImpl.java')
-rw-r--r-- | src/classes/com/sun/opengl/impl/GLContextImpl.java | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/src/classes/com/sun/opengl/impl/GLContextImpl.java b/src/classes/com/sun/opengl/impl/GLContextImpl.java index 1eb121b1b..5dbf08df6 100644 --- a/src/classes/com/sun/opengl/impl/GLContextImpl.java +++ b/src/classes/com/sun/opengl/impl/GLContextImpl.java @@ -58,11 +58,15 @@ public abstract class GLContextImpl extends GLContext { // OpenGL functions. private GLProcAddressTable glProcAddressTable; + // Tracks creation and deletion of server-side OpenGL objects when + // the Java2D/OpenGL pipeline is active and using FBOs to render + private GLObjectTracker tracker; + protected GL gl; public GLContextImpl(GLContext shareWith) { setGL(createGL()); functionAvailability = new FunctionAvailabilityCache(this); - if (shareWith != null) { + if (shareWith != null || GLContextShareSet.isObjectTrackingDebuggingEnabled()) { GLContextShareSet.registerSharing(this, shareWith); } } @@ -72,6 +76,11 @@ public abstract class GLContextImpl extends GLContext { int res = 0; try { res = makeCurrentImpl(); + if ((tracker != null) && + (res == CONTEXT_CURRENT_NEW)) { + // Increase reference count of GLObjectTracker + tracker.ref(); + } } catch (GLException e) { lock.unlock(); throw(e); @@ -104,8 +113,27 @@ public abstract class GLContextImpl extends GLContext { if (lock.isHeld()) { throw new GLException("Can not destroy context while it is current"); } - // Should we check the lock state? It should not be current on any - // thread. + + if (tracker != null) { + // Don't need to do anything for contexts that haven't been + // created yet + if (isCreated()) { + // If we are tracking creation and destruction of server-side + // OpenGL objects, we must decrement the reference count of the + // GLObjectTracker upon context destruction. + int res = makeCurrent(); + if (res != CONTEXT_CURRENT) { + // FIXME: we really need to behave better than this + throw new GLException("Unable to make context current to destroy tracked server-side OpenGL objects"); + } + try { + tracker.unref(getGL()); + } finally { + release(); + } + } + } + destroyImpl(); } @@ -135,7 +163,11 @@ public abstract class GLContextImpl extends GLContext { /** Create the GL for this context. */ protected GL createGL() { - return new GLImpl(this); + GLImpl gl = new GLImpl(this); + if (tracker != null) { + gl.setObjectTracker(tracker); + } + return gl; } public GLProcAddressTable getGLProcAddressTable() { @@ -267,4 +299,12 @@ public abstract class GLContextImpl extends GLContext { public static String toHexString(long hex) { return "0x" + Long.toHexString(hex); } + + public void setObjectTracker(GLObjectTracker tracker) { + this.tracker = tracker; + } + + public GLObjectTracker getObjectTracker() { + return tracker; + } } |