gdk_frame_timings_unref(priv->timings[priv->current]);
}
- priv->timings[priv->current] = gdk_frame_timings_new (priv->frame_counter);
+ priv->timings[priv->current] = _gdk_frame_timings_new (priv->frame_counter);
}
GdkFrameTimings *
for (i = 0; i < priv->n_timings; i++)
{
gint pos = ((priv->current - i) + FRAME_HISTORY_MAX_LENGTH) % FRAME_HISTORY_MAX_LENGTH;
- if (gdk_frame_timings_get_complete (priv->timings[pos]))
+ if (priv->timings[pos]->complete)
return priv->timings[pos];
}
_gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
GdkFrameTimings *timings)
{
- gint64 frame_counter = gdk_frame_timings_get_frame_counter (timings);
- gint64 layout_start_time = _gdk_frame_timings_get_layout_start_time (timings);
- gint64 paint_start_time = _gdk_frame_timings_get_paint_start_time (timings);
- gint64 frame_end_time = _gdk_frame_timings_get_frame_end_time (timings);
- gint64 frame_time = gdk_frame_timings_get_frame_time (timings);
- gint64 presentation_time = gdk_frame_timings_get_presentation_time (timings);
- gint64 predicted_presentation_time = gdk_frame_timings_get_predicted_presentation_time (timings);
- gint64 refresh_interval = gdk_frame_timings_get_refresh_interval (timings);
gint64 previous_frame_time = 0;
- gboolean slept_before = gdk_frame_timings_get_slept_before (timings);
GdkFrameTimings *previous_timings = gdk_frame_clock_get_timings (clock,
- frame_counter - 1);
+ timings->frame_counter - 1);
if (previous_timings != NULL)
- previous_frame_time = gdk_frame_timings_get_frame_time (previous_timings);
+ previous_frame_time = previous_timings->frame_time;
- g_print ("%5" G_GINT64_FORMAT ":", frame_counter);
+ g_print ("%5" G_GINT64_FORMAT ":", timings->frame_counter);
if (previous_frame_time != 0)
{
- g_print (" interval=%-4.1f", (frame_time - previous_frame_time) / 1000.);
- g_print (slept_before ? " (sleep)" : " ");
+ g_print (" interval=%-4.1f", (timings->frame_time - previous_frame_time) / 1000.);
+ g_print (timings->slept_before ? " (sleep)" : " ");
}
- if (layout_start_time != 0)
- g_print (" layout_start=%-4.1f", (layout_start_time - frame_time) / 1000.);
- if (paint_start_time != 0)
- g_print (" paint_start=%-4.1f", (paint_start_time - frame_time) / 1000.);
- if (frame_end_time != 0)
- g_print (" frame_end=%-4.1f", (frame_end_time - frame_time) / 1000.);
- if (presentation_time != 0)
- g_print (" present=%-4.1f", (presentation_time - frame_time) / 1000.);
- if (predicted_presentation_time != 0)
- g_print (" predicted=%-4.1f", (predicted_presentation_time - frame_time) / 1000.);
- if (refresh_interval != 0)
- g_print (" refresh_interval=%-4.1f", refresh_interval / 1000.);
+ if (timings->layout_start_time != 0)
+ g_print (" layout_start=%-4.1f", (timings->layout_start_time - timings->frame_time) / 1000.);
+ if (timings->paint_start_time != 0)
+ g_print (" paint_start=%-4.1f", (timings->paint_start_time - timings->frame_time) / 1000.);
+ if (timings->frame_end_time != 0)
+ g_print (" frame_end=%-4.1f", (timings->frame_end_time - timings->frame_time) / 1000.);
+ if (timings->presentation_time != 0)
+ g_print (" present=%-4.1f", (timings->presentation_time - timings->frame_time) / 1000.);
+ if (timings->predicted_presentation_time != 0)
+ g_print (" predicted=%-4.1f", (timings->predicted_presentation_time - timings->frame_time) / 1000.);
+ if (timings->refresh_interval != 0)
+ g_print (" refresh_interval=%-4.1f", timings->refresh_interval / 1000.);
g_print ("\n");
}
#endif /* G_ENABLE_DEBUG */
if (timings == NULL)
return;
- refresh_interval = gdk_frame_timings_get_refresh_interval (timings);
- presentation_time = gdk_frame_timings_get_presentation_time (timings);
+ refresh_interval = timings->refresh_interval;
+ presentation_time = timings->presentation_time;
if (presentation_time != 0)
{
_gdk_frame_clock_begin_frame (clock);
timings = gdk_frame_clock_get_current_frame_timings (clock);
- gdk_frame_timings_set_frame_time (timings, priv->frame_time);
-
- gdk_frame_timings_set_slept_before (timings,
- priv->sleep_serial != get_sleep_serial ());
+ timings->frame_time = priv->frame_time;
+ timings->slept_before = priv->sleep_serial != get_sleep_serial ();
priv->phase = GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT;
{
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 ());
+ timings->layout_start_time = g_get_monotonic_time ();
}
#endif /* G_ENABLE_DEBUG */
{
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 ());
+ timings->paint_start_time = g_get_monotonic_time ();
}
#endif /* G_ENABLE_DEBUG */
#ifdef G_ENABLE_DEBUG
if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
- _gdk_frame_timings_set_frame_end_time (timings, g_get_monotonic_time ());
+ timings->frame_end_time = 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))
+ if (timings->complete)
_gdk_frame_clock_debug_print_timings (clock, timings);
}
#endif /* G_ENABLE_DEBUG */
/* void (* resume_events) (GdkFrameClock *clock); */
};
+struct _GdkFrameTimings
+{
+ guint ref_count;
+
+ gint64 frame_counter;
+ guint64 cookie;
+ gint64 frame_time;
+ gint64 drawn_time;
+ gint64 presentation_time;
+ gint64 refresh_interval;
+ gint64 predicted_presentation_time;
+
+#ifdef G_ENABLE_DEBUG
+ gint64 layout_start_time;
+ gint64 paint_start_time;
+ gint64 frame_end_time;
+#endif /* G_ENABLE_DEBUG */
+
+ guint complete : 1;
+ guint slept_before : 1;
+};
+
void _gdk_frame_clock_begin_frame (GdkFrameClock *clock);
void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
GdkFrameTimings *timings);
+GdkFrameTimings *_gdk_frame_timings_new (gint64 frame_counter);
+
G_END_DECLS
#endif /* __GDK_FRAME_CLOCK_PRIVATE_H__ */
#include "config.h"
-#include "gdkframetimings.h"
-
-struct _GdkFrameTimings
-{
- guint ref_count;
-
- gint64 frame_counter;
- guint64 cookie;
- gint64 frame_time;
- gint64 drawn_time;
- gint64 presentation_time;
- gint64 refresh_interval;
- gint64 predicted_presentation_time;
-
-#ifdef G_ENABLE_DEBUG
- gint64 layout_start_time;
- gint64 paint_start_time;
- gint64 frame_end_time;
-#endif /* G_ENABLE_DEBUG */
-
- guint complete : 1;
- guint slept_before : 1;
-};
+#include "gdkframeclockprivate.h"
G_DEFINE_BOXED_TYPE (GdkFrameTimings, gdk_frame_timings,
gdk_frame_timings_ref,
gdk_frame_timings_unref)
GdkFrameTimings *
-gdk_frame_timings_new (gint64 frame_counter)
+_gdk_frame_timings_new (gint64 frame_counter)
{
GdkFrameTimings *timings;
return timings->frame_counter;
}
-guint64
-gdk_frame_timings_get_cookie (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, 0);
-
- return timings->cookie;
-}
-
-void
-gdk_frame_timings_set_cookie (GdkFrameTimings *timings,
- guint64 cookie)
-{
- g_return_if_fail (timings != NULL);
-
- timings->cookie = cookie;
-}
-
gboolean
gdk_frame_timings_get_complete (GdkFrameTimings *timings)
{
return timings->complete;
}
-void
-gdk_frame_timings_set_complete (GdkFrameTimings *timings,
- gboolean complete)
-{
- g_return_if_fail (timings != NULL);
-
- timings->complete = complete;
-}
-
-gboolean
-gdk_frame_timings_get_slept_before (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, FALSE);
-
- return timings->slept_before;
-}
-
-void
-gdk_frame_timings_set_slept_before (GdkFrameTimings *timings,
- gboolean slept_before)
-{
- g_return_if_fail (timings != NULL);
-
- timings->slept_before = slept_before;
-}
-
gint64
gdk_frame_timings_get_frame_time (GdkFrameTimings *timings)
{
return timings->frame_time;
}
-void
-gdk_frame_timings_set_frame_time (GdkFrameTimings *timings,
- gint64 frame_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->frame_time = frame_time;
-}
-
-gint64
-gdk_frame_timings_get_drawn_time (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, 0);
-
- return timings->drawn_time;
-}
-
-void
-gdk_frame_timings_set_drawn_time (GdkFrameTimings *timings,
- gint64 drawn_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->drawn_time = drawn_time;
-}
-
gint64
gdk_frame_timings_get_presentation_time (GdkFrameTimings *timings)
{
return timings->presentation_time;
}
-void
-gdk_frame_timings_set_presentation_time (GdkFrameTimings *timings,
- gint64 presentation_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->presentation_time = presentation_time;
-}
-
gint64
gdk_frame_timings_get_predicted_presentation_time (GdkFrameTimings *timings)
{
return timings->predicted_presentation_time;
}
-void
-gdk_frame_timings_set_predicted_presentation_time (GdkFrameTimings *timings,
- gint64 predicted_presentation_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->predicted_presentation_time = predicted_presentation_time;
-}
-
gint64
gdk_frame_timings_get_refresh_interval (GdkFrameTimings *timings)
{
return timings->refresh_interval;
}
-
-void
-gdk_frame_timings_set_refresh_interval (GdkFrameTimings *timings,
- gint64 refresh_interval)
-{
- g_return_if_fail (timings != NULL);
-
- timings->refresh_interval = refresh_interval;
-}
-
-#ifdef G_ENABLE_DEBUG
-gint64
-_gdk_frame_timings_get_layout_start_time (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, 0);
-
- return timings->layout_start_time;
-}
-
-void
-_gdk_frame_timings_set_layout_start_time (GdkFrameTimings *timings,
- gint64 layout_start_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->layout_start_time = layout_start_time;
-}
-
-gint64
-_gdk_frame_timings_get_paint_start_time (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, 0);
-
- return timings->paint_start_time;
-}
-
-void
-_gdk_frame_timings_set_paint_start_time (GdkFrameTimings *timings,
- gint64 paint_start_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->paint_start_time = paint_start_time;
-}
-
-gint64
-_gdk_frame_timings_get_frame_end_time (GdkFrameTimings *timings)
-{
- g_return_val_if_fail (timings != NULL, 0);
-
- return timings->frame_end_time;
-}
-
-void
-_gdk_frame_timings_set_frame_end_time (GdkFrameTimings *timings,
- gint64 frame_end_time)
-{
- g_return_if_fail (timings != NULL);
-
- timings->frame_end_time = frame_end_time;
-}
-
-#endif /* G_ENABLE_DEBUG */
GType gdk_frame_timings_get_type (void) G_GNUC_CONST;
-GdkFrameTimings *gdk_frame_timings_new (gint64 frame_counter);
-
GdkFrameTimings *gdk_frame_timings_ref (GdkFrameTimings *timings);
void gdk_frame_timings_unref (GdkFrameTimings *timings);
gint64 gdk_frame_timings_get_frame_counter (GdkFrameTimings *timings);
-
-guint64 gdk_frame_timings_get_cookie (GdkFrameTimings *timings);
-void gdk_frame_timings_set_cookie (GdkFrameTimings *timings,
- guint64 cookie);
-
gboolean gdk_frame_timings_get_complete (GdkFrameTimings *timings);
-void gdk_frame_timings_set_complete (GdkFrameTimings *timings,
- gboolean complete);
-
-gboolean gdk_frame_timings_get_slept_before (GdkFrameTimings *timings);
-void gdk_frame_timings_set_slept_before (GdkFrameTimings *timings,
- gboolean slept_before);
-
gint64 gdk_frame_timings_get_frame_time (GdkFrameTimings *timings);
-void gdk_frame_timings_set_frame_time (GdkFrameTimings *timings,
- gint64 frame_time);
-gint64 gdk_frame_timings_get_drawn_time (GdkFrameTimings *timings);
-void gdk_frame_timings_set_drawn_time (GdkFrameTimings *timings,
- gint64 frame_time);
gint64 gdk_frame_timings_get_presentation_time (GdkFrameTimings *timings);
-void gdk_frame_timings_set_presentation_time (GdkFrameTimings *timings,
- gint64 presentation_time);
gint64 gdk_frame_timings_get_refresh_interval (GdkFrameTimings *timings);
-void gdk_frame_timings_set_refresh_interval (GdkFrameTimings *timings,
- gint64 refresh_interval);
gint64 gdk_frame_timings_get_predicted_presentation_time (GdkFrameTimings *timings);
-void gdk_frame_timings_set_predicted_presentation_time (GdkFrameTimings *timings,
- gint64 predicted_presentation_time);
G_END_DECLS
gint width,
gint height);
-/********************************
- * Debug-only frame statistics *
- ********************************/
-
-#ifdef G_ENABLE_DEBUG
-
-gint64 _gdk_frame_timings_get_layout_start_time (GdkFrameTimings *timings);
-void _gdk_frame_timings_set_layout_start_time (GdkFrameTimings *timings,
- gint64 layout_start_time);
-gint64 _gdk_frame_timings_get_paint_start_time (GdkFrameTimings *timings);
-void _gdk_frame_timings_set_paint_start_time (GdkFrameTimings *timings,
- gint64 paint_time);
-gint64 _gdk_frame_timings_get_frame_end_time (GdkFrameTimings *timings);
-void _gdk_frame_timings_set_frame_end_time (GdkFrameTimings *timings,
- gint64 frame_end_time);
-
-#endif /* G_ENABLE_DEBUG */
-
G_END_DECLS
#endif /* __GDK_INTERNALS_H__ */
{
GdkFrameTimings *timings = gdk_frame_clock_get_timings (clock, i);
- if (gdk_frame_timings_get_cookie (timings) == serial)
+ if (timings->cookie == serial)
return timings;
}
GdkFrameTimings *timings = find_frame_timings (clock, serial);
if (timings)
- gdk_frame_timings_set_drawn_time (timings, frame_drawn_time);
+ timings->drawn_time = frame_drawn_time;
if (window_impl->toplevel->frame_pending)
{
if (timings)
{
- gint64 drawn_time = gdk_frame_timings_get_drawn_time (timings);
gint32 presentation_time_offset = (gint32)d2;
gint32 refresh_interval = d3;
- if (drawn_time && presentation_time_offset)
- gdk_frame_timings_set_presentation_time (timings,
- drawn_time + presentation_time_offset);
+ if (timings->drawn_time && presentation_time_offset)
+ timings->presentation_time = timings->drawn_time + presentation_time_offset;
if (refresh_interval)
- gdk_frame_timings_set_refresh_interval (timings, refresh_interval);
+ timings->refresh_interval = refresh_interval;
- gdk_frame_timings_set_complete (timings, TRUE);
+ timings->complete = TRUE;
#ifdef G_ENABLE_DEBUG
if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
_gdk_frame_clock_debug_print_timings (clock, timings);
#include "gdkvisualprivate.h"
#include "gdkinternals.h"
#include "gdkdeviceprivate.h"
+#include "gdkframeclockprivate.h"
#include "gdkasync.h"
#include "gdkeventsource.h"
#include "gdkdisplay-x11.h"
GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window->impl);
GdkFrameClock *clock;
GdkFrameTimings *timings;
- gint64 frame_time;
gint64 presentation_time;
gint64 refresh_interval;
- gboolean slept_before;
if (!WINDOW_IS_TOPLEVEL (window))
return;
clock = gdk_window_get_frame_clock (window);
timings = gdk_frame_clock_get_current_frame_timings (clock);
- frame_time = gdk_frame_timings_get_frame_time (timings);
- slept_before = gdk_frame_timings_get_slept_before (timings);
gdk_frame_clock_get_refresh_info (clock,
- frame_time,
+ timings->frame_time,
&refresh_interval, &presentation_time);
if (presentation_time != 0)
{
- if (slept_before)
+ if (timings->slept_before)
{
presentation_time += refresh_interval;
}
else
{
- if (presentation_time < frame_time + refresh_interval / 2)
+ if (presentation_time < timings->frame_time + refresh_interval / 2)
presentation_time += refresh_interval;
}
}
else
{
- if (slept_before)
- presentation_time = frame_time + refresh_interval + refresh_interval / 2;
+ if (timings->slept_before)
+ presentation_time = timings->frame_time + refresh_interval + refresh_interval / 2;
else
- presentation_time = frame_time + refresh_interval;
+ presentation_time = timings->frame_time + refresh_interval;
}
if (presentation_time < impl->toplevel->throttled_presentation_time)
presentation_time = impl->toplevel->throttled_presentation_time;
- gdk_frame_timings_set_predicted_presentation_time (timings,
- presentation_time);
-
+ timings->predicted_presentation_time = presentation_time;
}
static void
* but rather at a particular time. This can trigger different handling from
* the compositor.
*/
- if (gdk_frame_timings_get_slept_before (timings))
+ if (timings->slept_before)
impl->toplevel->current_counter_value += 3;
else
impl->toplevel->current_counter_value += 1;
{
impl->toplevel->frame_pending = TRUE;
gdk_frame_clock_freeze (gdk_window_get_frame_clock (window));
- gdk_frame_timings_set_cookie (timings,
- impl->toplevel->current_counter_value);
+ timings->cookie = impl->toplevel->current_counter_value;
}
}
}
if (!impl->toplevel->frame_pending)
- gdk_frame_timings_set_complete (timings, TRUE);
+ timings->complete = TRUE;
}
/*****************************************************