[RFC xserver 1/1] xwayland: reduce over-damage
Pekka Paalanen
pekka.paalanen at collabora.co.uk
Mon Jan 22 13:34:07 UTC 2018
On Wed, 20 Dec 2017 13:18:45 +0200
Pekka Paalanen <ppaalanen at gmail.com> wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> If an X11 app draws a little here, some there, and a tiny bit in the
> opposite corner, using RegionExtents for the damage to be sent to the
> Wayland compositor will cause massive over-damaging.
>
> However, we cannot blindly send an arbitrary number of damage
> rectangles, because there is a risk of overflowing the Wayland
> connection. If that happens, it triggers an abort in libwayland-client.
>
> Try to be more accurate with the damage by sending up to 500 rectangles
> per window, and fall back to extents otherwise. The number is completely
> arbitrary.
>
> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> ---
> hw/xwayland/xwayland.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
> index c5a3ae7ae..383680d7a 100644
> --- a/hw/xwayland/xwayland.c
> +++ b/hw/xwayland/xwayland.c
> @@ -629,6 +629,7 @@ xwl_window_post_damage(struct xwl_window *xwl_window)
> BoxPtr box;
> struct wl_buffer *buffer;
> PixmapPtr pixmap;
> + int i;
>
> assert(!xwl_window->frame_callback);
>
> @@ -644,9 +645,20 @@ xwl_window_post_damage(struct xwl_window *xwl_window)
>
> wl_surface_attach(xwl_window->surface, buffer, 0, 0);
>
> - box = RegionExtents(region);
> - wl_surface_damage(xwl_window->surface, box->x1, box->y1,
> - box->x2 - box->x1, box->y2 - box->y1);
> + /* Arbitrary limit to try to avoid flooding the Wayland
> + * connection. If we flood it too much anyway, this could
> + * abort in libwayland-client.
> + */
> + if (RegionNumRects(region) > 500) {
> + box = RegionExtents(region);
> + wl_surface_damage(xwl_window->surface, box->x1, box->y1,
> + box->x2 - box->x1, box->y2 - box->y1);
> + } else {
> + box = RegionRects(region);
> + for (i = 0; i < RegionNumRects(region); i++, box++)
> + wl_surface_damage(xwl_window->surface, box->x1, box->y1,
> + box->x2 - box->x1, box->y2 - box->y1);
> + }
>
> xwl_window->frame_callback = wl_surface_frame(xwl_window->surface);
> wl_callback_add_listener(xwl_window->frame_callback, &frame_listener, xwl_window);
Hi,
should I invest the effort on a better algorithm than in this patch or
would this be acceptable for landing?
Thanks,
pq
More information about the xorg-devel
mailing list