[mutter] wayland/surface: Intersect buffer damage with buffer rect



commit da5a2d3cb81353c9b7b83defda0ce9c2a62f669c
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Mon Dec 3 17:02:30 2018 +0100

    wayland/surface: Intersect buffer damage with buffer rect
    
    Before processing the buffer damage region, intersect it with the buffer
    rectangle to avoid trying to damage content outside the surface.
    
    This fixes the runtime warning "GL error (1281): Invalid value"
    happening when a client posts too large buffer damage larger.

 src/wayland/meta-wayland-surface.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
---
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 297767a0d..26ee4c256 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -291,6 +291,7 @@ surface_process_damage (MetaWaylandSurface *surface,
 {
   MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
   cairo_rectangle_int_t surface_rect;
+  cairo_rectangle_int_t buffer_rect;
   cairo_region_t *scaled_region;
   cairo_region_t *transformed_region;
   int i, n_rectangles;
@@ -302,6 +303,12 @@ surface_process_damage (MetaWaylandSurface *surface,
   if (!buffer)
     return;
 
+  buffer_rect = (cairo_rectangle_int_t) {
+    .width = get_buffer_width (surface),
+    .height = get_buffer_height (surface),
+  };
+  cairo_region_intersect_rectangle (buffer_region, &buffer_rect);
+
   /* Intersect the damage region with the surface region before scaling in
    * order to avoid integer overflow when scaling a damage region is too large
    * (for example INT32_MAX which mesa passes). */
@@ -316,8 +323,8 @@ surface_process_damage (MetaWaylandSurface *surface,
   scaled_region = meta_region_scale (surface_region, surface->scale);
   transformed_region = meta_region_transform (scaled_region,
                                               surface->buffer_transform,
-                                              get_buffer_width (surface),
-                                              get_buffer_height (surface));
+                                              buffer_rect.width,
+                                              buffer_rect.height);
 
   /* Now add the buffer damage on top of the scaled damage region, as buffer
    * damage is already in that scale. */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]