diff --git a/src/gl-renderer.c b/src/gl-renderer.c index 76325f4f..868fdb71 100644 --- a/src/gl-renderer.c +++ b/src/gl-renderer.c @@ -1818,6 +1818,55 @@ out: return -1; } +static int +gl_renderer_setup_egl_extensions(struct weston_compositor *ec) +{ + struct gl_renderer *gr = get_renderer(ec); + const char *extensions; + EGLBoolean ret; + + gr->create_image = (void *) eglGetProcAddress("eglCreateImageKHR"); + gr->destroy_image = (void *) eglGetProcAddress("eglDestroyImageKHR"); + gr->bind_display = + (void *) eglGetProcAddress("eglBindWaylandDisplayWL"); + gr->unbind_display = + (void *) eglGetProcAddress("eglUnbindWaylandDisplayWL"); + gr->query_buffer = + (void *) eglGetProcAddress("eglQueryWaylandBufferWL"); + + extensions = + (const char *) eglQueryString(gr->egl_display, EGL_EXTENSIONS); + if (!extensions) { + weston_log("Retrieving EGL extension string failed.\n"); + return -1; + } + + if (strstr(extensions, "EGL_WL_bind_wayland_display")) + gr->has_bind_display = 1; + if (gr->has_bind_display) { + ret = gr->bind_display(gr->egl_display, ec->wl_display); + if (!ret) + gr->has_bind_display = 0; + } + + if (strstr(extensions, "EGL_EXT_buffer_age")) + gr->has_egl_buffer_age = 1; + else + weston_log("warning: EGL_EXT_buffer_age not supported. " + "Performance could be affected.\n"); + +#ifdef EGL_EXT_swap_buffers_with_damage + if (strstr(extensions, "EGL_EXT_swap_buffers_with_damage")) + gr->swap_buffers_with_damage = + (void *) eglGetProcAddress("eglSwapBuffersWithDamageEXT"); + else + weston_log("warning: EGL_EXT_swap_buffers_with_damage not " + "supported. Performance could be affected.\n"); +#endif + + return 0; +} + static const EGLint gl_renderer_opaque_attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 1, @@ -1877,6 +1926,9 @@ gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display, ec->capabilities |= WESTON_CAP_ROTATION_ANY; ec->capabilities |= WESTON_CAP_CAPTURE_YFLIP; + if (gl_renderer_setup_egl_extensions(ec) < 0) + goto err_egl; + wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565); wl_signal_init(&gr->destroy_signal); @@ -2004,14 +2056,6 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) gr->image_target_texture_2d = (void *) eglGetProcAddress("glEGLImageTargetTexture2DOES"); - gr->create_image = (void *) eglGetProcAddress("eglCreateImageKHR"); - gr->destroy_image = (void *) eglGetProcAddress("eglDestroyImageKHR"); - gr->bind_display = - (void *) eglGetProcAddress("eglBindWaylandDisplayWL"); - gr->unbind_display = - (void *) eglGetProcAddress("eglUnbindWaylandDisplayWL"); - gr->query_buffer = - (void *) eglGetProcAddress("eglQueryWaylandBufferWL"); extensions = (const char *) glGetString(GL_EXTENSIONS); if (!extensions) { @@ -2037,36 +2081,6 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) if (strstr(extensions, "GL_OES_EGL_image_external")) gr->has_egl_image_external = 1; - extensions = - (const char *) eglQueryString(gr->egl_display, EGL_EXTENSIONS); - if (!extensions) { - weston_log("Retrieving EGL extension string failed.\n"); - return -1; - } - - if (strstr(extensions, "EGL_WL_bind_wayland_display")) - gr->has_bind_display = 1; - if (gr->has_bind_display) { - ret = gr->bind_display(gr->egl_display, ec->wl_display); - if (!ret) - gr->has_bind_display = 0; - } - - if (strstr(extensions, "EGL_EXT_buffer_age")) - gr->has_egl_buffer_age = 1; - else - weston_log("warning: EGL_EXT_buffer_age not supported. " - "Performance could be affected.\n"); - -#ifdef EGL_EXT_swap_buffers_with_damage - if (strstr(extensions, "EGL_EXT_swap_buffers_with_damage")) - gr->swap_buffers_with_damage = - (void *) eglGetProcAddress("eglSwapBuffersWithDamageEXT"); - else - weston_log("warning: EGL_EXT_swap_buffers_with_damage not " - "supported. Performance could be affected.\n"); -#endif - glActiveTexture(GL_TEXTURE0); if (compile_shaders(ec))