| Index: cc/scheduler/scheduler_state_machine_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| index 82ad14f845f45fb2e43774219ff7e0234eb0c229..f6f71171855a095069d66921145195633e989f2f 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -41,6 +41,7 @@
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \
|
| } \
|
| state.WillAction(action); \
|
| + state.DidAction(action); \
|
| if (action == SchedulerStateMachine::ACTION_NONE) { \
|
| if (state.begin_impl_frame_state() == \
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \
|
| @@ -353,101 +354,123 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| - TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) {
|
| + FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) {
|
| SchedulerSettings default_scheduler_settings;
|
| StateMachine state(default_scheduler_settings);
|
| SET_UP_STATE(state)
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.RedrawPending());
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| +
|
| + // Start a frame.
|
| state.OnBeginImplFrame();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.CommitPending());
|
|
|
| - // We're drawing now.
|
| + // Failing a draw triggers request for a new BeginMainFrame.
|
| + state.OnBeginImplFrameDeadline();
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // Failing the draw makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| + // It's okay to attempt more draws just in case additional raster
|
| + // finishes and the requested commit wasn't actually necessary.
|
| EXPECT_TRUE(state.CommitPending());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| state.OnBeginImplFrame();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // Missing high res content requires a commit (but not a redraw)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_TRUE(state.CommitPending());
|
| }
|
|
|
| -TEST(SchedulerStateMachineTest,
|
| - TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
|
| +TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
|
| SchedulerSettings default_scheduler_settings;
|
| StateMachine state(default_scheduler_settings);
|
| SET_UP_STATE(state)
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.RedrawPending());
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| +
|
| + // Start a frame.
|
| state.OnBeginImplFrame();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.CommitPending());
|
|
|
| - // We're drawing now.
|
| + // Failing a draw triggers because of high res tiles missing
|
| + // request for a new BeginMainFrame.
|
| + state.OnBeginImplFrameDeadline();
|
| + state.SetDrawResult(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // It doesn't request a draw until we get a new commit though.
|
| + EXPECT_TRUE(state.CommitPending());
|
| EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| + state.OnBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - // While still in the same BeginMainFrame callback on the main thread,
|
| - // set needs redraw again. This should not redraw.
|
| - state.SetNeedsRedraw(true);
|
| + // Finish the commit and activation.
|
| + 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_SYNC_TREE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_TRUE(state.RedrawPending());
|
|
|
| - // Failing the draw for animation checkerboards makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| + // Verify we draw with the new frame.
|
| state.OnBeginImplFrame();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + state.DidSwapBuffers();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| @@ -466,19 +489,16 @@ TEST(SchedulerStateMachineTest,
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_TRUE(state.CommitPending());
|
|
|
| - // Then initiate a draw.
|
| + // Then initiate a draw that fails.
|
| state.SetNeedsRedraw(true);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -
|
| - // Fail the draw.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| EXPECT_TRUE(state.RedrawPending());
|
| - // But the commit is ongoing.
|
| EXPECT_TRUE(state.CommitPending());
|
|
|
| // Finish the commit. Note, we should not yet be forcing a draw, but should
|
| @@ -510,7 +530,7 @@ TEST(SchedulerStateMachineTest,
|
|
|
| TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
|
| SchedulerSettings scheduler_settings;
|
| - int draw_limit = 1;
|
| + int draw_limit = 2;
|
| scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced =
|
| draw_limit;
|
| StateMachine state(scheduler_settings);
|
| @@ -532,11 +552,23 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| - // Fail the draw enough times to force a redraw,
|
| - // then once more for good measure.
|
| - for (int i = 0; i < draw_limit + 1; ++i)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + // Fail the draw enough times to force a redraw.
|
| + for (int i = 0; i < draw_limit; ++i) {
|
| + state.SetNeedsRedraw(true);
|
| + state.OnBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + }
|
| +
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| EXPECT_TRUE(state.RedrawPending());
|
| // But the commit is ongoing.
|
| @@ -557,8 +589,21 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
|
|
|
| // After failing additional draws, we should still be in a forced
|
| // redraw, but not back in WAITING_FOR_COMMIT.
|
| - for (int i = 0; i < draw_limit + 1; ++i)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| + for (int i = 0; i < draw_limit; ++i) {
|
| + state.SetNeedsRedraw(true);
|
| + state.OnBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadlinePending();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameIdle();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + }
|
| EXPECT_TRUE(state.RedrawPending());
|
| EXPECT_TRUE(state.ForcedRedrawState() ==
|
| SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
|
| @@ -577,11 +622,11 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_TRUE(state.RedrawPending());
|
| + state.SetDrawResult(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| // Failing the draw for animation checkerboards makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -619,7 +664,6 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| @@ -639,7 +683,6 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| @@ -871,7 +914,6 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
| @@ -916,7 +958,6 @@ TEST(SchedulerStateMachineTest, TestFullCycle) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
|
|
| // Should be synchronized, no draw needed, no action needed.
|
| @@ -1055,7 +1096,6 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
|
|
| // Now will be able to start main frame.
|
| @@ -1107,7 +1147,6 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| state.DidSwapBuffersComplete();
|
|
|
| // Should be synchronized, no draw needed, no action needed.
|
|
|