| /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ |
| static |
| void |
| android_glGetUniformIndices_array |
| (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jintArray uniformIndices_ref, jint uniformIndicesOffset) { |
| jint _exception = 0; |
| const char* _exceptionType = NULL; |
| const char* _exceptionMessage = NULL; |
| jint _count = 0; |
| jint _i; |
| const char** _names = NULL; |
| GLuint* _indices_base = NULL; |
| GLuint* _indices = NULL; |
| |
| if (!uniformNames_ref) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "uniformNames == null"; |
| goto exit; |
| } |
| _count = _env->GetArrayLength(uniformNames_ref); |
| _names = (const char**)calloc(_count, sizeof(const char*)); |
| for (_i = 0; _i < _count; _i++) { |
| jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); |
| if (!_name) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "null uniformNames element"; |
| goto exit; |
| } |
| _names[_i] = _env->GetStringUTFChars(_name, 0); |
| } |
| |
| if (!uniformIndices_ref) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "uniformIndices == null"; |
| goto exit; |
| } |
| if (uniformIndicesOffset < 0) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "uniformIndicesOffset < 0"; |
| goto exit; |
| } |
| if (_env->GetArrayLength(uniformIndices_ref) - uniformIndicesOffset < _count) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "not enough space in uniformIndices"; |
| goto exit; |
| } |
| _indices_base = (GLuint*)_env->GetIntArrayElements( |
| uniformIndices_ref, 0); |
| _indices = _indices_base + uniformIndicesOffset; |
| |
| glGetUniformIndices(program, _count, _names, _indices); |
| |
| exit: |
| if (_indices_base) { |
| _env->ReleaseIntArrayElements(uniformIndices_ref, (jint*)_indices_base, |
| _exception ? JNI_ABORT : 0); |
| } |
| for (_i = _count - 1; _i >= 0; _i--) { |
| if (_names[_i]) { |
| jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); |
| if (_name) { |
| _env->ReleaseStringUTFChars(_name, _names[_i]); |
| } |
| } |
| } |
| free(_names); |
| if (_exception) { |
| jniThrowException(_env, _exceptionType, _exceptionMessage); |
| } |
| } |
| |
| /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ |
| static |
| void |
| android_glGetUniformIndices_buffer |
| (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jobject uniformIndices_buf) { |
| jint _exception = 0; |
| const char* _exceptionType = NULL; |
| const char* _exceptionMessage = NULL; |
| jint _count = 0; |
| jint _i; |
| const char** _names = NULL; |
| jintArray _uniformIndicesArray = (jintArray)0; |
| jint _uniformIndicesRemaining; |
| jint _uniformIndicesOffset = 0; |
| GLuint* _indices = NULL; |
| char* _indicesBase = NULL; |
| |
| if (!uniformNames_ref) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "uniformNames == null"; |
| goto exit; |
| } |
| if (!uniformIndices_buf) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "uniformIndices == null"; |
| goto exit; |
| } |
| |
| _count = _env->GetArrayLength(uniformNames_ref); |
| _names = (const char**)calloc(_count, sizeof(const char*)); |
| for (_i = 0; _i < _count; _i++) { |
| jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); |
| if (!_name) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "null uniformNames element"; |
| goto exit; |
| } |
| _names[_i] = _env->GetStringUTFChars(_name, 0); |
| } |
| |
| _indices = (GLuint*)getPointer(_env, uniformIndices_buf, |
| (jarray*)&_uniformIndicesArray, &_uniformIndicesRemaining, |
| &_uniformIndicesOffset); |
| if (!_indices) { |
| _indicesBase = (char*)_env->GetIntArrayElements( |
| _uniformIndicesArray, 0); |
| _indices = (GLuint*)(_indicesBase + _uniformIndicesOffset); |
| } |
| if (_uniformIndicesRemaining < _count) { |
| _exception = 1; |
| _exceptionType = "java/lang/IllegalArgumentException"; |
| _exceptionMessage = "not enough space in uniformIndices"; |
| goto exit; |
| } |
| |
| glGetUniformIndices(program, _count, _names, _indices); |
| |
| exit: |
| if (_uniformIndicesArray) { |
| releaseArrayPointer<jintArray, jint*, IntArrayReleaser>( |
| _env, _uniformIndicesArray, (jint*)_indicesBase, JNI_TRUE); |
| } |
| for (_i = _count - 1; _i >= 0; _i--) { |
| if (_names[_i]) { |
| jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); |
| if (_name) { |
| _env->ReleaseStringUTFChars(_name, _names[_i]); |
| } |
| } |
| } |
| free(_names); |
| if (_exception) { |
| jniThrowException(_env, _exceptionType, _exceptionMessage); |
| } |
| } |