[Mesa-dev] [PATCH] egl/wayland: Support for KHR_partial_update
Emil Velikov
emil.l.velikov at gmail.com
Mon Oct 16 13:54:25 UTC 2017
Hi Harish,
Overall looks great, a few comments/questions inline.
On 13 October 2017 at 19:49, Harish Krupo <harish.krupo.kps at intel.com> wrote:
> 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,
Yes, it might be a bit confusing, but please stay consistent and call
this dri2_wl_set_damage_region.
> + _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;
Drop this return - it's only confusing the reader.
> + }
> +
> + return EGL_TRUE;
... since this should suffice.
> +}
> +
> +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);
Hmm what will happen if use calls:
eglSetDamageRegionKHR(dpy, surf, rects, n_rects)
...
eglSwapBuffersWithDamageKHR(dpy, surf, NULL, 0)
eglSwapBuffersWithDamageKHR should behave identical as eglSwapBuffers, correct?
If so, the proposed code seems buggy - we might as well drop the
explicit with_damage and derive it from rects/n_rects locally.
Thanks
Emil
More information about the mesa-dev
mailing list