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