[gtk/ngl-tiling-experiment] Use damage rectangles for splitting



commit 5fa2d91558704da003f52984e56466a2cd1b21aa
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Apr 11 19:51:20 2021 -0400

    Use damage rectangles for splitting
    
    This is much better when the damage is 'reasonable',
    for example the 3-4 rectangles in widget-factory. It
    breaks down when we end up with 20 - 30 rectangles,
    such as when switching pages in gtk4-demo.

 gsk/ngl/gsknglrenderer.c | 45 +++++++--------------------------------------
 1 file changed, 7 insertions(+), 38 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderer.c b/gsk/ngl/gsknglrenderer.c
index bd9fb03220..9c9d62598a 100644
--- a/gsk/ngl/gsknglrenderer.c
+++ b/gsk/ngl/gsknglrenderer.c
@@ -174,15 +174,14 @@ get_render_region (GdkSurface   *surface,
   damage = gdk_draw_context_get_frame_region (GDK_DRAW_CONTEXT (context));
 
   if (cairo_region_contains_rectangle (damage, &whole_surface) == CAIRO_REGION_OVERLAP_IN)
-    return NULL;
+    return cairo_region_create_rectangle (&whole_surface);
 
   /* If the extents match the full-scene, do the same as above */
   cairo_region_get_extents (damage, &extents);
   if (gdk_rectangle_equal (&extents, &whole_surface))
-    return NULL;
+    return cairo_region_create_rectangle (&whole_surface);
 
-  /* Draw clipped to the bounding-box of the region. */
-  return cairo_region_create_rectangle (&extents);
+  return cairo_region_copy (damage);
 }
 
 static void
@@ -221,44 +220,14 @@ gsk_ngl_renderer_render (GskRenderer          *renderer,
   g_print ("tiled:");
   end_time = start_time;
 
-  for (int i = 0; i < 4; i++)
+  for (int i = 0; i < cairo_region_num_rectangles (render_region); i++)
     {
+      cairo_rectangle_int_t rect;
       cairo_region_t *region;
       gint64 st = end_time;
 
-      int w = gdk_surface_get_width (surface);
-      int h = gdk_surface_get_height (surface);
-
-      if (render_region)
-        region = cairo_region_copy (render_region);
-      else
-        region = cairo_region_create_rectangle (&(GdkRectangle){ 0, 0, w, h });
-
-      switch (i)
-        {
-        case 0:
-          cairo_region_intersect_rectangle (region,
-                &(cairo_rectangle_int_t) { 0, 0, w/2, h/2 });
-          break;
-        case 1:
-          cairo_region_intersect_rectangle (region,
-                &(cairo_rectangle_int_t) { w/2, 0, w - w/2, h/2 });
-          break;
-        case 2:
-          cairo_region_intersect_rectangle (region,
-                &(cairo_rectangle_int_t) { 0, h/2, w/2, h - h/2 });
-          break;
-        case 3:
-          cairo_region_intersect_rectangle (region,
-                &(cairo_rectangle_int_t) { w/2, h/2, w - w/2, h - h/2 });
-          break;
-        default:
-          g_assert_not_reached ();
-          break;
-        }
-
-      if (cairo_region_num_rectangles (region) == 0)
-        continue;
+      cairo_region_get_rectangle (render_region, i, &rect);
+      region = cairo_region_create_rectangle (&rect);
 
       job = gsk_ngl_render_job_new (self->driver, &viewport, scale_factor, region, 0);
 #ifdef G_ENABLE_DEBUG


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