127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/*
227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich**
327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** Copyright 2009, The Android Open Source Project
427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich**
524ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
624ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** you may not use this file except in compliance with the License.
724ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** You may obtain a copy of the License at
827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich**
924ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
1027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich**
1124ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Unless required by applicable law or agreed to in writing, software
1224ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
1324ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** See the License for the specific language governing permissions and
1527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** limitations under the License.
1627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich*/
1727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
1827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich// This source file is automatically generated
1927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
20bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe#pragma GCC diagnostic ignored "-Wunused-variable"
21bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe#pragma GCC diagnostic ignored "-Wunused-function"
22bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe
232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#include <GLES/gl.h>
242ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#include <GLES/glext.h>
252ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
269626f8203a8c222b8960a49cdc66d540fdb688b0Jesse Hall#include <jni.h>
272279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h>
2827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <android_runtime/AndroidRuntime.h>
2927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <utils/misc.h>
3027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <assert.h>
3127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
3227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic int initialized = 0;
3327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
3427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jclass nioAccessClass;
3527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jclass bufferClass;
3627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBasePointerID;
3727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBaseArrayID;
3827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBaseArrayOffsetID;
3927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID positionID;
4027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID limitID;
4127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID elementSizeShiftID;
4227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian/* special calls implemented in Android's GLES wrapper used to more
452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * efficiently bound-check passed arrays */
462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianextern "C" {
472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_VERSION_ES_CM_1_1
482ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride,
492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        const GLvoid *ptr, GLsizei count);
502ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride,
512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        const GLvoid *pointer, GLsizei count);
522ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type,
532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLsizei stride, const GLvoid *pointer, GLsizei count);
542ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type,
552ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLsizei stride, const GLvoid *pointer, GLsizei count);
562ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glPointSizePointerOESBounds(GLenum type,
572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLsizei stride, const GLvoid *pointer, GLsizei count);
582ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type,
592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLsizei stride, const GLvoid *pointer, GLsizei count);
602ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLsizei stride, const GLvoid *pointer, GLsizei count);
622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif
632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_ES_VERSION_2_0
642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void glVertexAttribPointerBounds(GLuint indx, GLint size, GLenum type,
652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        GLboolean normalized, GLsizei stride, const GLvoid *pointer, GLsizei count) {
662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif
69cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden#ifdef GL_ES_VERSION_3_0
70cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFaddenstatic void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
71cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden        GLsizei stride, const GLvoid *pointer, GLsizei count) {
72cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden    glVertexAttribIPointer(indx, size, type, stride, pointer);
73cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden}
74cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden#endif
752ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
762ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
7727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* Cache method IDs each time the class is loaded. */
7827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
7927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void
8024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass)
8127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{
8227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
8327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
8427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
8527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
8627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
8727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
8827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
8927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            "getBasePointer", "(Ljava/nio/Buffer;)J");
9027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
9127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
9227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
9327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
9427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
9527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    positionID = _env->GetFieldID(bufferClass, "position", "I");
9627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    limitID = _env->GetFieldID(bufferClass, "limit", "I");
9727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    elementSizeShiftID =
9827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
9927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
10027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
10127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void *
10217045a16575ece34cfadb63da4791f115625df78Thomas TafertshofergetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
10327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{
10427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint position;
10527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint limit;
10627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint elementSizeShift;
10727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jlong pointer;
10827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
10927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    position = _env->GetIntField(buffer, positionID);
11027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    limit = _env->GetIntField(buffer, limitID);
11127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
11227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    *remaining = (limit - position) << elementSizeShift;
11327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    pointer = _env->CallStaticLongMethod(nioAccessClass,
11427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            getBasePointerID, buffer);
11527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (pointer != 0L) {
11627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        *array = NULL;
11701c26ea89d4bbea3cf550e9328742302dd9a2b25Ashok Bhat        return reinterpret_cast<void*>(pointer);
11827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
11924ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes
12027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
12127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            getBaseArrayID, buffer);
12217045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    *offset = _env->CallStaticIntMethod(nioAccessClass,
12327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            getBaseArrayOffsetID, buffer);
12424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes
12517045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    return NULL;
12627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
12727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
1283b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ByteArrayGetter {
1293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1303b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jbyteArray array, jboolean* is_copy) {
1313b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetByteArrayElements(array, is_copy);
1323b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1333b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1343b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass BooleanArrayGetter {
1353b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1363b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jbooleanArray array, jboolean* is_copy) {
1373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetBooleanArrayElements(array, is_copy);
1383b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1393b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1403b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass CharArrayGetter {
1413b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1423b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jcharArray array, jboolean* is_copy) {
1433b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetCharArrayElements(array, is_copy);
1443b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1453b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1463b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ShortArrayGetter {
1473b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1483b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jshortArray array, jboolean* is_copy) {
1493b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetShortArrayElements(array, is_copy);
1503b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1513b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1523b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass IntArrayGetter {
1533b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1543b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jintArray array, jboolean* is_copy) {
1553b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetIntArrayElements(array, is_copy);
1563b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1573b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1583b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass LongArrayGetter {
1593b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1603b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jlongArray array, jboolean* is_copy) {
1613b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetLongArrayElements(array, is_copy);
1623b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1633b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1643b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass FloatArrayGetter {
1653b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1663b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jfloatArray array, jboolean* is_copy) {
1673b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetFloatArrayElements(array, is_copy);
1683b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1693b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1703b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass DoubleArrayGetter {
1713b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1723b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void* Get(JNIEnv* _env, jdoubleArray array, jboolean* is_copy) {
1733b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        return _env->GetDoubleArrayElements(array, is_copy);
1743b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1753b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1763b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi
1773b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate<typename JTYPEARRAY, typename ARRAYGETTER>
1783b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchistatic void*
1793b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi YamauchigetArrayPointer(JNIEnv *_env, JTYPEARRAY array, jboolean* is_copy) {
1803b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    return ARRAYGETTER::Get(_env, array, is_copy);
1813b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}
1823b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi
1833b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ByteArrayReleaser {
1843b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1853b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jbyteArray array, jbyte* data, jboolean commit) {
1863b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseByteArrayElements(array, data, commit ? 0 : JNI_ABORT);
1873b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1883b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1893b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass BooleanArrayReleaser {
1903b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1913b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jbooleanArray array, jboolean* data, jboolean commit) {
1923b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseBooleanArrayElements(array, data, commit ? 0 : JNI_ABORT);
1933b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
1943b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
1953b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass CharArrayReleaser {
1963b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
1973b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jcharArray array, jchar* data, jboolean commit) {
1983b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseCharArrayElements(array, data, commit ? 0 : JNI_ABORT);
1993b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2003b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2013b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ShortArrayReleaser {
2023b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
2033b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jshortArray array, jshort* data, jboolean commit) {
2043b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseShortArrayElements(array, data, commit ? 0 : JNI_ABORT);
2053b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2063b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2073b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass IntArrayReleaser {
2083b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
2093b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jintArray array, jint* data, jboolean commit) {
2103b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseIntArrayElements(array, data, commit ? 0 : JNI_ABORT);
2113b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2123b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2133b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass LongArrayReleaser {
2143b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
2153b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jlongArray array, jlong* data, jboolean commit) {
2163b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseLongArrayElements(array, data, commit ? 0 : JNI_ABORT);
2173b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2183b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2193b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass FloatArrayReleaser {
2203b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
2213b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jfloatArray array, jfloat* data, jboolean commit) {
2223b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseFloatArrayElements(array, data, commit ? 0 : JNI_ABORT);
2233b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2243b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2253b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass DoubleArrayReleaser {
2263b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic:
2273b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    static void Release(JNIEnv* _env, jdoubleArray array, jdouble* data, jboolean commit) {
2283b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseDoubleArrayElements(array, data, commit ? 0 : JNI_ABORT);
2293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    }
2303b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi};
2313b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi
2323b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate<typename JTYPEARRAY, typename NTYPEARRAY, typename ARRAYRELEASER>
2333b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchistatic void
2343b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi YamauchireleaseArrayPointer(JNIEnv *_env, JTYPEARRAY array, NTYPEARRAY data, jboolean commit) {
2353b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    ARRAYRELEASER::Release(_env, array, data, commit);
2363b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}
2373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi
23827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void
23927f8002e591b5c579f75b2580183b5d1c4219cd4Jack PalevichreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
24027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{
24127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    _env->ReleasePrimitiveArrayCritical(array, data,
2422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian                       commit ? 0 : JNI_ABORT);
2432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
2442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
2452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void *
2462ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopiangetDirectBufferPointer(JNIEnv *_env, jobject buffer) {
2472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    char* buf = (char*) _env->GetDirectBufferAddress(buffer);
2482ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (buf) {
2492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        jint position = _env->GetIntField(buffer, positionID);
2502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
2512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        buf += position << elementSizeShift;
2522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    } else {
2532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        jniThrowException(_env, "java/lang/IllegalArgumentException",
2542ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian                          "Must use a native order direct Buffer");
2552ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
2562ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    return (void*) buf;
2572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
2582ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
2592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian// --------------------------------------------------------------------------
2602ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
2612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian/*
2622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * returns the number of values glGet returns for a given pname.
2632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian *
2642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * The code below is written such that pnames requiring only one values
2652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * are the default (and are not explicitely tested for). This makes the
2662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * checking code much shorter/readable/efficient.
2672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian *
2682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * This means that unknown pnames (e.g.: extensions) will default to 1. If
2692ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * that unknown pname needs more than 1 value, then the validation check
2702ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * is incomplete and the app may crash if it passed the wrong number params.
2712ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian */
2722ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic int getNeededCount(GLint pname) {
2732ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    int needed = 1;
274dc43a6c99c21e99723058bab4041e80557795a74Romain Guy#ifdef GL_ES_VERSION_3_0
275dc43a6c99c21e99723058bab4041e80557795a74Romain Guy    // GLES 3.x pnames
276dc43a6c99c21e99723058bab4041e80557795a74Romain Guy    switch (pname) {
277dc43a6c99c21e99723058bab4041e80557795a74Romain Guy        case GL_MAX_VIEWPORT_DIMS:
278dc43a6c99c21e99723058bab4041e80557795a74Romain Guy            needed = 2;
279dc43a6c99c21e99723058bab4041e80557795a74Romain Guy            break;
280dc43a6c99c21e99723058bab4041e80557795a74Romain Guy
281dc43a6c99c21e99723058bab4041e80557795a74Romain Guy        case GL_PROGRAM_BINARY_FORMATS:
282dc43a6c99c21e99723058bab4041e80557795a74Romain Guy            glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
283dc43a6c99c21e99723058bab4041e80557795a74Romain Guy            break;
284dc43a6c99c21e99723058bab4041e80557795a74Romain Guy    }
285dc43a6c99c21e99723058bab4041e80557795a74Romain Guy#endif
286dc43a6c99c21e99723058bab4041e80557795a74Romain Guy
2872ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_ES_VERSION_2_0
2882ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // GLES 2.x pnames
2892ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    switch (pname) {
2902ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_ALIASED_LINE_WIDTH_RANGE:
2912ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_ALIASED_POINT_SIZE_RANGE:
2922ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 2;
2932ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
2942ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
2952ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_BLEND_COLOR:
2962ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COLOR_CLEAR_VALUE:
2972ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COLOR_WRITEMASK:
2982ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_SCISSOR_BOX:
2992ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_VIEWPORT:
3002ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 4;
3012ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3022ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3032ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COMPRESSED_TEXTURE_FORMATS:
3042ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed);
3052ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3062ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3072ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_SHADER_BINARY_FORMATS:
3082ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &needed);
3092ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3102ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
3112ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif
3122ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3132ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_VERSION_ES_CM_1_1
3142ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // GLES 1.x pnames
3152ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    switch (pname) {
3162ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_ALIASED_LINE_WIDTH_RANGE:
3172ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_ALIASED_POINT_SIZE_RANGE:
3182ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_DEPTH_RANGE:
3192ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_SMOOTH_LINE_WIDTH_RANGE:
3202ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_SMOOTH_POINT_SIZE_RANGE:
3212ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 2;
3222ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3242ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_CURRENT_NORMAL:
3252ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_POINT_DISTANCE_ATTENUATION:
3262ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 3;
3272ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3282ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3292ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COLOR_CLEAR_VALUE:
3302ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COLOR_WRITEMASK:
3312ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_CURRENT_COLOR:
3322ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_CURRENT_TEXTURE_COORDS:
3332ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_FOG_COLOR:
3342ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_LIGHT_MODEL_AMBIENT:
3352ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_SCISSOR_BOX:
3362ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_VIEWPORT:
3372ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 4;
3382ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3392ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3402ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_MODELVIEW_MATRIX:
3412ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_PROJECTION_MATRIX:
3422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_TEXTURE_MATRIX:
3432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            needed = 16;
3442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        case GL_COMPRESSED_TEXTURE_FORMATS:
3472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed);
3482ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian            break;
3492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
3502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif
3512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    return needed;
3522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
3532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3543b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate <typename JTYPEARRAY, typename ARRAYGETTER, typename NTYPEARRAY,
3553b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi          typename ARRAYRELEASER, typename CTYPE, void GET(GLenum, CTYPE*)>
3562ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void
3572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianget
3582ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian  (JNIEnv *_env, jobject _this, jint pname, JTYPEARRAY params_ref, jint offset) {
3592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    jint _exception = 0;
3602ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionType;
3612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionMessage;
3622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    CTYPE *params_base = (CTYPE *) 0;
3632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    jint _remaining;
3642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    CTYPE *params = (CTYPE *) 0;
3652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    int _needed = 0;
3662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (!params_ref) {
3682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exception = 1;
3692ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionType = "java/lang/IllegalArgumentException";
3702ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionMessage = "params == null";
3712ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        goto exit;
3722ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
3732ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (offset < 0) {
3742ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exception = 1;
3752ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionType = "java/lang/IllegalArgumentException";
3762ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionMessage = "offset < 0";
3772ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        goto exit;
3782ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
3792ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    _remaining = _env->GetArrayLength(params_ref) - offset;
3802ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    _needed = getNeededCount(pname);
3812ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // if we didn't find this pname, we just assume the user passed
3822ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // an array of the right size -- this might happen with extensions
3832ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // or if we forget an enum here.
3842ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (_remaining < _needed) {
3852ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exception = 1;
3862ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionType = "java/lang/IllegalArgumentException";
3872ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionMessage = "length - offset < needed";
3882ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        goto exit;
3892ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
3903b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    params_base = (CTYPE *) getArrayPointer<JTYPEARRAY, ARRAYGETTER>(
3913b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env, params_ref, (jboolean *)0);
3922ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    params = params_base + offset;
3932ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3942ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    GET(
3952ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        (GLenum)pname,
3962ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        (CTYPE *)params
3972ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    );
3982ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
3992ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianexit:
4002ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (params_base) {
4013b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        releaseArrayPointer<JTYPEARRAY, NTYPEARRAY, ARRAYRELEASER>(
4023b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi            _env, params_ref, params_base, !_exception);
4032ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
4042ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (_exception) {
4052ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        jniThrowException(_env, _exceptionType, _exceptionMessage);
4062ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
4072ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian}
4082ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
4092ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
4103b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate <typename CTYPE, typename JTYPEARRAY, typename ARRAYGETTER, typename NTYPEARRAY,
4113b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi          typename ARRAYRELEASER, void GET(GLenum, CTYPE*)>
4122ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void
4132ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopiangetarray
4142ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian  (JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
4152ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    jint _exception = 0;
4162ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionType;
4172ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionMessage;
4183b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    JTYPEARRAY _array = (JTYPEARRAY) 0;
4192ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    jint _bufferOffset = (jint) 0;
4202ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    jint _remaining;
4212ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    CTYPE *params = (CTYPE *) 0;
4222ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    int _needed = 0;
4232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
4243b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    params = (CTYPE *)getPointer(_env, params_buf, (jarray*)&_array, &_remaining, &_bufferOffset);
425cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden    _remaining /= sizeof(CTYPE);    // convert from bytes to item count
4262ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    _needed = getNeededCount(pname);
4272ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // if we didn't find this pname, we just assume the user passed
4282ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // an array of the right size -- this might happen with extensions
4292ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    // or if we forget an enum here.
4302ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (_needed>0 && _remaining < _needed) {
4312ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exception = 1;
4322ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionType = "java/lang/IllegalArgumentException";
4332ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        _exceptionMessage = "remaining() < needed";
4342ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        goto exit;
4352ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
4362ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (params == NULL) {
4373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        char * _paramsBase = (char *) getArrayPointer<JTYPEARRAY, ARRAYGETTER>(
4383b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi            _env, _array, (jboolean *) 0);
4392ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        params = (CTYPE *) (_paramsBase + _bufferOffset);
4402ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
4412ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    GET(
4422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        (GLenum)pname,
4432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        (CTYPE *)params
4442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    );
4452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian
4462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianexit:
4472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (_array) {
4483b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        releaseArrayPointer<JTYPEARRAY, NTYPEARRAY, ARRAYRELEASER>(
4493b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi            _env, _array, (NTYPEARRAY)params, _exception ? JNI_FALSE : JNI_TRUE);
4502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
4512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    if (_exception) {
4522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian        jniThrowException(_env, _exceptionType, _exceptionMessage);
4532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    }
45427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
45527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
45627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich// --------------------------------------------------------------------------
45727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
45827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jint
45927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichandroid_glQueryMatrixxOES___3II_3II
46027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich  (JNIEnv *_env, jobject _this, jintArray mantissa_ref, jint mantissaOffset, jintArray exponent_ref, jint exponentOffset) {
46127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _exception = 0;
4622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionType = NULL;
4632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionMessage = NULL;
46427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLbitfield _returnValue = -1;
46527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLfixed *mantissa_base = (GLfixed *) 0;
46627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _mantissaRemaining;
46727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLfixed *mantissa = (GLfixed *) 0;
46827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLint *exponent_base = (GLint *) 0;
46927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _exponentRemaining;
47027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLint *exponent = (GLint *) 0;
47127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
47227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (!mantissa_ref) {
47327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
4742545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
4752545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "mantissa == null";
47627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
47727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
47827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (mantissaOffset < 0) {
47927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
4802545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
4812545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "mantissaOffset < 0";
48227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
48327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
48427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    _mantissaRemaining = _env->GetArrayLength(mantissa_ref) - mantissaOffset;
48527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (_mantissaRemaining < 16) {
48627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
4872545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
4882545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "length - mantissaOffset < 16 < needed";
48927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
49027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
49127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    mantissa_base = (GLfixed *)
4923b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->GetIntArrayElements(mantissa_ref, (jboolean *)0);
49327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    mantissa = mantissa_base + mantissaOffset;
49427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
49527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (!exponent_ref) {
49627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
4972545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
4982545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "exponent == null";
49927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
50027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
50127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (exponentOffset < 0) {
50227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
5032545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
5042545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "exponentOffset < 0";
50527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
50627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
50727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    _exponentRemaining = _env->GetArrayLength(exponent_ref) - exponentOffset;
50827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (_exponentRemaining < 16) {
50927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
5102545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
5112545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "length - exponentOffset < 16 < needed";
51227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
51327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
51427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    exponent_base = (GLint *)
5153b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->GetIntArrayElements(exponent_ref, (jboolean *)0);
51627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    exponent = exponent_base + exponentOffset;
51727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
51827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    _returnValue = glQueryMatrixxOES(
51927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        (GLfixed *)mantissa,
52027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        (GLint *)exponent
52127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    );
52227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
52327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichexit:
52427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (exponent_base) {
5253b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseIntArrayElements(exponent_ref, (jint*)exponent_base,
52627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            _exception ? JNI_ABORT: 0);
52727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
52827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (mantissa_base) {
5293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseIntArrayElements(mantissa_ref, (jint*)mantissa_base,
53027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich            _exception ? JNI_ABORT: 0);
53127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
5322545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer    if (_exception) {
5332545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        jniThrowException(_env, _exceptionType, _exceptionMessage);
5342545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer    }
535cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden    return (jint)_returnValue;
53627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
53727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
53827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
53927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jint
54027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichandroid_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2
54127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich  (JNIEnv *_env, jobject _this, jobject mantissa_buf, jobject exponent_buf) {
54227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _exception = 0;
5432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionType = NULL;
5442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian    const char * _exceptionMessage = NULL;
5453b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    jintArray _mantissaArray = (jintArray) 0;
54617045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    jint _mantissaBufferOffset = (jint) 0;
5473b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    jintArray _exponentArray = (jintArray) 0;
54817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    jint _exponentBufferOffset = (jint) 0;
54927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLbitfield _returnValue = -1;
55027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _mantissaRemaining;
55127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLfixed *mantissa = (GLfixed *) 0;
55227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    jint _exponentRemaining;
55327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    GLint *exponent = (GLint *) 0;
55427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
55584cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy    if (!mantissa_buf) {
55684cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exception = 1;
55784cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exceptionType = "java/lang/IllegalArgumentException";
55884cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exceptionMessage = "mantissa == null";
55984cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        goto exit;
56084cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy    }
5613b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    mantissa = (GLfixed *)getPointer(_env, mantissa_buf, (jarray*)&_mantissaArray, &_mantissaRemaining, &_mantissaBufferOffset);
56227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (_mantissaRemaining < 16) {
56327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
5642545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
5652545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "remaining() < 16 < needed";
56627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
56727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
56884cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy    if (!exponent_buf) {
56984cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exception = 1;
57084cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exceptionType = "java/lang/IllegalArgumentException";
57184cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        _exceptionMessage = "exponent == null";
57284cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy        goto exit;
57384cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy    }
5743b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi    exponent = (GLint *)getPointer(_env, exponent_buf, (jarray*)&_exponentArray, &_exponentRemaining, &_exponentBufferOffset);
57527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (_exponentRemaining < 16) {
57627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        _exception = 1;
5772545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
5782545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        _exceptionMessage = "remaining() < 16 < needed";
57927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        goto exit;
58027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
58117045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    if (mantissa == NULL) {
5823b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        char * _mantissaBase = (char *)_env->GetIntArrayElements(_mantissaArray, (jboolean *) 0);
58317045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer        mantissa = (GLfixed *) (_mantissaBase + _mantissaBufferOffset);
58417045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    }
58517045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    if (exponent == NULL) {
5863b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        char * _exponentBase = (char *)_env->GetIntArrayElements(_exponentArray, (jboolean *) 0);
58717045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer        exponent = (GLint *) (_exponentBase + _exponentBufferOffset);
58817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    }
58927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    _returnValue = glQueryMatrixxOES(
59027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        (GLfixed *)mantissa,
59127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich        (GLint *)exponent
59227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    );
59327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
59427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichexit:
59527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    if (_exponentArray) {
5963b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseIntArrayElements(_exponentArray, (jint*)exponent, _exception ? JNI_ABORT : 0);
59717045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    }
59817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer    if (_mantissaArray) {
5993b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi        _env->ReleaseIntArrayElements(_mantissaArray, (jint*)mantissa, _exception ? JNI_ABORT : 0);
60027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    }
6012545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer    if (_exception) {
6022545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer        jniThrowException(_env, _exceptionType, _exceptionMessage);
6032545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer    }
604cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden    return (jint)_returnValue;
60527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
60627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
60727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic const char *classPathName = "android/opengl/GLES10Ext";
60827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
60976f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
61027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"_nativeClassInit", "()V", (void*)nativeClassInit },
61127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"glQueryMatrixxOES", "([II[II)I", (void *) android_glQueryMatrixxOES___3II_3II },
61227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"glQueryMatrixxOES", "(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I", (void *) android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 },
61327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich};
61427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich
61527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichint register_android_opengl_jni_GLES10Ext(JNIEnv *_env)
61627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{
61727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    int err;
61827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
61927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich    return err;
62027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}
621