127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall/* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ 227c86b962373f40a01f094689d623d51c51d4f83Jesse Hallstatic 327c86b962373f40a01f094689d623d51c51d4f83Jesse Hallvoid 427c86b962373f40a01f094689d623d51c51d4f83Jesse Hallandroid_glGetUniformIndices_array 527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jintArray uniformIndices_ref, jint uniformIndicesOffset) { 627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _exception = 0; 727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char* _exceptionType = NULL; 827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char* _exceptionMessage = NULL; 927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _count = 0; 1027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _i; 1127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char** _names = NULL; 1227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall GLuint* _indices_base = NULL; 1327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall GLuint* _indices = NULL; 1427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 1527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!uniformNames_ref) { 1627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 1727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 1827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "uniformNames == null"; 1927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 2027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 2127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _count = _env->GetArrayLength(uniformNames_ref); 2227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _names = (const char**)calloc(_count, sizeof(const char*)); 2327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall for (_i = 0; _i < _count; _i++) { 2427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); 2527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!_name) { 2627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 2727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 2827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "null uniformNames element"; 2927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 3027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 3127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _names[_i] = _env->GetStringUTFChars(_name, 0); 3227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 3327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 3427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!uniformIndices_ref) { 3527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 3627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 3727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "uniformIndices == null"; 3827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 3927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 4027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (uniformIndicesOffset < 0) { 4127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 4227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 4327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "uniformIndicesOffset < 0"; 4427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 4527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 4627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_env->GetArrayLength(uniformIndices_ref) - uniformIndicesOffset < _count) { 4727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 4827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 4927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "not enough space in uniformIndices"; 5027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 5127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 5227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _indices_base = (GLuint*)_env->GetPrimitiveArrayCritical( 5327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall uniformIndices_ref, 0); 5427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _indices = _indices_base + uniformIndicesOffset; 5527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 5627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall glGetUniformIndices(program, _count, _names, _indices); 5727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 5827c86b962373f40a01f094689d623d51c51d4f83Jesse Hallexit: 5927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_indices_base) { 6027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _env->ReleasePrimitiveArrayCritical(uniformIndices_ref, _indices_base, 6127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception ? JNI_ABORT : 0); 6227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 6327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall for (_i = _count - 1; _i >= 0; _i--) { 6427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_names[_i]) { 6527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); 6627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_name) { 6727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _env->ReleaseStringUTFChars(_name, _names[_i]); 6827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 6927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 7027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 7127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall free(_names); 7227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_exception) { 7327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jniThrowException(_env, _exceptionType, _exceptionMessage); 7427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 7527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall} 7627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 7727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall/* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ 7827c86b962373f40a01f094689d623d51c51d4f83Jesse Hallstatic 7927c86b962373f40a01f094689d623d51c51d4f83Jesse Hallvoid 8027c86b962373f40a01f094689d623d51c51d4f83Jesse Hallandroid_glGetUniformIndices_buffer 8127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jobject uniformIndices_buf) { 8227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _exception = 0; 8327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char* _exceptionType = NULL; 8427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char* _exceptionMessage = NULL; 8527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _count = 0; 8627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _i; 8727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall const char** _names = NULL; 8827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jarray _uniformIndicesArray = (jarray)0; 8927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _uniformIndicesRemaining; 9027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jint _uniformIndicesOffset = 0; 9127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall GLuint* _indices = NULL; 9227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall char* _indicesBase = NULL; 9327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 9427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!uniformNames_ref) { 9527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 9627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 9727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "uniformNames == null"; 9827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 9927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 10027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!uniformIndices_buf) { 10127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 10227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 10327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "uniformIndices == null"; 10427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 10527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 10627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 10727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _count = _env->GetArrayLength(uniformNames_ref); 10827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _names = (const char**)calloc(_count, sizeof(const char*)); 10927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall for (_i = 0; _i < _count; _i++) { 11027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); 11127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!_name) { 11227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 11327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 11427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "null uniformNames element"; 11527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 11627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 11727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _names[_i] = _env->GetStringUTFChars(_name, 0); 11827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 11927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 12027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _indices = (GLuint*)getPointer(_env, uniformIndices_buf, 12127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall &_uniformIndicesArray, &_uniformIndicesRemaining, 12227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall &_uniformIndicesOffset); 12327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!_indices) { 12427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _indicesBase = (char*)_env->GetPrimitiveArrayCritical( 12527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _uniformIndicesArray, 0); 12627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _indices = (GLuint*)(_indicesBase + _uniformIndicesOffset); 12727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 12827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_uniformIndicesRemaining < _count) { 12927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exception = 1; 13027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 13127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _exceptionMessage = "not enough space in uniformIndices"; 13227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall goto exit; 13327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 13427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 13527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall glGetUniformIndices(program, _count, _names, _indices); 13627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 13727c86b962373f40a01f094689d623d51c51d4f83Jesse Hallexit: 13827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_uniformIndicesArray) { 13927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall releasePointer(_env, _uniformIndicesArray, _indicesBase, JNI_TRUE); 14027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall for (_i = _count - 1; _i >= 0; _i--) { 14227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_names[_i]) { 14327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); 14427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_name) { 14527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _env->ReleaseStringUTFChars(_name, _names[_i]); 14627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall free(_names); 15027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_exception) { 15127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jniThrowException(_env, _exceptionType, _exceptionMessage); 15227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 15327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall} 15427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall 155