Home | History | Annotate | Download | only in gles11
      1 /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */
      2 static
      3 void
      4 android_glGetUniformIndices_array
      5     (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jintArray uniformIndices_ref, jint uniformIndicesOffset) {
      6     jint _exception = 0;
      7     const char* _exceptionType = NULL;
      8     const char* _exceptionMessage = NULL;
      9     jint _count = 0;
     10     jint _i;
     11     const char** _names = NULL;
     12     GLuint* _indices_base = NULL;
     13     GLuint* _indices = NULL;
     14 
     15     if (!uniformNames_ref) {
     16         _exception = 1;
     17         _exceptionType = "java/lang/IllegalArgumentException";
     18         _exceptionMessage = "uniformNames == null";
     19         goto exit;
     20     }
     21     _count = _env->GetArrayLength(uniformNames_ref);
     22     _names = (const char**)calloc(_count, sizeof(const char*));
     23     for (_i = 0; _i < _count; _i++) {
     24         jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
     25         if (!_name) {
     26             _exception = 1;
     27             _exceptionType = "java/lang/IllegalArgumentException";
     28             _exceptionMessage = "null uniformNames element";
     29             goto exit;
     30         }
     31         _names[_i] = _env->GetStringUTFChars(_name, 0);
     32     }
     33 
     34     if (!uniformIndices_ref) {
     35         _exception = 1;
     36         _exceptionType = "java/lang/IllegalArgumentException";
     37         _exceptionMessage = "uniformIndices == null";
     38         goto exit;
     39     }
     40     if (uniformIndicesOffset < 0) {
     41         _exception = 1;
     42         _exceptionType = "java/lang/IllegalArgumentException";
     43         _exceptionMessage = "uniformIndicesOffset < 0";
     44         goto exit;
     45     }
     46     if (_env->GetArrayLength(uniformIndices_ref) - uniformIndicesOffset < _count) {
     47         _exception = 1;
     48         _exceptionType = "java/lang/IllegalArgumentException";
     49         _exceptionMessage = "not enough space in uniformIndices";
     50         goto exit;
     51     }
     52     _indices_base = (GLuint*)_env->GetIntArrayElements(
     53             uniformIndices_ref, 0);
     54     _indices = _indices_base + uniformIndicesOffset;
     55 
     56     glGetUniformIndices(program, _count, _names, _indices);
     57 
     58 exit:
     59     if (_indices_base) {
     60         _env->ReleaseIntArrayElements(uniformIndices_ref, (jint*)_indices_base,
     61             _exception ? JNI_ABORT : 0);
     62     }
     63     for (_i = _count - 1; _i >= 0; _i--) {
     64         if (_names[_i]) {
     65             jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
     66             if (_name) {
     67                 _env->ReleaseStringUTFChars(_name, _names[_i]);
     68             }
     69         }
     70     }
     71     free(_names);
     72     if (_exception) {
     73         jniThrowException(_env, _exceptionType, _exceptionMessage);
     74     }
     75 }
     76 
     77 /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */
     78 static
     79 void
     80 android_glGetUniformIndices_buffer
     81     (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jobject uniformIndices_buf) {
     82     jint _exception = 0;
     83     const char* _exceptionType = NULL;
     84     const char* _exceptionMessage = NULL;
     85     jint _count = 0;
     86     jint _i;
     87     const char** _names = NULL;
     88     jintArray _uniformIndicesArray = (jintArray)0;
     89     jint _uniformIndicesRemaining;
     90     jint _uniformIndicesOffset = 0;
     91     GLuint* _indices = NULL;
     92     char* _indicesBase = NULL;
     93 
     94     if (!uniformNames_ref) {
     95         _exception = 1;
     96         _exceptionType = "java/lang/IllegalArgumentException";
     97         _exceptionMessage = "uniformNames == null";
     98         goto exit;
     99     }
    100     if (!uniformIndices_buf) {
    101         _exception = 1;
    102         _exceptionType = "java/lang/IllegalArgumentException";
    103         _exceptionMessage = "uniformIndices == null";
    104         goto exit;
    105     }
    106 
    107     _count = _env->GetArrayLength(uniformNames_ref);
    108     _names = (const char**)calloc(_count, sizeof(const char*));
    109     for (_i = 0; _i < _count; _i++) {
    110         jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
    111         if (!_name) {
    112             _exception = 1;
    113             _exceptionType = "java/lang/IllegalArgumentException";
    114             _exceptionMessage = "null uniformNames element";
    115             goto exit;
    116         }
    117         _names[_i] = _env->GetStringUTFChars(_name, 0);
    118     }
    119 
    120     _indices = (GLuint*)getPointer(_env, uniformIndices_buf,
    121             (jarray*)&_uniformIndicesArray, &_uniformIndicesRemaining,
    122             &_uniformIndicesOffset);
    123     if (!_indices) {
    124         _indicesBase = (char*)_env->GetIntArrayElements(
    125             _uniformIndicesArray, 0);
    126         _indices = (GLuint*)(_indicesBase + _uniformIndicesOffset);
    127     }
    128     if (_uniformIndicesRemaining < _count) {
    129         _exception = 1;
    130         _exceptionType = "java/lang/IllegalArgumentException";
    131         _exceptionMessage = "not enough space in uniformIndices";
    132         goto exit;
    133     }
    134 
    135     glGetUniformIndices(program, _count, _names, _indices);
    136 
    137 exit:
    138     if (_uniformIndicesArray) {
    139         releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(
    140             _env, _uniformIndicesArray, (jint*)_indicesBase, JNI_TRUE);
    141     }
    142     for (_i = _count - 1; _i >= 0; _i--) {
    143         if (_names[_i]) {
    144             jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
    145             if (_name) {
    146                 _env->ReleaseStringUTFChars(_name, _names[_i]);
    147             }
    148         }
    149     }
    150     free(_names);
    151     if (_exception) {
    152         jniThrowException(_env, _exceptionType, _exceptionMessage);
    153     }
    154 }
    155