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