GdkFrameTimings: strip down to a minimal public API

Since we're not exporting the ability to create your own frame
clock for now, remove the setters for GdkFrameTimings fields.
Also remove all setters and getters for fields that are more
about implementation than about quantities that are meaningful
to the applcation and just access the fields directly within
GDK.
This commit is contained in:
Owen W. Taylor
2013-02-12 16:14:24 -05:00
parent 515e5f74aa
commit d5edf9c072
8 changed files with 70 additions and 280 deletions

View File

@@ -420,7 +420,7 @@ _gdk_frame_clock_begin_frame (GdkFrameClock *clock)
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 *
@@ -471,7 +471,7 @@ gdk_frame_clock_get_last_complete (GdkFrameClock *clock)
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];
}
@@ -483,40 +483,31 @@ void
_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 */
@@ -550,8 +541,8 @@ gdk_frame_clock_get_refresh_info (GdkFrameClock *clock,
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)
{

View File

@@ -304,10 +304,8 @@ gdk_frame_clock_paint_idle (void *data)
_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;
@@ -336,7 +334,7 @@ gdk_frame_clock_paint_idle (void *data)
{
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 */
@@ -355,7 +353,7 @@ gdk_frame_clock_paint_idle (void *data)
{
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 */
@@ -377,7 +375,7 @@ gdk_frame_clock_paint_idle (void *data)
#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:
@@ -388,7 +386,7 @@ gdk_frame_clock_paint_idle (void *data)
#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 */

View File

@@ -67,10 +67,34 @@ struct _GdkFrameClockClass
/* 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__ */

View File

@@ -17,36 +17,14 @@
#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;
@@ -86,23 +64,6 @@ gdk_frame_timings_get_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)
{
@@ -111,32 +72,6 @@ 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)
{
@@ -145,32 +80,6 @@ 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)
{
@@ -179,15 +88,6 @@ 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)
{
@@ -196,15 +96,6 @@ 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)
{
@@ -212,66 +103,3 @@ 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 */

View File

@@ -30,41 +30,16 @@ typedef struct _GdkFrameTimings GdkFrameTimings;
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

View File

@@ -429,24 +429,6 @@ cairo_surface_t * _gdk_offscreen_window_create_surface (GdkWindow *window,
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__ */

View File

@@ -1070,7 +1070,7 @@ find_frame_timings (GdkFrameClock *clock,
{
GdkFrameTimings *timings = gdk_frame_clock_get_timings (clock, i);
if (gdk_frame_timings_get_cookie (timings) == serial)
if (timings->cookie == serial)
return timings;
}
@@ -1116,7 +1116,7 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
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)
{
@@ -1153,18 +1153,16 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
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);

View File

@@ -32,6 +32,7 @@
#include "gdkvisualprivate.h"
#include "gdkinternals.h"
#include "gdkdeviceprivate.h"
#include "gdkframeclockprivate.h"
#include "gdkasync.h"
#include "gdkeventsource.h"
#include "gdkdisplay-x11.h"
@@ -282,10 +283,8 @@ gdk_x11_window_predict_presentation_time (GdkWindow *window)
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;
@@ -293,39 +292,35 @@ gdk_x11_window_predict_presentation_time (GdkWindow *window)
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
@@ -399,7 +394,7 @@ gdk_x11_window_end_frame (GdkWindow *window)
* 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;
@@ -413,8 +408,7 @@ gdk_x11_window_end_frame (GdkWindow *window)
{
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;
}
}
@@ -431,7 +425,7 @@ gdk_x11_window_end_frame (GdkWindow *window)
}
if (!impl->toplevel->frame_pending)
gdk_frame_timings_set_complete (timings, TRUE);
timings->complete = TRUE;
}
/*****************************************************