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. |