[PATCH] xwayland: Fix damage reporting

Adel Gadllah adel.gadllah at gmail.com
Sat Apr 19 01:26:34 PDT 2014

Currently we accumulate damage in a list and call wl_surface_damage() for every
rectangle in the accumulated regions in xwl_screen_post_damage(). If the window
size changes we might end up with a damage region that exceeds the window
bounds causing compositors like mutter to call glTexSubImage2D with an area
that exceeds the buffer dimensions causing GL_INVALID_VALUE.

So intersect the damage region with the window's shape region in

Signed-off-by: Adel Gadllah <adel.gadllah at gmail.com>
 hw/xwayland/xwayland.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index c2c6481..7f810aa 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -325,7 +325,7 @@ static void
 xwl_screen_post_damage(struct xwl_screen *xwl_screen)
     struct xwl_window *xwl_window;
-    RegionPtr region;
+    RegionPtr region, shape_region;
     BoxPtr box;
     int count, i;
     struct wl_buffer *buffer;
@@ -334,6 +334,9 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen)
     xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list,
                              link_damage) {
         region = DamageRegion(xwl_window->damage);
+        shape_region = wBoundingShape(xwl_window->window);
+        if (shape_region)
+            RegionIntersect(region, region, shape_region);
         count = RegionNumRects(region);
         pixmap = (*xwl_screen->screen->GetWindowPixmap) (xwl_window->window);

More information about the xorg-devel mailing list