| 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 5a6027683539049090159f49ed76f401df814f06..1f377b5a1ca182404c3ca15aa90f604b024b96aa 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -1150,7 +1150,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
|
|
|
| // Get into a begin frame / commit state.
|
| state.SetNeedsCommit();
|
| -
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| EXPECT_COMMIT_STATE(
|
| @@ -1164,12 +1164,8 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
|
|
|
| // NeedsCommit should now be false because the commit was actually handled.
|
| EXPECT_FALSE(state.NeedsCommit());
|
| - // Verify that another commit doesn't start on the same frame.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Even though the commit was aborted, we still expect to draw the new frame.
|
| - state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| @@ -1177,15 +1173,21 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
|
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidSwapBuffers();
|
| state.DidSwapBuffersComplete();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Verify another commit doesn't start on another frame either.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_FALSE(state.NeedsCommit());
|
| + EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| +
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Verify another commit can start if requested, though.
|
| state.SetNeedsCommit();
|
| EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| }
|
|
|
| @@ -1246,6 +1248,8 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
|
| TEST(SchedulerStateMachineTest,
|
| TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
|
| SchedulerSettings default_scheduler_settings;
|
| + // We use impl side painting because it's the more complicated version.
|
| + default_scheduler_settings.impl_side_painting = true;
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| @@ -1256,6 +1260,8 @@ TEST(SchedulerStateMachineTest,
|
| EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| state.DidLoseOutputSurface();
|
| + EXPECT_EQ(state.output_surface_state(),
|
| + SchedulerStateMachine::OUTPUT_SURFACE_LOST);
|
|
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| @@ -1276,31 +1282,94 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Recreate the context
|
| state.DidCreateAndInitializeOutputSurface();
|
| + EXPECT_EQ(state.output_surface_state(),
|
| + SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT);
|
| EXPECT_FALSE(state.RedrawPending());
|
|
|
| - // When the context is recreated, we should begin a commit
|
| + // When the context is recreated, we wait until the next BeginImplFrame
|
| + // before starting.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // When the BeginFrame comes in we should begin a commit
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_COMMIT_STATE(
|
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
|
|
| + // Until that commit finishes, we shouldn't be drawing or animate.
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // Finish the commit, which should make the surface active.
|
| state.NotifyBeginMainFrameStarted();
|
| state.NotifyReadyToCommit();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_EQ(state.output_surface_state(),
|
| + SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION);
|
| + state.NotifyReadyToActivate();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_EQ(state.output_surface_state(),
|
| + SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE);
|
| +
|
| // Finishing the first commit after initializing an output surface should
|
| // automatically cause a redraw.
|
| EXPECT_TRUE(state.RedrawPending());
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.RedrawPending());
|
| +
|
| + // Next frame as no work to do.
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Once the context is recreated, whether we draw should be based on
|
| - // SetCanDraw.
|
| + // SetCanDraw if waiting on first draw after activate.
|
| + state.SetNeedsRedraw(true);
|
| state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.SetCanDraw(false);
|
| + EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| + state.SetCanDraw(true);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // Once the context is recreated, whether we draw should be based on
|
| + // SetCanDraw if waiting on first draw after activate.
|
| + state.SetNeedsRedraw(true);
|
| + state.SetNeedsCommit();
|
| + state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + // Activate so we need the first draw
|
| + state.NotifyBeginMainFrameStarted();
|
| + state.NotifyReadyToCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + state.NotifyReadyToActivate();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| + EXPECT_TRUE(state.needs_redraw());
|
| +
|
| + state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| + EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + state.SetCanDraw(false);
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| state.SetCanDraw(true);
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|