diff options
author | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-20 00:13:44 +0000 |
---|---|---|
committer | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-20 00:13:44 +0000 |
commit | d6d4b39a3a74766c33912df5abbf4ef39dc22679 (patch) | |
tree | cdb5c7c3d34c933153bbc5a34fe69dded8e9be61 | |
parent | e509990dc10958ae9298f4a7fdcd8a6af1438d53 (diff) | |
download | chromium_src-d6d4b39a3a74766c33912df5abbf4ef39dc22679.zip chromium_src-d6d4b39a3a74766c33912df5abbf4ef39dc22679.tar.gz chromium_src-d6d4b39a3a74766c33912df5abbf4ef39dc22679.tar.bz2 |
Merge 277109 "cc: Don't swap throttle BeginMainFrame just after ..."
> cc: Don't swap throttle BeginMainFrame just after swapping
>
> This will better reflect behavior prior to the
> OutputSurface+Scheduler refactor and will
> prevent us from skipping BeginMainFrames that
> the scheduler only meant to defer.
>
> BUG=381346
>
> Review URL: https://codereview.chromium.org/325303002
TBR=brianderson@chromium.org
Review URL: https://codereview.chromium.org/341083009
git-svn-id: svn://svn.chromium.org/chrome/branches/1985/src@278545 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | cc/scheduler/scheduler_state_machine.cc | 7 | ||||
-rw-r--r-- | cc/scheduler/scheduler_state_machine_unittest.cc | 63 |
2 files changed, 65 insertions, 5 deletions
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 3ed18f6..9302a49 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -500,9 +500,12 @@ bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { if (!HasInitializedOutputSurface()) return false; - // SwapAck throttle the BeginMainFrames + // SwapAck throttle the BeginMainFrames unless we just swapped. // TODO(brianderson): Remove this restriction to improve throughput. - if (pending_swaps_ >= max_pending_swaps_) + bool just_swapped_in_deadline = + begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && + HasSwappedThisFrame(); + if (pending_swaps_ >= max_pending_swaps_ && !just_swapped_in_deadline) return false; if (skip_begin_main_frame_to_reduce_latency_) diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index 067f019..5ec43ad 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc @@ -2032,7 +2032,32 @@ TEST(SchedulerStateMachineTest, TestTriggerDeadlineEarlyAfterAbortedCommit) { EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); } -TEST(SchedulerStateMachineTest, TestTriggerDeadlineEarlyForSmoothness) { +void FinishPreviousCommitAndDrawWithoutExitingDeadline( + StateMachine* state_ptr) { + // Gross, but allows us to use macros below. + StateMachine& state = *state_ptr; + + state.NotifyBeginMainFrameStarted(); + state.NotifyReadyToCommit(); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + state.NotifyReadyToActivate(); + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + + state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + + EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); + state.OnBeginImplFrameDeadline(); + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); +} + +TEST(SchedulerStateMachineTest, TestSmoothnessTakesPriority) { SchedulerSettings settings; settings.impl_side_painting = true; StateMachine state(settings); @@ -2044,18 +2069,50 @@ TEST(SchedulerStateMachineTest, TestTriggerDeadlineEarlyForSmoothness) { // This test ensures that impl-draws are prioritized over main thread updates // in prefer smoothness mode. - state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); state.SetNeedsRedraw(true); state.SetNeedsCommit(); + state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); - // The deadline is not triggered early until we enter prefer smoothness mode. + // Verify the deadline is not triggered early until we enter + // prefer smoothness mode. EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); state.SetSmoothnessTakesPriority(true); EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); + + // Trigger the deadline. + state.OnBeginImplFrameDeadline(); + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + state.DidSwapBuffersComplete(); + + // Request a new commit and finish the previous one. + state.SetNeedsCommit(); + FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + state.DidSwapBuffersComplete(); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + + // Finish the previous commit and draw it. + FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + + // Verify we do not send another BeginMainFrame if was are swap throttled + // and did not just swap. + state.SetNeedsCommit(); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); + EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); + state.OnBeginImplFrameDeadline(); + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); } TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) { |