[Mesa-dev] [PATCH v3] egl/wayland: Support for KHR_partial_update
Eric Engestrom
eric.engestrom at imgtec.com
Wed Oct 25 17:28:11 UTC 2017
On Monday, 2017-10-23 16:20:54 +0530, Harish Krupo wrote:
> This passes 33/37 deqp tests related to partial_update, 4 are not
> supported. Tests not supported:
> dEQP-EGL.functional.negative_partial_update.not_postable_surface
> dEQP-EGL.functional.negative_partial_update.not_current_surface
> dEQP-EGL.functional.negative_partial_update.buffer_preserved
> dEQP-EGL.functional.negative_partial_update.not_current_surface2
> Reason: No matching egl config found.
>
> v2: Remove unnecessary return statement. Keep function names
> consistent. (Emil Velikov)
> Add not supported list to commit message. (Eric Engestrom)
>
> v3: Remove explicit with_damage variable. (Eric Engestrom)
>
> Signed-off-by: Harish Krupo <harish.krupo.kps at intel.com>
> ---
> src/egl/drivers/dri2/platform_wayland.c | 54 ++++++++++++++++++++++-----------
> 1 file changed, 36 insertions(+), 18 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index b38eb1c335..8846099d57 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -790,27 +790,44 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
> return ret;
> }
>
> +/**
> + * Called via eglSetDamageRegionKHR(), drv->API.SetDamageRegion().
> + */
> static EGLBoolean
> -try_damage_buffer(struct dri2_egl_surface *dri2_surf,
> - const EGLint *rects,
> - EGLint n_rects)
> +dri2_wl_set_damage_region(_EGLDriver *drv,
> + _EGLDisplay *dpy,
> + _EGLSurface *surf,
> + const EGLint *rects,
> + EGLint n_rects)
> {
> - if (wl_proxy_get_version((struct wl_proxy *) dri2_surf->wl_surface_wrapper)
> - < WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
> - return EGL_FALSE;
> + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
>
> - for (int i = 0; i < n_rects; i++) {
> - const int *rect = &rects[i * 4];
> + /* 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 ||
> + wl_proxy_get_version((struct wl_proxy *) dri2_surf->wl_surface_wrapper)
> + < WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION) {
> + wl_surface_damage(dri2_surf->wl_surface_wrapper,
> + 0, 0, INT32_MAX, INT32_MAX);
> + } else {
I know Emil suggested you remove the `return` in an earlier version, but
if you add it back here you can drop the else, and the diff will look
much cleaner, keeping only the version check getting an `|| !n_rects`
and `return false` becoming `damage(everything)`.
Other than that, it looks good to me. Thanks :)
> + for (int i = 0; i < n_rects; i++) {
> + const int *rect = &rects[i * 4];
>
> - wl_surface_damage_buffer(dri2_surf->wl_surface_wrapper,
> - rect[0],
> - dri2_surf->base.Height - rect[1] - rect[3],
> - rect[2], rect[3]);
> + wl_surface_damage_buffer(dri2_surf->wl_surface_wrapper,
> + rect[0],
> + dri2_surf->base.Height - rect[1] - rect[3],
> + rect[2], rect[3]);
> + }
> }
> +
> return EGL_TRUE;
> }
> +
> /**
> - * Called via eglSwapBuffers(), drv->API.SwapBuffers().
> + * Called via eglSwapBuffersWithDamage{KHR,EXT}(),
> + * drv->API.SwapBuffersWithDamageEXT().
> */
> static EGLBoolean
> dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
> @@ -875,9 +892,8 @@ 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))
> - wl_surface_damage(dri2_surf->wl_surface_wrapper,
> - 0, 0, INT32_MAX, INT32_MAX);
> + if (n_rects || !dri2_surf->base.SetDamageRegionCalled)
> + dri2_wl_set_damage_region(drv, disp, draw, rects, n_rects);
>
> if (dri2_dpy->is_different_gpu) {
> _EGLContext *ctx = _eglGetCurrentContext();
> @@ -928,7 +944,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_with_damage(drv, disp, draw,
> + NULL, 0);
> }
>
> static struct wl_buffer *
> @@ -1166,7 +1183,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 = dri2_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,
> @@ -1378,6 +1395,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