1/* void glGetActiveUniformBlockName ( GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName ) */
2static void
3android_glGetActiveUniformBlockName_III_3II_3BI
4    (JNIEnv* _env, jobject _this, jint program, jint uniformBlockIndex, int bufSize, jintArray length_ref, jint lengthOffset, jbyteArray name_ref, jint nameOffset) {
5    jint _exception = 0;
6    const char* _exceptionType;
7    const char* _exceptionMessage;
8    GLsizei* _length_base = (GLsizei*)0;
9    jint _lengthRemaining;
10    GLsizei* _length = (GLsizei*)0;
11    GLchar* _name_base = (GLchar*)0;
12    jint _nameRemaining;
13    GLchar* _name = (GLchar*)0;
14
15    if (length_ref) {
16        if (lengthOffset < 0) {
17            _exception = 1;
18            _exceptionType = "java/lang/IllegalArgumentException";
19            _exceptionMessage = "lengthOffset < 0";
20            goto exit;
21        }
22        _lengthRemaining = _env->GetArrayLength(length_ref) - lengthOffset;
23        _length_base = (GLsizei*)_env->GetIntArrayElements(
24                length_ref, (jboolean*)0);
25        _length = _length_base + lengthOffset;
26    }
27
28    if (!name_ref) {
29        _exception = 1;
30        _exceptionType = "java/lang/IllegalArgumentException";
31        _exceptionMessage = "uniformBlockName == null";
32        goto exit;
33    }
34    if (nameOffset < 0) {
35        _exception = 1;
36        _exceptionType = "java/lang/IllegalArgumentException";
37        _exceptionMessage = "uniformBlockNameOffset < 0";
38        goto exit;
39    }
40    _nameRemaining = _env->GetArrayLength(name_ref) - nameOffset;
41    _name_base = (GLchar*)_env->GetByteArrayElements(
42            name_ref, (jboolean*)0);
43    _name = _name_base + nameOffset;
44
45    glGetActiveUniformBlockName(
46        (GLuint)program,
47        (GLuint)uniformBlockIndex,
48        (GLsizei)bufSize,
49        (GLsizei*)_length,
50        (GLchar*)_name
51    );
52
53exit:
54    if (_name_base) {
55        _env->ReleaseByteArrayElements(name_ref, (jbyte*)_name_base,
56            _exception ? JNI_ABORT: 0);
57    }
58    if (_length_base) {
59        _env->ReleaseIntArrayElements(length_ref, (jint*)_length_base,
60            _exception ? JNI_ABORT: 0);
61    }
62    if (_exception) {
63        jniThrowException(_env, _exceptionType, _exceptionMessage);
64    }
65}
66
67/* void glGetActiveUniformBlockName ( GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName ) */
68static void
69android_glGetActiveUniformBlockName_IILjava_nio_Buffer_2Ljava_nio_Buffer_2
70    (JNIEnv* _env, jobject _this, jint program, jint uniformBlockIndex, jobject length_buf, jobject uniformBlockName_buf) {
71    jint _exception = 0;
72    const char* _exceptionType;
73    const char* _exceptionMessage;
74    jarray _lengthArray = (jarray)0;
75    jint _lengthBufferOffset = (jint)0;
76    GLsizei* _length = (GLsizei*)0;
77    jint _lengthRemaining;
78    jarray _nameArray = (jarray)0;
79    jint _nameBufferOffset = (jint)0;
80    GLchar* _name = (GLchar*)0;
81    jint _nameRemaining;
82
83    _length = (GLsizei*)getPointer(_env, length_buf, &_lengthArray, &_lengthRemaining, &_lengthBufferOffset);
84    if (_length == NULL) {
85        GLsizei* _lengthBase = (GLsizei*)_env->GetPrimitiveArrayCritical(_lengthArray, (jboolean*)0);
86        _length = (GLsizei*)(_lengthBase + _lengthBufferOffset);
87    }
88
89    _name = (GLchar*)getPointer(_env, uniformBlockName_buf, &_nameArray, &_nameRemaining, &_nameBufferOffset);
90    if (_name == NULL) {
91        GLchar* _nameBase = (GLchar*)_env->GetPrimitiveArrayCritical(_nameArray, (jboolean*)0);
92        _name = (GLchar*)(_nameBase + _nameBufferOffset);
93    }
94
95    glGetActiveUniformBlockName(
96        (GLuint)program,
97        (GLuint)uniformBlockIndex,
98        (GLsizei)_nameRemaining,
99        _length, _name
100    );
101    if (_nameArray) {
102        releasePointer(_env, _nameArray, _name, JNI_TRUE);
103    }
104    if (_lengthArray) {
105        releasePointer(_env, _lengthArray, _length, JNI_TRUE);
106    }
107}
108
109/* void glGetActiveUniformBlockName ( GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName ) */
110static jstring
111android_glGetActiveUniformBlockName_II
112    (JNIEnv *_env, jobject _this, jint program, jint uniformBlockIndex) {
113    GLint len = 0;
114    glGetActiveUniformBlockiv((GLuint)program, (GLuint)uniformBlockIndex,
115            GL_UNIFORM_BLOCK_NAME_LENGTH, &len);
116    GLchar* name = (GLchar*)malloc(len);
117    glGetActiveUniformBlockName((GLuint)program, (GLuint)uniformBlockIndex,
118        len, NULL, name);
119    jstring result = _env->NewStringUTF(name);
120    free(name);
121    return result;
122}
123