[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