diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-04-11 19:51:20 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-04-11 19:51:20 -0400 |
commit | 5fa2d91558704da003f52984e56466a2cd1b21aa (patch) | |
tree | 9288c068f6ab6f445a8a4366c37bc7934d259379 | |
parent | b23a03a44b37831f7ae0aaae805382d46129dc11 (diff) | |
download | gtk+-ngl-tiling-experiment.tar.gz |
Use damage rectangles for splittingngl-tiling-experiment
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.
-rw-r--r-- | gsk/ngl/gsknglrenderer.c | 45 |
1 files 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 |