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