gl-renderer: add support for EGL_KHR_swap_buffers_with_damage
authorEmil Velikov <emil.velikov@collabora.com>
Mon, 14 Nov 2016 16:03:45 +0000 (16:03 +0000)
committerDaniel Stone <daniels@collabora.com>
Mon, 21 Nov 2016 11:31:29 +0000 (11:31 +0000)
Extension is identical to the EXT one, yet we need to check for the KHR
abbreviated extension name + entry-point.

v2: s/foo/swap_damage_ext_to_entrypoint/ (Eric, Daniel)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com> (v1)
Reviewed-by: Daniel Stone <daniels@collabora.com>
libweston/gl-renderer.c

index 2f46373..d072caf 100644 (file)
@@ -2812,6 +2812,18 @@ renderer_setup_egl_client_extensions(struct gl_renderer *gr)
 static int
 gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
 {
+       static const struct {
+               char *extension, *entrypoint;
+       } swap_damage_ext_to_entrypoint[] = {
+               {
+                       .extension = "EGL_EXT_swap_buffers_with_damage",
+                       .entrypoint = "eglSwapBuffersWithDamageEXT",
+               },
+               {
+                       .extension = "EGL_KHR_swap_buffers_with_damage",
+                       .entrypoint = "eglSwapBuffersWithDamageKHR",
+               },
+       };
        struct gl_renderer *gr = get_renderer(ec);
        const char *extensions;
        EGLBoolean ret;
@@ -2846,12 +2858,20 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
                weston_log("warning: EGL_EXT_buffer_age not supported. "
                           "Performance could be affected.\n");
 
-       if (weston_check_egl_extension(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");
+       for (unsigned i = 0; i < ARRAY_LENGTH(swap_damage_ext_to_entrypoint); i++) {
+               if (weston_check_egl_extension(extensions,
+                               swap_damage_ext_to_entrypoint[i].extension)) {
+                       gr->swap_buffers_with_damage =
+                               (void *) eglGetProcAddress(
+                                               swap_damage_ext_to_entrypoint[i].entrypoint);
+                       break;
+               }
+       }
+       if (!gr->swap_buffers_with_damage)
+               weston_log("warning: neither %s or %s is supported. "
+                          "Performance could be affected.\n",
+                          swap_damage_ext_to_entrypoint[0].extension,
+                          swap_damage_ext_to_entrypoint[1].extension);
 
        if (weston_check_egl_extension(extensions, "EGL_KHR_no_config_context") ||
            weston_check_egl_extension(extensions, "EGL_MESA_configless_context"))