[RFC xserver 1/1] xwayland: reduce over-damage
Olivier Fourdan
fourdan at gmail.com
Mon Jan 22 13:56:12 UTC 2018
Hi Pekka,
On 22 January 2018 at 14:34, Pekka Paalanen <pekka.paalanen at collabora.co.uk>
wrote:
> 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?
>
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?
Cheers,
Olivier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.x.org/archives/xorg-devel/attachments/20180122/6b0e9355/attachment.html>
More information about the xorg-devel
mailing list