diff options
author | Sven Gothel <[email protected]> | 2010-10-29 06:30:45 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-10-29 06:30:45 +0200 |
commit | a0c7b5ca791f659d9c98654b47246092aad42665 (patch) | |
tree | 7dbc6d920657558143008a888854e70f14bec8fb /src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java | |
parent | ce24d32178106baa16e84f016192441ce45845a7 (diff) |
JOGL: HashMap ProcAddressTable for all GL profiles incl GLX/WGL/CGL/EGL
Reduce (performance/footprint) overhead of ProcAddressTable recreation,
instead use a hashmap (major, minor, profile) -> ProcAddressTable.
Remove GL2ES12 implementation profile, redundant.
Diffstat (limited to 'src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java')
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java | 75 |
1 files changed, 51 insertions, 24 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java index 3d4c601fe..5f4a9879b 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java @@ -474,7 +474,10 @@ public abstract class GLContextImpl extends GLContext { boolean compat = glp.isGL2(); // incl GL3bc and GL4bc int key = compose8bit(reqMajor, compat?CTX_PROFILE_COMPAT:CTX_PROFILE_CORE, 0, 0); - int val = mappedVersionsAvailable.get( key ); + int val; + synchronized(mappedVersionsAvailableLock) { + val = mappedVersionsAvailable.get( key ); + } long _ctx = 0; if(val>0) { int _major = getComposed8bit(val, 1); @@ -489,23 +492,23 @@ public abstract class GLContextImpl extends GLContext { return _ctx; } - private void mapGLVersions() { - if (!mappedVersionsAvailableSet) { - synchronized (mappedVersionsAvailableLock) { - if (!mappedVersionsAvailableSet) { - createContextARBMapVersionsAvailable(4, false /* core */); // GL4 - createContextARBMapVersionsAvailable(4, true /* compat */); // GL4bc - createContextARBMapVersionsAvailable(3, false /* core */); // GL3 - createContextARBMapVersionsAvailable(3, true /* compat */); // GL3bc - createContextARBMapVersionsAvailable(2, true /* compat */); // GL2 - mappedVersionsAvailableSet = true; - if (DEBUG) { - System.err.println(getThreadName() + ": !!! createContextARB: SET mappedVersionsAvailableSet " + mappedVersionsAvailableSet); - } + private void mapGLVersions() { + if (!mappedVersionsAvailableSet) { + synchronized (mappedVersionsAvailableLock) { + if (!mappedVersionsAvailableSet) { + createContextARBMapVersionsAvailable(4, false /* core */); // GL4 + createContextARBMapVersionsAvailable(4, true /* compat */); // GL4bc + createContextARBMapVersionsAvailable(3, false /* core */); // GL3 + createContextARBMapVersionsAvailable(3, true /* compat */); // GL3bc + createContextARBMapVersionsAvailable(2, true /* compat */); // GL2 + mappedVersionsAvailableSet = true; + if (DEBUG) { + System.err.println(getThreadName() + ": !!! createContextARB: SET mappedVersionsAvailableSet " + mappedVersionsAvailableSet); } } } } + } private final void createContextARBMapVersionsAvailable(int reqMajor, boolean compat) { @@ -649,6 +652,10 @@ public abstract class GLContextImpl extends GLContext { return ReflectionUtil.createInstance(glp.getGLImplBaseClassName()+suffix, cstrArgTypes, cstrArgs, getClass().getClassLoader()); } + private boolean verifyInstance(GLProfile glp, String suffix, Object instance) { + return ReflectionUtil.instanceOf(instance, glp.getGLImplBaseClassName()+suffix); + } + /** Create the GL for this context. */ protected GL createGL(GLProfile glp) { GL gl = (GL) createInstance(glp, "Impl", new Class[] { GLProfile.class, GLContextImpl.class }, new Object[] { glp, this } ); @@ -729,8 +736,8 @@ 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(Object table) { - ((ProcAddressTable)table).reset(getDrawableImpl().getGLDynamicLookupHelper() ); + protected void resetProcAddressTable(ProcAddressTable table) { + table.reset(getDrawableImpl().getGLDynamicLookupHelper() ); } /** @@ -769,15 +776,35 @@ public abstract class GLContextImpl extends GLContext { if (DEBUG) { System.err.println(getThreadName() + ": !!! Initializing OpenGL extension address table for " + this); } - if (glProcAddressTable == null) { - glProcAddressTable = (ProcAddressTable) createInstance(gl.getGLProfile(), "ProcAddressTable", - new Class[] { FunctionAddressResolver.class } , - new Object[] { new GLProcAddressResolver() } ); - // FIXME: cache ProcAddressTables by capability bits so we can - // share them among contexts with the same capabilities - } - resetProcAddressTable(getGLProcAddressTable()); + int key = compose8bit(major, minor, ctp, 0); + ProcAddressTable table = null; + synchronized(mappedProcAddressLock) { + table = (ProcAddressTable) mappedGLProcAddress.get( key ); + if(null != table && !verifyInstance(gl.getGLProfile(), "ProcAddressTable", table)) { + throw new InternalError("GLContext GL ProcAddressTable mapped key("+major+","+minor+","+ctp+") -> "+ + table.getClass().getName()+" not matching "+gl.getGLProfile().getGLImplBaseClassName()); + } + } + if(null != table) { + glProcAddressTable = table; + if(DEBUG) { + System.err.println("GLContext GL ProcAddressTable reusing key("+major+","+minor+","+ctp+") -> "+table.hashCode()); + } + } else { + if (glProcAddressTable == null) { + glProcAddressTable = (ProcAddressTable) createInstance(gl.getGLProfile(), "ProcAddressTable", + new Class[] { FunctionAddressResolver.class } , + new Object[] { new GLProcAddressResolver() } ); + } + resetProcAddressTable(getGLProcAddressTable()); + synchronized(mappedProcAddressLock) { + mappedGLProcAddress.put(key, getGLProcAddressTable()); + if(DEBUG) { + System.err.println("GLContext GL ProcAddressTable mapping key("+major+","+minor+","+ctp+") -> "+getGLProcAddressTable().hashCode()); + } + } + } setContextVersion(major, minor, ctp); extensionAvailability.reset(); |