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