diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c index 1fea057bd2f02437a18f990d596857687603ac8a..71f2ec896edd79510cc994b8b292bc4f923b57e4 100644 --- a/clutter/clutter/clutter-frame-clock.c +++ b/clutter/clutter/clutter-frame-clock.c @@ -55,7 +55,6 @@ typedef enum _ClutterFrameClockState CLUTTER_FRAME_CLOCK_STATE_IDLE, CLUTTER_FRAME_CLOCK_STATE_SCHEDULED, CLUTTER_FRAME_CLOCK_STATE_DISPATCHING, - CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED, } ClutterFrameClockState; struct _ClutterFrameClock @@ -78,6 +77,8 @@ struct _ClutterFrameClock gboolean pending_reschedule; gboolean pending_reschedule_now; + gboolean pending_presented; + int inhibit_count; GList *timelines; @@ -197,15 +198,17 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, frame_clock->last_presentation_time_us = g_get_monotonic_time (); } + frame_clock->pending_presented = FALSE; + switch (frame_clock->state) { case CLUTTER_FRAME_CLOCK_STATE_INIT: + g_warn_if_reached (); + break; case CLUTTER_FRAME_CLOCK_STATE_IDLE: case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: - g_warn_if_reached (); break; case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: - case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; maybe_reschedule_update (frame_clock); break; @@ -293,7 +296,6 @@ clutter_frame_clock_inhibit (ClutterFrameClock *frame_clock) frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; break; case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: - case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: break; } @@ -333,7 +335,6 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: return; case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: - case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: frame_clock->pending_reschedule = TRUE; frame_clock->pending_reschedule_now = TRUE; return; @@ -371,7 +372,6 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: return; case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: - case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: frame_clock->pending_reschedule = TRUE; return; } @@ -397,30 +397,37 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, frame_count = frame_clock->frame_count++; - COGL_TRACE_BEGIN (ClutterFrameClockEvents, "Frame Clock (before frame)"); - if (frame_clock->listener.iface->before_frame) + COGL_TRACE_BEGIN (ClutterFrameClockUpdate, "Frame Clock (update)"); + if (frame_clock->listener.iface->update) { - frame_clock->listener.iface->before_frame (frame_clock, - frame_count, - frame_clock->listener.user_data); + frame_clock->listener.iface->update (frame_clock, + frame_count, + frame_clock->listener.user_data); } - COGL_TRACE_END (ClutterFrameClockEvents); + COGL_TRACE_END (ClutterFrameClockUpdate); - COGL_TRACE_BEGIN (ClutterFrameClockTimelines, "Frame Clock (timelines)"); - advance_timelines (frame_clock, time_us); - COGL_TRACE_END (ClutterFrameClockTimelines); + if (!frame_clock->pending_presented) + { + COGL_TRACE_BEGIN (ClutterFrameClockTimelines, "Frame Clock (timelines)"); + advance_timelines (frame_clock, time_us); + COGL_TRACE_END (ClutterFrameClockTimelines); - COGL_TRACE_BEGIN (ClutterFrameClockFrame, "Frame Clock (frame)"); - result = frame_clock->listener.iface->frame (frame_clock, - frame_count, - time_us, - frame_clock->listener.user_data); - COGL_TRACE_END (ClutterFrameClockFrame); + COGL_TRACE_BEGIN (ClutterFrameClockFrame, "Frame Clock (frame)"); + result = frame_clock->listener.iface->frame (frame_clock, + frame_count, + time_us, + frame_clock->listener.user_data); + COGL_TRACE_END (ClutterFrameClockFrame); + } + else + { + result = CLUTTER_FRAME_RESULT_IDLE; + frame_clock->pending_reschedule = TRUE; + } switch (frame_clock->state) { case CLUTTER_FRAME_CLOCK_STATE_INIT: - case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: g_warn_if_reached (); break; case CLUTTER_FRAME_CLOCK_STATE_IDLE: @@ -430,13 +437,14 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, switch (result) { case CLUTTER_FRAME_RESULT_PENDING_PRESENTED: - frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED; + frame_clock->pending_presented = TRUE; break; case CLUTTER_FRAME_RESULT_IDLE: - frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; - maybe_reschedule_update (frame_clock); break; } + + frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; + maybe_reschedule_update (frame_clock); break; } } diff --git a/clutter/clutter/clutter-frame-clock.h b/clutter/clutter/clutter-frame-clock.h index 3c9ab7b5ad2ce7d77d248dbbb796eec0dc7df9c0..894d218298e62efcc4e4128016cac1d9ff6d55f9 100644 --- a/clutter/clutter/clutter-frame-clock.h +++ b/clutter/clutter/clutter-frame-clock.h @@ -42,9 +42,9 @@ G_DECLARE_FINAL_TYPE (ClutterFrameClock, clutter_frame_clock, typedef struct _ClutterFrameListenerIface { - void (* before_frame) (ClutterFrameClock *frame_clock, - int64_t frame_count, - gpointer user_data); + void (* update) (ClutterFrameClock *frame_clock, + int64_t frame_count, + gpointer user_data); ClutterFrameResult (* frame) (ClutterFrameClock *frame_clock, int64_t frame_count, int64_t time_us, diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index 00a4d5ad1461c1fdc0cc819c72257b4f9a07eaad..17bd61846fc6924c822a7b594d420528bd3cf462 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -1052,9 +1052,9 @@ clutter_stage_view_get_frame_clock (ClutterStageView *view) } static void -handle_frame_clock_before_frame (ClutterFrameClock *frame_clock, - int64_t frame_count, - gpointer user_data) +handle_frame_clock_update (ClutterFrameClock *frame_clock, + int64_t frame_count, + gpointer user_data) { ClutterStageView *view = user_data; ClutterStageViewPrivate *priv = @@ -1123,7 +1123,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock, } static const ClutterFrameListenerIface frame_clock_listener_iface = { - .before_frame = handle_frame_clock_before_frame, + .update = handle_frame_clock_update, .frame = handle_frame_clock_frame, }; diff --git a/src/tests/clutter/conform/frame-clock.c b/src/tests/clutter/conform/frame-clock.c index 62a4176722b19add8900ea94bd63253f826f562f..655ba1a8c52a4149616129a766a8ea3bb6770dfc 100644 --- a/src/tests/clutter/conform/frame-clock.c +++ b/src/tests/clutter/conform/frame-clock.c @@ -478,9 +478,9 @@ frame_clock_schedule_update_now (void) } static void -before_frame_frame_clock_before_frame (ClutterFrameClock *frame_clock, - int64_t frame_count, - gpointer user_data) +update_frame_clock_update (ClutterFrameClock *frame_clock, + int64_t frame_count, + gpointer user_data) { int64_t *expected_frame_count = user_data; @@ -488,10 +488,10 @@ before_frame_frame_clock_before_frame (ClutterFrameClock *frame_clock, } static ClutterFrameResult -before_frame_frame_clock_frame (ClutterFrameClock *frame_clock, - int64_t frame_count, - int64_t time_us, - gpointer user_data) +update_frame_clock_frame (ClutterFrameClock *frame_clock, + int64_t frame_count, + int64_t time_us, + gpointer user_data) { int64_t *expected_frame_count = user_data; ClutterFrameInfo frame_info; @@ -507,9 +507,9 @@ before_frame_frame_clock_frame (ClutterFrameClock *frame_clock, return CLUTTER_FRAME_RESULT_PENDING_PRESENTED; } -static const ClutterFrameListenerIface before_frame_frame_listener_iface = { - .before_frame = before_frame_frame_clock_before_frame, - .frame = before_frame_frame_clock_frame, +static const ClutterFrameListenerIface update_frame_listener_iface = { + .update = update_frame_clock_update, + .frame = update_frame_clock_frame, }; static gboolean @@ -523,7 +523,7 @@ quit_main_loop_timeout (gpointer user_data) } static void -frame_clock_before_frame (void) +frame_clock_update (void) { GMainLoop *main_loop; ClutterFrameClock *frame_clock; @@ -532,7 +532,7 @@ frame_clock_before_frame (void) main_loop = g_main_loop_new (NULL, FALSE); frame_clock = clutter_frame_clock_new (refresh_rate, - &before_frame_frame_listener_iface, + &update_frame_listener_iface, &expected_frame_count); clutter_frame_clock_schedule_update (frame_clock); @@ -753,7 +753,7 @@ CLUTTER_TEST_SUITE ( CLUTTER_TEST_UNIT ("/frame-clock/delayed-damage", frame_clock_delayed_damage) CLUTTER_TEST_UNIT ("/frame-clock/no-damage", frame_clock_no_damage) CLUTTER_TEST_UNIT ("/frame-clock/schedule-update-now", frame_clock_schedule_update_now) - CLUTTER_TEST_UNIT ("/frame-clock/before-frame", frame_clock_before_frame) + CLUTTER_TEST_UNIT ("/frame-clock/update", frame_clock_update) CLUTTER_TEST_UNIT ("/frame-clock/inhibit", frame_clock_inhibit) CLUTTER_TEST_UNIT ("/frame-clock/reschedule-on-idle", frame_clock_reschedule_on_idle) CLUTTER_TEST_UNIT ("/frame-clock/destroy-signal", frame_clock_destroy_signal)