- EGLint config_attribs[3];
- config_attribs[0] = EGL_CONFIG_ID;
- eglQueryContext(rh->egl_display, rh->egl_ctx, EGL_CONFIG_ID,
- &config_attribs[1]);
- config_attribs[2] = EGL_NONE;
-
- EGLint num_config;
- eglChooseConfig(rh->egl_display, config_attribs,
- &rh->egl_config, 1, &num_config);
- Assert(num_config == 1, "no EGL config chosen");
-
- const GLubyte *extensions = glGetString (GL_EXTENSIONS);
- rh->gl_fbo_p = jwzgles_gluCheckExtension (
- (const GLubyte *)"GL_OES_framebuffer_object", extensions);
-
- if (rh->gl_fbo_p) {
- PFNGLGENFRAMEBUFFERSOESPROC glGenFramebuffersOES =
- (PFNGLGENFRAMEBUFFERSOESPROC)
- eglGetProcAddress ("glGenFramebuffersOES");
-
- rh->glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC)
- eglGetProcAddress ("glBindFramebufferOES");
- rh->glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC)
- eglGetProcAddress ("glFramebufferTexture2DOES");
-
- glGetIntegerv (GL_FRAMEBUFFER_BINDING_OES, &rh->fb_default);
- Assert (!rh->fb_default, "default framebuffer not current framebuffer");
- glGenFramebuffersOES (1, &rh->fb_pixmap);
- wnd->texture = 0;
- } else {
- wnd->egl_surface = rh->egl_surface;
- }
+ rh->egl_display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
+ Assert (rh->egl_display != EGL_NO_DISPLAY, "init: EGL_NO_DISPLAY");
+
+ int egl_major, egl_minor;
+ Assert (eglInitialize (rh->egl_display, &egl_major, &egl_minor),
+ "eglInitialize failed");
+
+ // TODO: Skip depth and (probably) alpha for Xlib.
+ // TODO: Could ask for EGL_SWAP_BEHAVIOR_PRESERVED_BIT here...maybe?
+ // TODO: Probably should try to ask for EGL_PBUFFER_BIT.
+ // TODO: Do like visual-gl.c and work from a list of configs.
+ /* Probably don't need EGL_FRAMEBUFFER_TARGET_ANDROID here if GLSurfaceView
+ doesn't use it.
+ */
+ EGLint config_attribs[] = {
+ EGL_RED_SIZE, 8,
+ EGL_GREEN_SIZE, 8,
+ EGL_BLUE_SIZE, 8,
+ EGL_ALPHA_SIZE, 8,
+ EGL_DEPTH_SIZE, 16,
+ EGL_NONE
+ };
+
+ EGLint num_config;
+ Assert (eglChooseConfig (rh->egl_display, config_attribs,
+ &rh->egl_config, 1, &num_config),
+ "eglChooseConfig failed");
+ Assert (num_config == 1, "no EGL config chosen");
+
+ EGLint no_attribs[] = {EGL_NONE};
+ rh->egl_ctx = eglCreateContext (rh->egl_display, rh->egl_config,
+ EGL_NO_CONTEXT, no_attribs);
+ Assert (rh->egl_ctx != EGL_NO_CONTEXT, "init: EGL_NO_CONTEXT");
+
+ ANativeWindow *native_window =
+ ANativeWindow_fromSurface (env, jni_surface);
+
+ rh->egl_surface = eglCreateWindowSurface (rh->egl_display, rh->egl_config,
+ native_window, no_attribs);
+ Assert (rh->egl_surface != EGL_NO_SURFACE, "init: EGL_NO_SURFACE");
+
+ ANativeWindow_release (native_window);
+
+ prepare_context (rh);
+
+ Log ("init %s / %s / %s",
+ glGetString (GL_VENDOR),
+ glGetString (GL_RENDERER),
+ glGetString (GL_VERSION));
+
+ const GLubyte *extensions = glGetString (GL_EXTENSIONS);
+ rh->gl_fbo_p = jwzgles_gluCheckExtension (
+ (const GLubyte *)"GL_OES_framebuffer_object", extensions);
+
+ if (rh->gl_fbo_p) {
+ PFNGLGENFRAMEBUFFERSOESPROC glGenFramebuffersOES =
+ (PFNGLGENFRAMEBUFFERSOESPROC)
+ eglGetProcAddress ("glGenFramebuffersOES");
+
+ rh->glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC)
+ eglGetProcAddress ("glBindFramebufferOES");
+ rh->glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC)
+ eglGetProcAddress ("glFramebufferTexture2DOES");
+
+ glGetIntegerv (GL_FRAMEBUFFER_BINDING_OES, &rh->fb_default);
+ Assert (!rh->fb_default, "default framebuffer not current framebuffer");
+ glGenFramebuffersOES (1, &rh->fb_pixmap);
+ wnd->texture = 0;
+ } else {
+ wnd->egl_surface = rh->egl_surface;
+ }