summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2019-03-29 12:31:42 +0100
committerAlexander Larsson <alexl@redhat.com>2019-03-29 14:30:13 +0100
commit4e7eccbb49d541e807a721db5076323b20c56f89 (patch)
treef5a8cd0288025863d306d53bc62994372250542f
parent27e47d5df6c8859e4d806dab22b0705306efab54 (diff)
downloadgtk+-4e7eccbb49d541e807a721db5076323b20c56f89.tar.gz
broadway: Report some level of frame timings
This is not ideal because we report the time of a full roundtrip, rather than the presentation time, but its better than nothing, and i'm not sure how the browser time should be reconciled.
-rw-r--r--gdk/broadway/gdksurface-broadway.c46
-rw-r--r--gdk/broadway/gdksurface-broadway.h2
2 files changed, 48 insertions, 0 deletions
diff --git a/gdk/broadway/gdksurface-broadway.c b/gdk/broadway/gdksurface-broadway.c
index 580f1fecf3..732d2a7fd6 100644
--- a/gdk/broadway/gdksurface-broadway.c
+++ b/gdk/broadway/gdksurface-broadway.c
@@ -128,13 +128,32 @@ _gdk_broadway_roundtrip_notify (GdkSurface *surface,
guint32 tag,
gboolean local_reply)
{
+ GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GdkFrameClock *clock = gdk_surface_get_frame_clock (surface);
+ GdkFrameTimings *timings;
+
+ timings = gdk_frame_clock_get_timings (clock, impl->pending_frame_counter);
+ impl->pending_frame_counter = 0;
/* If there is no remove web client, rate limit update to once a second */
if (local_reply)
g_timeout_add_seconds (1, (GSourceFunc)thaw_clock_cb, g_object_ref (clock));
else
_gdk_frame_clock_thaw (clock);
+
+ if (timings)
+ {
+ timings->refresh_interval = 33333; /* default to 1/30th of a second */
+ // This isn't quite right, since we've done a rountrip back too, can we do better?
+ timings->presentation_time = g_get_monotonic_time ();
+ timings->complete = TRUE;
+
+
+#ifdef G_ENABLE_DEBUG
+ if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
+ _gdk_frame_clock_debug_print_timings (clock, timings);
+#endif
+ }
}
static void
@@ -145,6 +164,7 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GdkBroadwayDisplay *broadway_display;
+ impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
_gdk_frame_clock_freeze (gdk_surface_get_frame_clock (surface));
broadway_display = GDK_BROADWAY_DISPLAY (display);
@@ -155,12 +175,38 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
}
static void
+on_frame_clock_before_paint (GdkFrameClock *clock,
+ GdkSurface *surface)
+{
+ GdkFrameTimings *timings = gdk_frame_clock_get_current_timings (clock);
+ gint64 presentation_time;
+ gint64 refresh_interval;
+
+ if (surface->update_freeze_count > 0)
+ return;
+
+ gdk_frame_clock_get_refresh_info (clock,
+ timings->frame_time,
+ &refresh_interval, &presentation_time);
+ if (presentation_time != 0)
+ {
+ timings->predicted_presentation_time = presentation_time + refresh_interval;
+ }
+ else
+ {
+ timings->predicted_presentation_time = timings->frame_time + refresh_interval / 2 + refresh_interval;
+ }
+}
+
+static void
connect_frame_clock (GdkSurface *surface)
{
if (SURFACE_IS_TOPLEVEL (surface))
{
GdkFrameClock *frame_clock = gdk_surface_get_frame_clock (surface);
+ g_signal_connect (frame_clock, "before-paint",
+ G_CALLBACK (on_frame_clock_before_paint), surface);
g_signal_connect (frame_clock, "after-paint",
G_CALLBACK (on_frame_clock_after_paint), surface);
}
diff --git a/gdk/broadway/gdksurface-broadway.h b/gdk/broadway/gdksurface-broadway.h
index a89042e17a..9be2da92df 100644
--- a/gdk/broadway/gdksurface-broadway.h
+++ b/gdk/broadway/gdksurface-broadway.h
@@ -61,6 +61,8 @@ struct _GdkSurfaceImplBroadway
int pre_maximize_width;
int pre_maximize_height;
+ gint64 pending_frame_counter;
+
gboolean dirty;
gboolean last_synced;