[Mesa-dev] [PATCH] egl/wayland: Ignore rects from SwapBuffersWithDamage
Jason Ekstrand
jason at jlekstrand.net
Thu Nov 12 08:47:29 PST 2015
On Thu, Nov 12, 2015 at 6:46 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> 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.
Yes, that would be good. One day, we need to add a
wl_surface.buffer_damage request. I blame Kristian for that not
happening. I was working on that almost two years ago when he
co-opted me to work on drivers. :-P
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
More information about the mesa-dev
mailing list