diff options
author | Alexander Larsson <alexl@redhat.com> | 2017-01-11 12:47:32 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2017-01-11 12:47:32 +0100 |
commit | e380e8c2ccd418ded179ebe5bb3c6c03febfa0d7 (patch) | |
tree | 3b9b7bd47721d433e426d8bf25fc3d5e815fabbc | |
parent | 68a27a995160894c1075dcdc163382a1714f0db6 (diff) | |
download | gtk+-wip/alexl/optimize-snapshot.tar.gz |
DO NOT MERGE - test codewip/alexl/optimize-snapshot
This adds some spew for snapshot and render time, and
adds tweaks for testing:
GSK_NO_RENDER setenv to completely skip the render phase (for profiling)
GSK_NO_LAYOUT setenv to disable pango layout nodes
Also, disable some widget from rendering to avoid fallback:
entry
textview
-rw-r--r-- | gtk/gtkentry.c | 2 | ||||
-rw-r--r-- | gtk/gtksnapshot.c | 13 | ||||
-rw-r--r-- | gtk/gtktextview.c | 9 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 35 |
4 files changed, 58 insertions, 1 deletions
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 2a04129483..43e04d7478 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -3592,6 +3592,8 @@ gtk_entry_render (GtkCssGadget *gadget, cairo_t *cr; int i; + return FALSE; + widget = gtk_css_gadget_get_owner (gadget); entry = GTK_ENTRY (widget); priv = entry->priv; diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index 72f1b1586f..31ddad2ff4 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -1137,6 +1137,19 @@ gtk_snapshot_render_layout (GtkSnapshot *snapshot, GtkCssValue *shadow; cairo_t *cr; + { + static int no_layout = 0; + if (no_layout == 0) + { + if (g_getenv ("GSK_NO_LAYOUT") != NULL) + no_layout = 2; + else + no_layout = 1; + } + if (no_layout == 2) + return; + } + g_return_if_fail (snapshot != NULL); g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (PANGO_IS_LAYOUT (layout)); diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 7f4f79a19c..0b61d47275 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -428,6 +428,8 @@ static gint gtk_text_view_motion_event (GtkWidget *widget, GdkEventMotion *event); static gint gtk_text_view_draw (GtkWidget *widget, cairo_t *cr); +static void gtk_text_view_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot); static gboolean gtk_text_view_focus (GtkWidget *widget, GtkDirectionType direction); static void gtk_text_view_select_all (GtkWidget *widget, @@ -737,6 +739,7 @@ gtk_text_view_class_init (GtkTextViewClass *klass) gobject_class->get_property = gtk_text_view_get_property; gobject_class->finalize = gtk_text_view_finalize; + widget_class->snapshot = gtk_text_view_snapshot; widget_class->destroy = gtk_text_view_destroy; widget_class->realize = gtk_text_view_realize; widget_class->unrealize = gtk_text_view_unrealize; @@ -5901,6 +5904,12 @@ paint_border_window (GtkTextView *text_view, gtk_style_context_restore (context); } +static void +gtk_text_view_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ +} + static gboolean gtk_text_view_draw (GtkWidget *widget, cairo_t *cr) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 14b2d6d7e1..07935df8c2 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -15690,8 +15690,23 @@ gtk_widget_render (GtkWidget *widget, clip, "Render<%s>", G_OBJECT_TYPE_NAME (widget)); cairo_region_destroy (clip); + gint64 start_snapshot = g_get_monotonic_time (); gtk_widget_snapshot (widget, &snapshot); root = gtk_snapshot_finish (&snapshot); + gint64 end_snapshot = g_get_monotonic_time (); + { + gint64 delta = end_snapshot - start_snapshot; + static gint64 min_delta = G_MAXINT64; + static gint64 max_delta = 0; + static gint64 n_delta = 0; + static gint64 total_delta = 0; + min_delta = MIN (min_delta, delta); + max_delta = MAX (max_delta, delta); + n_delta++; + total_delta += delta; + g_print ("Snapshot took %.1fms (min: %.1f, max: %.1f, avg: %.1f)\n", + delta / 1000.0, min_delta / 1000.0, max_delta / 1000.0, total_delta / (1000.0 * n_delta)); + } if (root != NULL) { gtk_inspector_record_render (widget, @@ -15700,8 +15715,26 @@ gtk_widget_render (GtkWidget *widget, region, context, root); + if (g_getenv ("GSK_NO_RENDER") == NULL) + { + gint64 start_render = g_get_monotonic_time (); + gsk_renderer_render (renderer, root, context); + gint64 end_render = g_get_monotonic_time (); + { + gint64 delta = end_render - start_render; + static gint64 min_delta = G_MAXINT64; + static gint64 max_delta = 0; + static gint64 n_delta = 0; + static gint64 total_delta = 0; + min_delta = MIN (min_delta, delta); + max_delta = MAX (max_delta, delta); + n_delta++; + total_delta += delta; + g_print ("Render took %.1fms (min: %.1f, max: %.1f, avg: %.1f)\n", + delta / 1000.0, min_delta / 1000.0, max_delta / 1000.0, total_delta / (1000.0 * n_delta)); + } + } - gsk_renderer_render (renderer, root, context); gsk_render_node_unref (root); } |