1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 49875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 59875750593aae7c2a62f33c620809d49162393ebElliott Hughes** you may not use this file except in compliance with the License. 69875750593aae7c2a62f33c620809d49162393ebElliott Hughes** You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 89875750593aae7c2a62f33c620809d49162393ebElliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 109875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Unless required by applicable law or agreed to in writing, software 119875750593aae7c2a62f33c620809d49162393ebElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 129875750593aae7c2a62f33c620809d49162393ebElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139875750593aae7c2a62f33c620809d49162393ebElliott Hughes** See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// This source file is automatically generated 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "jni.h" 209875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "JNIHelp.h" 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/misc.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 26593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich#include <GLES/glext.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich// Work around differences between the generated name and the actual name. 29e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 30e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glBlendEquation glBlendEquationOES 31e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glBlendEquationSeparate glBlendEquationSeparateOES 32e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glBlendFuncSeparate glBlendFuncSeparateOES 33e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glGetTexGenfv glGetTexGenfvOES 34e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glGetTexGeniv glGetTexGenivOES 35e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glGetTexGenxv glGetTexGenxvOES 36e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGenf glTexGenfOES 37e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGenfv glTexGenfvOES 38e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGeni glTexGeniOES 39e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGeniv glTexGenivOES 40e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGenx glTexGenxOES 41e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich#define glTexGenxv glTexGenxvOES 42e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 43e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 44e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 45d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian/* special calls implemented in Android's GLES wrapper used to more 46d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian * efficiently bound-check passed arrays */ 47d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopianextern "C" { 48d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride, 49d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian const GLvoid *ptr, GLsizei count); 50d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride, 51d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian const GLvoid *pointer, GLsizei count); 52d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type, 53d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 54d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type, 55d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 5666089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichGL_API void GL_APIENTRY glPointSizePointerOESBounds(GLenum type, 5766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich GLsizei stride, const GLvoid *pointer, GLsizei count); 5866089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichGL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type, 5966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich GLsizei stride, const GLvoid *pointer, GLsizei count); 6066089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichGL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, 6166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich GLsizei stride, const GLvoid *pointer, GLsizei count); 62d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian} 63d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int initialized = 0; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass nioAccessClass; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass bufferClass; 68c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevichstatic jclass G11ImplClass; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBasePointerID; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayID; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayOffsetID; 72c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevichstatic jmethodID allowIndirectBuffersID; 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID positionID; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID limitID; 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID elementSizeShiftID; 76e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic jfieldID haveCheckedExtensionsID; 77e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic jfieldID have_OES_blend_equation_separateID; 78e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic jfieldID have_OES_blend_subtractID; 79e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic jfieldID have_OES_framebuffer_objectID; 80e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic jfieldID have_OES_texture_cube_mapID; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* Cache method IDs each time the class is loaded. */ 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevichstatic void 859875750593aae7c2a62f33c620809d49162393ebElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass) 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 93c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich jclass g11impClassLocal = _env->FindClass("com/google/android/gles_jni/GLImpl"); 94c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich G11ImplClass = (jclass) _env->NewGlobalRef(g11impClassLocal); 95e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich haveCheckedExtensionsID = _env->GetFieldID(G11ImplClass, "haveCheckedExtensions", "Z"); 96e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich have_OES_blend_equation_separateID = _env->GetFieldID(G11ImplClass, "have_OES_blend_equation_separate", "Z"); 97e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich have_OES_blend_subtractID = _env->GetFieldID(G11ImplClass, "have_OES_blend_subtract", "Z"); 98e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich have_OES_framebuffer_objectID = _env->GetFieldID(G11ImplClass, "have_OES_framebuffer_object", "Z"); 99e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich have_OES_texture_cube_mapID = _env->GetFieldID(G11ImplClass, "have_OES_texture_cube_map", "Z"); 100c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBasePointer", "(Ljava/nio/Buffer;)J"); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 107c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich allowIndirectBuffersID = _env->GetStaticMethodID(g11impClassLocal, 108c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich "allowIndirectBuffers", "(Ljava/lang/String;)Z"); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project positionID = _env->GetFieldID(bufferClass, "position", "I"); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limitID = _env->GetFieldID(bufferClass, "limit", "I"); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShiftID = 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void * 116e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas TafertshofergetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset) 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint position; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint limit; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint elementSizeShift; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jlong pointer; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project position = _env->GetIntField(buffer, positionID); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limit = _env->GetIntField(buffer, limitID); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *remaining = (limit - position) << elementSizeShift; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pointer = _env->CallStaticLongMethod(nioAccessClass, 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID, buffer); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pointer != 0L) { 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = NULL; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (void *) (jint) pointer; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1339875750593aae7c2a62f33c620809d49162393ebElliott Hughes 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID, buffer); 136c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich if (*array == NULL) { 137c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich return (void*) NULL; 138c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } 139e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer *offset = _env->CallStaticIntMethod(nioAccessClass, 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID, buffer); 1419875750593aae7c2a62f33c620809d49162393ebElliott Hughes 142e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer return NULL; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->ReleasePrimitiveArrayCritical(array, data, 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project commit ? 0 : JNI_ABORT); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 152c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevichextern "C" { 153c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevichextern char* __progname; 154c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich} 155c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich 156c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevichstatic bool 157c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack PalevichallowIndirectBuffers(JNIEnv *_env) { 158c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich static jint sIndirectBufferCompatability; 159c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich if (sIndirectBufferCompatability == 0) { 160c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich jobject appName = _env->NewStringUTF(::__progname); 161c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich sIndirectBufferCompatability = _env->CallStaticBooleanMethod(G11ImplClass, allowIndirectBuffersID, appName) ? 2 : 1; 162c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } 163c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich return sIndirectBufferCompatability == 2; 164c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich} 165c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich 1666eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevichstatic void * 1676eedc8d3b598163f797a2f75d05fdc20809a4364Jack PalevichgetDirectBufferPointer(JNIEnv *_env, jobject buffer) { 168c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich if (!buffer) { 169c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich return NULL; 170c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } 171c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich void* buf = _env->GetDirectBufferAddress(buffer); 1726eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich if (buf) { 1736eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich jint position = _env->GetIntField(buffer, positionID); 1746eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 175c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich buf = ((char*) buf) + (position << elementSizeShift); 1766eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich } else { 177c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich if (allowIndirectBuffers(_env)) { 178c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich jarray array = 0; 179c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich jint remaining; 180e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer jint offset; 181e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer buf = getPointer(_env, buffer, &array, &remaining, &offset); 182c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich if (array) { 183c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich releasePointer(_env, array, buf, 0); 184c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } 185e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer buf = buf + offset; 186c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } else { 1879875750593aae7c2a62f33c620809d49162393ebElliott Hughes jniThrowException(_env, "java/lang/IllegalArgumentException", 1889875750593aae7c2a62f33c620809d49162393ebElliott Hughes "Must use a native order direct Buffer"); 189c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich } 1906eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich } 191c96812cb27ca2fbfe4456c8297e2c77d23d790f1Jack Palevich return buf; 1926eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich} 1936eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich 194593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevichstatic int 195593f203ba3df251b238409bb3fcc66b0a90b856dJack PalevichgetNumCompressedTextureFormats() { 196593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich int numCompressedTextureFormats = 0; 197593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedTextureFormats); 198593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich return numCompressedTextureFormats; 199593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich} 200593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich 201e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich// Check if the extension at the head of pExtensions is pExtension. Note that pExtensions is 202e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich// terminated by either 0 or space, while pExtension is terminated by 0. 203e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 204e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic bool 205e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack PalevichextensionEqual(const GLubyte* pExtensions, const GLubyte* pExtension) { 206e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich while (true) { 207e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich char a = *pExtensions++; 208e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich char b = *pExtension++; 209e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich bool aEnd = a == '\0' || a == ' '; 210e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich bool bEnd = b == '\0'; 211e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if ( aEnd || bEnd) { 212e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return aEnd == bEnd; 213e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 214e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if ( a != b ) { 215e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return false; 216e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 217e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 218e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich} 219e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 220e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic const GLubyte* 221e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack PalevichnextExtension(const GLubyte* pExtensions) { 222e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich while (true) { 223e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich char a = *pExtensions++; 224e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if ( a == '\0') { 225e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return pExtensions-1; 226e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } else if ( a == ' ') { 227e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return pExtensions; 228e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 229e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 230e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich} 2319875750593aae7c2a62f33c620809d49162393ebElliott Hughes 232e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic bool 233e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack PalevichcheckForExtension(const GLubyte* pExtensions, const GLubyte* pExtension) { 234e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich for (;*pExtensions != '\0'; pExtensions = nextExtension(pExtensions)) { 235e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (extensionEqual(pExtensions, pExtension)) { 236e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return true; 237e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 238e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 239e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return false; 240e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich} 241e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 242e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevichstatic bool 243e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack PalevichsupportsExtension(JNIEnv *_env, jobject impl, jfieldID fieldId) { 244e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (!_env->GetBooleanField(impl, haveCheckedExtensionsID)) { 245e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich _env->SetBooleanField(impl, haveCheckedExtensionsID, true); 246e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich const GLubyte* sExtensions = glGetString(GL_EXTENSIONS); 247e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich _env->SetBooleanField(impl, have_OES_blend_equation_separateID, 248e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_equation_separate")); 249e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich _env->SetBooleanField(impl, have_OES_blend_subtractID, 250e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_subtract")); 251e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich _env->SetBooleanField(impl, have_OES_framebuffer_objectID, 252e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich checkForExtension(sExtensions, (const GLubyte*) "GL_OES_framebuffer_object")); 253e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich _env->SetBooleanField(impl, have_OES_texture_cube_mapID, 254e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich checkForExtension(sExtensions, (const GLubyte*) "GL_OES_texture_cube_map")); 255e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 256e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return _env->GetBooleanField(impl, fieldId); 257e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich} 258e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// -------------------------------------------------------------------------- 260