diff options
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java')
-rw-r--r-- | src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java | 116 |
1 files changed, 62 insertions, 54 deletions
diff --git a/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java b/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java index 610f08e21..fd59ecfd4 100644 --- a/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java +++ b/src/jogl/classes/jogamp/opengl/ExtensionAvailabilityCache.java @@ -1,22 +1,22 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. * Copyright (c) 2010 JogAmp Community. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: - * + * * - Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * - Redistribution in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * Neither the name of Sun Microsystems, Inc. or the names of * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. - * + * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A @@ -29,20 +29,25 @@ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * + * * You acknowledge that this software is not designed or intended for use * in the design, construction, operation or maintenance of any nuclear * facility. - * + * * Sun gratefully acknowledges that this software was originally authored * and developed by Kenneth Bradley Russell and Christopher John Kline. */ package jogamp.opengl; -import javax.media.opengl.*; +import java.util.HashMap; +import java.util.StringTokenizer; -import java.util.*; +import javax.media.opengl.GL; +import javax.media.opengl.GL2GL3; +import javax.media.opengl.GLContext; + +import com.jogamp.common.util.VersionNumber; /** * A utility object intended to be used by implementations to act as a cache @@ -57,7 +62,7 @@ final class ExtensionAvailabilityCache { } /** - * Flush the cache. + * Flush the cache. */ final void flush() { @@ -78,24 +83,24 @@ final class ExtensionAvailabilityCache { } final boolean isInitialized() { - return initialized && !availableExtensionCache.isEmpty() ; + return initialized; } final int getTotalExtensionCount() { validateInitialization(); return availableExtensionCache.size(); } - + final boolean isExtensionAvailable(String glExtensionName) { validateInitialization(); - return availableExtensionCache.contains(glExtensionName); + return null != availableExtensionCache.get(glExtensionName); } final int getPlatformExtensionCount() { validateInitialization(); return glXExtensionCount; } - + final String getPlatformExtensionsString() { validateInitialization(); return glXExtensions; @@ -105,7 +110,7 @@ final class ExtensionAvailabilityCache { validateInitialization(); return glExtensionCount; } - + final String getGLExtensionsString() { validateInitialization(); if(DEBUG) { @@ -149,7 +154,6 @@ final class ExtensionAvailabilityCache { ", use "+ ( useGetStringi ? "glGetStringi" : "glGetString" ) ); } - HashSet<String> glExtensionSet = new HashSet<String>(gl.isGLES() ? 50 : 320); // far less gl extension expected on mobile if(useGetStringi) { GL2GL3 gl2gl3 = gl.getGL2GL3(); final int count; @@ -160,78 +164,84 @@ final class ExtensionAvailabilityCache { } StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; i++) { - if(i > 0) { - sb.append(" "); - } final String ext = gl2gl3.glGetStringi(GL.GL_EXTENSIONS, i); - glExtensionSet.add(ext); - sb.append(ext); + if( null == availableExtensionCache.put(ext, ext) ) { + // new one + if( 0 < i ) { + sb.append(" "); + } + sb.append(ext); + } } if(0==count || sb.length()==0) { // fall back .. useGetStringi=false; } else { glExtensions = sb.toString(); + glExtensionCount = count; } } if(!useGetStringi) { glExtensions = gl.glGetString(GL.GL_EXTENSIONS); if(null != glExtensions) { - StringTokenizer tok = new StringTokenizer(glExtensions); + final StringTokenizer tok = new StringTokenizer(glExtensions); + int count = 0; while (tok.hasMoreTokens()) { - glExtensionSet.add(tok.nextToken().trim()); + final String ext = tok.nextToken().trim(); + if( null == availableExtensionCache.put(ext, ext) ) { + count++; + } } + glExtensionCount = count; } } - glExtensionCount = glExtensionSet.size(); if (DEBUG) { System.err.println(getThreadName() + ":ExtensionAvailabilityCache: GL_EXTENSIONS: "+glExtensionCount+ ", used "+ ( useGetStringi ? "glGetStringi" : "glGetString" ) ); } // Platform Extensions - HashSet<String> glXExtensionSet = new HashSet<String>(50); - { - // unify platform extension .. might have duplicates - StringTokenizer tok = new StringTokenizer(context.getPlatformExtensionsStringImpl().toString()); - while (tok.hasMoreTokens()) { - glXExtensionSet.add(tok.nextToken().trim()); - } + { + // unify platform extension .. might have duplicates final StringBuilder sb = new StringBuilder(); - for(Iterator<String> iter = glXExtensionSet.iterator(); iter.hasNext(); ) { - sb.append(iter.next()); - if(iter.hasNext()) { - sb.append(" "); + final StringTokenizer tok = new StringTokenizer(context.getPlatformExtensionsStringImpl().toString()); + int count = 0; + while (tok.hasMoreTokens()) { + final String ext = tok.nextToken().trim(); + if( null == availableExtensionCache.put(ext, ext) ) { + // new one + if( 0 < count ) { + sb.append(" "); + } + sb.append(ext); + count++; } } glXExtensions = sb.toString(); - glXExtensionCount = glXExtensionSet.size(); + glXExtensionCount = count; } - availableExtensionCache.addAll(glExtensionSet); - availableExtensionCache.addAll(glXExtensionSet); - if (DEBUG) { System.err.println(getThreadName() + ":ExtensionAvailabilityCache: GLX_EXTENSIONS: "+glXExtensionCount); System.err.println(getThreadName() + ":ExtensionAvailabilityCache: GL vendor: " + gl.glGetString(GL.GL_VENDOR)); System.err.println(getThreadName() + ":ExtensionAvailabilityCache: ALL EXTENSIONS: "+availableExtensionCache.size()); } - if(!context.isGLES()) { - int major[] = new int[] { context.getGLVersionMajor() }; - int minor[] = new int[] { context.getGLVersionMinor() }; - while (GLContext.isValidGLVersion(major[0], minor[0])) { - availableExtensionCache.add("GL_VERSION_" + major[0] + "_" + minor[0]); - if (DEBUG) { - System.err.println(getThreadName() + ":ExtensionAvailabilityCache: Added GL_VERSION_" + major[0] + "_" + minor[0] + " to known extensions"); - } - if(!GLContext.decrementGLVersion(major, minor)) break; + final int ctxOptions = context.getCtxOptions(); + final VersionNumber version = context.getGLVersionNumber(); + int major[] = new int[] { version.getMajor() }; + int minor[] = new int[] { version.getMinor() }; + do{ + final String GL_XX_VERSION = ( context.isGLES() ? "GL_ES_VERSION_" : "GL_VERSION_" ) + major[0] + "_" + minor[0]; + availableExtensionCache.put(GL_XX_VERSION, GL_XX_VERSION); + if (DEBUG) { + System.err.println(getThreadName() + ":ExtensionAvailabilityCache: Added "+GL_XX_VERSION+" to known extensions"); } - } + } while( GLContext.decrementGLVersion(ctxOptions, major, minor) ); // put a dummy var in here so that the cache is no longer empty even if // no extensions are in the GL_EXTENSIONS string - availableExtensionCache.add("<INTERNAL_DUMMY_PLACEHOLDER>"); + availableExtensionCache.put("<INTERNAL_DUMMY_PLACEHOLDER>", "<INTERNAL_DUMMY_PLACEHOLDER>"); initialized = true; } @@ -245,10 +255,8 @@ final class ExtensionAvailabilityCache { private int glExtensionCount = 0; private String glXExtensions = null; private int glXExtensionCount = 0; - private HashSet<String> availableExtensionCache = new HashSet<String>(50); + private final HashMap<String, String> availableExtensionCache = new HashMap<String, String>(100); - static String getThreadName() { - return Thread.currentThread().getName(); - } + static String getThreadName() { return Thread.currentThread().getName(); } } |