Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 // This source file is automatically generated
     18 
     19 #include <stdint.h>
     20 #include <GLES3/gl31.h>
     21 #include <jni.h>
     22 #include <JNIHelp.h>
     23 #include <android_runtime/AndroidRuntime.h>
     24 #include <utils/misc.h>
     25 #include <assert.h>
     26 
     27 static int initialized = 0;
     28 
     29 static jclass nioAccessClass;
     30 static jclass bufferClass;
     31 static jmethodID getBasePointerID;
     32 static jmethodID getBaseArrayID;
     33 static jmethodID getBaseArrayOffsetID;
     34 static jfieldID positionID;
     35 static jfieldID limitID;
     36 static jfieldID elementSizeShiftID;
     37 
     38 
     39 /* special calls implemented in Android's GLES wrapper used to more
     40  * efficiently bound-check passed arrays */
     41 extern "C" {
     42 #ifdef GL_VERSION_ES_CM_1_1
     43 GL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride,
     44         const GLvoid *ptr, GLsizei count);
     45 GL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride,
     46         const GLvoid *pointer, GLsizei count);
     47 GL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type,
     48         GLsizei stride, const GLvoid *pointer, GLsizei count);
     49 GL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type,
     50         GLsizei stride, const GLvoid *pointer, GLsizei count);
     51 GL_API void GL_APIENTRY glPointSizePointerOESBounds(GLenum type,
     52         GLsizei stride, const GLvoid *pointer, GLsizei count);
     53 GL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type,
     54         GLsizei stride, const GLvoid *pointer, GLsizei count);
     55 GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
     56         GLsizei stride, const GLvoid *pointer, GLsizei count);
     57 #endif
     58 #ifdef GL_ES_VERSION_2_0
     59 static void glVertexAttribPointerBounds(GLuint indx, GLint size, GLenum type,
     60         GLboolean normalized, GLsizei stride, const GLvoid *pointer, GLsizei count) {
     61     glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
     62 }
     63 #endif
     64 #ifdef GL_ES_VERSION_3_0
     65 static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
     66         GLsizei stride, const GLvoid *pointer, GLsizei count) {
     67     glVertexAttribIPointer(indx, size, type, stride, pointer);
     68 }
     69 #endif
     70 }
     71 
     72 /* Cache method IDs each time the class is loaded. */
     73 
     74 static void
     75 nativeClassInit(JNIEnv *_env, jclass glImplClass)
     76 {
     77     jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
     78     nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
     79 
     80     jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
     81     bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
     82 
     83     getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
     84             "getBasePointer", "(Ljava/nio/Buffer;)J");
     85     getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
     86             "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
     87     getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
     88             "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
     89 
     90     positionID = _env->GetFieldID(bufferClass, "position", "I");
     91     limitID = _env->GetFieldID(bufferClass, "limit", "I");
     92     elementSizeShiftID =
     93         _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
     94 }
     95 
     96 static void *
     97 getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
     98 {
     99     jint position;
    100     jint limit;
    101     jint elementSizeShift;
    102     jlong pointer;
    103 
    104     position = _env->GetIntField(buffer, positionID);
    105     limit = _env->GetIntField(buffer, limitID);
    106     elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
    107     *remaining = (limit - position) << elementSizeShift;
    108     pointer = _env->CallStaticLongMethod(nioAccessClass,
    109             getBasePointerID, buffer);
    110     if (pointer != 0L) {
    111         *array = NULL;
    112         return reinterpret_cast<void*>(pointer);
    113     }
    114 
    115     *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
    116             getBaseArrayID, buffer);
    117     *offset = _env->CallStaticIntMethod(nioAccessClass,
    118             getBaseArrayOffsetID, buffer);
    119 
    120     return NULL;
    121 }
    122 
    123 static void
    124 releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
    125 {
    126     _env->ReleasePrimitiveArrayCritical(array, data,
    127                        commit ? 0 : JNI_ABORT);
    128 }
    129 
    130 static void *
    131 getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
    132     char* buf = (char*) _env->GetDirectBufferAddress(buffer);
    133     if (buf) {
    134         jint position = _env->GetIntField(buffer, positionID);
    135         jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
    136         buf += position << elementSizeShift;
    137     } else {
    138         jniThrowException(_env, "java/lang/IllegalArgumentException",
    139                           "Must use a native order direct Buffer");
    140     }
    141     return (void*) buf;
    142 }
    143 
    144 // --------------------------------------------------------------------------
    145 
    146 /*
    147  * returns the number of values glGet returns for a given pname.
    148  *
    149  * The code below is written such that pnames requiring only one values
    150  * are the default (and are not explicitely tested for). This makes the
    151  * checking code much shorter/readable/efficient.
    152  *
    153  * This means that unknown pnames (e.g.: extensions) will default to 1. If
    154  * that unknown pname needs more than 1 value, then the validation check
    155  * is incomplete and the app may crash if it passed the wrong number params.
    156  */
    157 static int getNeededCount(GLint pname) {
    158     int needed = 1;
    159 #ifdef GL_ES_VERSION_2_0
    160     // GLES 2.x pnames
    161     switch (pname) {
    162         case GL_ALIASED_LINE_WIDTH_RANGE:
    163         case GL_ALIASED_POINT_SIZE_RANGE:
    164             needed = 2;
    165             break;
    166 
    167         case GL_BLEND_COLOR:
    168         case GL_COLOR_CLEAR_VALUE:
    169         case GL_COLOR_WRITEMASK:
    170         case GL_SCISSOR_BOX:
    171         case GL_VIEWPORT:
    172             needed = 4;
    173             break;
    174 
    175         case GL_COMPRESSED_TEXTURE_FORMATS:
    176             glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed);
    177             break;
    178 
    179         case GL_SHADER_BINARY_FORMATS:
    180             glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &needed);
    181             break;
    182     }
    183 #endif
    184 
    185 #ifdef GL_VERSION_ES_CM_1_1
    186     // GLES 1.x pnames
    187     switch (pname) {
    188         case GL_ALIASED_LINE_WIDTH_RANGE:
    189         case GL_ALIASED_POINT_SIZE_RANGE:
    190         case GL_DEPTH_RANGE:
    191         case GL_SMOOTH_LINE_WIDTH_RANGE:
    192         case GL_SMOOTH_POINT_SIZE_RANGE:
    193             needed = 2;
    194             break;
    195 
    196         case GL_CURRENT_NORMAL:
    197         case GL_POINT_DISTANCE_ATTENUATION:
    198             needed = 3;
    199             break;
    200 
    201         case GL_COLOR_CLEAR_VALUE:
    202         case GL_COLOR_WRITEMASK:
    203         case GL_CURRENT_COLOR:
    204         case GL_CURRENT_TEXTURE_COORDS:
    205         case GL_FOG_COLOR:
    206         case GL_LIGHT_MODEL_AMBIENT:
    207         case GL_SCISSOR_BOX:
    208         case GL_VIEWPORT:
    209             needed = 4;
    210             break;
    211 
    212         case GL_MODELVIEW_MATRIX:
    213         case GL_PROJECTION_MATRIX:
    214         case GL_TEXTURE_MATRIX:
    215             needed = 16;
    216             break;
    217 
    218         case GL_COMPRESSED_TEXTURE_FORMATS:
    219             glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed);
    220             break;
    221     }
    222 #endif
    223     return needed;
    224 }
    225 
    226 template <typename JTYPEARRAY, typename CTYPE, void GET(GLenum, CTYPE*)>
    227 static void
    228 get
    229   (JNIEnv *_env, jobject _this, jint pname, JTYPEARRAY params_ref, jint offset) {
    230     jint _exception = 0;
    231     const char * _exceptionType;
    232     const char * _exceptionMessage;
    233     CTYPE *params_base = (CTYPE *) 0;
    234     jint _remaining;
    235     CTYPE *params = (CTYPE *) 0;
    236     int _needed = 0;
    237 
    238     if (!params_ref) {
    239         _exception = 1;
    240         _exceptionType = "java/lang/IllegalArgumentException";
    241         _exceptionMessage = "params == null";
    242         goto exit;
    243     }
    244     if (offset < 0) {
    245         _exception = 1;
    246         _exceptionType = "java/lang/IllegalArgumentException";
    247         _exceptionMessage = "offset < 0";
    248         goto exit;
    249     }
    250     _remaining = _env->GetArrayLength(params_ref) - offset;
    251     _needed = getNeededCount(pname);
    252     // if we didn't find this pname, we just assume the user passed
    253     // an array of the right size -- this might happen with extensions
    254     // or if we forget an enum here.
    255     if (_remaining < _needed) {
    256         _exception = 1;
    257         _exceptionType = "java/lang/IllegalArgumentException";
    258         _exceptionMessage = "length - offset < needed";
    259         goto exit;
    260     }
    261     params_base = (CTYPE *)
    262         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
    263     params = params_base + offset;
    264 
    265     GET(
    266         (GLenum)pname,
    267         (CTYPE *)params
    268     );
    269 
    270 exit:
    271     if (params_base) {
    272         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
    273             _exception ? JNI_ABORT: 0);
    274     }
    275     if (_exception) {
    276         jniThrowException(_env, _exceptionType, _exceptionMessage);
    277     }
    278 }
    279 
    280 
    281 template <typename CTYPE, void GET(GLenum, CTYPE*)>
    282 static void
    283 getarray
    284   (JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
    285     jint _exception = 0;
    286     const char * _exceptionType;
    287     const char * _exceptionMessage;
    288     jarray _array = (jarray) 0;
    289     jint _bufferOffset = (jint) 0;
    290     jint _remaining;
    291     CTYPE *params = (CTYPE *) 0;
    292     int _needed = 0;
    293 
    294     params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
    295     _remaining /= sizeof(CTYPE);    // convert from bytes to item count
    296     _needed = getNeededCount(pname);
    297     // if we didn't find this pname, we just assume the user passed
    298     // an array of the right size -- this might happen with extensions
    299     // or if we forget an enum here.
    300     if (_needed>0 && _remaining < _needed) {
    301         _exception = 1;
    302         _exceptionType = "java/lang/IllegalArgumentException";
    303         _exceptionMessage = "remaining() < needed";
    304         goto exit;
    305     }
    306     if (params == NULL) {
    307         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    308         params = (CTYPE *) (_paramsBase + _bufferOffset);
    309     }
    310     GET(
    311         (GLenum)pname,
    312         (CTYPE *)params
    313     );
    314 
    315 exit:
    316     if (_array) {
    317         releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
    318     }
    319     if (_exception) {
    320         jniThrowException(_env, _exceptionType, _exceptionMessage);
    321     }
    322 }
    323 
    324 // --------------------------------------------------------------------------
    325 /* void glDispatchCompute ( GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z ) */
    326 static void
    327 android_glDispatchCompute__III
    328   (JNIEnv *_env, jobject _this, jint num_groups_x, jint num_groups_y, jint num_groups_z) {
    329     glDispatchCompute(
    330         (GLuint)num_groups_x,
    331         (GLuint)num_groups_y,
    332         (GLuint)num_groups_z
    333     );
    334 }
    335 
    336 /* void glDispatchComputeIndirect ( GLintptr indirect ) */
    337 static void android_glDispatchComputeIndirect(JNIEnv *_env, jobject, jlong indirect) {
    338     // 'indirect' is a byte offset, not a pointer. GL checks for negative and too-large values.
    339     // Here we only need to check for successful 64-bit to 32-bit conversion.
    340     // - jlong is a int64_t (jni.h)
    341     // - GLintptr is a long (khrplatform.h)
    342     if (sizeof(GLintptr) != sizeof(jlong) && (indirect < LONG_MIN || indirect > LONG_MAX)) {
    343         jniThrowException(_env, "java/lang/IllegalArgumentException", "indirect offset too large");
    344         return;
    345     }
    346     glDispatchComputeIndirect((GLintptr)indirect);
    347 }
    348 
    349 /* void glDrawArraysIndirect ( GLenum mode, const void *indirect ) */
    350 static void android_glDrawArraysIndirect(JNIEnv *_env, jobject, int mode, jlong indirect) {
    351     // In OpenGL ES, 'indirect' is a byte offset into a buffer, not a raw pointer.
    352     // GL checks for too-large values. Here we only need to check for successful signed 64-bit
    353     // to unsigned 32-bit conversion.
    354     if (sizeof(void*) != sizeof(jlong) && indirect > UINTPTR_MAX) {
    355         jniThrowException(_env, "java/lang/IllegalArgumentException", "indirect offset too large");
    356         return;
    357     }
    358     glDrawArraysIndirect(mode, (const void*)indirect);
    359 }
    360 
    361 /* void glDrawElementsIndirect ( GLenum mode, GLenum type, const void *indirect ) */
    362 static void android_glDrawElementsIndirect(JNIEnv *_env, jobject, jint mode, jint type, jlong indirect) {
    363     // In OpenGL ES, 'indirect' is a byte offset into a buffer, not a raw pointer.
    364     // GL checks for too-large values. Here we only need to check for successful signed 64-bit
    365     // to unsigned 32-bit conversion.
    366     if (sizeof(void*) != sizeof(jlong) && indirect > UINTPTR_MAX) {
    367         jniThrowException(_env, "java/lang/IllegalArgumentException", "indirect offset too large");
    368         return;
    369     }
    370     glDrawElementsIndirect(mode, type, (const void*)indirect);
    371 }
    372 
    373 /* void glFramebufferParameteri ( GLenum target, GLenum pname, GLint param ) */
    374 static void
    375 android_glFramebufferParameteri__III
    376   (JNIEnv *_env, jobject _this, jint target, jint pname, jint param) {
    377     glFramebufferParameteri(
    378         (GLenum)target,
    379         (GLenum)pname,
    380         (GLint)param
    381     );
    382 }
    383 
    384 /* void glGetFramebufferParameteriv ( GLenum target, GLenum pname, GLint *params ) */
    385 static void
    386 android_glGetFramebufferParameteriv__II_3II
    387   (JNIEnv *_env, jobject _this, jint target, jint pname, jintArray params_ref, jint offset) {
    388     jint _exception = 0;
    389     const char * _exceptionType = NULL;
    390     const char * _exceptionMessage = NULL;
    391     GLint *params_base = (GLint *) 0;
    392     jint _remaining;
    393     GLint *params = (GLint *) 0;
    394 
    395     if (!params_ref) {
    396         _exception = 1;
    397         _exceptionType = "java/lang/IllegalArgumentException";
    398         _exceptionMessage = "params == null";
    399         goto exit;
    400     }
    401     if (offset < 0) {
    402         _exception = 1;
    403         _exceptionType = "java/lang/IllegalArgumentException";
    404         _exceptionMessage = "offset < 0";
    405         goto exit;
    406     }
    407     _remaining = _env->GetArrayLength(params_ref) - offset;
    408     params_base = (GLint *)
    409         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
    410     params = params_base + offset;
    411 
    412     glGetFramebufferParameteriv(
    413         (GLenum)target,
    414         (GLenum)pname,
    415         (GLint *)params
    416     );
    417 
    418 exit:
    419     if (params_base) {
    420         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
    421             _exception ? JNI_ABORT: 0);
    422     }
    423     if (_exception) {
    424         jniThrowException(_env, _exceptionType, _exceptionMessage);
    425     }
    426 }
    427 
    428 /* void glGetFramebufferParameteriv ( GLenum target, GLenum pname, GLint *params ) */
    429 static void
    430 android_glGetFramebufferParameteriv__IILjava_nio_IntBuffer_2
    431   (JNIEnv *_env, jobject _this, jint target, jint pname, jobject params_buf) {
    432     jarray _array = (jarray) 0;
    433     jint _bufferOffset = (jint) 0;
    434     jint _remaining;
    435     GLint *params = (GLint *) 0;
    436 
    437     params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
    438     if (params == NULL) {
    439         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    440         params = (GLint *) (_paramsBase + _bufferOffset);
    441     }
    442     glGetFramebufferParameteriv(
    443         (GLenum)target,
    444         (GLenum)pname,
    445         (GLint *)params
    446     );
    447     if (_array) {
    448         releasePointer(_env, _array, params, JNI_TRUE);
    449     }
    450 }
    451 
    452 /* void glGetProgramInterfaceiv ( GLuint program, GLenum programInterface, GLenum pname, GLint *params ) */
    453 static void
    454 android_glGetProgramInterfaceiv__III_3II
    455   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jint pname, jintArray params_ref, jint offset) {
    456     jint _exception = 0;
    457     const char * _exceptionType = NULL;
    458     const char * _exceptionMessage = NULL;
    459     GLint *params_base = (GLint *) 0;
    460     jint _remaining;
    461     GLint *params = (GLint *) 0;
    462 
    463     if (!params_ref) {
    464         _exception = 1;
    465         _exceptionType = "java/lang/IllegalArgumentException";
    466         _exceptionMessage = "params == null";
    467         goto exit;
    468     }
    469     if (offset < 0) {
    470         _exception = 1;
    471         _exceptionType = "java/lang/IllegalArgumentException";
    472         _exceptionMessage = "offset < 0";
    473         goto exit;
    474     }
    475     _remaining = _env->GetArrayLength(params_ref) - offset;
    476     params_base = (GLint *)
    477         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
    478     params = params_base + offset;
    479 
    480     glGetProgramInterfaceiv(
    481         (GLuint)program,
    482         (GLenum)programInterface,
    483         (GLenum)pname,
    484         (GLint *)params
    485     );
    486 
    487 exit:
    488     if (params_base) {
    489         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
    490             _exception ? JNI_ABORT: 0);
    491     }
    492     if (_exception) {
    493         jniThrowException(_env, _exceptionType, _exceptionMessage);
    494     }
    495 }
    496 
    497 /* void glGetProgramInterfaceiv ( GLuint program, GLenum programInterface, GLenum pname, GLint *params ) */
    498 static void
    499 android_glGetProgramInterfaceiv__IIILjava_nio_IntBuffer_2
    500   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jint pname, jobject params_buf) {
    501     jarray _array = (jarray) 0;
    502     jint _bufferOffset = (jint) 0;
    503     jint _remaining;
    504     GLint *params = (GLint *) 0;
    505 
    506     params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
    507     if (params == NULL) {
    508         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    509         params = (GLint *) (_paramsBase + _bufferOffset);
    510     }
    511     glGetProgramInterfaceiv(
    512         (GLuint)program,
    513         (GLenum)programInterface,
    514         (GLenum)pname,
    515         (GLint *)params
    516     );
    517     if (_array) {
    518         releasePointer(_env, _array, params, JNI_TRUE);
    519     }
    520 }
    521 
    522 /* GLuint glGetProgramResourceIndex ( GLuint program, GLenum programInterface, const GLchar *name ) */
    523 static jint
    524 android_glGetProgramResourceIndex__IILjava_lang_String_2
    525   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jstring name) {
    526     jint _exception = 0;
    527     const char * _exceptionType = NULL;
    528     const char * _exceptionMessage = NULL;
    529     GLuint _returnValue = 0;
    530     const char* _nativename = 0;
    531 
    532     if (!name) {
    533         _exception = 1;
    534         _exceptionType = "java/lang/IllegalArgumentException";
    535         _exceptionMessage = "name == null";
    536         goto exit;
    537     }
    538     _nativename = _env->GetStringUTFChars(name, 0);
    539 
    540     _returnValue = glGetProgramResourceIndex(
    541         (GLuint)program,
    542         (GLenum)programInterface,
    543         (GLchar *)_nativename
    544     );
    545 
    546 exit:
    547     if (_nativename) {
    548         _env->ReleaseStringUTFChars(name, _nativename);
    549     }
    550 
    551     if (_exception) {
    552         jniThrowException(_env, _exceptionType, _exceptionMessage);
    553     }
    554     return (jint)_returnValue;
    555 }
    556 
    557 /* void glGetProgramResourceName ( GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name ) */
    558 static jstring
    559 android_glGetProgramResourceName
    560   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jint index) {
    561     jniThrowException(_env, "java/lang/UnsupportedOperationException", "not yet implemented");
    562     return NULL;
    563 }
    564 
    565 /* void glGetProgramResourceiv ( GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params ) */
    566 static void
    567 android_glGetProgramResourceiv__IIII_3III_3II_3II
    568   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jint index, jint propCount, jintArray props_ref, jint propsOffset, jint bufSize, jintArray length_ref, jint lengthOffset, jintArray params_ref, jint paramsOffset) {
    569     jint _exception = 0;
    570     const char * _exceptionType = NULL;
    571     const char * _exceptionMessage = NULL;
    572     GLenum *props_base = (GLenum *) 0;
    573     jint _propsRemaining;
    574     GLenum *props = (GLenum *) 0;
    575     GLsizei *length_base = (GLsizei *) 0;
    576     jint _lengthRemaining;
    577     GLsizei *length = (GLsizei *) 0;
    578     GLint *params_base = (GLint *) 0;
    579     jint _paramsRemaining;
    580     GLint *params = (GLint *) 0;
    581 
    582     if (!props_ref) {
    583         _exception = 1;
    584         _exceptionType = "java/lang/IllegalArgumentException";
    585         _exceptionMessage = "props == null";
    586         goto exit;
    587     }
    588     if (propsOffset < 0) {
    589         _exception = 1;
    590         _exceptionType = "java/lang/IllegalArgumentException";
    591         _exceptionMessage = "propsOffset < 0";
    592         goto exit;
    593     }
    594     _propsRemaining = _env->GetArrayLength(props_ref) - propsOffset;
    595     props_base = (GLenum *)
    596         _env->GetPrimitiveArrayCritical(props_ref, (jboolean *)0);
    597     props = props_base + propsOffset;
    598 
    599     if (!length_ref) {
    600         _exception = 1;
    601         _exceptionType = "java/lang/IllegalArgumentException";
    602         _exceptionMessage = "length == null";
    603         goto exit;
    604     }
    605     if (lengthOffset < 0) {
    606         _exception = 1;
    607         _exceptionType = "java/lang/IllegalArgumentException";
    608         _exceptionMessage = "lengthOffset < 0";
    609         goto exit;
    610     }
    611     _lengthRemaining = _env->GetArrayLength(length_ref) - lengthOffset;
    612     length_base = (GLsizei *)
    613         _env->GetPrimitiveArrayCritical(length_ref, (jboolean *)0);
    614     length = length_base + lengthOffset;
    615 
    616     if (!params_ref) {
    617         _exception = 1;
    618         _exceptionType = "java/lang/IllegalArgumentException";
    619         _exceptionMessage = "params == null";
    620         goto exit;
    621     }
    622     if (paramsOffset < 0) {
    623         _exception = 1;
    624         _exceptionType = "java/lang/IllegalArgumentException";
    625         _exceptionMessage = "paramsOffset < 0";
    626         goto exit;
    627     }
    628     _paramsRemaining = _env->GetArrayLength(params_ref) - paramsOffset;
    629     params_base = (GLint *)
    630         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
    631     params = params_base + paramsOffset;
    632 
    633     glGetProgramResourceiv(
    634         (GLuint)program,
    635         (GLenum)programInterface,
    636         (GLuint)index,
    637         (GLsizei)propCount,
    638         (GLenum *)props,
    639         (GLsizei)bufSize,
    640         (GLsizei *)length,
    641         (GLint *)params
    642     );
    643 
    644 exit:
    645     if (params_base) {
    646         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
    647             _exception ? JNI_ABORT: 0);
    648     }
    649     if (length_base) {
    650         _env->ReleasePrimitiveArrayCritical(length_ref, length_base,
    651             _exception ? JNI_ABORT: 0);
    652     }
    653     if (props_base) {
    654         _env->ReleasePrimitiveArrayCritical(props_ref, props_base,
    655             JNI_ABORT);
    656     }
    657     if (_exception) {
    658         jniThrowException(_env, _exceptionType, _exceptionMessage);
    659     }
    660 }
    661 
    662 /* void glGetProgramResourceiv ( GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params ) */
    663 static void
    664 android_glGetProgramResourceiv__IIIILjava_nio_IntBuffer_2ILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2
    665   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jint index, jint propCount, jobject props_buf, jint bufSize, jobject length_buf, jobject params_buf) {
    666     jarray _propsArray = (jarray) 0;
    667     jint _propsBufferOffset = (jint) 0;
    668     jarray _lengthArray = (jarray) 0;
    669     jint _lengthBufferOffset = (jint) 0;
    670     jarray _paramsArray = (jarray) 0;
    671     jint _paramsBufferOffset = (jint) 0;
    672     jint _propsRemaining;
    673     GLenum *props = (GLenum *) 0;
    674     jint _lengthRemaining;
    675     GLsizei *length = (GLsizei *) 0;
    676     jint _paramsRemaining;
    677     GLint *params = (GLint *) 0;
    678 
    679     props = (GLenum *)getPointer(_env, props_buf, &_propsArray, &_propsRemaining, &_propsBufferOffset);
    680     length = (GLsizei *)getPointer(_env, length_buf, &_lengthArray, &_lengthRemaining, &_lengthBufferOffset);
    681     params = (GLint *)getPointer(_env, params_buf, &_paramsArray, &_paramsRemaining, &_paramsBufferOffset);
    682     if (props == NULL) {
    683         char * _propsBase = (char *)_env->GetPrimitiveArrayCritical(_propsArray, (jboolean *) 0);
    684         props = (GLenum *) (_propsBase + _propsBufferOffset);
    685     }
    686     if (length == NULL) {
    687         char * _lengthBase = (char *)_env->GetPrimitiveArrayCritical(_lengthArray, (jboolean *) 0);
    688         length = (GLsizei *) (_lengthBase + _lengthBufferOffset);
    689     }
    690     if (params == NULL) {
    691         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_paramsArray, (jboolean *) 0);
    692         params = (GLint *) (_paramsBase + _paramsBufferOffset);
    693     }
    694     glGetProgramResourceiv(
    695         (GLuint)program,
    696         (GLenum)programInterface,
    697         (GLuint)index,
    698         (GLsizei)propCount,
    699         (GLenum *)props,
    700         (GLsizei)bufSize,
    701         (GLsizei *)length,
    702         (GLint *)params
    703     );
    704     if (_paramsArray) {
    705         releasePointer(_env, _paramsArray, params, JNI_TRUE);
    706     }
    707     if (_lengthArray) {
    708         releasePointer(_env, _lengthArray, length, JNI_TRUE);
    709     }
    710     if (_propsArray) {
    711         releasePointer(_env, _propsArray, props, JNI_FALSE);
    712     }
    713 }
    714 
    715 /* GLint glGetProgramResourceLocation ( GLuint program, GLenum programInterface, const GLchar *name ) */
    716 static jint
    717 android_glGetProgramResourceLocation__IILjava_lang_String_2
    718   (JNIEnv *_env, jobject _this, jint program, jint programInterface, jstring name) {
    719     jint _exception = 0;
    720     const char * _exceptionType = NULL;
    721     const char * _exceptionMessage = NULL;
    722     GLint _returnValue = 0;
    723     const char* _nativename = 0;
    724 
    725     if (!name) {
    726         _exception = 1;
    727         _exceptionType = "java/lang/IllegalArgumentException";
    728         _exceptionMessage = "name == null";
    729         goto exit;
    730     }
    731     _nativename = _env->GetStringUTFChars(name, 0);
    732 
    733     _returnValue = glGetProgramResourceLocation(
    734         (GLuint)program,
    735         (GLenum)programInterface,
    736         (GLchar *)_nativename
    737     );
    738 
    739 exit:
    740     if (_nativename) {
    741         _env->ReleaseStringUTFChars(name, _nativename);
    742     }
    743 
    744     if (_exception) {
    745         jniThrowException(_env, _exceptionType, _exceptionMessage);
    746     }
    747     return (jint)_returnValue;
    748 }
    749 
    750 /* void glUseProgramStages ( GLuint pipeline, GLbitfield stages, GLuint program ) */
    751 static void
    752 android_glUseProgramStages__III
    753   (JNIEnv *_env, jobject _this, jint pipeline, jint stages, jint program) {
    754     glUseProgramStages(
    755         (GLuint)pipeline,
    756         (GLbitfield)stages,
    757         (GLuint)program
    758     );
    759 }
    760 
    761 /* void glActiveShaderProgram ( GLuint pipeline, GLuint program ) */
    762 static void
    763 android_glActiveShaderProgram__II
    764   (JNIEnv *_env, jobject _this, jint pipeline, jint program) {
    765     glActiveShaderProgram(
    766         (GLuint)pipeline,
    767         (GLuint)program
    768     );
    769 }
    770 
    771 /* GLuint glCreateShaderProgramv ( GLenum type, GLsizei count, const GLchar *const *strings ) */
    772 static jint
    773 android_glCreateShaderProgramv
    774   (JNIEnv *_env, jobject _this, jint type, jobjectArray strings) {
    775 
    776     jniThrowException(_env, "java/lang/UnsupportedOperationException", "not yet implemented");
    777     return 0;
    778 }
    779 /* void glBindProgramPipeline ( GLuint pipeline ) */
    780 static void
    781 android_glBindProgramPipeline__I
    782   (JNIEnv *_env, jobject _this, jint pipeline) {
    783     glBindProgramPipeline(
    784         (GLuint)pipeline
    785     );
    786 }
    787 
    788 /* void glDeleteProgramPipelines ( GLsizei n, const GLuint *pipelines ) */
    789 static void
    790 android_glDeleteProgramPipelines__I_3II
    791   (JNIEnv *_env, jobject _this, jint n, jintArray pipelines_ref, jint offset) {
    792     jint _exception = 0;
    793     const char * _exceptionType = NULL;
    794     const char * _exceptionMessage = NULL;
    795     GLuint *pipelines_base = (GLuint *) 0;
    796     jint _remaining;
    797     GLuint *pipelines = (GLuint *) 0;
    798 
    799     if (!pipelines_ref) {
    800         _exception = 1;
    801         _exceptionType = "java/lang/IllegalArgumentException";
    802         _exceptionMessage = "pipelines == null";
    803         goto exit;
    804     }
    805     if (offset < 0) {
    806         _exception = 1;
    807         _exceptionType = "java/lang/IllegalArgumentException";
    808         _exceptionMessage = "offset < 0";
    809         goto exit;
    810     }
    811     _remaining = _env->GetArrayLength(pipelines_ref) - offset;
    812     pipelines_base = (GLuint *)
    813         _env->GetPrimitiveArrayCritical(pipelines_ref, (jboolean *)0);
    814     pipelines = pipelines_base + offset;
    815 
    816     glDeleteProgramPipelines(
    817         (GLsizei)n,
    818         (GLuint *)pipelines
    819     );
    820 
    821 exit:
    822     if (pipelines_base) {
    823         _env->ReleasePrimitiveArrayCritical(pipelines_ref, pipelines_base,
    824             JNI_ABORT);
    825     }
    826     if (_exception) {
    827         jniThrowException(_env, _exceptionType, _exceptionMessage);
    828     }
    829 }
    830 
    831 /* void glDeleteProgramPipelines ( GLsizei n, const GLuint *pipelines ) */
    832 static void
    833 android_glDeleteProgramPipelines__ILjava_nio_IntBuffer_2
    834   (JNIEnv *_env, jobject _this, jint n, jobject pipelines_buf) {
    835     jarray _array = (jarray) 0;
    836     jint _bufferOffset = (jint) 0;
    837     jint _remaining;
    838     GLuint *pipelines = (GLuint *) 0;
    839 
    840     pipelines = (GLuint *)getPointer(_env, pipelines_buf, &_array, &_remaining, &_bufferOffset);
    841     if (pipelines == NULL) {
    842         char * _pipelinesBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    843         pipelines = (GLuint *) (_pipelinesBase + _bufferOffset);
    844     }
    845     glDeleteProgramPipelines(
    846         (GLsizei)n,
    847         (GLuint *)pipelines
    848     );
    849     if (_array) {
    850         releasePointer(_env, _array, pipelines, JNI_FALSE);
    851     }
    852 }
    853 
    854 /* void glGenProgramPipelines ( GLsizei n, GLuint *pipelines ) */
    855 static void
    856 android_glGenProgramPipelines__I_3II
    857   (JNIEnv *_env, jobject _this, jint n, jintArray pipelines_ref, jint offset) {
    858     jint _exception = 0;
    859     const char * _exceptionType = NULL;
    860     const char * _exceptionMessage = NULL;
    861     GLuint *pipelines_base = (GLuint *) 0;
    862     jint _remaining;
    863     GLuint *pipelines = (GLuint *) 0;
    864 
    865     if (!pipelines_ref) {
    866         _exception = 1;
    867         _exceptionType = "java/lang/IllegalArgumentException";
    868         _exceptionMessage = "pipelines == null";
    869         goto exit;
    870     }
    871     if (offset < 0) {
    872         _exception = 1;
    873         _exceptionType = "java/lang/IllegalArgumentException";
    874         _exceptionMessage = "offset < 0";
    875         goto exit;
    876     }
    877     _remaining = _env->GetArrayLength(pipelines_ref) - offset;
    878     pipelines_base = (GLuint *)
    879         _env->GetPrimitiveArrayCritical(pipelines_ref, (jboolean *)0);
    880     pipelines = pipelines_base + offset;
    881 
    882     glGenProgramPipelines(
    883         (GLsizei)n,
    884         (GLuint *)pipelines
    885     );
    886 
    887 exit:
    888     if (pipelines_base) {
    889         _env->ReleasePrimitiveArrayCritical(pipelines_ref, pipelines_base,
    890             _exception ? JNI_ABORT: 0);
    891     }
    892     if (_exception) {
    893         jniThrowException(_env, _exceptionType, _exceptionMessage);
    894     }
    895 }
    896 
    897 /* void glGenProgramPipelines ( GLsizei n, GLuint *pipelines ) */
    898 static void
    899 android_glGenProgramPipelines__ILjava_nio_IntBuffer_2
    900   (JNIEnv *_env, jobject _this, jint n, jobject pipelines_buf) {
    901     jarray _array = (jarray) 0;
    902     jint _bufferOffset = (jint) 0;
    903     jint _remaining;
    904     GLuint *pipelines = (GLuint *) 0;
    905 
    906     pipelines = (GLuint *)getPointer(_env, pipelines_buf, &_array, &_remaining, &_bufferOffset);
    907     if (pipelines == NULL) {
    908         char * _pipelinesBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    909         pipelines = (GLuint *) (_pipelinesBase + _bufferOffset);
    910     }
    911     glGenProgramPipelines(
    912         (GLsizei)n,
    913         (GLuint *)pipelines
    914     );
    915     if (_array) {
    916         releasePointer(_env, _array, pipelines, JNI_TRUE);
    917     }
    918 }
    919 
    920 /* GLboolean glIsProgramPipeline ( GLuint pipeline ) */
    921 static jboolean
    922 android_glIsProgramPipeline__I
    923   (JNIEnv *_env, jobject _this, jint pipeline) {
    924     GLboolean _returnValue;
    925     _returnValue = glIsProgramPipeline(
    926         (GLuint)pipeline
    927     );
    928     return (jboolean)_returnValue;
    929 }
    930 
    931 /* void glGetProgramPipelineiv ( GLuint pipeline, GLenum pname, GLint *params ) */
    932 static void
    933 android_glGetProgramPipelineiv__II_3II
    934   (JNIEnv *_env, jobject _this, jint pipeline, jint pname, jintArray params_ref, jint offset) {
    935     jint _exception = 0;
    936     const char * _exceptionType = NULL;
    937     const char * _exceptionMessage = NULL;
    938     GLint *params_base = (GLint *) 0;
    939     jint _remaining;
    940     GLint *params = (GLint *) 0;
    941 
    942     if (!params_ref) {
    943         _exception = 1;
    944         _exceptionType = "java/lang/IllegalArgumentException";
    945         _exceptionMessage = "params == null";
    946         goto exit;
    947     }
    948     if (offset < 0) {
    949         _exception = 1;
    950         _exceptionType = "java/lang/IllegalArgumentException";
    951         _exceptionMessage = "offset < 0";
    952         goto exit;
    953     }
    954     _remaining = _env->GetArrayLength(params_ref) - offset;
    955     params_base = (GLint *)
    956         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
    957     params = params_base + offset;
    958 
    959     glGetProgramPipelineiv(
    960         (GLuint)pipeline,
    961         (GLenum)pname,
    962         (GLint *)params
    963     );
    964 
    965 exit:
    966     if (params_base) {
    967         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
    968             _exception ? JNI_ABORT: 0);
    969     }
    970     if (_exception) {
    971         jniThrowException(_env, _exceptionType, _exceptionMessage);
    972     }
    973 }
    974 
    975 /* void glGetProgramPipelineiv ( GLuint pipeline, GLenum pname, GLint *params ) */
    976 static void
    977 android_glGetProgramPipelineiv__IILjava_nio_IntBuffer_2
    978   (JNIEnv *_env, jobject _this, jint pipeline, jint pname, jobject params_buf) {
    979     jarray _array = (jarray) 0;
    980     jint _bufferOffset = (jint) 0;
    981     jint _remaining;
    982     GLint *params = (GLint *) 0;
    983 
    984     params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
    985     if (params == NULL) {
    986         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
    987         params = (GLint *) (_paramsBase + _bufferOffset);
    988     }
    989     glGetProgramPipelineiv(
    990         (GLuint)pipeline,
    991         (GLenum)pname,
    992         (GLint *)params
    993     );
    994     if (_array) {
    995         releasePointer(_env, _array, params, JNI_TRUE);
    996     }
    997 }
    998 
    999 /* void glProgramUniform1i ( GLuint program, GLint location, GLint v0 ) */
   1000 static void
   1001 android_glProgramUniform1i__III
   1002   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0) {
   1003     glProgramUniform1i(
   1004         (GLuint)program,
   1005         (GLint)location,
   1006         (GLint)v0
   1007     );
   1008 }
   1009 
   1010 /* void glProgramUniform2i ( GLuint program, GLint location, GLint v0, GLint v1 ) */
   1011 static void
   1012 android_glProgramUniform2i__IIII
   1013   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1) {
   1014     glProgramUniform2i(
   1015         (GLuint)program,
   1016         (GLint)location,
   1017         (GLint)v0,
   1018         (GLint)v1
   1019     );
   1020 }
   1021 
   1022 /* void glProgramUniform3i ( GLuint program, GLint location, GLint v0, GLint v1, GLint v2 ) */
   1023 static void
   1024 android_glProgramUniform3i__IIIII
   1025   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1, jint v2) {
   1026     glProgramUniform3i(
   1027         (GLuint)program,
   1028         (GLint)location,
   1029         (GLint)v0,
   1030         (GLint)v1,
   1031         (GLint)v2
   1032     );
   1033 }
   1034 
   1035 /* void glProgramUniform4i ( GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3 ) */
   1036 static void
   1037 android_glProgramUniform4i__IIIIII
   1038   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1, jint v2, jint v3) {
   1039     glProgramUniform4i(
   1040         (GLuint)program,
   1041         (GLint)location,
   1042         (GLint)v0,
   1043         (GLint)v1,
   1044         (GLint)v2,
   1045         (GLint)v3
   1046     );
   1047 }
   1048 
   1049 /* void glProgramUniform1ui ( GLuint program, GLint location, GLuint v0 ) */
   1050 static void
   1051 android_glProgramUniform1ui__III
   1052   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0) {
   1053     glProgramUniform1ui(
   1054         (GLuint)program,
   1055         (GLint)location,
   1056         (GLuint)v0
   1057     );
   1058 }
   1059 
   1060 /* void glProgramUniform2ui ( GLuint program, GLint location, GLuint v0, GLuint v1 ) */
   1061 static void
   1062 android_glProgramUniform2ui__IIII
   1063   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1) {
   1064     glProgramUniform2ui(
   1065         (GLuint)program,
   1066         (GLint)location,
   1067         (GLuint)v0,
   1068         (GLuint)v1
   1069     );
   1070 }
   1071 
   1072 /* void glProgramUniform3ui ( GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2 ) */
   1073 static void
   1074 android_glProgramUniform3ui__IIIII
   1075   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1, jint v2) {
   1076     glProgramUniform3ui(
   1077         (GLuint)program,
   1078         (GLint)location,
   1079         (GLuint)v0,
   1080         (GLuint)v1,
   1081         (GLuint)v2
   1082     );
   1083 }
   1084 
   1085 /* void glProgramUniform4ui ( GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 ) */
   1086 static void
   1087 android_glProgramUniform4ui__IIIIII
   1088   (JNIEnv *_env, jobject _this, jint program, jint location, jint v0, jint v1, jint v2, jint v3) {
   1089     glProgramUniform4ui(
   1090         (GLuint)program,
   1091         (GLint)location,
   1092         (GLuint)v0,
   1093         (GLuint)v1,
   1094         (GLuint)v2,
   1095         (GLuint)v3
   1096     );
   1097 }
   1098 
   1099 /* void glProgramUniform1f ( GLuint program, GLint location, GLfloat v0 ) */
   1100 static void
   1101 android_glProgramUniform1f__IIF
   1102   (JNIEnv *_env, jobject _this, jint program, jint location, jfloat v0) {
   1103     glProgramUniform1f(
   1104         (GLuint)program,
   1105         (GLint)location,
   1106         (GLfloat)v0
   1107     );
   1108 }
   1109 
   1110 /* void glProgramUniform2f ( GLuint program, GLint location, GLfloat v0, GLfloat v1 ) */
   1111 static void
   1112 android_glProgramUniform2f__IIFF
   1113   (JNIEnv *_env, jobject _this, jint program, jint location, jfloat v0, jfloat v1) {
   1114     glProgramUniform2f(
   1115         (GLuint)program,
   1116         (GLint)location,
   1117         (GLfloat)v0,
   1118         (GLfloat)v1
   1119     );
   1120 }
   1121 
   1122 /* void glProgramUniform3f ( GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2 ) */
   1123 static void
   1124 android_glProgramUniform3f__IIFFF
   1125   (JNIEnv *_env, jobject _this, jint program, jint location, jfloat v0, jfloat v1, jfloat v2) {
   1126     glProgramUniform3f(
   1127         (GLuint)program,
   1128         (GLint)location,
   1129         (GLfloat)v0,
   1130         (GLfloat)v1,
   1131         (GLfloat)v2
   1132     );
   1133 }
   1134 
   1135 /* void glProgramUniform4f ( GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3 ) */
   1136 static void
   1137 android_glProgramUniform4f__IIFFFF
   1138   (JNIEnv *_env, jobject _this, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3) {
   1139     glProgramUniform4f(
   1140         (GLuint)program,
   1141         (GLint)location,
   1142         (GLfloat)v0,
   1143         (GLfloat)v1,
   1144         (GLfloat)v2,
   1145         (GLfloat)v3
   1146     );
   1147 }
   1148 
   1149 /* void glProgramUniform1iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1150 static void
   1151 android_glProgramUniform1iv__III_3II
   1152   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1153     jint _exception = 0;
   1154     const char * _exceptionType = NULL;
   1155     const char * _exceptionMessage = NULL;
   1156     GLint *value_base = (GLint *) 0;
   1157     jint _remaining;
   1158     GLint *value = (GLint *) 0;
   1159 
   1160     if (!value_ref) {
   1161         _exception = 1;
   1162         _exceptionType = "java/lang/IllegalArgumentException";
   1163         _exceptionMessage = "value == null";
   1164         goto exit;
   1165     }
   1166     if (offset < 0) {
   1167         _exception = 1;
   1168         _exceptionType = "java/lang/IllegalArgumentException";
   1169         _exceptionMessage = "offset < 0";
   1170         goto exit;
   1171     }
   1172     _remaining = _env->GetArrayLength(value_ref) - offset;
   1173     value_base = (GLint *)
   1174         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1175     value = value_base + offset;
   1176 
   1177     glProgramUniform1iv(
   1178         (GLuint)program,
   1179         (GLint)location,
   1180         (GLsizei)count,
   1181         (GLint *)value
   1182     );
   1183 
   1184 exit:
   1185     if (value_base) {
   1186         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1187             JNI_ABORT);
   1188     }
   1189     if (_exception) {
   1190         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1191     }
   1192 }
   1193 
   1194 /* void glProgramUniform1iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1195 static void
   1196 android_glProgramUniform1iv__IIILjava_nio_IntBuffer_2
   1197   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1198     jarray _array = (jarray) 0;
   1199     jint _bufferOffset = (jint) 0;
   1200     jint _remaining;
   1201     GLint *value = (GLint *) 0;
   1202 
   1203     value = (GLint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1204     if (value == NULL) {
   1205         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1206         value = (GLint *) (_valueBase + _bufferOffset);
   1207     }
   1208     glProgramUniform1iv(
   1209         (GLuint)program,
   1210         (GLint)location,
   1211         (GLsizei)count,
   1212         (GLint *)value
   1213     );
   1214     if (_array) {
   1215         releasePointer(_env, _array, value, JNI_FALSE);
   1216     }
   1217 }
   1218 
   1219 /* void glProgramUniform2iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1220 static void
   1221 android_glProgramUniform2iv__III_3II
   1222   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1223     jint _exception = 0;
   1224     const char * _exceptionType = NULL;
   1225     const char * _exceptionMessage = NULL;
   1226     GLint *value_base = (GLint *) 0;
   1227     jint _remaining;
   1228     GLint *value = (GLint *) 0;
   1229 
   1230     if (!value_ref) {
   1231         _exception = 1;
   1232         _exceptionType = "java/lang/IllegalArgumentException";
   1233         _exceptionMessage = "value == null";
   1234         goto exit;
   1235     }
   1236     if (offset < 0) {
   1237         _exception = 1;
   1238         _exceptionType = "java/lang/IllegalArgumentException";
   1239         _exceptionMessage = "offset < 0";
   1240         goto exit;
   1241     }
   1242     _remaining = _env->GetArrayLength(value_ref) - offset;
   1243     value_base = (GLint *)
   1244         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1245     value = value_base + offset;
   1246 
   1247     glProgramUniform2iv(
   1248         (GLuint)program,
   1249         (GLint)location,
   1250         (GLsizei)count,
   1251         (GLint *)value
   1252     );
   1253 
   1254 exit:
   1255     if (value_base) {
   1256         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1257             JNI_ABORT);
   1258     }
   1259     if (_exception) {
   1260         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1261     }
   1262 }
   1263 
   1264 /* void glProgramUniform2iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1265 static void
   1266 android_glProgramUniform2iv__IIILjava_nio_IntBuffer_2
   1267   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1268     jarray _array = (jarray) 0;
   1269     jint _bufferOffset = (jint) 0;
   1270     jint _remaining;
   1271     GLint *value = (GLint *) 0;
   1272 
   1273     value = (GLint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1274     if (value == NULL) {
   1275         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1276         value = (GLint *) (_valueBase + _bufferOffset);
   1277     }
   1278     glProgramUniform2iv(
   1279         (GLuint)program,
   1280         (GLint)location,
   1281         (GLsizei)count,
   1282         (GLint *)value
   1283     );
   1284     if (_array) {
   1285         releasePointer(_env, _array, value, JNI_FALSE);
   1286     }
   1287 }
   1288 
   1289 /* void glProgramUniform3iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1290 static void
   1291 android_glProgramUniform3iv__III_3II
   1292   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1293     jint _exception = 0;
   1294     const char * _exceptionType = NULL;
   1295     const char * _exceptionMessage = NULL;
   1296     GLint *value_base = (GLint *) 0;
   1297     jint _remaining;
   1298     GLint *value = (GLint *) 0;
   1299 
   1300     if (!value_ref) {
   1301         _exception = 1;
   1302         _exceptionType = "java/lang/IllegalArgumentException";
   1303         _exceptionMessage = "value == null";
   1304         goto exit;
   1305     }
   1306     if (offset < 0) {
   1307         _exception = 1;
   1308         _exceptionType = "java/lang/IllegalArgumentException";
   1309         _exceptionMessage = "offset < 0";
   1310         goto exit;
   1311     }
   1312     _remaining = _env->GetArrayLength(value_ref) - offset;
   1313     value_base = (GLint *)
   1314         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1315     value = value_base + offset;
   1316 
   1317     glProgramUniform3iv(
   1318         (GLuint)program,
   1319         (GLint)location,
   1320         (GLsizei)count,
   1321         (GLint *)value
   1322     );
   1323 
   1324 exit:
   1325     if (value_base) {
   1326         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1327             JNI_ABORT);
   1328     }
   1329     if (_exception) {
   1330         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1331     }
   1332 }
   1333 
   1334 /* void glProgramUniform3iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1335 static void
   1336 android_glProgramUniform3iv__IIILjava_nio_IntBuffer_2
   1337   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1338     jarray _array = (jarray) 0;
   1339     jint _bufferOffset = (jint) 0;
   1340     jint _remaining;
   1341     GLint *value = (GLint *) 0;
   1342 
   1343     value = (GLint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1344     if (value == NULL) {
   1345         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1346         value = (GLint *) (_valueBase + _bufferOffset);
   1347     }
   1348     glProgramUniform3iv(
   1349         (GLuint)program,
   1350         (GLint)location,
   1351         (GLsizei)count,
   1352         (GLint *)value
   1353     );
   1354     if (_array) {
   1355         releasePointer(_env, _array, value, JNI_FALSE);
   1356     }
   1357 }
   1358 
   1359 /* void glProgramUniform4iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1360 static void
   1361 android_glProgramUniform4iv__III_3II
   1362   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1363     jint _exception = 0;
   1364     const char * _exceptionType = NULL;
   1365     const char * _exceptionMessage = NULL;
   1366     GLint *value_base = (GLint *) 0;
   1367     jint _remaining;
   1368     GLint *value = (GLint *) 0;
   1369 
   1370     if (!value_ref) {
   1371         _exception = 1;
   1372         _exceptionType = "java/lang/IllegalArgumentException";
   1373         _exceptionMessage = "value == null";
   1374         goto exit;
   1375     }
   1376     if (offset < 0) {
   1377         _exception = 1;
   1378         _exceptionType = "java/lang/IllegalArgumentException";
   1379         _exceptionMessage = "offset < 0";
   1380         goto exit;
   1381     }
   1382     _remaining = _env->GetArrayLength(value_ref) - offset;
   1383     value_base = (GLint *)
   1384         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1385     value = value_base + offset;
   1386 
   1387     glProgramUniform4iv(
   1388         (GLuint)program,
   1389         (GLint)location,
   1390         (GLsizei)count,
   1391         (GLint *)value
   1392     );
   1393 
   1394 exit:
   1395     if (value_base) {
   1396         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1397             JNI_ABORT);
   1398     }
   1399     if (_exception) {
   1400         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1401     }
   1402 }
   1403 
   1404 /* void glProgramUniform4iv ( GLuint program, GLint location, GLsizei count, const GLint *value ) */
   1405 static void
   1406 android_glProgramUniform4iv__IIILjava_nio_IntBuffer_2
   1407   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1408     jarray _array = (jarray) 0;
   1409     jint _bufferOffset = (jint) 0;
   1410     jint _remaining;
   1411     GLint *value = (GLint *) 0;
   1412 
   1413     value = (GLint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1414     if (value == NULL) {
   1415         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1416         value = (GLint *) (_valueBase + _bufferOffset);
   1417     }
   1418     glProgramUniform4iv(
   1419         (GLuint)program,
   1420         (GLint)location,
   1421         (GLsizei)count,
   1422         (GLint *)value
   1423     );
   1424     if (_array) {
   1425         releasePointer(_env, _array, value, JNI_FALSE);
   1426     }
   1427 }
   1428 
   1429 /* void glProgramUniform1uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1430 static void
   1431 android_glProgramUniform1uiv__III_3II
   1432   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1433     jint _exception = 0;
   1434     const char * _exceptionType = NULL;
   1435     const char * _exceptionMessage = NULL;
   1436     GLuint *value_base = (GLuint *) 0;
   1437     jint _remaining;
   1438     GLuint *value = (GLuint *) 0;
   1439 
   1440     if (!value_ref) {
   1441         _exception = 1;
   1442         _exceptionType = "java/lang/IllegalArgumentException";
   1443         _exceptionMessage = "value == null";
   1444         goto exit;
   1445     }
   1446     if (offset < 0) {
   1447         _exception = 1;
   1448         _exceptionType = "java/lang/IllegalArgumentException";
   1449         _exceptionMessage = "offset < 0";
   1450         goto exit;
   1451     }
   1452     _remaining = _env->GetArrayLength(value_ref) - offset;
   1453     value_base = (GLuint *)
   1454         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1455     value = value_base + offset;
   1456 
   1457     glProgramUniform1uiv(
   1458         (GLuint)program,
   1459         (GLint)location,
   1460         (GLsizei)count,
   1461         (GLuint *)value
   1462     );
   1463 
   1464 exit:
   1465     if (value_base) {
   1466         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1467             JNI_ABORT);
   1468     }
   1469     if (_exception) {
   1470         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1471     }
   1472 }
   1473 
   1474 /* void glProgramUniform1uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1475 static void
   1476 android_glProgramUniform1uiv__IIILjava_nio_IntBuffer_2
   1477   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1478     jarray _array = (jarray) 0;
   1479     jint _bufferOffset = (jint) 0;
   1480     jint _remaining;
   1481     GLuint *value = (GLuint *) 0;
   1482 
   1483     value = (GLuint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1484     if (value == NULL) {
   1485         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1486         value = (GLuint *) (_valueBase + _bufferOffset);
   1487     }
   1488     glProgramUniform1uiv(
   1489         (GLuint)program,
   1490         (GLint)location,
   1491         (GLsizei)count,
   1492         (GLuint *)value
   1493     );
   1494     if (_array) {
   1495         releasePointer(_env, _array, value, JNI_FALSE);
   1496     }
   1497 }
   1498 
   1499 /* void glProgramUniform2uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1500 static void
   1501 android_glProgramUniform2uiv__III_3II
   1502   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1503     jint _exception = 0;
   1504     const char * _exceptionType = NULL;
   1505     const char * _exceptionMessage = NULL;
   1506     GLuint *value_base = (GLuint *) 0;
   1507     jint _remaining;
   1508     GLuint *value = (GLuint *) 0;
   1509 
   1510     if (!value_ref) {
   1511         _exception = 1;
   1512         _exceptionType = "java/lang/IllegalArgumentException";
   1513         _exceptionMessage = "value == null";
   1514         goto exit;
   1515     }
   1516     if (offset < 0) {
   1517         _exception = 1;
   1518         _exceptionType = "java/lang/IllegalArgumentException";
   1519         _exceptionMessage = "offset < 0";
   1520         goto exit;
   1521     }
   1522     _remaining = _env->GetArrayLength(value_ref) - offset;
   1523     value_base = (GLuint *)
   1524         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1525     value = value_base + offset;
   1526 
   1527     glProgramUniform2uiv(
   1528         (GLuint)program,
   1529         (GLint)location,
   1530         (GLsizei)count,
   1531         (GLuint *)value
   1532     );
   1533 
   1534 exit:
   1535     if (value_base) {
   1536         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1537             JNI_ABORT);
   1538     }
   1539     if (_exception) {
   1540         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1541     }
   1542 }
   1543 
   1544 /* void glProgramUniform2uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1545 static void
   1546 android_glProgramUniform2uiv__IIILjava_nio_IntBuffer_2
   1547   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1548     jarray _array = (jarray) 0;
   1549     jint _bufferOffset = (jint) 0;
   1550     jint _remaining;
   1551     GLuint *value = (GLuint *) 0;
   1552 
   1553     value = (GLuint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1554     if (value == NULL) {
   1555         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1556         value = (GLuint *) (_valueBase + _bufferOffset);
   1557     }
   1558     glProgramUniform2uiv(
   1559         (GLuint)program,
   1560         (GLint)location,
   1561         (GLsizei)count,
   1562         (GLuint *)value
   1563     );
   1564     if (_array) {
   1565         releasePointer(_env, _array, value, JNI_FALSE);
   1566     }
   1567 }
   1568 
   1569 /* void glProgramUniform3uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1570 static void
   1571 android_glProgramUniform3uiv__III_3II
   1572   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1573     jint _exception = 0;
   1574     const char * _exceptionType = NULL;
   1575     const char * _exceptionMessage = NULL;
   1576     GLuint *value_base = (GLuint *) 0;
   1577     jint _remaining;
   1578     GLuint *value = (GLuint *) 0;
   1579 
   1580     if (!value_ref) {
   1581         _exception = 1;
   1582         _exceptionType = "java/lang/IllegalArgumentException";
   1583         _exceptionMessage = "value == null";
   1584         goto exit;
   1585     }
   1586     if (offset < 0) {
   1587         _exception = 1;
   1588         _exceptionType = "java/lang/IllegalArgumentException";
   1589         _exceptionMessage = "offset < 0";
   1590         goto exit;
   1591     }
   1592     _remaining = _env->GetArrayLength(value_ref) - offset;
   1593     value_base = (GLuint *)
   1594         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1595     value = value_base + offset;
   1596 
   1597     glProgramUniform3uiv(
   1598         (GLuint)program,
   1599         (GLint)location,
   1600         (GLsizei)count,
   1601         (GLuint *)value
   1602     );
   1603 
   1604 exit:
   1605     if (value_base) {
   1606         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1607             JNI_ABORT);
   1608     }
   1609     if (_exception) {
   1610         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1611     }
   1612 }
   1613 
   1614 /* void glProgramUniform3uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1615 static void
   1616 android_glProgramUniform3uiv__IIILjava_nio_IntBuffer_2
   1617   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1618     jarray _array = (jarray) 0;
   1619     jint _bufferOffset = (jint) 0;
   1620     jint _remaining;
   1621     GLuint *value = (GLuint *) 0;
   1622 
   1623     value = (GLuint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1624     if (value == NULL) {
   1625         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1626         value = (GLuint *) (_valueBase + _bufferOffset);
   1627     }
   1628     glProgramUniform3uiv(
   1629         (GLuint)program,
   1630         (GLint)location,
   1631         (GLsizei)count,
   1632         (GLuint *)value
   1633     );
   1634     if (_array) {
   1635         releasePointer(_env, _array, value, JNI_FALSE);
   1636     }
   1637 }
   1638 
   1639 /* void glProgramUniform4uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1640 static void
   1641 android_glProgramUniform4uiv__III_3II
   1642   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jintArray value_ref, jint offset) {
   1643     jint _exception = 0;
   1644     const char * _exceptionType = NULL;
   1645     const char * _exceptionMessage = NULL;
   1646     GLuint *value_base = (GLuint *) 0;
   1647     jint _remaining;
   1648     GLuint *value = (GLuint *) 0;
   1649 
   1650     if (!value_ref) {
   1651         _exception = 1;
   1652         _exceptionType = "java/lang/IllegalArgumentException";
   1653         _exceptionMessage = "value == null";
   1654         goto exit;
   1655     }
   1656     if (offset < 0) {
   1657         _exception = 1;
   1658         _exceptionType = "java/lang/IllegalArgumentException";
   1659         _exceptionMessage = "offset < 0";
   1660         goto exit;
   1661     }
   1662     _remaining = _env->GetArrayLength(value_ref) - offset;
   1663     value_base = (GLuint *)
   1664         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1665     value = value_base + offset;
   1666 
   1667     glProgramUniform4uiv(
   1668         (GLuint)program,
   1669         (GLint)location,
   1670         (GLsizei)count,
   1671         (GLuint *)value
   1672     );
   1673 
   1674 exit:
   1675     if (value_base) {
   1676         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1677             JNI_ABORT);
   1678     }
   1679     if (_exception) {
   1680         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1681     }
   1682 }
   1683 
   1684 /* void glProgramUniform4uiv ( GLuint program, GLint location, GLsizei count, const GLuint *value ) */
   1685 static void
   1686 android_glProgramUniform4uiv__IIILjava_nio_IntBuffer_2
   1687   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1688     jarray _array = (jarray) 0;
   1689     jint _bufferOffset = (jint) 0;
   1690     jint _remaining;
   1691     GLuint *value = (GLuint *) 0;
   1692 
   1693     value = (GLuint *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1694     if (value == NULL) {
   1695         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1696         value = (GLuint *) (_valueBase + _bufferOffset);
   1697     }
   1698     glProgramUniform4uiv(
   1699         (GLuint)program,
   1700         (GLint)location,
   1701         (GLsizei)count,
   1702         (GLuint *)value
   1703     );
   1704     if (_array) {
   1705         releasePointer(_env, _array, value, JNI_FALSE);
   1706     }
   1707 }
   1708 
   1709 /* void glProgramUniform1fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1710 static void
   1711 android_glProgramUniform1fv__III_3FI
   1712   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jfloatArray value_ref, jint offset) {
   1713     jint _exception = 0;
   1714     const char * _exceptionType = NULL;
   1715     const char * _exceptionMessage = NULL;
   1716     GLfloat *value_base = (GLfloat *) 0;
   1717     jint _remaining;
   1718     GLfloat *value = (GLfloat *) 0;
   1719 
   1720     if (!value_ref) {
   1721         _exception = 1;
   1722         _exceptionType = "java/lang/IllegalArgumentException";
   1723         _exceptionMessage = "value == null";
   1724         goto exit;
   1725     }
   1726     if (offset < 0) {
   1727         _exception = 1;
   1728         _exceptionType = "java/lang/IllegalArgumentException";
   1729         _exceptionMessage = "offset < 0";
   1730         goto exit;
   1731     }
   1732     _remaining = _env->GetArrayLength(value_ref) - offset;
   1733     value_base = (GLfloat *)
   1734         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1735     value = value_base + offset;
   1736 
   1737     glProgramUniform1fv(
   1738         (GLuint)program,
   1739         (GLint)location,
   1740         (GLsizei)count,
   1741         (GLfloat *)value
   1742     );
   1743 
   1744 exit:
   1745     if (value_base) {
   1746         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1747             JNI_ABORT);
   1748     }
   1749     if (_exception) {
   1750         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1751     }
   1752 }
   1753 
   1754 /* void glProgramUniform1fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1755 static void
   1756 android_glProgramUniform1fv__IIILjava_nio_FloatBuffer_2
   1757   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1758     jarray _array = (jarray) 0;
   1759     jint _bufferOffset = (jint) 0;
   1760     jint _remaining;
   1761     GLfloat *value = (GLfloat *) 0;
   1762 
   1763     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1764     if (value == NULL) {
   1765         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1766         value = (GLfloat *) (_valueBase + _bufferOffset);
   1767     }
   1768     glProgramUniform1fv(
   1769         (GLuint)program,
   1770         (GLint)location,
   1771         (GLsizei)count,
   1772         (GLfloat *)value
   1773     );
   1774     if (_array) {
   1775         releasePointer(_env, _array, value, JNI_FALSE);
   1776     }
   1777 }
   1778 
   1779 /* void glProgramUniform2fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1780 static void
   1781 android_glProgramUniform2fv__III_3FI
   1782   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jfloatArray value_ref, jint offset) {
   1783     jint _exception = 0;
   1784     const char * _exceptionType = NULL;
   1785     const char * _exceptionMessage = NULL;
   1786     GLfloat *value_base = (GLfloat *) 0;
   1787     jint _remaining;
   1788     GLfloat *value = (GLfloat *) 0;
   1789 
   1790     if (!value_ref) {
   1791         _exception = 1;
   1792         _exceptionType = "java/lang/IllegalArgumentException";
   1793         _exceptionMessage = "value == null";
   1794         goto exit;
   1795     }
   1796     if (offset < 0) {
   1797         _exception = 1;
   1798         _exceptionType = "java/lang/IllegalArgumentException";
   1799         _exceptionMessage = "offset < 0";
   1800         goto exit;
   1801     }
   1802     _remaining = _env->GetArrayLength(value_ref) - offset;
   1803     value_base = (GLfloat *)
   1804         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1805     value = value_base + offset;
   1806 
   1807     glProgramUniform2fv(
   1808         (GLuint)program,
   1809         (GLint)location,
   1810         (GLsizei)count,
   1811         (GLfloat *)value
   1812     );
   1813 
   1814 exit:
   1815     if (value_base) {
   1816         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1817             JNI_ABORT);
   1818     }
   1819     if (_exception) {
   1820         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1821     }
   1822 }
   1823 
   1824 /* void glProgramUniform2fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1825 static void
   1826 android_glProgramUniform2fv__IIILjava_nio_FloatBuffer_2
   1827   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1828     jarray _array = (jarray) 0;
   1829     jint _bufferOffset = (jint) 0;
   1830     jint _remaining;
   1831     GLfloat *value = (GLfloat *) 0;
   1832 
   1833     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1834     if (value == NULL) {
   1835         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1836         value = (GLfloat *) (_valueBase + _bufferOffset);
   1837     }
   1838     glProgramUniform2fv(
   1839         (GLuint)program,
   1840         (GLint)location,
   1841         (GLsizei)count,
   1842         (GLfloat *)value
   1843     );
   1844     if (_array) {
   1845         releasePointer(_env, _array, value, JNI_FALSE);
   1846     }
   1847 }
   1848 
   1849 /* void glProgramUniform3fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1850 static void
   1851 android_glProgramUniform3fv__III_3FI
   1852   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jfloatArray value_ref, jint offset) {
   1853     jint _exception = 0;
   1854     const char * _exceptionType = NULL;
   1855     const char * _exceptionMessage = NULL;
   1856     GLfloat *value_base = (GLfloat *) 0;
   1857     jint _remaining;
   1858     GLfloat *value = (GLfloat *) 0;
   1859 
   1860     if (!value_ref) {
   1861         _exception = 1;
   1862         _exceptionType = "java/lang/IllegalArgumentException";
   1863         _exceptionMessage = "value == null";
   1864         goto exit;
   1865     }
   1866     if (offset < 0) {
   1867         _exception = 1;
   1868         _exceptionType = "java/lang/IllegalArgumentException";
   1869         _exceptionMessage = "offset < 0";
   1870         goto exit;
   1871     }
   1872     _remaining = _env->GetArrayLength(value_ref) - offset;
   1873     value_base = (GLfloat *)
   1874         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1875     value = value_base + offset;
   1876 
   1877     glProgramUniform3fv(
   1878         (GLuint)program,
   1879         (GLint)location,
   1880         (GLsizei)count,
   1881         (GLfloat *)value
   1882     );
   1883 
   1884 exit:
   1885     if (value_base) {
   1886         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1887             JNI_ABORT);
   1888     }
   1889     if (_exception) {
   1890         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1891     }
   1892 }
   1893 
   1894 /* void glProgramUniform3fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1895 static void
   1896 android_glProgramUniform3fv__IIILjava_nio_FloatBuffer_2
   1897   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1898     jarray _array = (jarray) 0;
   1899     jint _bufferOffset = (jint) 0;
   1900     jint _remaining;
   1901     GLfloat *value = (GLfloat *) 0;
   1902 
   1903     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1904     if (value == NULL) {
   1905         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1906         value = (GLfloat *) (_valueBase + _bufferOffset);
   1907     }
   1908     glProgramUniform3fv(
   1909         (GLuint)program,
   1910         (GLint)location,
   1911         (GLsizei)count,
   1912         (GLfloat *)value
   1913     );
   1914     if (_array) {
   1915         releasePointer(_env, _array, value, JNI_FALSE);
   1916     }
   1917 }
   1918 
   1919 /* void glProgramUniform4fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1920 static void
   1921 android_glProgramUniform4fv__III_3FI
   1922   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jfloatArray value_ref, jint offset) {
   1923     jint _exception = 0;
   1924     const char * _exceptionType = NULL;
   1925     const char * _exceptionMessage = NULL;
   1926     GLfloat *value_base = (GLfloat *) 0;
   1927     jint _remaining;
   1928     GLfloat *value = (GLfloat *) 0;
   1929 
   1930     if (!value_ref) {
   1931         _exception = 1;
   1932         _exceptionType = "java/lang/IllegalArgumentException";
   1933         _exceptionMessage = "value == null";
   1934         goto exit;
   1935     }
   1936     if (offset < 0) {
   1937         _exception = 1;
   1938         _exceptionType = "java/lang/IllegalArgumentException";
   1939         _exceptionMessage = "offset < 0";
   1940         goto exit;
   1941     }
   1942     _remaining = _env->GetArrayLength(value_ref) - offset;
   1943     value_base = (GLfloat *)
   1944         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1945     value = value_base + offset;
   1946 
   1947     glProgramUniform4fv(
   1948         (GLuint)program,
   1949         (GLint)location,
   1950         (GLsizei)count,
   1951         (GLfloat *)value
   1952     );
   1953 
   1954 exit:
   1955     if (value_base) {
   1956         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1957             JNI_ABORT);
   1958     }
   1959     if (_exception) {
   1960         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1961     }
   1962 }
   1963 
   1964 /* void glProgramUniform4fv ( GLuint program, GLint location, GLsizei count, const GLfloat *value ) */
   1965 static void
   1966 android_glProgramUniform4fv__IIILjava_nio_FloatBuffer_2
   1967   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jobject value_buf) {
   1968     jarray _array = (jarray) 0;
   1969     jint _bufferOffset = (jint) 0;
   1970     jint _remaining;
   1971     GLfloat *value = (GLfloat *) 0;
   1972 
   1973     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   1974     if (value == NULL) {
   1975         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   1976         value = (GLfloat *) (_valueBase + _bufferOffset);
   1977     }
   1978     glProgramUniform4fv(
   1979         (GLuint)program,
   1980         (GLint)location,
   1981         (GLsizei)count,
   1982         (GLfloat *)value
   1983     );
   1984     if (_array) {
   1985         releasePointer(_env, _array, value, JNI_FALSE);
   1986     }
   1987 }
   1988 
   1989 /* void glProgramUniformMatrix2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   1990 static void
   1991 android_glProgramUniformMatrix2fv__IIIZ_3FI
   1992   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   1993     jint _exception = 0;
   1994     const char * _exceptionType = NULL;
   1995     const char * _exceptionMessage = NULL;
   1996     GLfloat *value_base = (GLfloat *) 0;
   1997     jint _remaining;
   1998     GLfloat *value = (GLfloat *) 0;
   1999 
   2000     if (!value_ref) {
   2001         _exception = 1;
   2002         _exceptionType = "java/lang/IllegalArgumentException";
   2003         _exceptionMessage = "value == null";
   2004         goto exit;
   2005     }
   2006     if (offset < 0) {
   2007         _exception = 1;
   2008         _exceptionType = "java/lang/IllegalArgumentException";
   2009         _exceptionMessage = "offset < 0";
   2010         goto exit;
   2011     }
   2012     _remaining = _env->GetArrayLength(value_ref) - offset;
   2013     value_base = (GLfloat *)
   2014         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2015     value = value_base + offset;
   2016 
   2017     glProgramUniformMatrix2fv(
   2018         (GLuint)program,
   2019         (GLint)location,
   2020         (GLsizei)count,
   2021         (GLboolean)transpose,
   2022         (GLfloat *)value
   2023     );
   2024 
   2025 exit:
   2026     if (value_base) {
   2027         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2028             JNI_ABORT);
   2029     }
   2030     if (_exception) {
   2031         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2032     }
   2033 }
   2034 
   2035 /* void glProgramUniformMatrix2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2036 static void
   2037 android_glProgramUniformMatrix2fv__IIIZLjava_nio_FloatBuffer_2
   2038   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2039     jarray _array = (jarray) 0;
   2040     jint _bufferOffset = (jint) 0;
   2041     jint _remaining;
   2042     GLfloat *value = (GLfloat *) 0;
   2043 
   2044     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2045     if (value == NULL) {
   2046         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2047         value = (GLfloat *) (_valueBase + _bufferOffset);
   2048     }
   2049     glProgramUniformMatrix2fv(
   2050         (GLuint)program,
   2051         (GLint)location,
   2052         (GLsizei)count,
   2053         (GLboolean)transpose,
   2054         (GLfloat *)value
   2055     );
   2056     if (_array) {
   2057         releasePointer(_env, _array, value, JNI_FALSE);
   2058     }
   2059 }
   2060 
   2061 /* void glProgramUniformMatrix3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2062 static void
   2063 android_glProgramUniformMatrix3fv__IIIZ_3FI
   2064   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2065     jint _exception = 0;
   2066     const char * _exceptionType = NULL;
   2067     const char * _exceptionMessage = NULL;
   2068     GLfloat *value_base = (GLfloat *) 0;
   2069     jint _remaining;
   2070     GLfloat *value = (GLfloat *) 0;
   2071 
   2072     if (!value_ref) {
   2073         _exception = 1;
   2074         _exceptionType = "java/lang/IllegalArgumentException";
   2075         _exceptionMessage = "value == null";
   2076         goto exit;
   2077     }
   2078     if (offset < 0) {
   2079         _exception = 1;
   2080         _exceptionType = "java/lang/IllegalArgumentException";
   2081         _exceptionMessage = "offset < 0";
   2082         goto exit;
   2083     }
   2084     _remaining = _env->GetArrayLength(value_ref) - offset;
   2085     value_base = (GLfloat *)
   2086         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2087     value = value_base + offset;
   2088 
   2089     glProgramUniformMatrix3fv(
   2090         (GLuint)program,
   2091         (GLint)location,
   2092         (GLsizei)count,
   2093         (GLboolean)transpose,
   2094         (GLfloat *)value
   2095     );
   2096 
   2097 exit:
   2098     if (value_base) {
   2099         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2100             JNI_ABORT);
   2101     }
   2102     if (_exception) {
   2103         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2104     }
   2105 }
   2106 
   2107 /* void glProgramUniformMatrix3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2108 static void
   2109 android_glProgramUniformMatrix3fv__IIIZLjava_nio_FloatBuffer_2
   2110   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2111     jarray _array = (jarray) 0;
   2112     jint _bufferOffset = (jint) 0;
   2113     jint _remaining;
   2114     GLfloat *value = (GLfloat *) 0;
   2115 
   2116     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2117     if (value == NULL) {
   2118         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2119         value = (GLfloat *) (_valueBase + _bufferOffset);
   2120     }
   2121     glProgramUniformMatrix3fv(
   2122         (GLuint)program,
   2123         (GLint)location,
   2124         (GLsizei)count,
   2125         (GLboolean)transpose,
   2126         (GLfloat *)value
   2127     );
   2128     if (_array) {
   2129         releasePointer(_env, _array, value, JNI_FALSE);
   2130     }
   2131 }
   2132 
   2133 /* void glProgramUniformMatrix4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2134 static void
   2135 android_glProgramUniformMatrix4fv__IIIZ_3FI
   2136   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2137     jint _exception = 0;
   2138     const char * _exceptionType = NULL;
   2139     const char * _exceptionMessage = NULL;
   2140     GLfloat *value_base = (GLfloat *) 0;
   2141     jint _remaining;
   2142     GLfloat *value = (GLfloat *) 0;
   2143 
   2144     if (!value_ref) {
   2145         _exception = 1;
   2146         _exceptionType = "java/lang/IllegalArgumentException";
   2147         _exceptionMessage = "value == null";
   2148         goto exit;
   2149     }
   2150     if (offset < 0) {
   2151         _exception = 1;
   2152         _exceptionType = "java/lang/IllegalArgumentException";
   2153         _exceptionMessage = "offset < 0";
   2154         goto exit;
   2155     }
   2156     _remaining = _env->GetArrayLength(value_ref) - offset;
   2157     value_base = (GLfloat *)
   2158         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2159     value = value_base + offset;
   2160 
   2161     glProgramUniformMatrix4fv(
   2162         (GLuint)program,
   2163         (GLint)location,
   2164         (GLsizei)count,
   2165         (GLboolean)transpose,
   2166         (GLfloat *)value
   2167     );
   2168 
   2169 exit:
   2170     if (value_base) {
   2171         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2172             JNI_ABORT);
   2173     }
   2174     if (_exception) {
   2175         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2176     }
   2177 }
   2178 
   2179 /* void glProgramUniformMatrix4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2180 static void
   2181 android_glProgramUniformMatrix4fv__IIIZLjava_nio_FloatBuffer_2
   2182   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2183     jarray _array = (jarray) 0;
   2184     jint _bufferOffset = (jint) 0;
   2185     jint _remaining;
   2186     GLfloat *value = (GLfloat *) 0;
   2187 
   2188     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2189     if (value == NULL) {
   2190         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2191         value = (GLfloat *) (_valueBase + _bufferOffset);
   2192     }
   2193     glProgramUniformMatrix4fv(
   2194         (GLuint)program,
   2195         (GLint)location,
   2196         (GLsizei)count,
   2197         (GLboolean)transpose,
   2198         (GLfloat *)value
   2199     );
   2200     if (_array) {
   2201         releasePointer(_env, _array, value, JNI_FALSE);
   2202     }
   2203 }
   2204 
   2205 /* void glProgramUniformMatrix2x3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2206 static void
   2207 android_glProgramUniformMatrix2x3fv__IIIZ_3FI
   2208   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2209     jint _exception = 0;
   2210     const char * _exceptionType = NULL;
   2211     const char * _exceptionMessage = NULL;
   2212     GLfloat *value_base = (GLfloat *) 0;
   2213     jint _remaining;
   2214     GLfloat *value = (GLfloat *) 0;
   2215 
   2216     if (!value_ref) {
   2217         _exception = 1;
   2218         _exceptionType = "java/lang/IllegalArgumentException";
   2219         _exceptionMessage = "value == null";
   2220         goto exit;
   2221     }
   2222     if (offset < 0) {
   2223         _exception = 1;
   2224         _exceptionType = "java/lang/IllegalArgumentException";
   2225         _exceptionMessage = "offset < 0";
   2226         goto exit;
   2227     }
   2228     _remaining = _env->GetArrayLength(value_ref) - offset;
   2229     value_base = (GLfloat *)
   2230         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2231     value = value_base + offset;
   2232 
   2233     glProgramUniformMatrix2x3fv(
   2234         (GLuint)program,
   2235         (GLint)location,
   2236         (GLsizei)count,
   2237         (GLboolean)transpose,
   2238         (GLfloat *)value
   2239     );
   2240 
   2241 exit:
   2242     if (value_base) {
   2243         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2244             JNI_ABORT);
   2245     }
   2246     if (_exception) {
   2247         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2248     }
   2249 }
   2250 
   2251 /* void glProgramUniformMatrix2x3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2252 static void
   2253 android_glProgramUniformMatrix2x3fv__IIIZLjava_nio_FloatBuffer_2
   2254   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2255     jarray _array = (jarray) 0;
   2256     jint _bufferOffset = (jint) 0;
   2257     jint _remaining;
   2258     GLfloat *value = (GLfloat *) 0;
   2259 
   2260     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2261     if (value == NULL) {
   2262         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2263         value = (GLfloat *) (_valueBase + _bufferOffset);
   2264     }
   2265     glProgramUniformMatrix2x3fv(
   2266         (GLuint)program,
   2267         (GLint)location,
   2268         (GLsizei)count,
   2269         (GLboolean)transpose,
   2270         (GLfloat *)value
   2271     );
   2272     if (_array) {
   2273         releasePointer(_env, _array, value, JNI_FALSE);
   2274     }
   2275 }
   2276 
   2277 /* void glProgramUniformMatrix3x2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2278 static void
   2279 android_glProgramUniformMatrix3x2fv__IIIZ_3FI
   2280   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2281     jint _exception = 0;
   2282     const char * _exceptionType = NULL;
   2283     const char * _exceptionMessage = NULL;
   2284     GLfloat *value_base = (GLfloat *) 0;
   2285     jint _remaining;
   2286     GLfloat *value = (GLfloat *) 0;
   2287 
   2288     if (!value_ref) {
   2289         _exception = 1;
   2290         _exceptionType = "java/lang/IllegalArgumentException";
   2291         _exceptionMessage = "value == null";
   2292         goto exit;
   2293     }
   2294     if (offset < 0) {
   2295         _exception = 1;
   2296         _exceptionType = "java/lang/IllegalArgumentException";
   2297         _exceptionMessage = "offset < 0";
   2298         goto exit;
   2299     }
   2300     _remaining = _env->GetArrayLength(value_ref) - offset;
   2301     value_base = (GLfloat *)
   2302         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2303     value = value_base + offset;
   2304 
   2305     glProgramUniformMatrix3x2fv(
   2306         (GLuint)program,
   2307         (GLint)location,
   2308         (GLsizei)count,
   2309         (GLboolean)transpose,
   2310         (GLfloat *)value
   2311     );
   2312 
   2313 exit:
   2314     if (value_base) {
   2315         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2316             JNI_ABORT);
   2317     }
   2318     if (_exception) {
   2319         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2320     }
   2321 }
   2322 
   2323 /* void glProgramUniformMatrix3x2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2324 static void
   2325 android_glProgramUniformMatrix3x2fv__IIIZLjava_nio_FloatBuffer_2
   2326   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2327     jarray _array = (jarray) 0;
   2328     jint _bufferOffset = (jint) 0;
   2329     jint _remaining;
   2330     GLfloat *value = (GLfloat *) 0;
   2331 
   2332     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2333     if (value == NULL) {
   2334         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2335         value = (GLfloat *) (_valueBase + _bufferOffset);
   2336     }
   2337     glProgramUniformMatrix3x2fv(
   2338         (GLuint)program,
   2339         (GLint)location,
   2340         (GLsizei)count,
   2341         (GLboolean)transpose,
   2342         (GLfloat *)value
   2343     );
   2344     if (_array) {
   2345         releasePointer(_env, _array, value, JNI_FALSE);
   2346     }
   2347 }
   2348 
   2349 /* void glProgramUniformMatrix2x4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2350 static void
   2351 android_glProgramUniformMatrix2x4fv__IIIZ_3FI
   2352   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2353     jint _exception = 0;
   2354     const char * _exceptionType = NULL;
   2355     const char * _exceptionMessage = NULL;
   2356     GLfloat *value_base = (GLfloat *) 0;
   2357     jint _remaining;
   2358     GLfloat *value = (GLfloat *) 0;
   2359 
   2360     if (!value_ref) {
   2361         _exception = 1;
   2362         _exceptionType = "java/lang/IllegalArgumentException";
   2363         _exceptionMessage = "value == null";
   2364         goto exit;
   2365     }
   2366     if (offset < 0) {
   2367         _exception = 1;
   2368         _exceptionType = "java/lang/IllegalArgumentException";
   2369         _exceptionMessage = "offset < 0";
   2370         goto exit;
   2371     }
   2372     _remaining = _env->GetArrayLength(value_ref) - offset;
   2373     value_base = (GLfloat *)
   2374         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2375     value = value_base + offset;
   2376 
   2377     glProgramUniformMatrix2x4fv(
   2378         (GLuint)program,
   2379         (GLint)location,
   2380         (GLsizei)count,
   2381         (GLboolean)transpose,
   2382         (GLfloat *)value
   2383     );
   2384 
   2385 exit:
   2386     if (value_base) {
   2387         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2388             JNI_ABORT);
   2389     }
   2390     if (_exception) {
   2391         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2392     }
   2393 }
   2394 
   2395 /* void glProgramUniformMatrix2x4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2396 static void
   2397 android_glProgramUniformMatrix2x4fv__IIIZLjava_nio_FloatBuffer_2
   2398   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2399     jarray _array = (jarray) 0;
   2400     jint _bufferOffset = (jint) 0;
   2401     jint _remaining;
   2402     GLfloat *value = (GLfloat *) 0;
   2403 
   2404     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2405     if (value == NULL) {
   2406         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2407         value = (GLfloat *) (_valueBase + _bufferOffset);
   2408     }
   2409     glProgramUniformMatrix2x4fv(
   2410         (GLuint)program,
   2411         (GLint)location,
   2412         (GLsizei)count,
   2413         (GLboolean)transpose,
   2414         (GLfloat *)value
   2415     );
   2416     if (_array) {
   2417         releasePointer(_env, _array, value, JNI_FALSE);
   2418     }
   2419 }
   2420 
   2421 /* void glProgramUniformMatrix4x2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2422 static void
   2423 android_glProgramUniformMatrix4x2fv__IIIZ_3FI
   2424   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2425     jint _exception = 0;
   2426     const char * _exceptionType = NULL;
   2427     const char * _exceptionMessage = NULL;
   2428     GLfloat *value_base = (GLfloat *) 0;
   2429     jint _remaining;
   2430     GLfloat *value = (GLfloat *) 0;
   2431 
   2432     if (!value_ref) {
   2433         _exception = 1;
   2434         _exceptionType = "java/lang/IllegalArgumentException";
   2435         _exceptionMessage = "value == null";
   2436         goto exit;
   2437     }
   2438     if (offset < 0) {
   2439         _exception = 1;
   2440         _exceptionType = "java/lang/IllegalArgumentException";
   2441         _exceptionMessage = "offset < 0";
   2442         goto exit;
   2443     }
   2444     _remaining = _env->GetArrayLength(value_ref) - offset;
   2445     value_base = (GLfloat *)
   2446         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2447     value = value_base + offset;
   2448 
   2449     glProgramUniformMatrix4x2fv(
   2450         (GLuint)program,
   2451         (GLint)location,
   2452         (GLsizei)count,
   2453         (GLboolean)transpose,
   2454         (GLfloat *)value
   2455     );
   2456 
   2457 exit:
   2458     if (value_base) {
   2459         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2460             JNI_ABORT);
   2461     }
   2462     if (_exception) {
   2463         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2464     }
   2465 }
   2466 
   2467 /* void glProgramUniformMatrix4x2fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2468 static void
   2469 android_glProgramUniformMatrix4x2fv__IIIZLjava_nio_FloatBuffer_2
   2470   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2471     jarray _array = (jarray) 0;
   2472     jint _bufferOffset = (jint) 0;
   2473     jint _remaining;
   2474     GLfloat *value = (GLfloat *) 0;
   2475 
   2476     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2477     if (value == NULL) {
   2478         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2479         value = (GLfloat *) (_valueBase + _bufferOffset);
   2480     }
   2481     glProgramUniformMatrix4x2fv(
   2482         (GLuint)program,
   2483         (GLint)location,
   2484         (GLsizei)count,
   2485         (GLboolean)transpose,
   2486         (GLfloat *)value
   2487     );
   2488     if (_array) {
   2489         releasePointer(_env, _array, value, JNI_FALSE);
   2490     }
   2491 }
   2492 
   2493 /* void glProgramUniformMatrix3x4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2494 static void
   2495 android_glProgramUniformMatrix3x4fv__IIIZ_3FI
   2496   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2497     jint _exception = 0;
   2498     const char * _exceptionType = NULL;
   2499     const char * _exceptionMessage = NULL;
   2500     GLfloat *value_base = (GLfloat *) 0;
   2501     jint _remaining;
   2502     GLfloat *value = (GLfloat *) 0;
   2503 
   2504     if (!value_ref) {
   2505         _exception = 1;
   2506         _exceptionType = "java/lang/IllegalArgumentException";
   2507         _exceptionMessage = "value == null";
   2508         goto exit;
   2509     }
   2510     if (offset < 0) {
   2511         _exception = 1;
   2512         _exceptionType = "java/lang/IllegalArgumentException";
   2513         _exceptionMessage = "offset < 0";
   2514         goto exit;
   2515     }
   2516     _remaining = _env->GetArrayLength(value_ref) - offset;
   2517     value_base = (GLfloat *)
   2518         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2519     value = value_base + offset;
   2520 
   2521     glProgramUniformMatrix3x4fv(
   2522         (GLuint)program,
   2523         (GLint)location,
   2524         (GLsizei)count,
   2525         (GLboolean)transpose,
   2526         (GLfloat *)value
   2527     );
   2528 
   2529 exit:
   2530     if (value_base) {
   2531         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2532             JNI_ABORT);
   2533     }
   2534     if (_exception) {
   2535         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2536     }
   2537 }
   2538 
   2539 /* void glProgramUniformMatrix3x4fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2540 static void
   2541 android_glProgramUniformMatrix3x4fv__IIIZLjava_nio_FloatBuffer_2
   2542   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2543     jarray _array = (jarray) 0;
   2544     jint _bufferOffset = (jint) 0;
   2545     jint _remaining;
   2546     GLfloat *value = (GLfloat *) 0;
   2547 
   2548     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2549     if (value == NULL) {
   2550         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2551         value = (GLfloat *) (_valueBase + _bufferOffset);
   2552     }
   2553     glProgramUniformMatrix3x4fv(
   2554         (GLuint)program,
   2555         (GLint)location,
   2556         (GLsizei)count,
   2557         (GLboolean)transpose,
   2558         (GLfloat *)value
   2559     );
   2560     if (_array) {
   2561         releasePointer(_env, _array, value, JNI_FALSE);
   2562     }
   2563 }
   2564 
   2565 /* void glProgramUniformMatrix4x3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2566 static void
   2567 android_glProgramUniformMatrix4x3fv__IIIZ_3FI
   2568   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jfloatArray value_ref, jint offset) {
   2569     jint _exception = 0;
   2570     const char * _exceptionType = NULL;
   2571     const char * _exceptionMessage = NULL;
   2572     GLfloat *value_base = (GLfloat *) 0;
   2573     jint _remaining;
   2574     GLfloat *value = (GLfloat *) 0;
   2575 
   2576     if (!value_ref) {
   2577         _exception = 1;
   2578         _exceptionType = "java/lang/IllegalArgumentException";
   2579         _exceptionMessage = "value == null";
   2580         goto exit;
   2581     }
   2582     if (offset < 0) {
   2583         _exception = 1;
   2584         _exceptionType = "java/lang/IllegalArgumentException";
   2585         _exceptionMessage = "offset < 0";
   2586         goto exit;
   2587     }
   2588     _remaining = _env->GetArrayLength(value_ref) - offset;
   2589     value_base = (GLfloat *)
   2590         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   2591     value = value_base + offset;
   2592 
   2593     glProgramUniformMatrix4x3fv(
   2594         (GLuint)program,
   2595         (GLint)location,
   2596         (GLsizei)count,
   2597         (GLboolean)transpose,
   2598         (GLfloat *)value
   2599     );
   2600 
   2601 exit:
   2602     if (value_base) {
   2603         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   2604             JNI_ABORT);
   2605     }
   2606     if (_exception) {
   2607         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2608     }
   2609 }
   2610 
   2611 /* void glProgramUniformMatrix4x3fv ( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value ) */
   2612 static void
   2613 android_glProgramUniformMatrix4x3fv__IIIZLjava_nio_FloatBuffer_2
   2614   (JNIEnv *_env, jobject _this, jint program, jint location, jint count, jboolean transpose, jobject value_buf) {
   2615     jarray _array = (jarray) 0;
   2616     jint _bufferOffset = (jint) 0;
   2617     jint _remaining;
   2618     GLfloat *value = (GLfloat *) 0;
   2619 
   2620     value = (GLfloat *)getPointer(_env, value_buf, &_array, &_remaining, &_bufferOffset);
   2621     if (value == NULL) {
   2622         char * _valueBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2623         value = (GLfloat *) (_valueBase + _bufferOffset);
   2624     }
   2625     glProgramUniformMatrix4x3fv(
   2626         (GLuint)program,
   2627         (GLint)location,
   2628         (GLsizei)count,
   2629         (GLboolean)transpose,
   2630         (GLfloat *)value
   2631     );
   2632     if (_array) {
   2633         releasePointer(_env, _array, value, JNI_FALSE);
   2634     }
   2635 }
   2636 
   2637 /* void glValidateProgramPipeline ( GLuint pipeline ) */
   2638 static void
   2639 android_glValidateProgramPipeline__I
   2640   (JNIEnv *_env, jobject _this, jint pipeline) {
   2641     glValidateProgramPipeline(
   2642         (GLuint)pipeline
   2643     );
   2644 }
   2645 
   2646 #include <stdlib.h>
   2647 
   2648 /* void glGetProgramPipelineInfoLog ( GLuint shader, GLsizei maxLength, GLsizei* length, GLchar* infoLog ) */
   2649 static jstring android_glGetProgramPipelineInfoLog(JNIEnv *_env, jobject, jint shader) {
   2650     GLint infoLen = 0;
   2651     glGetProgramPipelineiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
   2652     if (!infoLen) {
   2653         return _env->NewStringUTF("");
   2654     }
   2655     char* buf = (char*) malloc(infoLen);
   2656     if (buf == NULL) {
   2657         jniThrowException(_env, "java/lang/OutOfMemoryError", "out of memory");
   2658         return NULL;
   2659     }
   2660     glGetProgramPipelineInfoLog(shader, infoLen, NULL, buf);
   2661     jstring result = _env->NewStringUTF(buf);
   2662     free(buf);
   2663     return result;
   2664 }
   2665 /* void glBindImageTexture ( GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format ) */
   2666 static void
   2667 android_glBindImageTexture__IIIZIII
   2668   (JNIEnv *_env, jobject _this, jint unit, jint texture, jint level, jboolean layered, jint layer, jint access, jint format) {
   2669     glBindImageTexture(
   2670         (GLuint)unit,
   2671         (GLuint)texture,
   2672         (GLint)level,
   2673         (GLboolean)layered,
   2674         (GLint)layer,
   2675         (GLenum)access,
   2676         (GLenum)format
   2677     );
   2678 }
   2679 
   2680 /* void glGetBooleani_v ( GLenum target, GLuint index, GLboolean *data ) */
   2681 static void
   2682 android_glGetBooleani_v__II_3ZI
   2683   (JNIEnv *_env, jobject _this, jint target, jint index, jbooleanArray data_ref, jint offset) {
   2684     jint _exception = 0;
   2685     const char * _exceptionType = NULL;
   2686     const char * _exceptionMessage = NULL;
   2687     GLboolean *data_base = (GLboolean *) 0;
   2688     jint _remaining;
   2689     GLboolean *data = (GLboolean *) 0;
   2690 
   2691     if (!data_ref) {
   2692         _exception = 1;
   2693         _exceptionType = "java/lang/IllegalArgumentException";
   2694         _exceptionMessage = "data == null";
   2695         goto exit;
   2696     }
   2697     if (offset < 0) {
   2698         _exception = 1;
   2699         _exceptionType = "java/lang/IllegalArgumentException";
   2700         _exceptionMessage = "offset < 0";
   2701         goto exit;
   2702     }
   2703     _remaining = _env->GetArrayLength(data_ref) - offset;
   2704     data_base = (GLboolean *)
   2705         _env->GetPrimitiveArrayCritical(data_ref, (jboolean *)0);
   2706     data = data_base + offset;
   2707 
   2708     glGetBooleani_v(
   2709         (GLenum)target,
   2710         (GLuint)index,
   2711         (GLboolean *)data
   2712     );
   2713 
   2714 exit:
   2715     if (data_base) {
   2716         _env->ReleasePrimitiveArrayCritical(data_ref, data_base,
   2717             _exception ? JNI_ABORT: 0);
   2718     }
   2719     if (_exception) {
   2720         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2721     }
   2722 }
   2723 
   2724 /* void glGetBooleani_v ( GLenum target, GLuint index, GLboolean *data ) */
   2725 static void
   2726 android_glGetBooleani_v__IILjava_nio_IntBuffer_2
   2727   (JNIEnv *_env, jobject _this, jint target, jint index, jobject data_buf) {
   2728     jarray _array = (jarray) 0;
   2729     jint _bufferOffset = (jint) 0;
   2730     jint _remaining;
   2731     GLboolean *data = (GLboolean *) 0;
   2732 
   2733     data = (GLboolean *)getPointer(_env, data_buf, &_array, &_remaining, &_bufferOffset);
   2734     if (data == NULL) {
   2735         char * _dataBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2736         data = (GLboolean *) (_dataBase + _bufferOffset);
   2737     }
   2738     glGetBooleani_v(
   2739         (GLenum)target,
   2740         (GLuint)index,
   2741         (GLboolean *)data
   2742     );
   2743     if (_array) {
   2744         releasePointer(_env, _array, data, JNI_TRUE);
   2745     }
   2746 }
   2747 
   2748 /* void glMemoryBarrier ( GLbitfield barriers ) */
   2749 static void
   2750 android_glMemoryBarrier__I
   2751   (JNIEnv *_env, jobject _this, jint barriers) {
   2752     glMemoryBarrier(
   2753         (GLbitfield)barriers
   2754     );
   2755 }
   2756 
   2757 /* void glMemoryBarrierByRegion ( GLbitfield barriers ) */
   2758 static void
   2759 android_glMemoryBarrierByRegion__I
   2760   (JNIEnv *_env, jobject _this, jint barriers) {
   2761     glMemoryBarrierByRegion(
   2762         (GLbitfield)barriers
   2763     );
   2764 }
   2765 
   2766 /* void glTexStorage2DMultisample ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations ) */
   2767 static void
   2768 android_glTexStorage2DMultisample__IIIIIZ
   2769   (JNIEnv *_env, jobject _this, jint target, jint samples, jint internalformat, jint width, jint height, jboolean fixedsamplelocations) {
   2770     glTexStorage2DMultisample(
   2771         (GLenum)target,
   2772         (GLsizei)samples,
   2773         (GLenum)internalformat,
   2774         (GLsizei)width,
   2775         (GLsizei)height,
   2776         (GLboolean)fixedsamplelocations
   2777     );
   2778 }
   2779 
   2780 /* void glGetMultisamplefv ( GLenum pname, GLuint index, GLfloat *val ) */
   2781 static void
   2782 android_glGetMultisamplefv__II_3FI
   2783   (JNIEnv *_env, jobject _this, jint pname, jint index, jfloatArray val_ref, jint offset) {
   2784     jint _exception = 0;
   2785     const char * _exceptionType = NULL;
   2786     const char * _exceptionMessage = NULL;
   2787     GLfloat *val_base = (GLfloat *) 0;
   2788     jint _remaining;
   2789     GLfloat *val = (GLfloat *) 0;
   2790 
   2791     if (!val_ref) {
   2792         _exception = 1;
   2793         _exceptionType = "java/lang/IllegalArgumentException";
   2794         _exceptionMessage = "val == null";
   2795         goto exit;
   2796     }
   2797     if (offset < 0) {
   2798         _exception = 1;
   2799         _exceptionType = "java/lang/IllegalArgumentException";
   2800         _exceptionMessage = "offset < 0";
   2801         goto exit;
   2802     }
   2803     _remaining = _env->GetArrayLength(val_ref) - offset;
   2804     val_base = (GLfloat *)
   2805         _env->GetPrimitiveArrayCritical(val_ref, (jboolean *)0);
   2806     val = val_base + offset;
   2807 
   2808     glGetMultisamplefv(
   2809         (GLenum)pname,
   2810         (GLuint)index,
   2811         (GLfloat *)val
   2812     );
   2813 
   2814 exit:
   2815     if (val_base) {
   2816         _env->ReleasePrimitiveArrayCritical(val_ref, val_base,
   2817             _exception ? JNI_ABORT: 0);
   2818     }
   2819     if (_exception) {
   2820         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2821     }
   2822 }
   2823 
   2824 /* void glGetMultisamplefv ( GLenum pname, GLuint index, GLfloat *val ) */
   2825 static void
   2826 android_glGetMultisamplefv__IILjava_nio_FloatBuffer_2
   2827   (JNIEnv *_env, jobject _this, jint pname, jint index, jobject val_buf) {
   2828     jarray _array = (jarray) 0;
   2829     jint _bufferOffset = (jint) 0;
   2830     jint _remaining;
   2831     GLfloat *val = (GLfloat *) 0;
   2832 
   2833     val = (GLfloat *)getPointer(_env, val_buf, &_array, &_remaining, &_bufferOffset);
   2834     if (val == NULL) {
   2835         char * _valBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2836         val = (GLfloat *) (_valBase + _bufferOffset);
   2837     }
   2838     glGetMultisamplefv(
   2839         (GLenum)pname,
   2840         (GLuint)index,
   2841         (GLfloat *)val
   2842     );
   2843     if (_array) {
   2844         releasePointer(_env, _array, val, JNI_TRUE);
   2845     }
   2846 }
   2847 
   2848 /* void glSampleMaski ( GLuint maskNumber, GLbitfield mask ) */
   2849 static void
   2850 android_glSampleMaski__II
   2851   (JNIEnv *_env, jobject _this, jint maskNumber, jint mask) {
   2852     glSampleMaski(
   2853         (GLuint)maskNumber,
   2854         (GLbitfield)mask
   2855     );
   2856 }
   2857 
   2858 /* void glGetTexLevelParameteriv ( GLenum target, GLint level, GLenum pname, GLint *params ) */
   2859 static void
   2860 android_glGetTexLevelParameteriv__III_3II
   2861   (JNIEnv *_env, jobject _this, jint target, jint level, jint pname, jintArray params_ref, jint offset) {
   2862     jint _exception = 0;
   2863     const char * _exceptionType = NULL;
   2864     const char * _exceptionMessage = NULL;
   2865     GLint *params_base = (GLint *) 0;
   2866     jint _remaining;
   2867     GLint *params = (GLint *) 0;
   2868 
   2869     if (!params_ref) {
   2870         _exception = 1;
   2871         _exceptionType = "java/lang/IllegalArgumentException";
   2872         _exceptionMessage = "params == null";
   2873         goto exit;
   2874     }
   2875     if (offset < 0) {
   2876         _exception = 1;
   2877         _exceptionType = "java/lang/IllegalArgumentException";
   2878         _exceptionMessage = "offset < 0";
   2879         goto exit;
   2880     }
   2881     _remaining = _env->GetArrayLength(params_ref) - offset;
   2882     params_base = (GLint *)
   2883         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
   2884     params = params_base + offset;
   2885 
   2886     glGetTexLevelParameteriv(
   2887         (GLenum)target,
   2888         (GLint)level,
   2889         (GLenum)pname,
   2890         (GLint *)params
   2891     );
   2892 
   2893 exit:
   2894     if (params_base) {
   2895         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
   2896             _exception ? JNI_ABORT: 0);
   2897     }
   2898     if (_exception) {
   2899         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2900     }
   2901 }
   2902 
   2903 /* void glGetTexLevelParameteriv ( GLenum target, GLint level, GLenum pname, GLint *params ) */
   2904 static void
   2905 android_glGetTexLevelParameteriv__IIILjava_nio_IntBuffer_2
   2906   (JNIEnv *_env, jobject _this, jint target, jint level, jint pname, jobject params_buf) {
   2907     jarray _array = (jarray) 0;
   2908     jint _bufferOffset = (jint) 0;
   2909     jint _remaining;
   2910     GLint *params = (GLint *) 0;
   2911 
   2912     params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
   2913     if (params == NULL) {
   2914         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2915         params = (GLint *) (_paramsBase + _bufferOffset);
   2916     }
   2917     glGetTexLevelParameteriv(
   2918         (GLenum)target,
   2919         (GLint)level,
   2920         (GLenum)pname,
   2921         (GLint *)params
   2922     );
   2923     if (_array) {
   2924         releasePointer(_env, _array, params, JNI_TRUE);
   2925     }
   2926 }
   2927 
   2928 /* void glGetTexLevelParameterfv ( GLenum target, GLint level, GLenum pname, GLfloat *params ) */
   2929 static void
   2930 android_glGetTexLevelParameterfv__III_3FI
   2931   (JNIEnv *_env, jobject _this, jint target, jint level, jint pname, jfloatArray params_ref, jint offset) {
   2932     jint _exception = 0;
   2933     const char * _exceptionType = NULL;
   2934     const char * _exceptionMessage = NULL;
   2935     GLfloat *params_base = (GLfloat *) 0;
   2936     jint _remaining;
   2937     GLfloat *params = (GLfloat *) 0;
   2938 
   2939     if (!params_ref) {
   2940         _exception = 1;
   2941         _exceptionType = "java/lang/IllegalArgumentException";
   2942         _exceptionMessage = "params == null";
   2943         goto exit;
   2944     }
   2945     if (offset < 0) {
   2946         _exception = 1;
   2947         _exceptionType = "java/lang/IllegalArgumentException";
   2948         _exceptionMessage = "offset < 0";
   2949         goto exit;
   2950     }
   2951     _remaining = _env->GetArrayLength(params_ref) - offset;
   2952     params_base = (GLfloat *)
   2953         _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
   2954     params = params_base + offset;
   2955 
   2956     glGetTexLevelParameterfv(
   2957         (GLenum)target,
   2958         (GLint)level,
   2959         (GLenum)pname,
   2960         (GLfloat *)params
   2961     );
   2962 
   2963 exit:
   2964     if (params_base) {
   2965         _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
   2966             _exception ? JNI_ABORT: 0);
   2967     }
   2968     if (_exception) {
   2969         jniThrowException(_env, _exceptionType, _exceptionMessage);
   2970     }
   2971 }
   2972 
   2973 /* void glGetTexLevelParameterfv ( GLenum target, GLint level, GLenum pname, GLfloat *params ) */
   2974 static void
   2975 android_glGetTexLevelParameterfv__IIILjava_nio_FloatBuffer_2
   2976   (JNIEnv *_env, jobject _this, jint target, jint level, jint pname, jobject params_buf) {
   2977     jarray _array = (jarray) 0;
   2978     jint _bufferOffset = (jint) 0;
   2979     jint _remaining;
   2980     GLfloat *params = (GLfloat *) 0;
   2981 
   2982     params = (GLfloat *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
   2983     if (params == NULL) {
   2984         char * _paramsBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
   2985         params = (GLfloat *) (_paramsBase + _bufferOffset);
   2986     }
   2987     glGetTexLevelParameterfv(
   2988         (GLenum)target,
   2989         (GLint)level,
   2990         (GLenum)pname,
   2991         (GLfloat *)params
   2992     );
   2993     if (_array) {
   2994         releasePointer(_env, _array, params, JNI_TRUE);
   2995     }
   2996 }
   2997 
   2998 /* void glBindVertexBuffer ( GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride ) */
   2999 static void
   3000 android_glBindVertexBuffer__IIJI
   3001   (JNIEnv *_env, jobject _this, jint bindingindex, jint buffer, jlong offset, jint stride) {
   3002     if (sizeof(GLintptr) != sizeof(jlong) && (offset < LONG_MIN || offset > LONG_MAX)) {
   3003         jniThrowException(_env, "java/lang/IllegalArgumentException", "offset too large");
   3004         return;
   3005     }
   3006     glBindVertexBuffer(
   3007         (GLuint)bindingindex,
   3008         (GLuint)buffer,
   3009         (GLintptr)offset,
   3010         (GLsizei)stride
   3011     );
   3012 }
   3013 /* void glVertexAttribFormat ( GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset ) */
   3014 static void
   3015 android_glVertexAttribFormat__IIIZI
   3016   (JNIEnv *_env, jobject _this, jint attribindex, jint size, jint type, jboolean normalized, jint relativeoffset) {
   3017     glVertexAttribFormat(
   3018         (GLuint)attribindex,
   3019         (GLint)size,
   3020         (GLenum)type,
   3021         (GLboolean)normalized,
   3022         (GLuint)relativeoffset
   3023     );
   3024 }
   3025 
   3026 /* void glVertexAttribIFormat ( GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset ) */
   3027 static void
   3028 android_glVertexAttribIFormat__IIII
   3029   (JNIEnv *_env, jobject _this, jint attribindex, jint size, jint type, jint relativeoffset) {
   3030     glVertexAttribIFormat(
   3031         (GLuint)attribindex,
   3032         (GLint)size,
   3033         (GLenum)type,
   3034         (GLuint)relativeoffset
   3035     );
   3036 }
   3037 
   3038 /* void glVertexAttribBinding ( GLuint attribindex, GLuint bindingindex ) */
   3039 static void
   3040 android_glVertexAttribBinding__II
   3041   (JNIEnv *_env, jobject _this, jint attribindex, jint bindingindex) {
   3042     glVertexAttribBinding(
   3043         (GLuint)attribindex,
   3044         (GLuint)bindingindex
   3045     );
   3046 }
   3047 
   3048 /* void glVertexBindingDivisor ( GLuint bindingindex, GLuint divisor ) */
   3049 static void
   3050 android_glVertexBindingDivisor__II
   3051   (JNIEnv *_env, jobject _this, jint bindingindex, jint divisor) {
   3052     glVertexBindingDivisor(
   3053         (GLuint)bindingindex,
   3054         (GLuint)divisor
   3055     );
   3056 }
   3057 
   3058 static const char *classPathName = "android/opengl/GLES31";
   3059 
   3060 static JNINativeMethod methods[] = {
   3061 {"_nativeClassInit", "()V", (void*)nativeClassInit },
   3062 {"glDispatchCompute", "(III)V", (void *) android_glDispatchCompute__III },
   3063 {"glDispatchComputeIndirect", "(J)V", (void *) android_glDispatchComputeIndirect },
   3064 {"glDrawArraysIndirect", "(IJ)V", (void *) android_glDrawArraysIndirect },
   3065 {"glDrawElementsIndirect", "(IIJ)V", (void *) android_glDrawElementsIndirect },
   3066 {"glFramebufferParameteri", "(III)V", (void *) android_glFramebufferParameteri__III },
   3067 {"glGetFramebufferParameteriv", "(II[II)V", (void *) android_glGetFramebufferParameteriv__II_3II },
   3068 {"glGetFramebufferParameteriv", "(IILjava/nio/IntBuffer;)V", (void *) android_glGetFramebufferParameteriv__IILjava_nio_IntBuffer_2 },
   3069 {"glGetProgramInterfaceiv", "(III[II)V", (void *) android_glGetProgramInterfaceiv__III_3II },
   3070 {"glGetProgramInterfaceiv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glGetProgramInterfaceiv__IIILjava_nio_IntBuffer_2 },
   3071 {"glGetProgramResourceIndex", "(IILjava/lang/String;)I", (void *) android_glGetProgramResourceIndex__IILjava_lang_String_2 },
   3072 {"glGetProgramResourceName", "(III)Ljava/lang/String;", (void *) android_glGetProgramResourceName },
   3073 {"glGetProgramResourceiv", "(IIII[III[II[II)V", (void *) android_glGetProgramResourceiv__IIII_3III_3II_3II },
   3074 {"glGetProgramResourceiv", "(IIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V", (void *) android_glGetProgramResourceiv__IIIILjava_nio_IntBuffer_2ILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 },
   3075 {"glGetProgramResourceLocation", "(IILjava/lang/String;)I", (void *) android_glGetProgramResourceLocation__IILjava_lang_String_2 },
   3076 {"glUseProgramStages", "(III)V", (void *) android_glUseProgramStages__III },
   3077 {"glActiveShaderProgram", "(II)V", (void *) android_glActiveShaderProgram__II },
   3078 {"glCreateShaderProgramv", "(I[Ljava/lang/String;)I", (void *) android_glCreateShaderProgramv },
   3079 {"glBindProgramPipeline", "(I)V", (void *) android_glBindProgramPipeline__I },
   3080 {"glDeleteProgramPipelines", "(I[II)V", (void *) android_glDeleteProgramPipelines__I_3II },
   3081 {"glDeleteProgramPipelines", "(ILjava/nio/IntBuffer;)V", (void *) android_glDeleteProgramPipelines__ILjava_nio_IntBuffer_2 },
   3082 {"glGenProgramPipelines", "(I[II)V", (void *) android_glGenProgramPipelines__I_3II },
   3083 {"glGenProgramPipelines", "(ILjava/nio/IntBuffer;)V", (void *) android_glGenProgramPipelines__ILjava_nio_IntBuffer_2 },
   3084 {"glIsProgramPipeline", "(I)Z", (void *) android_glIsProgramPipeline__I },
   3085 {"glGetProgramPipelineiv", "(II[II)V", (void *) android_glGetProgramPipelineiv__II_3II },
   3086 {"glGetProgramPipelineiv", "(IILjava/nio/IntBuffer;)V", (void *) android_glGetProgramPipelineiv__IILjava_nio_IntBuffer_2 },
   3087 {"glProgramUniform1i", "(III)V", (void *) android_glProgramUniform1i__III },
   3088 {"glProgramUniform2i", "(IIII)V", (void *) android_glProgramUniform2i__IIII },
   3089 {"glProgramUniform3i", "(IIIII)V", (void *) android_glProgramUniform3i__IIIII },
   3090 {"glProgramUniform4i", "(IIIIII)V", (void *) android_glProgramUniform4i__IIIIII },
   3091 {"glProgramUniform1ui", "(III)V", (void *) android_glProgramUniform1ui__III },
   3092 {"glProgramUniform2ui", "(IIII)V", (void *) android_glProgramUniform2ui__IIII },
   3093 {"glProgramUniform3ui", "(IIIII)V", (void *) android_glProgramUniform3ui__IIIII },
   3094 {"glProgramUniform4ui", "(IIIIII)V", (void *) android_glProgramUniform4ui__IIIIII },
   3095 {"glProgramUniform1f", "(IIF)V", (void *) android_glProgramUniform1f__IIF },
   3096 {"glProgramUniform2f", "(IIFF)V", (void *) android_glProgramUniform2f__IIFF },
   3097 {"glProgramUniform3f", "(IIFFF)V", (void *) android_glProgramUniform3f__IIFFF },
   3098 {"glProgramUniform4f", "(IIFFFF)V", (void *) android_glProgramUniform4f__IIFFFF },
   3099 {"glProgramUniform1iv", "(III[II)V", (void *) android_glProgramUniform1iv__III_3II },
   3100 {"glProgramUniform1iv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform1iv__IIILjava_nio_IntBuffer_2 },
   3101 {"glProgramUniform2iv", "(III[II)V", (void *) android_glProgramUniform2iv__III_3II },
   3102 {"glProgramUniform2iv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform2iv__IIILjava_nio_IntBuffer_2 },
   3103 {"glProgramUniform3iv", "(III[II)V", (void *) android_glProgramUniform3iv__III_3II },
   3104 {"glProgramUniform3iv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform3iv__IIILjava_nio_IntBuffer_2 },
   3105 {"glProgramUniform4iv", "(III[II)V", (void *) android_glProgramUniform4iv__III_3II },
   3106 {"glProgramUniform4iv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform4iv__IIILjava_nio_IntBuffer_2 },
   3107 {"glProgramUniform1uiv", "(III[II)V", (void *) android_glProgramUniform1uiv__III_3II },
   3108 {"glProgramUniform1uiv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform1uiv__IIILjava_nio_IntBuffer_2 },
   3109 {"glProgramUniform2uiv", "(III[II)V", (void *) android_glProgramUniform2uiv__III_3II },
   3110 {"glProgramUniform2uiv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform2uiv__IIILjava_nio_IntBuffer_2 },
   3111 {"glProgramUniform3uiv", "(III[II)V", (void *) android_glProgramUniform3uiv__III_3II },
   3112 {"glProgramUniform3uiv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform3uiv__IIILjava_nio_IntBuffer_2 },
   3113 {"glProgramUniform4uiv", "(III[II)V", (void *) android_glProgramUniform4uiv__III_3II },
   3114 {"glProgramUniform4uiv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glProgramUniform4uiv__IIILjava_nio_IntBuffer_2 },
   3115 {"glProgramUniform1fv", "(III[FI)V", (void *) android_glProgramUniform1fv__III_3FI },
   3116 {"glProgramUniform1fv", "(IIILjava/nio/FloatBuffer;)V", (void *) android_glProgramUniform1fv__IIILjava_nio_FloatBuffer_2 },
   3117 {"glProgramUniform2fv", "(III[FI)V", (void *) android_glProgramUniform2fv__III_3FI },
   3118 {"glProgramUniform2fv", "(IIILjava/nio/FloatBuffer;)V", (void *) android_glProgramUniform2fv__IIILjava_nio_FloatBuffer_2 },
   3119 {"glProgramUniform3fv", "(III[FI)V", (void *) android_glProgramUniform3fv__III_3FI },
   3120 {"glProgramUniform3fv", "(IIILjava/nio/FloatBuffer;)V", (void *) android_glProgramUniform3fv__IIILjava_nio_FloatBuffer_2 },
   3121 {"glProgramUniform4fv", "(III[FI)V", (void *) android_glProgramUniform4fv__III_3FI },
   3122 {"glProgramUniform4fv", "(IIILjava/nio/FloatBuffer;)V", (void *) android_glProgramUniform4fv__IIILjava_nio_FloatBuffer_2 },
   3123 {"glProgramUniformMatrix2fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix2fv__IIIZ_3FI },
   3124 {"glProgramUniformMatrix2fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix2fv__IIIZLjava_nio_FloatBuffer_2 },
   3125 {"glProgramUniformMatrix3fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix3fv__IIIZ_3FI },
   3126 {"glProgramUniformMatrix3fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix3fv__IIIZLjava_nio_FloatBuffer_2 },
   3127 {"glProgramUniformMatrix4fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix4fv__IIIZ_3FI },
   3128 {"glProgramUniformMatrix4fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix4fv__IIIZLjava_nio_FloatBuffer_2 },
   3129 {"glProgramUniformMatrix2x3fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix2x3fv__IIIZ_3FI },
   3130 {"glProgramUniformMatrix2x3fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix2x3fv__IIIZLjava_nio_FloatBuffer_2 },
   3131 {"glProgramUniformMatrix3x2fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix3x2fv__IIIZ_3FI },
   3132 {"glProgramUniformMatrix3x2fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix3x2fv__IIIZLjava_nio_FloatBuffer_2 },
   3133 {"glProgramUniformMatrix2x4fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix2x4fv__IIIZ_3FI },
   3134 {"glProgramUniformMatrix2x4fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix2x4fv__IIIZLjava_nio_FloatBuffer_2 },
   3135 {"glProgramUniformMatrix4x2fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix4x2fv__IIIZ_3FI },
   3136 {"glProgramUniformMatrix4x2fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix4x2fv__IIIZLjava_nio_FloatBuffer_2 },
   3137 {"glProgramUniformMatrix3x4fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix3x4fv__IIIZ_3FI },
   3138 {"glProgramUniformMatrix3x4fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix3x4fv__IIIZLjava_nio_FloatBuffer_2 },
   3139 {"glProgramUniformMatrix4x3fv", "(IIIZ[FI)V", (void *) android_glProgramUniformMatrix4x3fv__IIIZ_3FI },
   3140 {"glProgramUniformMatrix4x3fv", "(IIIZLjava/nio/FloatBuffer;)V", (void *) android_glProgramUniformMatrix4x3fv__IIIZLjava_nio_FloatBuffer_2 },
   3141 {"glValidateProgramPipeline", "(I)V", (void *) android_glValidateProgramPipeline__I },
   3142 {"glGetProgramPipelineInfoLog", "(I)Ljava/lang/String;", (void *) android_glGetProgramPipelineInfoLog },
   3143 {"glBindImageTexture", "(IIIZIII)V", (void *) android_glBindImageTexture__IIIZIII },
   3144 {"glGetBooleani_v", "(II[ZI)V", (void *) android_glGetBooleani_v__II_3ZI },
   3145 {"glGetBooleani_v", "(IILjava/nio/IntBuffer;)V", (void *) android_glGetBooleani_v__IILjava_nio_IntBuffer_2 },
   3146 {"glMemoryBarrier", "(I)V", (void *) android_glMemoryBarrier__I },
   3147 {"glMemoryBarrierByRegion", "(I)V", (void *) android_glMemoryBarrierByRegion__I },
   3148 {"glTexStorage2DMultisample", "(IIIIIZ)V", (void *) android_glTexStorage2DMultisample__IIIIIZ },
   3149 {"glGetMultisamplefv", "(II[FI)V", (void *) android_glGetMultisamplefv__II_3FI },
   3150 {"glGetMultisamplefv", "(IILjava/nio/FloatBuffer;)V", (void *) android_glGetMultisamplefv__IILjava_nio_FloatBuffer_2 },
   3151 {"glSampleMaski", "(II)V", (void *) android_glSampleMaski__II },
   3152 {"glGetTexLevelParameteriv", "(III[II)V", (void *) android_glGetTexLevelParameteriv__III_3II },
   3153 {"glGetTexLevelParameteriv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glGetTexLevelParameteriv__IIILjava_nio_IntBuffer_2 },
   3154 {"glGetTexLevelParameterfv", "(III[FI)V", (void *) android_glGetTexLevelParameterfv__III_3FI },
   3155 {"glGetTexLevelParameterfv", "(IIILjava/nio/FloatBuffer;)V", (void *) android_glGetTexLevelParameterfv__IIILjava_nio_FloatBuffer_2 },
   3156 {"glBindVertexBuffer", "(IIJI)V", (void *) android_glBindVertexBuffer__IIJI },
   3157 {"glVertexAttribFormat", "(IIIZI)V", (void *) android_glVertexAttribFormat__IIIZI },
   3158 {"glVertexAttribIFormat", "(IIII)V", (void *) android_glVertexAttribIFormat__IIII },
   3159 {"glVertexAttribBinding", "(II)V", (void *) android_glVertexAttribBinding__II },
   3160 {"glVertexBindingDivisor", "(II)V", (void *) android_glVertexBindingDivisor__II },
   3161 };
   3162 
   3163 int register_android_opengl_jni_GLES31(JNIEnv *_env)
   3164 {
   3165     int err;
   3166     err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
   3167     return err;
   3168 }
   3169