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     }
     71     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
     72 }
     73 
     74 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
     75 static jobject
     76 android_eglCreateWindowSurfaceTexture
     77   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) {
     78     jint _exception = 0;
     79     const char * _exceptionType = "";
     80     const char * _exceptionMessage = "";
     81     EGLSurface _returnValue = (EGLSurface) 0;
     82     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
     83     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
     84     int attrib_list_sentinel = 0;
     85     EGLint *attrib_list_base = (EGLint *) 0;
     86     jint _remaining;
     87     EGLint *attrib_list = (EGLint *) 0;
     88     android::sp<ANativeWindow> window;
     89     android::sp<android::IGraphicBufferProducer> producer;
     90 
     91     if (!attrib_list_ref) {
     92         _exception = 1;
     93         _exceptionType = "java/lang/IllegalArgumentException";
     94         _exceptionMessage = "attrib_list == null";
     95         goto exit;
     96     }
     97     if (offset < 0) {
     98         _exception = 1;
     99         _exceptionType = "java/lang/IllegalArgumentException";
    100         _exceptionMessage = "offset < 0";
    101         goto exit;
    102     }
    103     if (win == NULL) {
    104 not_valid_surface:
    105         _exception = 1;
    106         _exceptionType = "java/lang/IllegalArgumentException";
    107         _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface";
    108         goto exit;
    109     }
    110     producer = android::SurfaceTexture_getProducer(_env, win);
    111 
    112     if (producer == NULL)
    113         goto not_valid_surface;
    114 
    115     window = new android::Surface(producer, true);
    116 
    117     if (window == NULL)
    118         goto not_valid_surface;
    119 
    120     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
    121     attrib_list_base = (EGLint *)
    122         _env->GetIntArrayElements(attrib_list_ref, (jboolean *)0);
    123     attrib_list = attrib_list_base + offset;
    124     attrib_list_sentinel = 0;
    125     for (int i = _remaining - 1; i >= 0; i--)  {
    126         if (*((EGLint*)(attrib_list + i)) == EGL_NONE){
    127             attrib_list_sentinel = 1;
    128             break;
    129         }
    130     }
    131     if (attrib_list_sentinel == 0) {
    132         _exception = 1;
    133         _exceptionType = "java/lang/IllegalArgumentException";
    134         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    135         goto exit;
    136     }
    137 
    138     _returnValue = eglCreateWindowSurface(
    139         (EGLDisplay)dpy_native,
    140         (EGLConfig)config_native,
    141         (EGLNativeWindowType)window.get(),
    142         (EGLint *)attrib_list
    143     );
    144 
    145 exit:
    146     if (attrib_list_base) {
    147         _env->ReleaseIntArrayElements(attrib_list_ref, attrib_list_base,
    148             JNI_ABORT);
    149     }
    150     if (_exception) {
    151         jniThrowException(_env, _exceptionType, _exceptionMessage);
    152     }
    153     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
    154 }
    155