60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
From a655c446880613e17c3b91e66a7f7ac125f62228 Mon Sep 17 00:00:00 2001
|
|
From: Adam Jackson <ajax@redhat.com>
|
|
Date: Tue, 8 Oct 2013 13:54:27 -0400
|
|
Subject: [PATCH] xwayland: Just send the bounding box of the damage
|
|
|
|
... instead of every rect. Most window updates are going to be CopyArea
|
|
in from offscreen, with plenty of time to get back around to
|
|
BlockHandler in between, so this is no change there. However for
|
|
pathological apps like x11perf that draw complicated primitives directly
|
|
to the window you can end up with massive numbers of damage rects, and
|
|
you can run out of space in the write buffer and crash.
|
|
|
|
This obviously isn't a complete fix, and it would be nice to handle this
|
|
more gracefully in the wayland client code, but this at least lets
|
|
x11perf -all run to completion.
|
|
|
|
While we're in the area, rearrange attach to be before damage, not
|
|
after, since the spec says that's the correct order.
|
|
|
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
|
---
|
|
hw/xfree86/xwayland/xwayland.c | 14 +++++---------
|
|
1 file changed, 5 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c
|
|
index c70a52d..c10a213 100644
|
|
--- a/hw/xfree86/xwayland/xwayland.c
|
|
+++ b/hw/xfree86/xwayland/xwayland.c
|
|
@@ -333,22 +333,18 @@ void xwl_screen_post_damage(struct xwl_screen *xwl_screen)
|
|
struct xwl_window *xwl_window;
|
|
RegionPtr region;
|
|
BoxPtr box;
|
|
- int count, i;
|
|
|
|
xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list,
|
|
link_damage) {
|
|
region = DamageRegion(xwl_window->damage);
|
|
- count = RegionNumRects(region);
|
|
- for (i = 0; i < count; i++) {
|
|
- box = &RegionRects(region)[i];
|
|
- wl_surface_damage(xwl_window->surface,
|
|
- box->x1, box->y1,
|
|
- box->x2 - box->x1,
|
|
- box->y2 - box->y1);
|
|
- }
|
|
wl_surface_attach(xwl_window->surface,
|
|
xwl_window->buffer,
|
|
0, 0);
|
|
+ box = ®ion->extents;
|
|
+ wl_surface_damage(xwl_window->surface,
|
|
+ box->x1, box->y1,
|
|
+ box->x2 - box->x1,
|
|
+ box->y2 - box->y1);
|
|
wl_surface_commit(xwl_window->surface);
|
|
DamageEmpty(xwl_window->damage);
|
|
}
|
|
--
|
|
1.8.3.1
|
|
|