<div dir="ltr">Hi Pekka,<div class="gmail_extra"><br><div class="gmail_quote">On 22 January 2018 at 14:34, Pekka Paalanen <span dir="ltr"><<a href="mailto:pekka.paalanen@collabora.co.uk" target="_blank">pekka.paalanen@collabora.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-HOEnZb"><div class="gmail-h5">On Wed, 20 Dec 2017 13:18:45 +0200<br>
Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br>
<br>
> From: Pekka Paalanen <<a href="mailto:pekka.paalanen@collabora.co.uk">pekka.paalanen@collabora.co.<wbr>uk</a>><br>
><br>
> If an X11 app draws a little here, some there, and a tiny bit in the<br>
> opposite corner, using RegionExtents for the damage to be sent to the<br>
> Wayland compositor will cause massive over-damaging.<br>
><br>
> However, we cannot blindly send an arbitrary number of damage<br>
> rectangles, because there is a risk of overflowing the Wayland<br>
> connection. If that happens, it triggers an abort in libwayland-client.<br>
><br>
> Try to be more accurate with the damage by sending up to 500 rectangles<br>
> per window, and fall back to extents otherwise. The number is completely<br>
> arbitrary.<br>
><br>
> Signed-off-by: Pekka Paalanen <<a href="mailto:pekka.paalanen@collabora.co.uk">pekka.paalanen@collabora.co.<wbr>uk</a>><br>
> ---<br>
>  hw/xwayland/xwayland.c | 18 +++++++++++++++---<br>
>  1 file changed, 15 insertions(+), 3 deletions(-)<br>
><br>
> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c<br>
> index c5a3ae7ae..383680d7a 100644<br>
> --- a/hw/xwayland/xwayland.c<br>
> +++ b/hw/xwayland/xwayland.c<br>
> @@ -629,6 +629,7 @@ xwl_window_post_damage(struct xwl_window *xwl_window)<br>
>      BoxPtr box;<br>
>      struct wl_buffer *buffer;<br>
>      PixmapPtr pixmap;<br>
> +    int i;<br>
><br>
>      assert(!xwl_window->frame_<wbr>callback);<br>
><br>
> @@ -644,9 +645,20 @@ xwl_window_post_damage(struct xwl_window *xwl_window)<br>
><br>
>      wl_surface_attach(xwl_window-><wbr>surface, buffer, 0, 0);<br>
><br>
> -    box = RegionExtents(region);<br>
> -    wl_surface_damage(xwl_window-><wbr>surface, box->x1, box->y1,<br>
> -                        box->x2 - box->x1, box->y2 - box->y1);<br>
> +    /* Arbitrary limit to try to avoid flooding the Wayland<br>
> +     * connection. If we flood it too much anyway, this could<br>
> +     * abort in libwayland-client.<br>
> +     */<br>
> +    if (RegionNumRects(region) > 500) {<br>
> +        box = RegionExtents(region);<br>
> +        wl_surface_damage(xwl_window-><wbr>surface, box->x1, box->y1,<br>
> +                          box->x2 - box->x1, box->y2 - box->y1);<br>
> +    } else {<br>
> +        box = RegionRects(region);<br>
> +        for (i = 0; i < RegionNumRects(region); i++, box++)<br>
> +            wl_surface_damage(xwl_window-><wbr>surface, box->x1, box->y1,<br>
> +                              box->x2 - box->x1, box->y2 - box->y1);<br>
> +    }<br>
><br>
>      xwl_window->frame_callback = wl_surface_frame(xwl_window-><wbr>surface);<br>
>      wl_callback_add_listener(xwl_<wbr>window->frame_callback, &frame_listener, xwl_window);<br>
<br>
</div></div>Hi,<br>
<br>
should I invest the effort on a better algorithm than in this patch or<br>
would this be acceptable for landing?<br></blockquote><div><br></div><div>Not sure which better algorithm you might have in mind here, but the approach taken in your patch seems simple enough, do we have a rough idea of the average number of rectangles we usually deal with here?</div><div><br></div><div>Cheers,</div><div>Olivier</div><div><br></div><div><br></div></div></div></div>