• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 **
2 ** Copyright 2006, The Android Open Source Project
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 **     http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 
17 // This source file is automatically generated
18 
19 #include <android_runtime/AndroidRuntime.h>
20 #include <utils/misc.h>
21 
22 #include <assert.h>
23 #include <GLES/gl.h>
24 #include <GLES/glext.h>
25 
26 // Work around differences between the generated name and the actual name.
27 
28 #define glBlendEquation glBlendEquationOES
29 #define glBlendEquationSeparate glBlendEquationSeparateOES
30 #define glBlendFuncSeparate glBlendFuncSeparateOES
31 #define glGetTexGenfv glGetTexGenfvOES
32 #define glGetTexGeniv glGetTexGenivOES
33 #define glGetTexGenxv glGetTexGenxvOES
34 #define glTexGenf glTexGenfOES
35 #define glTexGenfv glTexGenfvOES
36 #define glTexGeni glTexGeniOES
37 #define glTexGeniv glTexGenivOES
38 #define glTexGenx glTexGenxOES
39 #define glTexGenxv glTexGenxvOES
40 
41 
42 
43 /* special calls implemented in Android's GLES wrapper used to more
44  * efficiently bound-check passed arrays */
45 extern "C" {
46 GL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride,
47         const GLvoid *ptr, GLsizei count);
48 GL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride,
49         const GLvoid *pointer, GLsizei count);
50 GL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type,
51         GLsizei stride, const GLvoid *pointer, GLsizei count);
52 GL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type,
53         GLsizei stride, const GLvoid *pointer, GLsizei count);
54 GL_API void GL_APIENTRY glPointSizePointerOESBounds(GLenum type,
55         GLsizei stride, const GLvoid *pointer, GLsizei count);
56 GL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type,
57         GLsizei stride, const GLvoid *pointer, GLsizei count);
58 GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
59         GLsizei stride, const GLvoid *pointer, GLsizei count);
60 }
61 
62 static int initialized = 0;
63 
64 static jclass nioAccessClass;
65 static jclass bufferClass;
66 static jclass OOMEClass;
67 static jclass UOEClass;
68 static jclass IAEClass;
69 static jclass AIOOBEClass;
70 static jclass G11ImplClass;
71 static jmethodID getBasePointerID;
72 static jmethodID getBaseArrayID;
73 static jmethodID getBaseArrayOffsetID;
74 static jmethodID allowIndirectBuffersID;
75 static jfieldID positionID;
76 static jfieldID limitID;
77 static jfieldID elementSizeShiftID;
78 static jfieldID haveCheckedExtensionsID;
79 static jfieldID have_OES_blend_equation_separateID;
80 static jfieldID have_OES_blend_subtractID;
81 static jfieldID have_OES_framebuffer_objectID;
82 static jfieldID have_OES_texture_cube_mapID;
83 
84 /* Cache method IDs each time the class is loaded. */
85 
86 static void
87 nativeClassInitBuffer(JNIEnv *_env)
88 {
89     jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
90     nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
91 
92     jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
93     bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
94 
95     jclass g11impClassLocal = _env->FindClass("com/google/android/gles_jni/GLImpl");
96     G11ImplClass = (jclass) _env->NewGlobalRef(g11impClassLocal);
97     haveCheckedExtensionsID =  _env->GetFieldID(G11ImplClass, "haveCheckedExtensions", "Z");
98     have_OES_blend_equation_separateID =  _env->GetFieldID(G11ImplClass, "have_OES_blend_equation_separate", "Z");
99     have_OES_blend_subtractID =  _env->GetFieldID(G11ImplClass, "have_OES_blend_subtract", "Z");
100     have_OES_framebuffer_objectID =  _env->GetFieldID(G11ImplClass, "have_OES_framebuffer_object", "Z");
101     have_OES_texture_cube_mapID =  _env->GetFieldID(G11ImplClass, "have_OES_texture_cube_map", "Z");
102 
103     getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
104             "getBasePointer", "(Ljava/nio/Buffer;)J");
105     getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
106             "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
107     getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
108             "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
109     allowIndirectBuffersID = _env->GetStaticMethodID(g11impClassLocal,
110             "allowIndirectBuffers", "(Ljava/lang/String;)Z");
111     positionID = _env->GetFieldID(bufferClass, "position", "I");
112     limitID = _env->GetFieldID(bufferClass, "limit", "I");
113     elementSizeShiftID =
114         _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
115 }
116 
117 static void
118 nativeClassInit(JNIEnv *_env, jclass glImplClass)
119 {
120     nativeClassInitBuffer(_env);
121 
122     jclass IAEClassLocal =
123         _env->FindClass("java/lang/IllegalArgumentException");
124     jclass OOMEClassLocal =
125          _env->FindClass("java/lang/OutOfMemoryError");
126     jclass UOEClassLocal =
127          _env->FindClass("java/lang/UnsupportedOperationException");
128     jclass AIOOBEClassLocal =
129          _env->FindClass("java/lang/ArrayIndexOutOfBoundsException");
130 
131     IAEClass = (jclass) _env->NewGlobalRef(IAEClassLocal);
132     OOMEClass = (jclass) _env->NewGlobalRef(OOMEClassLocal);
133     UOEClass = (jclass) _env->NewGlobalRef(UOEClassLocal);
134     AIOOBEClass = (jclass) _env->NewGlobalRef(AIOOBEClassLocal);
135 }
136 
137 static void *
138 getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
139 {
140     jint position;
141     jint limit;
142     jint elementSizeShift;
143     jlong pointer;
144     jint offset;
145     void *data;
146 
147     position = _env->GetIntField(buffer, positionID);
148     limit = _env->GetIntField(buffer, limitID);
149     elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
150     *remaining = (limit - position) << elementSizeShift;
151     pointer = _env->CallStaticLongMethod(nioAccessClass,
152             getBasePointerID, buffer);
153     if (pointer != 0L) {
154         *array = NULL;
155         return (void *) (jint) pointer;
156     }
157 
158     *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
159             getBaseArrayID, buffer);
160     if (*array == NULL) {
161         return (void*) NULL;
162     }
163     offset = _env->CallStaticIntMethod(nioAccessClass,
164             getBaseArrayOffsetID, buffer);
165     data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
166 
167     return (void *) ((char *) data + offset);
168 }
169 
170 static void
171 releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
172 {
173     _env->ReleasePrimitiveArrayCritical(array, data,
174 					   commit ? 0 : JNI_ABORT);
175 }
176 
177 extern "C" {
178 extern char*  __progname;
179 }
180 
181 static bool
182 allowIndirectBuffers(JNIEnv *_env) {
183     static jint sIndirectBufferCompatability;
184     if (sIndirectBufferCompatability == 0) {
185         jobject appName = _env->NewStringUTF(::__progname);
186         sIndirectBufferCompatability = _env->CallStaticBooleanMethod(G11ImplClass, allowIndirectBuffersID, appName) ? 2 : 1;
187     }
188     return sIndirectBufferCompatability == 2;
189 }
190 
191 static void *
192 getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
193     if (!buffer) {
194         return NULL;
195     }
196     void* buf = _env->GetDirectBufferAddress(buffer);
197     if (buf) {
198         jint position = _env->GetIntField(buffer, positionID);
199         jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
200         buf = ((char*) buf) + (position << elementSizeShift);
201     } else {
202         if (allowIndirectBuffers(_env)) {
203             jarray array = 0;
204             jint remaining;
205             buf = getPointer(_env, buffer, &array, &remaining);
206             if (array) {
207                 releasePointer(_env, array, buf, 0);
208             }
209         } else {
210             _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
211         }
212     }
213     return buf;
214 }
215 
216 static int
217 getNumCompressedTextureFormats() {
218     int numCompressedTextureFormats = 0;
219     glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedTextureFormats);
220     return numCompressedTextureFormats;
221 }
222 
223 // Check if the extension at the head of pExtensions is pExtension. Note that pExtensions is
224 // terminated by either 0 or space, while pExtension is terminated by 0.
225 
226 static bool
227 extensionEqual(const GLubyte* pExtensions, const GLubyte* pExtension) {
228     while (true) {
229         char a = *pExtensions++;
230         char b = *pExtension++;
231         bool aEnd = a == '\0' || a == ' ';
232         bool bEnd = b == '\0';
233         if ( aEnd || bEnd) {
234             return aEnd == bEnd;
235         }
236         if ( a != b ) {
237             return false;
238         }
239     }
240 }
241 
242 static const GLubyte*
243 nextExtension(const GLubyte* pExtensions) {
244     while (true) {
245         char a = *pExtensions++;
246         if ( a == '\0') {
247             return pExtensions-1;
248         } else if ( a == ' ') {
249             return pExtensions;
250         }
251     }
252 }
253 
254 static bool
255 checkForExtension(const GLubyte* pExtensions, const GLubyte* pExtension) {
256     for (;*pExtensions != '\0'; pExtensions = nextExtension(pExtensions)) {
257         if (extensionEqual(pExtensions, pExtension)) {
258             return true;
259         }
260     }
261     return false;
262 }
263 
264 static bool
265 supportsExtension(JNIEnv *_env, jobject impl, jfieldID fieldId) {
266     if (!_env->GetBooleanField(impl, haveCheckedExtensionsID)) {
267         _env->SetBooleanField(impl, haveCheckedExtensionsID, true);
268         const GLubyte* sExtensions = glGetString(GL_EXTENSIONS);
269         _env->SetBooleanField(impl, have_OES_blend_equation_separateID,
270             checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_equation_separate"));
271         _env->SetBooleanField(impl, have_OES_blend_subtractID,
272             checkForExtension(sExtensions, (const GLubyte*) "GL_OES_blend_subtract"));
273         _env->SetBooleanField(impl, have_OES_framebuffer_objectID,
274             checkForExtension(sExtensions, (const GLubyte*) "GL_OES_framebuffer_object"));
275         _env->SetBooleanField(impl, have_OES_texture_cube_mapID,
276             checkForExtension(sExtensions, (const GLubyte*) "GL_OES_texture_cube_map"));
277     }
278     return _env->GetBooleanField(impl, fieldId);
279 }
280 
281 // --------------------------------------------------------------------------
282 
283