1 /*
2 ** Copyright 2012, 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 #pragma GCC diagnostic ignored "-Wunused-variable"
20 #pragma GCC diagnostic ignored "-Wunused-function"
21
22 #include "jni.h"
23 #include <nativehelper/JNIHelp.h>
24 #include <android_runtime/AndroidRuntime.h>
25 #include <android_runtime/android_view_Surface.h>
26 #include <android_runtime/android_graphics_SurfaceTexture.h>
27 #include <utils/misc.h>
28
29 #include <assert.h>
30 #include <EGL/egl.h>
31
32 #include <gui/Surface.h>
33 #include <gui/GLConsumer.h>
34 #include <gui/Surface.h>
35
36 #include <ui/ANativeObjectBase.h>
37
38 static int initialized = 0;
39
40 static jclass egldisplayClass;
41 static jclass eglcontextClass;
42 static jclass eglsurfaceClass;
43 static jclass eglconfigClass;
44
45 static jmethodID egldisplayGetHandleID;
46 static jmethodID eglcontextGetHandleID;
47 static jmethodID eglsurfaceGetHandleID;
48 static jmethodID eglconfigGetHandleID;
49
50 static jmethodID egldisplayConstructor;
51 static jmethodID eglcontextConstructor;
52 static jmethodID eglsurfaceConstructor;
53 static jmethodID eglconfigConstructor;
54
55 static jobject eglNoContextObject;
56 static jobject eglNoDisplayObject;
57 static jobject eglNoSurfaceObject;
58
59
60
61 /* Cache method IDs each time the class is loaded. */
62
63 static void
nativeClassInit(JNIEnv * _env,jclass glImplClass)64 nativeClassInit(JNIEnv *_env, jclass glImplClass)
65 {
66 jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay");
67 egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal);
68 jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext");
69 eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal);
70 jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface");
71 eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal);
72 jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig");
73 eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal);
74
75 egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J");
76 eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J");
77 eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J");
78 eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J");
79
80
81 egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(J)V");
82 eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(J)V");
83 eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(J)V");
84 eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(J)V");
85
86 jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast<jlong>(EGL_NO_CONTEXT));
87 eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
88 jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast<jlong>(EGL_NO_DISPLAY));
89 eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
90 jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast<jlong>(EGL_NO_SURFACE));
91 eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
92
93
94 jclass eglClass = _env->FindClass("android/opengl/EGL14");
95 jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;");
96 _env->SetStaticObjectField(eglClass, noContextFieldID, eglNoContextObject);
97
98 jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;");
99 _env->SetStaticObjectField(eglClass, noDisplayFieldID, eglNoDisplayObject);
100
101 jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;");
102 _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject);
103 }
104
105 static void *
fromEGLHandle(JNIEnv * _env,jmethodID mid,jobject obj)106 fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) {
107 if (obj == NULL){
108 jniThrowException(_env, "java/lang/IllegalArgumentException",
109 "Object is set to null.");
110 }
111
112 jlong handle = _env->CallLongMethod(obj, mid);
113 return reinterpret_cast<void*>(handle);
114 }
115
116 static jobject
toEGLHandle(JNIEnv * _env,jclass cls,jmethodID con,void * handle)117 toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
118 if (cls == eglcontextClass &&
119 (EGLContext)handle == EGL_NO_CONTEXT) {
120 return eglNoContextObject;
121 }
122
123 if (cls == egldisplayClass &&
124 (EGLDisplay)handle == EGL_NO_DISPLAY) {
125 return eglNoDisplayObject;
126 }
127
128 if (cls == eglsurfaceClass &&
129 (EGLSurface)handle == EGL_NO_SURFACE) {
130 return eglNoSurfaceObject;
131 }
132
133 return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
134 }
135
136 // --------------------------------------------------------------------------
137 /* EGLint eglGetError ( void ) */
138 static jint
android_eglGetError(JNIEnv * _env,jobject _this)139 android_eglGetError
140 (JNIEnv *_env, jobject _this) {
141 EGLint _returnValue = (EGLint) 0;
142 _returnValue = eglGetError();
143 return (jint)_returnValue;
144 }
145
146 /* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
147 static jobject
android_eglGetDisplay(JNIEnv * _env,jobject _this,jlong display_id)148 android_eglGetDisplay
149 (JNIEnv *_env, jobject _this, jlong display_id) {
150 EGLDisplay _returnValue = (EGLDisplay) 0;
151 _returnValue = eglGetDisplay(
152 reinterpret_cast<EGLNativeDisplayType>(display_id)
153 );
154 return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue);
155 }
156
157 /* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
158 static jobject
android_eglGetDisplayInt(JNIEnv * _env,jobject _this,jint display_id)159 android_eglGetDisplayInt
160 (JNIEnv *_env, jobject _this, jint display_id) {
161
162 if (static_cast<uintptr_t>(display_id) !=
163 reinterpret_cast<uintptr_t>(EGL_DEFAULT_DISPLAY)) {
164 jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglGetDisplay");
165 return 0;
166 }
167 return android_eglGetDisplay(_env, _this, display_id);
168 }
169
170 /* EGLBoolean eglInitialize ( EGLDisplay dpy, EGLint *major, EGLint *minor ) */
171 static jboolean
android_eglInitialize(JNIEnv * _env,jobject _this,jobject dpy,jintArray major_ref,jint majorOffset,jintArray minor_ref,jint minorOffset)172 android_eglInitialize
173 (JNIEnv *_env, jobject _this, jobject dpy, jintArray major_ref, jint majorOffset, jintArray minor_ref, jint minorOffset) {
174 jint _exception = 0;
175 const char * _exceptionType = NULL;
176 const char * _exceptionMessage = NULL;
177 EGLBoolean _returnValue = (EGLBoolean) 0;
178 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
179 EGLint *major_base = (EGLint *) 0;
180 jint _majorRemaining;
181 EGLint *major = (EGLint *) 0;
182 EGLint *minor_base = (EGLint *) 0;
183 jint _minorRemaining;
184 EGLint *minor = (EGLint *) 0;
185
186 if (major_ref) {
187 if (majorOffset < 0) {
188 _exception = 1;
189 _exceptionType = "java/lang/IllegalArgumentException";
190 _exceptionMessage = "majorOffset < 0";
191 goto exit;
192 }
193 _majorRemaining = _env->GetArrayLength(major_ref) - majorOffset;
194 if (_majorRemaining < 1) {
195 _exception = 1;
196 _exceptionType = "java/lang/IllegalArgumentException";
197 _exceptionMessage = "length - majorOffset < 1 < needed";
198 goto exit;
199 }
200 major_base = (EGLint *)
201 _env->GetIntArrayElements(major_ref, (jboolean *)0);
202 major = major_base + majorOffset;
203 }
204
205 if (minor_ref) {
206 if (minorOffset < 0) {
207 _exception = 1;
208 _exceptionType = "java/lang/IllegalArgumentException";
209 _exceptionMessage = "minorOffset < 0";
210 goto exit;
211 }
212 _minorRemaining = _env->GetArrayLength(minor_ref) - minorOffset;
213 if (_minorRemaining < 1) {
214 _exception = 1;
215 _exceptionType = "java/lang/IllegalArgumentException";
216 _exceptionMessage = "length - minorOffset < 1 < needed";
217 goto exit;
218 }
219 minor_base = (EGLint *)
220 _env->GetIntArrayElements(minor_ref, (jboolean *)0);
221 minor = minor_base + minorOffset;
222 }
223
224 _returnValue = eglInitialize(
225 (EGLDisplay)dpy_native,
226 (EGLint *)major,
227 (EGLint *)minor
228 );
229
230 exit:
231 if (minor_base) {
232 _env->ReleaseIntArrayElements(minor_ref, (jint*)minor_base,
233 _exception ? JNI_ABORT: 0);
234 }
235 if (major_base) {
236 _env->ReleaseIntArrayElements(major_ref, (jint*)major_base,
237 _exception ? JNI_ABORT: 0);
238 }
239 if (_exception) {
240 jniThrowException(_env, _exceptionType, _exceptionMessage);
241 }
242 return (jboolean)_returnValue;
243 }
244
245 /* EGLBoolean eglTerminate ( EGLDisplay dpy ) */
246 static jboolean
android_eglTerminate(JNIEnv * _env,jobject _this,jobject dpy)247 android_eglTerminate
248 (JNIEnv *_env, jobject _this, jobject dpy) {
249 EGLBoolean _returnValue = (EGLBoolean) 0;
250 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
251
252 _returnValue = eglTerminate(
253 (EGLDisplay)dpy_native
254 );
255 return (jboolean)_returnValue;
256 }
257
258 /* const char * eglQueryString ( EGLDisplay dpy, EGLint name ) */
259 static jstring
android_eglQueryString__Landroind_opengl_EGLDisplay_2I(JNIEnv * _env,jobject _this,jobject dpy,jint name)260 android_eglQueryString__Landroind_opengl_EGLDisplay_2I
261 (JNIEnv *_env, jobject _this, jobject dpy, jint name) {
262 const char* chars = (const char*) eglQueryString(
263 (EGLDisplay)fromEGLHandle(_env, egldisplayGetHandleID, dpy),
264 (EGLint)name
265 );
266 return _env->NewStringUTF(chars);
267 }
268 /* EGLBoolean eglGetConfigs ( EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config ) */
269 static jboolean
android_eglGetConfigs(JNIEnv * _env,jobject _this,jobject dpy,jobjectArray configs_ref,jint configsOffset,jint config_size,jintArray num_config_ref,jint num_configOffset)270 android_eglGetConfigs
271 (JNIEnv *_env, jobject _this, jobject dpy, jobjectArray configs_ref, jint configsOffset, jint config_size, jintArray num_config_ref, jint num_configOffset) {
272 jint _exception = 0;
273 const char * _exceptionType = NULL;
274 const char * _exceptionMessage = NULL;
275 EGLBoolean _returnValue = (EGLBoolean) 0;
276 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
277 jint _configsRemaining;
278 EGLConfig *configs = (EGLConfig *) 0;
279 EGLint *num_config_base = (EGLint *) 0;
280 jint _num_configRemaining;
281 EGLint *num_config = (EGLint *) 0;
282
283 if (configs_ref) {
284 if (configsOffset < 0) {
285 _exception = 1;
286 _exceptionType = "java/lang/IllegalArgumentException";
287 _exceptionMessage = "configsOffset < 0";
288 goto exit;
289 }
290 _configsRemaining = _env->GetArrayLength(configs_ref) - configsOffset;
291 if (_configsRemaining < config_size) {
292 _exception = 1;
293 _exceptionType = "java/lang/IllegalArgumentException";
294 _exceptionMessage = "length - configsOffset < config_size < needed";
295 goto exit;
296 }
297 configs = new EGLConfig[_configsRemaining];
298 }
299
300 if (!num_config_ref) {
301 _exception = 1;
302 _exceptionType = "java/lang/IllegalArgumentException";
303 _exceptionMessage = "num_config == null";
304 goto exit;
305 }
306 if (num_configOffset < 0) {
307 _exception = 1;
308 _exceptionType = "java/lang/IllegalArgumentException";
309 _exceptionMessage = "num_configOffset < 0";
310 goto exit;
311 }
312 _num_configRemaining = _env->GetArrayLength(num_config_ref) - num_configOffset;
313 num_config_base = (EGLint *)
314 _env->GetIntArrayElements(num_config_ref, (jboolean *)0);
315 num_config = num_config_base + num_configOffset;
316
317 _returnValue = eglGetConfigs(
318 (EGLDisplay)dpy_native,
319 (EGLConfig *)configs,
320 (EGLint)config_size,
321 (EGLint *)num_config
322 );
323
324 exit:
325 if (num_config_base) {
326 _env->ReleaseIntArrayElements(num_config_ref, (jint*)num_config_base,
327 _exception ? JNI_ABORT: 0);
328 }
329 if (configs) {
330 for (int i = 0; i < _configsRemaining; i++) {
331 jobject configs_new = toEGLHandle(_env, eglconfigClass, eglconfigConstructor, configs[i]);
332 _env->SetObjectArrayElement(configs_ref, i + configsOffset, configs_new);
333 }
334 delete[] configs;
335 }
336 if (_exception) {
337 jniThrowException(_env, _exceptionType, _exceptionMessage);
338 }
339 return (jboolean)_returnValue;
340 }
341
342 /* EGLBoolean eglChooseConfig ( EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config ) */
343 static jboolean
android_eglChooseConfig(JNIEnv * _env,jobject _this,jobject dpy,jintArray attrib_list_ref,jint attrib_listOffset,jobjectArray configs_ref,jint configsOffset,jint config_size,jintArray num_config_ref,jint num_configOffset)344 android_eglChooseConfig
345 (JNIEnv *_env, jobject _this, jobject dpy, jintArray attrib_list_ref, jint attrib_listOffset, jobjectArray configs_ref, jint configsOffset, jint config_size, jintArray num_config_ref, jint num_configOffset) {
346 jint _exception = 0;
347 const char * _exceptionType = NULL;
348 const char * _exceptionMessage = NULL;
349 EGLBoolean _returnValue = (EGLBoolean) 0;
350 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
351 bool attrib_list_sentinel = false;
352 EGLint *attrib_list_base = (EGLint *) 0;
353 jint _attrib_listRemaining;
354 EGLint *attrib_list = (EGLint *) 0;
355 jint _configsRemaining;
356 EGLConfig *configs = (EGLConfig *) 0;
357 EGLint *num_config_base = (EGLint *) 0;
358 jint _num_configRemaining;
359 EGLint *num_config = (EGLint *) 0;
360
361 if (!attrib_list_ref) {
362 _exception = 1;
363 _exceptionType = "java/lang/IllegalArgumentException";
364 _exceptionMessage = "attrib_list == null";
365 goto exit;
366 }
367 if (attrib_listOffset < 0) {
368 _exception = 1;
369 _exceptionType = "java/lang/IllegalArgumentException";
370 _exceptionMessage = "attrib_listOffset < 0";
371 goto exit;
372 }
373 _attrib_listRemaining = _env->GetArrayLength(attrib_list_ref) - attrib_listOffset;
374 attrib_list_base = (EGLint *)
375 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
376 attrib_list = attrib_list_base + attrib_listOffset;
377 attrib_list_sentinel = false;
378 for (int i = _attrib_listRemaining - 1; i >= 0; i--) {
379 if (attrib_list[i] == EGL_NONE){
380 attrib_list_sentinel = true;
381 break;
382 }
383 }
384 if (attrib_list_sentinel == false) {
385 _exception = 1;
386 _exceptionType = "java/lang/IllegalArgumentException";
387 _exceptionMessage = "attrib_list must contain EGL_NONE!";
388 goto exit;
389 }
390
391 if (configs_ref) {
392 if (configsOffset < 0) {
393 _exception = 1;
394 _exceptionType = "java/lang/IllegalArgumentException";
395 _exceptionMessage = "configsOffset < 0";
396 goto exit;
397 }
398 _configsRemaining = _env->GetArrayLength(configs_ref) - configsOffset;
399 if (_configsRemaining < config_size) {
400 _exception = 1;
401 _exceptionType = "java/lang/IllegalArgumentException";
402 _exceptionMessage = "length - configsOffset < config_size < needed";
403 goto exit;
404 }
405 configs = new EGLConfig[_configsRemaining];
406 }
407
408 if (!num_config_ref) {
409 _exception = 1;
410 _exceptionType = "java/lang/IllegalArgumentException";
411 _exceptionMessage = "num_config == null";
412 goto exit;
413 }
414 if (num_configOffset < 0) {
415 _exception = 1;
416 _exceptionType = "java/lang/IllegalArgumentException";
417 _exceptionMessage = "num_configOffset < 0";
418 goto exit;
419 }
420 _num_configRemaining = _env->GetArrayLength(num_config_ref) - num_configOffset;
421 if (_num_configRemaining < 1) {
422 _exception = 1;
423 _exceptionType = "java/lang/IllegalArgumentException";
424 _exceptionMessage = "length - num_configOffset < 1 < needed";
425 goto exit;
426 }
427 num_config_base = (EGLint *)
428 _env->GetIntArrayElements(num_config_ref, (jboolean *)0);
429 num_config = num_config_base + num_configOffset;
430
431 _returnValue = eglChooseConfig(
432 (EGLDisplay)dpy_native,
433 (EGLint *)attrib_list,
434 (EGLConfig *)configs,
435 (EGLint)config_size,
436 (EGLint *)num_config
437 );
438
439 exit:
440 if (num_config_base) {
441 _env->ReleaseIntArrayElements(num_config_ref, (jint*)num_config_base,
442 _exception ? JNI_ABORT: 0);
443 }
444 if (attrib_list_base) {
445 _env->ReleaseIntArrayElements(attrib_list_ref, (jint*)attrib_list_base,
446 JNI_ABORT);
447 }
448 if (configs) {
449 for (int i = 0; i < _configsRemaining; i++) {
450 jobject configs_new = toEGLHandle(_env, eglconfigClass, eglconfigConstructor, configs[i]);
451 _env->SetObjectArrayElement(configs_ref, i + configsOffset, configs_new);
452 }
453 delete[] configs;
454 }
455 if (_exception) {
456 jniThrowException(_env, _exceptionType, _exceptionMessage);
457 }
458 return (jboolean)_returnValue;
459 }
460
461 /* EGLBoolean eglGetConfigAttrib ( EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value ) */
462 static jboolean
android_eglGetConfigAttrib(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jint attribute,jintArray value_ref,jint offset)463 android_eglGetConfigAttrib
464 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jint attribute, jintArray value_ref, jint offset) {
465 jint _exception = 0;
466 const char * _exceptionType = NULL;
467 const char * _exceptionMessage = NULL;
468 EGLBoolean _returnValue = (EGLBoolean) 0;
469 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
470 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
471 EGLint *value_base = (EGLint *) 0;
472 jint _remaining;
473 EGLint *value = (EGLint *) 0;
474
475 if (!value_ref) {
476 _exception = 1;
477 _exceptionType = "java/lang/IllegalArgumentException";
478 _exceptionMessage = "value == null";
479 goto exit;
480 }
481 if (offset < 0) {
482 _exception = 1;
483 _exceptionType = "java/lang/IllegalArgumentException";
484 _exceptionMessage = "offset < 0";
485 goto exit;
486 }
487 _remaining = _env->GetArrayLength(value_ref) - offset;
488 if (_remaining < 1) {
489 _exception = 1;
490 _exceptionType = "java/lang/IllegalArgumentException";
491 _exceptionMessage = "length - offset < 1 < needed";
492 goto exit;
493 }
494 value_base = (EGLint *)
495 _env->GetIntArrayElements(value_ref, (jboolean *)0);
496 value = value_base + offset;
497
498 _returnValue = eglGetConfigAttrib(
499 (EGLDisplay)dpy_native,
500 (EGLConfig)config_native,
501 (EGLint)attribute,
502 (EGLint *)value
503 );
504
505 exit:
506 if (value_base) {
507 _env->ReleaseIntArrayElements(value_ref, (jint*)value_base,
508 _exception ? JNI_ABORT: 0);
509 }
510 if (_exception) {
511 jniThrowException(_env, _exceptionType, _exceptionMessage);
512 }
513 return (jboolean)_returnValue;
514 }
515
516 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
517 static jobject
android_eglCreateWindowSurface(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jobject win,jintArray attrib_list_ref,jint offset)518 android_eglCreateWindowSurface
519 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) {
520 jint _exception = 0;
521 const char * _exceptionType = "";
522 const char * _exceptionMessage = "";
523 EGLSurface _returnValue = (EGLSurface) 0;
524 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
525 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
526 int attrib_list_sentinel = 0;
527 EGLint *attrib_list_base = (EGLint *) 0;
528 jint _remaining;
529 EGLint *attrib_list = (EGLint *) 0;
530 android::sp<ANativeWindow> window;
531
532 if (attrib_list_ref) {
533 if (offset < 0) {
534 _exception = 1;
535 _exceptionType = "java/lang/IllegalArgumentException";
536 _exceptionMessage = "offset < 0";
537 goto exit;
538 }
539 _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
540 attrib_list_base = (EGLint *)
541 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
542 attrib_list = attrib_list_base + offset;
543 attrib_list_sentinel = 0;
544 for (int i = _remaining - 1; i >= 0; i--) {
545 if (*((EGLint*)(attrib_list + i)) == EGL_NONE){
546 attrib_list_sentinel = 1;
547 break;
548 }
549 }
550 if (attrib_list_sentinel == 0) {
551 _exception = 1;
552 _exceptionType = "java/lang/IllegalArgumentException";
553 _exceptionMessage = "attrib_list must contain EGL_NONE!";
554 goto exit;
555 }
556 }
557
558 if (win == NULL) {
559 not_valid_surface:
560 _exception = 1;
561 _exceptionType = "java/lang/IllegalArgumentException";
562 _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface";
563 goto exit;
564 }
565
566 window = android::android_view_Surface_getNativeWindow(_env, win);
567
568 if (window == NULL)
569 goto not_valid_surface;
570
571 _returnValue = eglCreateWindowSurface(
572 (EGLDisplay)dpy_native,
573 (EGLConfig)config_native,
574 (EGLNativeWindowType)window.get(),
575 (EGLint *)attrib_list
576 );
577
578 exit:
579 if (attrib_list_base) {
580 _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base,
581 JNI_ABORT);
582 }
583 if (_exception) {
584 jniThrowException(_env, _exceptionType, _exceptionMessage);
585 }
586 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
587 }
588
589 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
590 static jobject
android_eglCreateWindowSurfaceTexture(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jobject win,jintArray attrib_list_ref,jint offset)591 android_eglCreateWindowSurfaceTexture
592 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) {
593 jint _exception = 0;
594 const char * _exceptionType = "";
595 const char * _exceptionMessage = "";
596 EGLSurface _returnValue = (EGLSurface) 0;
597 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
598 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
599 int attrib_list_sentinel = 0;
600 EGLint *attrib_list_base = (EGLint *) 0;
601 jint _remaining;
602 EGLint *attrib_list = (EGLint *) 0;
603 android::sp<ANativeWindow> window;
604 android::sp<android::IGraphicBufferProducer> producer;
605
606 if (!attrib_list_ref) {
607 _exception = 1;
608 _exceptionType = "java/lang/IllegalArgumentException";
609 _exceptionMessage = "attrib_list == null";
610 goto exit;
611 }
612 if (offset < 0) {
613 _exception = 1;
614 _exceptionType = "java/lang/IllegalArgumentException";
615 _exceptionMessage = "offset < 0";
616 goto exit;
617 }
618 if (win == NULL) {
619 not_valid_surface:
620 _exception = 1;
621 _exceptionType = "java/lang/IllegalArgumentException";
622 _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface";
623 goto exit;
624 }
625 producer = android::SurfaceTexture_getProducer(_env, win);
626
627 if (producer == NULL)
628 goto not_valid_surface;
629
630 window = new android::Surface(producer, true);
631
632 if (window == NULL)
633 goto not_valid_surface;
634
635 _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
636 attrib_list_base = (EGLint *)
637 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
638 attrib_list = attrib_list_base + offset;
639 attrib_list_sentinel = 0;
640 for (int i = _remaining - 1; i >= 0; i--) {
641 if (*((EGLint*)(attrib_list + i)) == EGL_NONE){
642 attrib_list_sentinel = 1;
643 break;
644 }
645 }
646 if (attrib_list_sentinel == 0) {
647 _exception = 1;
648 _exceptionType = "java/lang/IllegalArgumentException";
649 _exceptionMessage = "attrib_list must contain EGL_NONE!";
650 goto exit;
651 }
652
653 _returnValue = eglCreateWindowSurface(
654 (EGLDisplay)dpy_native,
655 (EGLConfig)config_native,
656 (EGLNativeWindowType)window.get(),
657 (EGLint *)attrib_list
658 );
659
660 exit:
661 if (attrib_list_base) {
662 _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base,
663 JNI_ABORT);
664 }
665 if (_exception) {
666 jniThrowException(_env, _exceptionType, _exceptionMessage);
667 }
668 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
669 }
670 /* EGLSurface eglCreatePbufferSurface ( EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list ) */
671 static jobject
android_eglCreatePbufferSurface(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jintArray attrib_list_ref,jint offset)672 android_eglCreatePbufferSurface
673 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jintArray attrib_list_ref, jint offset) {
674 jint _exception = 0;
675 const char * _exceptionType = NULL;
676 const char * _exceptionMessage = NULL;
677 EGLSurface _returnValue = (EGLSurface) 0;
678 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
679 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
680 bool attrib_list_sentinel = false;
681 EGLint *attrib_list_base = (EGLint *) 0;
682 jint _remaining;
683 EGLint *attrib_list = (EGLint *) 0;
684
685 if (attrib_list_ref) {
686 if (offset < 0) {
687 _exception = 1;
688 _exceptionType = "java/lang/IllegalArgumentException";
689 _exceptionMessage = "offset < 0";
690 goto exit;
691 }
692 _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
693 attrib_list_base = (EGLint *)
694 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
695 attrib_list = attrib_list_base + offset;
696 attrib_list_sentinel = false;
697 for (int i = _remaining - 1; i >= 0; i--) {
698 if (attrib_list[i] == EGL_NONE){
699 attrib_list_sentinel = true;
700 break;
701 }
702 }
703 if (attrib_list_sentinel == false) {
704 _exception = 1;
705 _exceptionType = "java/lang/IllegalArgumentException";
706 _exceptionMessage = "attrib_list must contain EGL_NONE!";
707 goto exit;
708 }
709 }
710
711 _returnValue = eglCreatePbufferSurface(
712 (EGLDisplay)dpy_native,
713 (EGLConfig)config_native,
714 (EGLint *)attrib_list
715 );
716
717 exit:
718 if (attrib_list_base) {
719 _env->ReleaseIntArrayElements(attrib_list_ref, (jint*)attrib_list_base,
720 JNI_ABORT);
721 }
722 if (_exception) {
723 jniThrowException(_env, _exceptionType, _exceptionMessage);
724 }
725 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
726 }
727
728 /* EGLSurface eglCreatePixmapSurface ( EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list ) */
729 static jobject
android_eglCreatePixmapSurface(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jint pixmap,jintArray attrib_list_ref,jint offset)730 android_eglCreatePixmapSurface
731 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jint pixmap, jintArray attrib_list_ref, jint offset) {
732 jniThrowException(_env, "java/lang/UnsupportedOperationException",
733 "eglCreatePixmapSurface");
734 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, (EGLSurface) 0);
735 }
736
737 /* EGLBoolean eglDestroySurface ( EGLDisplay dpy, EGLSurface surface ) */
738 static jboolean
android_eglDestroySurface(JNIEnv * _env,jobject _this,jobject dpy,jobject surface)739 android_eglDestroySurface
740 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface) {
741 EGLBoolean _returnValue = (EGLBoolean) 0;
742 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
743 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
744
745 _returnValue = eglDestroySurface(
746 (EGLDisplay)dpy_native,
747 (EGLSurface)surface_native
748 );
749 return (jboolean)_returnValue;
750 }
751
752 /* EGLBoolean eglQuerySurface ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value ) */
753 static jboolean
android_eglQuerySurface(JNIEnv * _env,jobject _this,jobject dpy,jobject surface,jint attribute,jintArray value_ref,jint offset)754 android_eglQuerySurface
755 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint attribute, jintArray value_ref, jint offset) {
756 jint _exception = 0;
757 const char * _exceptionType = NULL;
758 const char * _exceptionMessage = NULL;
759 EGLBoolean _returnValue = (EGLBoolean) 0;
760 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
761 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
762 EGLint *value_base = (EGLint *) 0;
763 jint _remaining;
764 EGLint *value = (EGLint *) 0;
765
766 if (!value_ref) {
767 _exception = 1;
768 _exceptionType = "java/lang/IllegalArgumentException";
769 _exceptionMessage = "value == null";
770 goto exit;
771 }
772 if (offset < 0) {
773 _exception = 1;
774 _exceptionType = "java/lang/IllegalArgumentException";
775 _exceptionMessage = "offset < 0";
776 goto exit;
777 }
778 _remaining = _env->GetArrayLength(value_ref) - offset;
779 if (_remaining < 1) {
780 _exception = 1;
781 _exceptionType = "java/lang/IllegalArgumentException";
782 _exceptionMessage = "length - offset < 1 < needed";
783 goto exit;
784 }
785 value_base = (EGLint *)
786 _env->GetIntArrayElements(value_ref, (jboolean *)0);
787 value = value_base + offset;
788
789 _returnValue = eglQuerySurface(
790 (EGLDisplay)dpy_native,
791 (EGLSurface)surface_native,
792 (EGLint)attribute,
793 (EGLint *)value
794 );
795
796 exit:
797 if (value_base) {
798 _env->ReleaseIntArrayElements(value_ref, (jint*)value_base,
799 _exception ? JNI_ABORT: 0);
800 }
801 if (_exception) {
802 jniThrowException(_env, _exceptionType, _exceptionMessage);
803 }
804 return (jboolean)_returnValue;
805 }
806
807 /* EGLBoolean eglBindAPI ( EGLenum api ) */
808 static jboolean
android_eglBindAPI(JNIEnv * _env,jobject _this,jint api)809 android_eglBindAPI
810 (JNIEnv *_env, jobject _this, jint api) {
811 EGLBoolean _returnValue = (EGLBoolean) 0;
812 _returnValue = eglBindAPI(
813 (EGLenum)api
814 );
815 return (jboolean)_returnValue;
816 }
817
818 /* EGLenum eglQueryAPI ( void ) */
819 static jint
android_eglQueryAPI(JNIEnv * _env,jobject _this)820 android_eglQueryAPI
821 (JNIEnv *_env, jobject _this) {
822 EGLenum _returnValue = (EGLenum) 0;
823 _returnValue = eglQueryAPI();
824 return (jint)_returnValue;
825 }
826
827 /* EGLBoolean eglWaitClient ( void ) */
828 static jboolean
android_eglWaitClient(JNIEnv * _env,jobject _this)829 android_eglWaitClient
830 (JNIEnv *_env, jobject _this) {
831 EGLBoolean _returnValue = (EGLBoolean) 0;
832 _returnValue = eglWaitClient();
833 return (jboolean)_returnValue;
834 }
835
836 /* EGLBoolean eglReleaseThread ( void ) */
837 static jboolean
android_eglReleaseThread(JNIEnv * _env,jobject _this)838 android_eglReleaseThread
839 (JNIEnv *_env, jobject _this) {
840 EGLBoolean _returnValue = (EGLBoolean) 0;
841 _returnValue = eglReleaseThread();
842 return (jboolean)_returnValue;
843 }
844
845 /* EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) */
846 static jobject
android_eglCreatePbufferFromClientBuffer(JNIEnv * _env,jobject _this,jobject dpy,jint buftype,jlong buffer,jobject config,jintArray attrib_list_ref,jint offset)847 android_eglCreatePbufferFromClientBuffer
848 (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jlong buffer, jobject config, jintArray attrib_list_ref, jint offset) {
849 jint _exception = 0;
850 const char * _exceptionType = NULL;
851 const char * _exceptionMessage = NULL;
852 EGLSurface _returnValue = (EGLSurface) 0;
853 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
854 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
855 bool attrib_list_sentinel = false;
856 EGLint *attrib_list_base = (EGLint *) 0;
857 jint _remaining;
858 EGLint *attrib_list = (EGLint *) 0;
859
860 if (attrib_list_ref) {
861 if (offset < 0) {
862 _exception = 1;
863 _exceptionType = "java/lang/IllegalArgumentException";
864 _exceptionMessage = "offset < 0";
865 goto exit;
866 }
867 _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
868 attrib_list_base = (EGLint *)
869 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
870 attrib_list = attrib_list_base + offset;
871 attrib_list_sentinel = false;
872 for (int i = _remaining - 1; i >= 0; i--) {
873 if (attrib_list[i] == EGL_NONE){
874 attrib_list_sentinel = true;
875 break;
876 }
877 }
878 if (attrib_list_sentinel == false) {
879 _exception = 1;
880 _exceptionType = "java/lang/IllegalArgumentException";
881 _exceptionMessage = "attrib_list must contain EGL_NONE!";
882 goto exit;
883 }
884 }
885
886 _returnValue = eglCreatePbufferFromClientBuffer(
887 (EGLDisplay)dpy_native,
888 (EGLenum)buftype,
889 reinterpret_cast<EGLClientBuffer>(buffer),
890 (EGLConfig)config_native,
891 (EGLint *)attrib_list
892 );
893
894 exit:
895 if (attrib_list_base) {
896 _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base,
897 JNI_ABORT);
898 }
899 if (_exception) {
900 jniThrowException(_env, _exceptionType, _exceptionMessage);
901 }
902 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
903 }
904
905 static jobject
android_eglCreatePbufferFromClientBufferInt(JNIEnv * _env,jobject _this,jobject dpy,jint buftype,jint buffer,jobject config,jintArray attrib_list_ref,jint offset)906 android_eglCreatePbufferFromClientBufferInt
907 (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jint buffer, jobject config, jintArray attrib_list_ref, jint offset) {
908 if(sizeof(void*) != sizeof(uint32_t)) {
909 jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglCreatePbufferFromClientBuffer");
910 return 0;
911 }
912 return android_eglCreatePbufferFromClientBuffer(_env, _this, dpy, buftype, buffer, config, attrib_list_ref, offset);
913 }
914 /* EGLBoolean eglSurfaceAttrib ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value ) */
915 static jboolean
android_eglSurfaceAttrib(JNIEnv * _env,jobject _this,jobject dpy,jobject surface,jint attribute,jint value)916 android_eglSurfaceAttrib
917 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint attribute, jint value) {
918 EGLBoolean _returnValue = (EGLBoolean) 0;
919 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
920 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
921
922 _returnValue = eglSurfaceAttrib(
923 (EGLDisplay)dpy_native,
924 (EGLSurface)surface_native,
925 (EGLint)attribute,
926 (EGLint)value
927 );
928 return (jboolean)_returnValue;
929 }
930
931 /* EGLBoolean eglBindTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
932 static jboolean
android_eglBindTexImage(JNIEnv * _env,jobject _this,jobject dpy,jobject surface,jint buffer)933 android_eglBindTexImage
934 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint buffer) {
935 EGLBoolean _returnValue = (EGLBoolean) 0;
936 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
937 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
938
939 _returnValue = eglBindTexImage(
940 (EGLDisplay)dpy_native,
941 (EGLSurface)surface_native,
942 (EGLint)buffer
943 );
944 return (jboolean)_returnValue;
945 }
946
947 /* EGLBoolean eglReleaseTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
948 static jboolean
android_eglReleaseTexImage(JNIEnv * _env,jobject _this,jobject dpy,jobject surface,jint buffer)949 android_eglReleaseTexImage
950 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint buffer) {
951 EGLBoolean _returnValue = (EGLBoolean) 0;
952 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
953 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
954
955 _returnValue = eglReleaseTexImage(
956 (EGLDisplay)dpy_native,
957 (EGLSurface)surface_native,
958 (EGLint)buffer
959 );
960 return (jboolean)_returnValue;
961 }
962
963 /* EGLBoolean eglSwapInterval ( EGLDisplay dpy, EGLint interval ) */
964 static jboolean
android_eglSwapInterval(JNIEnv * _env,jobject _this,jobject dpy,jint interval)965 android_eglSwapInterval
966 (JNIEnv *_env, jobject _this, jobject dpy, jint interval) {
967 EGLBoolean _returnValue = (EGLBoolean) 0;
968 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
969
970 _returnValue = eglSwapInterval(
971 (EGLDisplay)dpy_native,
972 (EGLint)interval
973 );
974 return (jboolean)_returnValue;
975 }
976
977 /* EGLContext eglCreateContext ( EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list ) */
978 static jobject
android_eglCreateContext(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jobject share_context,jintArray attrib_list_ref,jint offset)979 android_eglCreateContext
980 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject share_context, jintArray attrib_list_ref, jint offset) {
981 jint _exception = 0;
982 const char * _exceptionType = NULL;
983 const char * _exceptionMessage = NULL;
984 EGLContext _returnValue = (EGLContext) 0;
985 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
986 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
987 EGLContext share_context_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, share_context);
988 bool attrib_list_sentinel = false;
989 EGLint *attrib_list_base = (EGLint *) 0;
990 jint _remaining;
991 EGLint *attrib_list = (EGLint *) 0;
992
993 if (!attrib_list_ref) {
994 _exception = 1;
995 _exceptionType = "java/lang/IllegalArgumentException";
996 _exceptionMessage = "attrib_list == null";
997 goto exit;
998 }
999 if (offset < 0) {
1000 _exception = 1;
1001 _exceptionType = "java/lang/IllegalArgumentException";
1002 _exceptionMessage = "offset < 0";
1003 goto exit;
1004 }
1005 _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
1006 attrib_list_base = (EGLint *)
1007 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
1008 attrib_list = attrib_list_base + offset;
1009 attrib_list_sentinel = false;
1010 for (int i = _remaining - 1; i >= 0; i--) {
1011 if (attrib_list[i] == EGL_NONE){
1012 attrib_list_sentinel = true;
1013 break;
1014 }
1015 }
1016 if (attrib_list_sentinel == false) {
1017 _exception = 1;
1018 _exceptionType = "java/lang/IllegalArgumentException";
1019 _exceptionMessage = "attrib_list must contain EGL_NONE!";
1020 goto exit;
1021 }
1022
1023 _returnValue = eglCreateContext(
1024 (EGLDisplay)dpy_native,
1025 (EGLConfig)config_native,
1026 (EGLContext)share_context_native,
1027 (EGLint *)attrib_list
1028 );
1029
1030 exit:
1031 if (attrib_list_base) {
1032 _env->ReleaseIntArrayElements(attrib_list_ref, (jint*)attrib_list_base,
1033 JNI_ABORT);
1034 }
1035 if (_exception) {
1036 jniThrowException(_env, _exceptionType, _exceptionMessage);
1037 }
1038 return toEGLHandle(_env, eglcontextClass, eglcontextConstructor, _returnValue);
1039 }
1040
1041 /* EGLBoolean eglDestroyContext ( EGLDisplay dpy, EGLContext ctx ) */
1042 static jboolean
android_eglDestroyContext(JNIEnv * _env,jobject _this,jobject dpy,jobject ctx)1043 android_eglDestroyContext
1044 (JNIEnv *_env, jobject _this, jobject dpy, jobject ctx) {
1045 EGLBoolean _returnValue = (EGLBoolean) 0;
1046 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
1047 EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
1048
1049 _returnValue = eglDestroyContext(
1050 (EGLDisplay)dpy_native,
1051 (EGLContext)ctx_native
1052 );
1053 return (jboolean)_returnValue;
1054 }
1055
1056 /* EGLBoolean eglMakeCurrent ( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx ) */
1057 static jboolean
android_eglMakeCurrent(JNIEnv * _env,jobject _this,jobject dpy,jobject draw,jobject read,jobject ctx)1058 android_eglMakeCurrent
1059 (JNIEnv *_env, jobject _this, jobject dpy, jobject draw, jobject read, jobject ctx) {
1060 EGLBoolean _returnValue = (EGLBoolean) 0;
1061 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
1062 EGLSurface draw_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, draw);
1063 EGLSurface read_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, read);
1064 EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
1065
1066 _returnValue = eglMakeCurrent(
1067 (EGLDisplay)dpy_native,
1068 (EGLSurface)draw_native,
1069 (EGLSurface)read_native,
1070 (EGLContext)ctx_native
1071 );
1072 return (jboolean)_returnValue;
1073 }
1074
1075 /* EGLContext eglGetCurrentContext ( void ) */
1076 static jobject
android_eglGetCurrentContext(JNIEnv * _env,jobject _this)1077 android_eglGetCurrentContext
1078 (JNIEnv *_env, jobject _this) {
1079 EGLContext _returnValue = (EGLContext) 0;
1080 _returnValue = eglGetCurrentContext();
1081 return toEGLHandle(_env, eglcontextClass, eglcontextConstructor, _returnValue);
1082 }
1083
1084 /* EGLSurface eglGetCurrentSurface ( EGLint readdraw ) */
1085 static jobject
android_eglGetCurrentSurface(JNIEnv * _env,jobject _this,jint readdraw)1086 android_eglGetCurrentSurface
1087 (JNIEnv *_env, jobject _this, jint readdraw) {
1088 EGLSurface _returnValue = (EGLSurface) 0;
1089 _returnValue = eglGetCurrentSurface(
1090 (EGLint)readdraw
1091 );
1092 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
1093 }
1094
1095 /* EGLDisplay eglGetCurrentDisplay ( void ) */
1096 static jobject
android_eglGetCurrentDisplay(JNIEnv * _env,jobject _this)1097 android_eglGetCurrentDisplay
1098 (JNIEnv *_env, jobject _this) {
1099 EGLDisplay _returnValue = (EGLDisplay) 0;
1100 _returnValue = eglGetCurrentDisplay();
1101 return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue);
1102 }
1103
1104 /* EGLBoolean eglQueryContext ( EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value ) */
1105 static jboolean
android_eglQueryContext(JNIEnv * _env,jobject _this,jobject dpy,jobject ctx,jint attribute,jintArray value_ref,jint offset)1106 android_eglQueryContext
1107 (JNIEnv *_env, jobject _this, jobject dpy, jobject ctx, jint attribute, jintArray value_ref, jint offset) {
1108 jint _exception = 0;
1109 const char * _exceptionType = NULL;
1110 const char * _exceptionMessage = NULL;
1111 EGLBoolean _returnValue = (EGLBoolean) 0;
1112 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
1113 EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
1114 EGLint *value_base = (EGLint *) 0;
1115 jint _remaining;
1116 EGLint *value = (EGLint *) 0;
1117
1118 if (!value_ref) {
1119 _exception = 1;
1120 _exceptionType = "java/lang/IllegalArgumentException";
1121 _exceptionMessage = "value == null";
1122 goto exit;
1123 }
1124 if (offset < 0) {
1125 _exception = 1;
1126 _exceptionType = "java/lang/IllegalArgumentException";
1127 _exceptionMessage = "offset < 0";
1128 goto exit;
1129 }
1130 _remaining = _env->GetArrayLength(value_ref) - offset;
1131 if (_remaining < 1) {
1132 _exception = 1;
1133 _exceptionType = "java/lang/IllegalArgumentException";
1134 _exceptionMessage = "length - offset < 1 < needed";
1135 goto exit;
1136 }
1137 value_base = (EGLint *)
1138 _env->GetIntArrayElements(value_ref, (jboolean *)0);
1139 value = value_base + offset;
1140
1141 _returnValue = eglQueryContext(
1142 (EGLDisplay)dpy_native,
1143 (EGLContext)ctx_native,
1144 (EGLint)attribute,
1145 (EGLint *)value
1146 );
1147
1148 exit:
1149 if (value_base) {
1150 _env->ReleaseIntArrayElements(value_ref, (jint*)value_base,
1151 _exception ? JNI_ABORT: 0);
1152 }
1153 if (_exception) {
1154 jniThrowException(_env, _exceptionType, _exceptionMessage);
1155 }
1156 return (jboolean)_returnValue;
1157 }
1158
1159 /* EGLBoolean eglWaitGL ( void ) */
1160 static jboolean
android_eglWaitGL(JNIEnv * _env,jobject _this)1161 android_eglWaitGL
1162 (JNIEnv *_env, jobject _this) {
1163 EGLBoolean _returnValue = (EGLBoolean) 0;
1164 _returnValue = eglWaitGL();
1165 return (jboolean)_returnValue;
1166 }
1167
1168 /* EGLBoolean eglWaitNative ( EGLint engine ) */
1169 static jboolean
android_eglWaitNative(JNIEnv * _env,jobject _this,jint engine)1170 android_eglWaitNative
1171 (JNIEnv *_env, jobject _this, jint engine) {
1172 EGLBoolean _returnValue = (EGLBoolean) 0;
1173 _returnValue = eglWaitNative(
1174 (EGLint)engine
1175 );
1176 return (jboolean)_returnValue;
1177 }
1178
1179 /* EGLBoolean eglSwapBuffers ( EGLDisplay dpy, EGLSurface surface ) */
1180 static jboolean
android_eglSwapBuffers(JNIEnv * _env,jobject _this,jobject dpy,jobject surface)1181 android_eglSwapBuffers
1182 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface) {
1183 EGLBoolean _returnValue = (EGLBoolean) 0;
1184 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
1185 EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
1186
1187 _returnValue = eglSwapBuffers(
1188 (EGLDisplay)dpy_native,
1189 (EGLSurface)surface_native
1190 );
1191 return (jboolean)_returnValue;
1192 }
1193
1194 /* EGLBoolean eglCopyBuffers ( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target ) */
1195 static jboolean
android_eglCopyBuffers(JNIEnv * _env,jobject _this,jobject dpy,jobject surface,jint target)1196 android_eglCopyBuffers
1197 (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint target) {
1198 jniThrowException(_env, "java/lang/UnsupportedOperationException",
1199 "eglCopyBuffers");
1200 return (EGLBoolean) 0;
1201 }
1202
1203 static const char *classPathName = "android/opengl/EGL14";
1204
1205 static const JNINativeMethod methods[] = {
1206 {"_nativeClassInit", "()V", (void*)nativeClassInit },
1207 {"eglGetError", "()I", (void *) android_eglGetError },
1208 {"eglGetDisplay", "(I)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplayInt },
1209 {"eglGetDisplay", "(J)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplay },
1210 {"eglInitialize", "(Landroid/opengl/EGLDisplay;[II[II)Z", (void *) android_eglInitialize },
1211 {"eglTerminate", "(Landroid/opengl/EGLDisplay;)Z", (void *) android_eglTerminate },
1212 {"eglQueryString", "(Landroid/opengl/EGLDisplay;I)Ljava/lang/String;", (void *) android_eglQueryString__Landroind_opengl_EGLDisplay_2I },
1213 {"eglGetConfigs", "(Landroid/opengl/EGLDisplay;[Landroid/opengl/EGLConfig;II[II)Z", (void *) android_eglGetConfigs },
1214 {"eglChooseConfig", "(Landroid/opengl/EGLDisplay;[II[Landroid/opengl/EGLConfig;II[II)Z", (void *) android_eglChooseConfig },
1215 {"eglGetConfigAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Z", (void *) android_eglGetConfigAttrib },
1216 {"_eglCreateWindowSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreateWindowSurface },
1217 {"_eglCreateWindowSurfaceTexture", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreateWindowSurfaceTexture },
1218 {"eglCreatePbufferSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferSurface },
1219 {"eglCreatePixmapSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePixmapSurface },
1220 {"eglDestroySurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z", (void *) android_eglDestroySurface },
1221 {"eglQuerySurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I[II)Z", (void *) android_eglQuerySurface },
1222 {"eglBindAPI", "(I)Z", (void *) android_eglBindAPI },
1223 {"eglQueryAPI", "()I", (void *) android_eglQueryAPI },
1224 {"eglWaitClient", "()Z", (void *) android_eglWaitClient },
1225 {"eglReleaseThread", "()Z", (void *) android_eglReleaseThread },
1226 {"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBufferInt },
1227 {"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IJLandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBuffer },
1228 {"eglSurfaceAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;II)Z", (void *) android_eglSurfaceAttrib },
1229 {"eglBindTexImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglBindTexImage },
1230 {"eglReleaseTexImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglReleaseTexImage },
1231 {"eglSwapInterval", "(Landroid/opengl/EGLDisplay;I)Z", (void *) android_eglSwapInterval },
1232 {"eglCreateContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Landroid/opengl/EGLContext;[II)Landroid/opengl/EGLContext;", (void *) android_eglCreateContext },
1233 {"eglDestroyContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;)Z", (void *) android_eglDestroyContext },
1234 {"eglMakeCurrent", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;Landroid/opengl/EGLSurface;Landroid/opengl/EGLContext;)Z", (void *) android_eglMakeCurrent },
1235 {"eglGetCurrentContext", "()Landroid/opengl/EGLContext;", (void *) android_eglGetCurrentContext },
1236 {"eglGetCurrentSurface", "(I)Landroid/opengl/EGLSurface;", (void *) android_eglGetCurrentSurface },
1237 {"eglGetCurrentDisplay", "()Landroid/opengl/EGLDisplay;", (void *) android_eglGetCurrentDisplay },
1238 {"eglQueryContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;I[II)Z", (void *) android_eglQueryContext },
1239 {"eglWaitGL", "()Z", (void *) android_eglWaitGL },
1240 {"eglWaitNative", "(I)Z", (void *) android_eglWaitNative },
1241 {"eglSwapBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z", (void *) android_eglSwapBuffers },
1242 {"eglCopyBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglCopyBuffers },
1243 };
1244
register_android_opengl_jni_EGL14(JNIEnv * _env)1245 int register_android_opengl_jni_EGL14(JNIEnv *_env)
1246 {
1247 int err;
1248 err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
1249 return err;
1250 }
1251