[Mesa-dev] [PATCH] egl/wayland: Support for KHR_partial_update

Harish Krupo harish.krupo.kps at intel.com
Fri Oct 13 18:49:47 UTC 2017


This passes 33/37 deqp tests related to partial_update, 4 are not
supported.

Signed-off-by: Harish Krupo <harish.krupo.kps at intel.com>
---
 src/egl/drivers/dri2/platform_wayland.c | 68 ++++++++++++++++++++++++++++-----
 1 file changed, 59 insertions(+), 9 deletions(-)

diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 14db55ca74..483d588b92 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -810,15 +810,39 @@ try_damage_buffer(struct dri2_egl_surface *dri2_surf,
    }
    return EGL_TRUE;
 }
+
 /**
- * Called via eglSwapBuffers(), drv->API.SwapBuffers().
+ * Called via eglSetDamageRegionKHR(), drv->API.SetDamageRegion().
  */
 static EGLBoolean
-dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
-                                 _EGLDisplay *disp,
-                                 _EGLSurface *draw,
-                                 const EGLint *rects,
-                                 EGLint n_rects)
+wl_set_damage_region(_EGLDriver *drv,
+                     _EGLDisplay *dpy,
+                     _EGLSurface *surf,
+                     const EGLint *rects,
+                     EGLint n_rects)
+{
+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
+
+   /* The spec doesn't mention what should be returned in case of
+    * failure in setting the damage buffer with the window system, so
+    * setting the damage to maximum surface area
+   */
+   if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects)) {
+      wl_surface_damage(dri2_surf->wl_surface_wrapper,
+                        0, 0, INT32_MAX, INT32_MAX);
+      return EGL_TRUE;
+   }
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+dri2_wl_swap_buffers_common(_EGLDriver *drv,
+                            _EGLDisplay *disp,
+                            _EGLSurface *draw,
+                            const EGLint *rects,
+                            EGLint n_rects,
+                            EGLBoolean with_damage)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
@@ -876,7 +900,17 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
    /* If the compositor doesn't support damage_buffer, we deliberately
     * ignore the damage region and post maximum damage, due to
     * https://bugs.freedesktop.org/78190 */
-   if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
+
+   if (!with_damage) {
+
+      /* If called from swapBuffers, check if the damage region
+       * is already set, if not set to full damage
+       */
+      if (!dri2_surf->base.SetDamageRegionCalled)
+         wl_surface_damage(dri2_surf->wl_surface_wrapper,
+                           0, 0, INT32_MAX, INT32_MAX);
+   }
+   else if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
       wl_surface_damage(dri2_surf->wl_surface_wrapper,
                         0, 0, INT32_MAX, INT32_MAX);
 
@@ -912,6 +946,20 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
    return EGL_TRUE;
 }
 
+/**
+ * Called via eglSwapBuffers(), drv->API.SwapBuffers().
+ */
+static EGLBoolean
+dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
+                                 _EGLDisplay *disp,
+                                 _EGLSurface *draw,
+                                 const EGLint *rects,
+                                 EGLint n_rects)
+{
+   return dri2_wl_swap_buffers_common(drv, disp, draw,
+                                      rects, n_rects, EGL_TRUE);
+}
+
 static EGLint
 dri2_wl_query_buffer_age(_EGLDriver *drv,
                          _EGLDisplay *disp, _EGLSurface *surface)
@@ -929,7 +977,8 @@ dri2_wl_query_buffer_age(_EGLDriver *drv,
 static EGLBoolean
 dri2_wl_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
 {
-   return dri2_wl_swap_buffers_with_damage(drv, disp, draw, NULL, 0);
+   return dri2_wl_swap_buffers_common(drv, disp, draw,
+                                      NULL, 0, EGL_FALSE);
 }
 
 static struct wl_buffer *
@@ -1167,7 +1216,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
    .swap_buffers = dri2_wl_swap_buffers,
    .swap_buffers_with_damage = dri2_wl_swap_buffers_with_damage,
    .swap_buffers_region = dri2_fallback_swap_buffers_region,
-   .set_damage_region = dri2_fallback_set_damage_region,
+   .set_damage_region = wl_set_damage_region,
    .post_sub_buffer = dri2_fallback_post_sub_buffer,
    .copy_buffers = dri2_fallback_copy_buffers,
    .query_buffer_age = dri2_wl_query_buffer_age,
@@ -1379,6 +1428,7 @@ dri2_initialize_wayland_drm(_EGLDriver *drv, _EGLDisplay *disp)
    disp->Extensions.EXT_buffer_age = EGL_TRUE;
 
    disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
+   disp->Extensions.KHR_partial_update = EGL_TRUE;
 
    /* Fill vtbl last to prevent accidentally calling virtual function during
     * initialization.
-- 
2.14.2



More information about the mesa-dev mailing list