[Mesa-dev] [PATCH] egl/wayland: Ignore rects from SwapBuffersWithDamage

Pekka Paalanen ppaalanen at gmail.com
Thu Nov 12 06:46:01 PST 2015


On Sat,  7 Nov 2015 18:34:20 +0000
Daniel Stone <daniels at collabora.com> wrote:

> eglSwapBuffersWithDamage accepts damage-region rectangles to hint the
> compositor that it only needs to redraw certain areas, which was passed
> through the wl_surface_damage request, as designed.
> 
> Wayland also offers a buffer transformation interface, e.g. to allow
> users to render pre-rotated buffers. Unfortunately, there is no way to
> query buffer transforms, and the damage region was provided in surface,
> rather than buffer, co-ordinate space.
> 
> Users could perhaps account for this themselves, but EGL also requires
> co-ordinates to be passed in GL/mathematical co-ordinate space, with an
> inversion to Wayland's natural/scanout co-orodinate space, so the
> transformation is so convoluted that it's unreasonable to expect anyone
> to do it.
> 
> Pending creation and acceptance of a wl_surface.buffer_damage request,
> which will accept co-ordinates in buffer co-ordinate space, pessimise to
> always sending full-surface damage.
> 
> bce64c6c provides the explanation for why we send maximum-range damage,
> rather than the full size of the surface: in the presence of buffer
> transformations, full-surface damage may not actually cover the entire
> surface.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Cc: Jasper St. Pierre <jasper at mecheye.net>
> ---
>  src/egl/drivers/dri2/platform_wayland.c | 14 ++------------
>  1 file changed, 2 insertions(+), 12 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index 0d161f6..9e8e6ce 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -703,18 +703,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>     dri2_surf->dx = 0;
>     dri2_surf->dy = 0;
>  
> -   if (n_rects == 0) {
> -      wl_surface_damage(dri2_surf->wl_win->surface,
> -                        0, 0, INT32_MAX, INT32_MAX);
> -   } else {
> -      for (i = 0; i < n_rects; i++) {
> -         const int *rect = &rects[i * 4];
> -         wl_surface_damage(dri2_surf->wl_win->surface,
> -                           rect[0],
> -                           dri2_surf->base.Height - rect[1] - rect[3],
> -                           rect[2], rect[3]);
> -      }
> -   }
> +    wl_surface_damage(dri2_surf->wl_win->surface,
> +                      0, 0, INT32_MAX, INT32_MAX);
>  
>     if (dri2_dpy->is_different_gpu) {
>        _EGLContext *ctx = _eglGetCurrentContext();

One space too much of indent?

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

Perhaps a TODO comment referring to
https://bugs.freedesktop.org/show_bug.cgi?id=78190
would be nice.


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


More information about the mesa-dev mailing list