1 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */ 2 static jobject 3 android_eglCreateWindowSurface 4 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) { 5 jint _exception = 0; 6 const char * _exceptionType = ""; 7 const char * _exceptionMessage = ""; 8 EGLSurface _returnValue = (EGLSurface) 0; 9 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); 10 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config); 11 int attrib_list_sentinel = 0; 12 EGLint *attrib_list_base = (EGLint *) 0; 13 jint _remaining; 14 EGLint *attrib_list = (EGLint *) 0; 15 android::sp<ANativeWindow> window; 16 17 if (attrib_list_ref) { 18 if (offset < 0) { 19 _exception = 1; 20 _exceptionType = "java/lang/IllegalArgumentException"; 21 _exceptionMessage = "offset < 0"; 22 goto exit; 23 } 24 _remaining = _env->GetArrayLength(attrib_list_ref) - offset; 25 attrib_list_base = (EGLint *) 26 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0); 27 attrib_list = attrib_list_base + offset; 28 attrib_list_sentinel = 0; 29 for (int i = _remaining - 1; i >= 0; i--) { 30 if (*((EGLint*)(attrib_list + i)) == EGL_NONE){ 31 attrib_list_sentinel = 1; 32 break; 33 } 34 } 35 if (attrib_list_sentinel == 0) { 36 _exception = 1; 37 _exceptionType = "java/lang/IllegalArgumentException"; 38 _exceptionMessage = "attrib_list must contain EGL_NONE!"; 39 goto exit; 40 } 41 } 42 43 if (win == NULL) { 44 not_valid_surface: 45 _exception = 1; 46 _exceptionType = "java/lang/IllegalArgumentException"; 47 _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface"; 48 goto exit; 49 } 50 51 window = android::android_view_Surface_getNativeWindow(_env, win); 52 53 if (window == NULL) 54 goto not_valid_surface; 55 56 _returnValue = eglCreateWindowSurface( 57 (EGLDisplay)dpy_native, 58 (EGLConfig)config_native, 59 (EGLNativeWindowType)window.get(), 60 (EGLint *)attrib_list 61 ); 62 63 exit: 64 if (attrib_list_base) { 65 _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base, 66 JNI_ABORT); 67 } 68 if (_exception) { 69 jniThrowException(_env, _exceptionType, _exceptionMessage); 70 return nullptr; 71 } 72 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue); 73 } 74 75 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */ 76 static jobject 77 android_eglCreateWindowSurfaceTexture 78 (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) { 79 jint _exception = 0; 80 const char * _exceptionType = ""; 81 const char * _exceptionMessage = ""; 82 EGLSurface _returnValue = (EGLSurface) 0; 83 EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); 84 EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config); 85 int attrib_list_sentinel = 0; 86 EGLint *attrib_list_base = (EGLint *) 0; 87 jint _remaining; 88 EGLint *attrib_list = (EGLint *) 0; 89 android::sp<ANativeWindow> window; 90 android::sp<android::IGraphicBufferProducer> producer; 91 92 if (!attrib_list_ref) { 93 _exception = 1; 94 _exceptionType = "java/lang/IllegalArgumentException"; 95 _exceptionMessage = "attrib_list == null"; 96 goto exit; 97 } 98 if (offset < 0) { 99 _exception = 1; 100 _exceptionType = "java/lang/IllegalArgumentException"; 101 _exceptionMessage = "offset < 0"; 102 goto exit; 103 } 104 if (win == NULL) { 105 not_valid_surface: 106 _exception = 1; 107 _exceptionType = "java/lang/IllegalArgumentException"; 108 _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface"; 109 goto exit; 110 } 111 producer = android::SurfaceTexture_getProducer(_env, win); 112 113 if (producer == NULL) 114 goto not_valid_surface; 115 116 window = new android::Surface(producer, true); 117 118 if (window == NULL) 119 goto not_valid_surface; 120 121 _remaining = _env->GetArrayLength(attrib_list_ref) - offset; 122 attrib_list_base = (EGLint *) 123 _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0); 124 attrib_list = attrib_list_base + offset; 125 attrib_list_sentinel = 0; 126 for (int i = _remaining - 1; i >= 0; i--) { 127 if (*((EGLint*)(attrib_list + i)) == EGL_NONE){ 128 attrib_list_sentinel = 1; 129 break; 130 } 131 } 132 if (attrib_list_sentinel == 0) { 133 _exception = 1; 134 _exceptionType = "java/lang/IllegalArgumentException"; 135 _exceptionMessage = "attrib_list must contain EGL_NONE!"; 136 goto exit; 137 } 138 139 _returnValue = eglCreateWindowSurface( 140 (EGLDisplay)dpy_native, 141 (EGLConfig)config_native, 142 (EGLNativeWindowType)window.get(), 143 (EGLint *)attrib_list 144 ); 145 146 exit: 147 if (attrib_list_base) { 148 _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base, 149 JNI_ABORT); 150 } 151 if (_exception) { 152 jniThrowException(_env, _exceptionType, _exceptionMessage); 153 return nullptr; 154 } 155 return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue); 156 } 157