[gtk+] gsk: Add GSK_RENDERING_MODE=full-redraw



commit 68b39a47278bd9c2fde28c0787a3fd45769b8687
Author: Benjamin Otte <otte redhat com>
Date:   Tue Dec 27 00:33:34 2016 +0100

    gsk: Add GSK_RENDERING_MODE=full-redraw
    
    Forces a full redraw every frame.
    This is done generically, so it's supported on every renderer.
    
    For widget-factory first page (with the spinner spinning and progressbar
    pulsing), I get these numbers per frame:
    
    action                  clipped         full redraw
    snapshot                   0ms           7-10ms
    cairo rendering            0ms          10-15ms
    Vulkan rendering         3-5ms          18-20ms
    Vulkan expected *          0ms            1-2ms
    GL rendering            unsupported     55-62ms
    
    * expected means disabling rendering of unsupported render nodes,
    instead of doing fallback drawing. So it overestimates the performance,
    because borders and box-shadows are disabled.

 gsk/gskdebug.c        |    1 +
 gsk/gskdebugprivate.h |    5 +++--
 gsk/gskrenderer.c     |   19 ++++++++++++++++++-
 3 files changed, 22 insertions(+), 3 deletions(-)
---
diff --git a/gsk/gskdebug.c b/gsk/gskdebug.c
index 3ccb5e0..94d40b7 100644
--- a/gsk/gskdebug.c
+++ b/gsk/gskdebug.c
@@ -18,6 +18,7 @@ static const GDebugKey gsk_rendering_keys[] = {
   { "geometry", GSK_RENDERING_MODE_GEOMETRY },
   { "shaders", GSK_RENDERING_MODE_SHADERS },
   { "sync", GSK_RENDERING_MODE_SYNC },
+  { "full-redraw", GSK_RENDERING_MODE_FULL_REDRAW},
   { "staging-image", GSK_RENDERING_MODE_STAGING_IMAGE },
   { "staging-buffer", GSK_RENDERING_MODE_STAGING_BUFFER }
 };
diff --git a/gsk/gskdebugprivate.h b/gsk/gskdebugprivate.h
index 26b24f7..5a3f58d 100644
--- a/gsk/gskdebugprivate.h
+++ b/gsk/gskdebugprivate.h
@@ -21,8 +21,9 @@ typedef enum {
   GSK_RENDERING_MODE_GEOMETRY       = 1 << 0,
   GSK_RENDERING_MODE_SHADERS        = 1 << 1,
   GSK_RENDERING_MODE_SYNC           = 1 << 2,
-  GSK_RENDERING_MODE_STAGING_IMAGE  = 1 << 3,
-  GSK_RENDERING_MODE_STAGING_BUFFER = 1 << 4
+  GSK_RENDERING_MODE_FULL_REDRAW    = 1 << 3,
+  GSK_RENDERING_MODE_STAGING_IMAGE  = 1 << 4,
+  GSK_RENDERING_MODE_STAGING_BUFFER = 1 << 5
 } GskRenderingMode;
 
 gboolean gsk_check_debug_flags (GskDebugFlags flags);
diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c
index 623e395..bba0153 100644
--- a/gsk/gskrenderer.c
+++ b/gsk/gskrenderer.c
@@ -916,7 +916,24 @@ gsk_renderer_begin_draw_frame (GskRenderer          *renderer,
   g_return_val_if_fail (region != NULL, NULL);
   g_return_val_if_fail (priv->drawing_context == NULL, NULL);
 
-  priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
+  if (GSK_RENDER_MODE_CHECK (FULL_REDRAW))
+    {
+      cairo_region_t *full_window;
+      
+      full_window = cairo_region_create_rectangle (&(GdkRectangle) {
+                                                       0, 0,
+                                                       gdk_window_get_width (priv->window),
+                                                       gdk_window_get_height (priv->window)
+                                                   });
+      
+      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, full_window);
+
+      cairo_region_destroy (full_window);
+    }
+  else
+    {
+      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
+    }
 
   return priv->drawing_context;
 }


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