<div dir="ltr">Why do we end up with such a large damage anyway? Technically, we need to ignore this in mutter, as it's perfectly valid to have a too-big damage.<br><br>Rather than do the clip in Xwayland, I'd like to figure out why damage reporting for a window we know the bounds of is so unrealistically large, because this could be a bug hitting us on Xorg as well.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Apr 19, 2014 at 4:26 AM, Adel Gadllah <span dir="ltr"><<a href="mailto:adel.gadllah@gmail.com" target="_blank">adel.gadllah@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Currently we accumulate damage in a list and call wl_surface_damage() for every<br>
rectangle in the accumulated regions in xwl_screen_post_damage(). If the window<br>
size changes we might end up with a damage region that exceeds the window<br>
bounds causing compositors like mutter to call glTexSubImage2D with an area<br>
that exceeds the buffer dimensions causing GL_INVALID_VALUE.<br>
<br>
So intersect the damage region with the window's shape region in<br>
xwl_screen_post_damage().<br>
<br>
Signed-off-by: Adel Gadllah <<a href="mailto:adel.gadllah@gmail.com">adel.gadllah@gmail.com</a>><br>
---<br>
 hw/xwayland/xwayland.c | 5 ++++-<br>
 1 file changed, 4 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c<br>
index c2c6481..7f810aa 100644<br>
--- a/hw/xwayland/xwayland.c<br>
+++ b/hw/xwayland/xwayland.c<br>
@@ -325,7 +325,7 @@ static void<br>
 xwl_screen_post_damage(struct xwl_screen *xwl_screen)<br>
 {<br>
     struct xwl_window *xwl_window;<br>
-    RegionPtr region;<br>
+    RegionPtr region, shape_region;<br>
     BoxPtr box;<br>
     int count, i;<br>
     struct wl_buffer *buffer;<br>
@@ -334,6 +334,9 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen)<br>
     xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list,<br>
                              link_damage) {<br>
         region = DamageRegion(xwl_window->damage);<br>
+        shape_region = wBoundingShape(xwl_window->window);<br>
+        if (shape_region)<br>
+            RegionIntersect(region, region, shape_region);<br>
         count = RegionNumRects(region);<br>
<br>
         pixmap = (*xwl_screen->screen->GetWindowPixmap) (xwl_window->window);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.0<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>  Jasper<br>
</div>