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 } 524e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _indices_base = (GLuint*)_env->GetIntArrayElements( 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) { 604e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(uniformIndices_ref, (jint*)_indices_base, 614e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _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; 884e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _uniformIndicesArray = (jintArray)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, 1214e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi (jarray*)&_uniformIndicesArray, &_uniformIndicesRemaining, 12227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall &_uniformIndicesOffset); 12327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (!_indices) { 1244e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _indicesBase = (char*)_env->GetIntArrayElements( 1254e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _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) { 1394e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>( 1404e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env, _uniformIndicesArray, (jint*)_indicesBase, JNI_TRUE); 14127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall for (_i = _count - 1; _i >= 0; _i--) { 14327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_names[_i]) { 14427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); 14527c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_name) { 14627c86b962373f40a01f094689d623d51c51d4f83Jesse Hall _env->ReleaseStringUTFChars(_name, _names[_i]); 14727c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14827c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 14927c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 15027c86b962373f40a01f094689d623d51c51d4f83Jesse Hall free(_names); 15127c86b962373f40a01f094689d623d51c51d4f83Jesse Hall if (_exception) { 15227c86b962373f40a01f094689d623d51c51d4f83Jesse Hall jniThrowException(_env, _exceptionType, _exceptionMessage); 15327c86b962373f40a01f094689d623d51c51d4f83Jesse Hall } 15427c86b962373f40a01f094689d623d51c51d4f83Jesse Hall} 155