Home | History | Annotate | Download | only in egl
      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