[gtk/ngl-tiling-experiment] Use damage rectangles for splitting
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-tiling-experiment] Use damage rectangles for splitting
- Date: Sun, 11 Apr 2021 23:52:54 +0000 (UTC)
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]