diff options
author | Owen W. Taylor <otaylor@fishsoup.net> | 2012-11-14 19:21:33 -0500 |
---|---|---|
committer | Owen W. Taylor <otaylor@fishsoup.net> | 2013-02-14 17:19:51 -0500 |
commit | 8855bf052d8bbbd8fdfce1cd5f4a3540661a9c8e (patch) | |
tree | a20e834ec52411ff83638d942cc4788a7fa2fb75 /gdk/gdkframeclockidle.c | |
parent | 9690567d5059e5667803e5b8fb438c3b97e9d7e7 (diff) | |
download | gtk+-8855bf052d8bbbd8fdfce1cd5f4a3540661a9c8e.tar.gz |
Add GDK_DEBUG=frames
Add a debug option to print out detailed statistics about each frame drawn.
https://bugzilla.gnome.org/show_bug.cgi?id=685460
Diffstat (limited to 'gdk/gdkframeclockidle.c')
-rw-r--r-- | gdk/gdkframeclockidle.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/gdk/gdkframeclockidle.c b/gdk/gdkframeclockidle.c index f6e2d339b9..09624c45b0 100644 --- a/gdk/gdkframeclockidle.c +++ b/gdk/gdkframeclockidle.c @@ -26,6 +26,7 @@ #include "config.h" +#include "gdkinternals.h" #include "gdkframeclockidle.h" #include "gdk.h" @@ -271,6 +272,8 @@ gdk_frame_clock_paint_idle (void *data) GdkFrameClockIdle *clock_idle = GDK_FRAME_CLOCK_IDLE (clock); GdkFrameClockIdlePrivate *priv = clock_idle->priv; gboolean skip_to_resume_events; + GdkFrameTimings *timings = NULL; + gint64 frame_counter = 0; priv->paint_idle_id = 0; priv->in_paint_idle = TRUE; @@ -278,6 +281,12 @@ gdk_frame_clock_paint_idle (void *data) skip_to_resume_events = (priv->requested & ~(GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS | GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS)) == 0; + if (priv->phase > GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT) + { + frame_counter = gdk_frame_history_get_frame_counter (priv->history); + timings = gdk_frame_history_get_timings (priv->history, frame_counter); + } + if (!skip_to_resume_events) { switch (priv->phase) @@ -288,13 +297,12 @@ gdk_frame_clock_paint_idle (void *data) case GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT: if (priv->freeze_count == 0) { - GdkFrameTimings *timings; - gint64 frame_counter; - priv->frame_time = compute_frame_time (clock_idle); + gdk_frame_history_begin_frame (priv->history); frame_counter = gdk_frame_history_get_frame_counter (priv->history); timings = gdk_frame_history_get_timings (priv->history, frame_counter); + gdk_frame_timings_set_frame_time (timings, priv->frame_time); gdk_frame_timings_set_slept_before (timings, @@ -322,6 +330,15 @@ gdk_frame_clock_paint_idle (void *data) case GDK_FRAME_CLOCK_PHASE_LAYOUT: if (priv->freeze_count == 0) { +#ifdef G_ENABLE_DEBUG + if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0) + { + if (priv->phase != GDK_FRAME_CLOCK_PHASE_LAYOUT && + (priv->requested & GDK_FRAME_CLOCK_PHASE_LAYOUT)) + _gdk_frame_timings_set_layout_start_time (timings, g_get_monotonic_time ()); + } +#endif /* G_ENABLE_DEBUG */ + priv->phase = GDK_FRAME_CLOCK_PHASE_LAYOUT; if (priv->requested & GDK_FRAME_CLOCK_PHASE_LAYOUT) { @@ -332,6 +349,15 @@ gdk_frame_clock_paint_idle (void *data) case GDK_FRAME_CLOCK_PHASE_PAINT: if (priv->freeze_count == 0) { +#ifdef G_ENABLE_DEBUG + if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0) + { + if (priv->phase != GDK_FRAME_CLOCK_PHASE_PAINT && + (priv->requested & GDK_FRAME_CLOCK_PHASE_PAINT)) + _gdk_frame_timings_set_paint_start_time (timings, g_get_monotonic_time ()); + } +#endif /* G_ENABLE_DEBUG */ + priv->phase = GDK_FRAME_CLOCK_PHASE_PAINT; if (priv->requested & GDK_FRAME_CLOCK_PHASE_PAINT) { @@ -347,12 +373,25 @@ gdk_frame_clock_paint_idle (void *data) /* the ::after-paint phase doesn't get repeated on freeze/thaw, */ priv->phase = GDK_FRAME_CLOCK_PHASE_NONE; + +#ifdef G_ENABLE_DEBUG + if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0) + _gdk_frame_timings_set_frame_end_time (timings, g_get_monotonic_time ()); +#endif /* G_ENABLE_DEBUG */ } case GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS: ; } } +#ifdef G_ENABLE_DEBUG + if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0) + { + if (gdk_frame_timings_get_complete (timings)) + _gdk_frame_history_debug_print (priv->history, timings); + } +#endif /* G_ENABLE_DEBUG */ + if (priv->requested & GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS) { priv->requested &= ~GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS; |