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