• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
2 static jobject
android_eglCreateWindowSurface(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jobject win,jintArray attrib_list_ref,jint offset)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
android_eglCreateWindowSurfaceTexture(JNIEnv * _env,jobject _this,jobject dpy,jobject config,jobject win,jintArray attrib_list_ref,jint offset)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