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         _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->GetIntArrayElements(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->ReleaseIntArrayElements(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, true);
    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->GetIntArrayElements(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->ReleaseIntArrayElements(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