| Index: cc/scheduler/scheduler_state_machine.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
|
| index 6a412dcaca2d0412321360a18c833aa7e653195f..2b8210d2d2f85de8dbb86a381abff5f6f8266be0 100644
|
| --- a/cc/scheduler/scheduler_state_machine.cc
|
| +++ b/cc/scheduler/scheduler_state_machine.cc
|
| @@ -43,6 +43,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
|
| has_pending_tree_(false),
|
| pending_tree_is_ready_for_activation_(false),
|
| active_tree_needs_first_draw_(false),
|
| + did_commit_after_animating_(false),
|
| did_create_and_initialize_first_output_surface_(false),
|
| impl_latency_takes_priority_(false),
|
| skip_next_begin_main_frame_to_reduce_latency_(false),
|
| @@ -226,6 +227,7 @@ void SchedulerStateMachine::AsValueInto(base::debug::TracedValue* state,
|
| pending_tree_is_ready_for_activation_);
|
| state->SetBoolean("active_tree_needs_first_draw",
|
| active_tree_needs_first_draw_);
|
| + state->SetBoolean("did_commit_after_animating", did_commit_after_animating_);
|
| state->SetBoolean("did_create_and_initialize_first_output_surface",
|
| did_create_and_initialize_first_output_surface_);
|
| state->SetBoolean("impl_latency_takes_priority",
|
| @@ -254,6 +256,10 @@ void SchedulerStateMachine::AdvanceCurrentFrameNumber() {
|
| skip_next_begin_main_frame_to_reduce_latency_ = false;
|
| }
|
|
|
| +bool SchedulerStateMachine::HasAnimatedThisFrame() const {
|
| + return last_frame_number_animate_performed_ == current_frame_number_;
|
| +}
|
| +
|
| bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const {
|
| return current_frame_number_ ==
|
| last_frame_number_begin_main_frame_sent_;
|
| @@ -344,6 +350,11 @@ bool SchedulerStateMachine::ShouldDraw() const {
|
| if (PendingDrawsShouldBeAborted())
|
| return active_tree_needs_first_draw_;
|
|
|
| + // If a commit has occurred after the animate call, we need to call animate
|
| + // again before we should draw.
|
| + if (did_commit_after_animating_)
|
| + return false;
|
| +
|
| // After this line, we only want to send a swap request once per frame.
|
| if (HasRequestedSwapThisFrame())
|
| return false;
|
| @@ -415,7 +426,8 @@ bool SchedulerStateMachine::ShouldAnimate() const {
|
| if (!can_draw_)
|
| return false;
|
|
|
| - if (last_frame_number_animate_performed_ == current_frame_number_)
|
| + // If a commit occurred after our last call, we need to do animation again.
|
| + if (HasAnimatedThisFrame() && !did_commit_after_animating_)
|
| return false;
|
|
|
| if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING &&
|
| @@ -567,6 +579,7 @@ void SchedulerStateMachine::UpdateState(Action action) {
|
| case ACTION_ANIMATE:
|
| last_frame_number_animate_performed_ = current_frame_number_;
|
| needs_animate_ = false;
|
| + did_commit_after_animating_ = false;
|
| // TODO(skyostil): Instead of assuming this, require the client to tell
|
| // us.
|
| SetNeedsRedraw();
|
| @@ -622,6 +635,9 @@ void SchedulerStateMachine::UpdateState(Action action) {
|
| void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) {
|
| commit_count_++;
|
|
|
| + if (!commit_was_aborted && HasAnimatedThisFrame())
|
| + did_commit_after_animating_ = true;
|
| +
|
| if (commit_was_aborted || settings_.main_frame_before_activation_enabled) {
|
| commit_state_ = COMMIT_STATE_IDLE;
|
| } else {
|
|
|