diff options
Diffstat (limited to 'opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp')
-rw-r--r-- | opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp b/opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp index b3d1c6c..c2464b0 100644 --- a/opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp +++ b/opengl/tools/glgen/stubs/jsr239/GLCHeader.cpp @@ -23,6 +23,23 @@ #include <GLES/gl.h> #include <GLES/glext.h> +// Work around differences between the generated name and the actual name. + +#define glBlendEquation glBlendEquationOES +#define glBlendEquationSeparate glBlendEquationSeparateOES +#define glBlendFuncSeparate glBlendFuncSeparateOES +#define glGetTexGenfv glGetTexGenfvOES +#define glGetTexGeniv glGetTexGenivOES +#define glGetTexGenxv glGetTexGenxvOES +#define glTexGenf glTexGenfOES +#define glTexGenfv glTexGenfvOES +#define glTexGeni glTexGeniOES +#define glTexGeniv glTexGenivOES +#define glTexGenx glTexGenxOES +#define glTexGenxv glTexGenxvOES + + + /* special calls implemented in Android's GLES wrapper used to more * efficiently bound-check passed arrays */ extern "C" { @@ -58,6 +75,11 @@ static jmethodID allowIndirectBuffersID; static jfieldID positionID; static jfieldID limitID; static jfieldID elementSizeShiftID; +static jfieldID haveCheckedExtensionsID; +static jfieldID have_OES_blend_equation_separateID; +static jfieldID have_OES_blend_subtractID; +static jfieldID have_OES_framebuffer_objectID; +static jfieldID have_OES_texture_cube_mapID; /* Cache method IDs each time the class is loaded. */ @@ -72,6 +94,11 @@ nativeClassInitBuffer(JNIEnv *_env) jclass g11impClassLocal = _env->FindClass("com/google/android/gles_jni/GLImpl"); G11ImplClass = (jclass) _env->NewGlobalRef(g11impClassLocal); + haveCheckedExtensionsID = _env->GetFieldID(G11ImplClass, "haveCheckedExtensions", "Z"); + have_OES_blend_equation_separateID = _env->GetFieldID(G11ImplClass, "have_OES_blend_equation_separate", "Z"); + have_OES_blend_subtractID = _env->GetFieldID(G11ImplClass, "have_OES_blend_subtract", "Z"); + have_OES_framebuffer_objectID = _env->GetFieldID(G11ImplClass, "have_OES_framebuffer_object", "Z"); + have_OES_texture_cube_mapID = _env->GetFieldID(G11ImplClass, "have_OES_texture_cube_map", "Z"); getBasePointerID = _env->GetStaticMethodID(nioAccessClass, "getBasePointer", "(Ljava/nio/Buffer;)J"); @@ -193,5 +220,63 @@ getNumCompressedTextureFormats() { return numCompressedTextureFormats; } +// Check if the extension at the head of pExtensions is pExtension. Note that pExtensions is +// terminated by either 0 or space, while pExtension is terminated by 0. + +static bool +extensionEqual(const GLubyte* pExtensions, const GLubyte* pExtension) { + while (true) { + char a = *pExtensions++; + char b = *pExtension++; + bool aEnd = a == '\0' || a == ' '; + bool bEnd = b == '\0'; + if ( aEnd || bEnd) { + return aEnd == bEnd; + } + if ( a != b ) { + return false; + } + } +} + +static const GLubyte* +nextExtension(const GLubyte* pExtensions) { + while (true) { + char a = *pExtensions++; + if ( a == '\0') { + return pExtensions-1; + } else if ( a == ' ') { + return pExtensions; + } + } +} + +static bool +checkForExtension(const GLubyte* pExtensions, const GLubyte* pExtension) { + for (;*pExtensions != '\0'; pExtensions = nextExtension(pExtensions)) { + if (extensionEqual(pExtensions, pExtension)) { + return true; + } + } + return false; +} + +static bool +supportsExtension(JNIEnv *_env, jobject impl, jfieldID fieldId) { + if (!_env->GetBooleanField(impl, haveCheckedExtensionsID)) { + _env->SetBooleanField(impl, haveCheckedExtensionsID, true); + const GLubyte* sExtensions = glGetString(GL_EXTENSIONS); + _env->SetBooleanField(impl, have_OES_blend_equation_separateID, + checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_equation_separate")); + _env->SetBooleanField(impl, have_OES_blend_subtractID, + checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_subtract")); + _env->SetBooleanField(impl, have_OES_framebuffer_objectID, + checkForExtension(sExtensions, (const GLubyte*) "GL_OES_framebuffer_object")); + _env->SetBooleanField(impl, have_OES_texture_cube_mapID, + checkForExtension(sExtensions, (const GLubyte*) "GL_OES_texture_cube_map")); + } + return _env->GetBooleanField(impl, fieldId); +} + // -------------------------------------------------------------------------- |