• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */
2 static
3 void
android_glGetUniformIndices_array(JNIEnv * _env,jobject _this,jint program,jobjectArray uniformNames_ref,jintArray uniformIndices_ref,jint uniformIndicesOffset)4 android_glGetUniformIndices_array
5     (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jintArray uniformIndices_ref, jint uniformIndicesOffset) {
6     jint _exception = 0;
7     const char* _exceptionType = NULL;
8     const char* _exceptionMessage = NULL;
9     jint _count = 0;
10     jint _i;
11     const char** _names = NULL;
12     GLuint* _indices_base = NULL;
13     GLuint* _indices = NULL;
14 
15     if (!uniformNames_ref) {
16         _exception = 1;
17         _exceptionType = "java/lang/IllegalArgumentException";
18         _exceptionMessage = "uniformNames == null";
19         goto exit;
20     }
21     _count = _env->GetArrayLength(uniformNames_ref);
22     _names = (const char**)calloc(_count, sizeof(const char*));
23     for (_i = 0; _i < _count; _i++) {
24         jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
25         if (!_name) {
26             _exception = 1;
27             _exceptionType = "java/lang/IllegalArgumentException";
28             _exceptionMessage = "null uniformNames element";
29             goto exit;
30         }
31         _names[_i] = _env->GetStringUTFChars(_name, 0);
32     }
33 
34     if (!uniformIndices_ref) {
35         _exception = 1;
36         _exceptionType = "java/lang/IllegalArgumentException";
37         _exceptionMessage = "uniformIndices == null";
38         goto exit;
39     }
40     if (uniformIndicesOffset < 0) {
41         _exception = 1;
42         _exceptionType = "java/lang/IllegalArgumentException";
43         _exceptionMessage = "uniformIndicesOffset < 0";
44         goto exit;
45     }
46     if (_env->GetArrayLength(uniformIndices_ref) - uniformIndicesOffset < _count) {
47         _exception = 1;
48         _exceptionType = "java/lang/IllegalArgumentException";
49         _exceptionMessage = "not enough space in uniformIndices";
50         goto exit;
51     }
52     _indices_base = (GLuint*)_env->GetIntArrayElements(
53             uniformIndices_ref, 0);
54     _indices = _indices_base + uniformIndicesOffset;
55 
56     glGetUniformIndices(program, _count, _names, _indices);
57 
58 exit:
59     if (_indices_base) {
60         _env->ReleaseIntArrayElements(uniformIndices_ref, (jint*)_indices_base,
61             _exception ? JNI_ABORT : 0);
62     }
63     for (_i = _count - 1; _i >= 0; _i--) {
64         if (_names[_i]) {
65             jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
66             if (_name) {
67                 _env->ReleaseStringUTFChars(_name, _names[_i]);
68             }
69         }
70     }
71     free(_names);
72     if (_exception) {
73         jniThrowException(_env, _exceptionType, _exceptionMessage);
74     }
75 }
76 
77 /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */
78 static
79 void
android_glGetUniformIndices_buffer(JNIEnv * _env,jobject _this,jint program,jobjectArray uniformNames_ref,jobject uniformIndices_buf)80 android_glGetUniformIndices_buffer
81     (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jobject uniformIndices_buf) {
82     jint _exception = 0;
83     const char* _exceptionType = NULL;
84     const char* _exceptionMessage = NULL;
85     jint _count = 0;
86     jint _i;
87     const char** _names = NULL;
88     jintArray _uniformIndicesArray = (jintArray)0;
89     jint _uniformIndicesRemaining;
90     jint _uniformIndicesOffset = 0;
91     GLuint* _indices = NULL;
92     char* _indicesBase = NULL;
93 
94     if (!uniformNames_ref) {
95         _exception = 1;
96         _exceptionType = "java/lang/IllegalArgumentException";
97         _exceptionMessage = "uniformNames == null";
98         goto exit;
99     }
100     if (!uniformIndices_buf) {
101         _exception = 1;
102         _exceptionType = "java/lang/IllegalArgumentException";
103         _exceptionMessage = "uniformIndices == null";
104         goto exit;
105     }
106 
107     _count = _env->GetArrayLength(uniformNames_ref);
108     _names = (const char**)calloc(_count, sizeof(const char*));
109     for (_i = 0; _i < _count; _i++) {
110         jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
111         if (!_name) {
112             _exception = 1;
113             _exceptionType = "java/lang/IllegalArgumentException";
114             _exceptionMessage = "null uniformNames element";
115             goto exit;
116         }
117         _names[_i] = _env->GetStringUTFChars(_name, 0);
118     }
119 
120     _indices = (GLuint*)getPointer(_env, uniformIndices_buf,
121             (jarray*)&_uniformIndicesArray, &_uniformIndicesRemaining,
122             &_uniformIndicesOffset);
123     if (!_indices) {
124         _indicesBase = (char*)_env->GetIntArrayElements(
125             _uniformIndicesArray, 0);
126         _indices = (GLuint*)(_indicesBase + _uniformIndicesOffset);
127     }
128     if (_uniformIndicesRemaining < _count) {
129         _exception = 1;
130         _exceptionType = "java/lang/IllegalArgumentException";
131         _exceptionMessage = "not enough space in uniformIndices";
132         goto exit;
133     }
134 
135     glGetUniformIndices(program, _count, _names, _indices);
136 
137 exit:
138     if (_uniformIndicesArray) {
139         releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(
140             _env, _uniformIndicesArray, (jint*)_indicesBase, JNI_TRUE);
141     }
142     for (_i = _count - 1; _i >= 0; _i--) {
143         if (_names[_i]) {
144             jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i);
145             if (_name) {
146                 _env->ReleaseStringUTFChars(_name, _names[_i]);
147             }
148         }
149     }
150     free(_names);
151     if (_exception) {
152         jniThrowException(_env, _exceptionType, _exceptionMessage);
153     }
154 }
155