[Mesa-dev] [PATCH] egl/wayland: Try to use wl_surface.damage_buffer for SwapBuffersWithDamage

Pekka Paalanen ppaalanen at gmail.com
Mon Feb 15 11:24:31 UTC 2016


On Thu, 11 Feb 2016 10:34:10 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:

> Since commit d1314de293e9e4a63c35f094c3893aaaed8580b4 we ignore
> damage passed to SwapBuffersWithDamage.
> 
> Wayland 1.10 now has functionality that allows us to properly
> process those damage rectangles, and a way to query if it's
> available.
> 
> Now we can use wl_surface.damage_buffer and interpret the incoming
> damage as being in buffer co-ordinates.
> 
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>  src/egl/drivers/dri2/platform_wayland.c | 32 +++++++++++++++++++++++++++++---
>  1 file changed, 29 insertions(+), 3 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index c2438f7..b5a5b59 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -653,6 +653,30 @@ create_wl_buffer(struct dri2_egl_surface *dri2_surf)
>                            &wl_buffer_listener, dri2_surf);
>  }
>  
> +static EGLBoolean
> +try_damage_buffer(struct dri2_egl_surface *dri2_surf,
> +                  const EGLint *rects,
> +                  EGLint n_rects)
> +{
> +#ifdef WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION
> +   int i;
> +
> +   if (wl_proxy_get_version((struct wl_proxy *) dri2_surf->wl_win->surface)
> +       < WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
> +      return EGL_FALSE;
> +
> +   for (i = 0; i < n_rects; i++) {
> +      const int *rect = &rects[i * 4];
> +
> +      wl_surface_damage_buffer(dri2_surf->wl_win->surface,
> +                               rect[0],
> +                               dri2_surf->base.Height - rect[1] - rect[3],
> +                               rect[2], rect[3]);
> +   }
> +   return EGL_TRUE;
> +#endif
> +   return EGL_FALSE;
> +}
>  /**
>   * Called via eglSwapBuffers(), drv->API.SwapBuffers().
>   */
> @@ -703,10 +727,12 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>     dri2_surf->dx = 0;
>     dri2_surf->dy = 0;
>  
> -   /* We deliberately ignore the damage region and post maximum damage, due to
> +   /* 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 */
> -   wl_surface_damage(dri2_surf->wl_win->surface,
> -                     0, 0, INT32_MAX, INT32_MAX);
> +   if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
> +      wl_surface_damage(dri2_surf->wl_win->surface,
> +                        0, 0, INT32_MAX, INT32_MAX);
>  
>     if (dri2_dpy->is_different_gpu) {
>        _EGLContext *ctx = _eglGetCurrentContext();

Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

But I also agree with Emil that having a comment on #ifdef
WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION usage is good to add.

Bumping the wayland-client requirement to >= 1.10 would be nice,
but currently the requirement seems to be 1.2 so I wonder if there are
other things to be cleaned up too.

OTOH, with the #ifdef this patch could go to stable branches, couldn't
it?

How about landing this is as is, tagged for stable, and a follow-up if
wanted to bump the wayland-client dependency on master? Would that be
appropriate?


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160215/64777420/attachment.sig>


More information about the mesa-dev mailing list