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