gdk/vulkancontext: Pass all painted rects
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Tue, 21 Mar 2023 19:16:17 +0000 (16:16 -0300)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Thu, 30 Mar 2023 20:13:35 +0000 (17:13 -0300)
Instead of passing a single, potentially massive rectangle that is
just the extents of the damage rect, collect and pass all damage
rects individually.

gdk/gdkvulkancontext.c

index 74f2a0e08d344da3e96020290b9877062f3f95a0..59416695cf3e455fe868bc02eaf891b91b40fd37 100644 (file)
@@ -474,24 +474,35 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context,
   GdkSurface *surface = gdk_draw_context_get_surface (draw_context);
   VkPresentRegionsKHR *regionsptr = VK_NULL_HANDLE;
   VkPresentRegionsKHR regions;
-  cairo_rectangle_int_t extents;
+  VkRectLayerKHR *rectangles;
+  int n_regions;
   int scale;
 
-  cairo_region_get_extents (painted, &extents);
   scale = gdk_surface_get_scale_factor (surface);
+  n_regions = cairo_region_num_rectangles (painted);
+  rectangles = g_alloca (sizeof (VkRectLayerKHR) * n_regions);
+
+  for (int i = 0; i < n_regions; i++)
+    {
+      cairo_rectangle_int_t r;
+
+      cairo_region_get_rectangle (painted, i, &r);
+
+      rectangles[i] = (VkRectLayerKHR) {
+          .layer = 0,
+          .offset.x = r.x * scale,
+          .offset.y = r.y * scale,
+          .extent.width = r.width * scale,
+          .extent.height = r.height * scale,
+      };
+    }
 
   regions = (VkPresentRegionsKHR) {
       .sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR,
       .swapchainCount = 1,
       .pRegions = &(VkPresentRegionKHR) {
-          .rectangleCount = 1,
-          .pRectangles = &(VkRectLayerKHR) {
-              .layer = 0,
-              .offset.x = extents.x * scale,
-              .offset.y = extents.y * scale,
-              .extent.width = extents.width * scale,
-              .extent.height = extents.height * scale,
-          }
+        .rectangleCount = n_regions,
+        .pRectangles = rectangles,
       },
   };