| 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 7036459794ffd34cc16364b34fba0d55cd65b478..c7210eb2a05a0f9ea9ed7edf90a8c4fdf693acd0 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -718,7 +718,7 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
|
|
| // Become invisible and abort the main thread's begin frame.
|
| state.SetVisible(false);
|
| - state.BeginFrameAbortedByMainThread();
|
| + state.BeginFrameAbortedByMainThread(false);
|
|
|
| // We should now be back in the idle state as if we didn't start a frame at
|
| // all.
|
| @@ -728,8 +728,14 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
| // Become visible again.
|
| state.SetVisible(true);
|
|
|
| - // We should be beginning a frame now.
|
| + // Although we have aborted on this frame and haven't cancelled the commit
|
| + // (i.e. need another), don't send another begin frame yet.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_TRUE(state.NeedsCommit());
|
| +
|
| + // Start a new frame.
|
| + state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
|
|
| @@ -741,6 +747,52 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
| state.CommitState());
|
| }
|
|
|
| +TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) {
|
| + SchedulerSettings default_scheduler_settings;
|
| + StateMachine state(default_scheduler_settings);
|
| + state.SetCanStart();
|
| + state.UpdateState(state.NextAction());
|
| + state.DidCreateAndInitializeOutputSurface();
|
| + state.SetVisible(true);
|
| + state.SetCanDraw(true);
|
| +
|
| + // Get into a begin frame / commit state.
|
| + state.SetNeedsCommit();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| + state.NextAction());
|
| + state.UpdateState(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| + state.CommitState());
|
| + EXPECT_FALSE(state.NeedsCommit());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| +
|
| + // Abort the commit, cancelling future commits.
|
| + state.BeginFrameAbortedByMainThread(true);
|
| +
|
| + // Verify that another commit doesn't start on the same frame.
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_FALSE(state.NeedsCommit());
|
| +
|
| + // Start a new frame; draw because this is the first frame since output
|
| + // surface init'd.
|
| + state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + state.DidLeaveBeginFrame();
|
| +
|
| + // Verify another commit doesn't start on another frame either.
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_FALSE(state.NeedsCommit());
|
| +
|
| + // Verify another commit can start if requested, though.
|
| + state.SetNeedsCommit();
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| + state.NextAction());
|
| +}
|
| +
|
| TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
|
| SchedulerSettings default_scheduler_settings;
|
| StateMachine state(default_scheduler_settings);
|
| @@ -816,15 +868,23 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Recreate the context
|
| state.DidCreateAndInitializeOutputSurface();
|
| + EXPECT_FALSE(state.RedrawPending());
|
|
|
| // When the context is recreated, we should begin a commit
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| state.UpdateState(state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| + state.CommitState());
|
| + state.FinishCommit();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| + state.UpdateState(state.NextAction());
|
| + // Finishing the first commit after initializing an output surface should
|
| + // automatically cause a redraw.
|
| + EXPECT_TRUE(state.RedrawPending());
|
|
|
| // Once the context is recreated, whether we draw should be based on
|
| // SetCanDraw.
|
| - state.SetNeedsRedraw(true);
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| state.SetCanDraw(false);
|
| @@ -1192,7 +1252,7 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Become invisible and abort the main thread's begin frame.
|
| state.SetVisible(false);
|
| - state.BeginFrameAbortedByMainThread();
|
| + state.BeginFrameAbortedByMainThread(false);
|
|
|
| // Should be back in the idle state, but needing a commit.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| @@ -1295,5 +1355,37 @@ TEST(SchedulerStateMachineTest, ReportIfNotDrawingFromAcquiredTextures) {
|
| EXPECT_FALSE(state.DrawSuspendedUntilCommit());
|
| }
|
|
|
| +TEST(SchedulerStateMachineTest, AcquireTexturesWithAbort) {
|
| + SchedulerSettings default_scheduler_settings;
|
| + SchedulerStateMachine state(default_scheduler_settings);
|
| + state.SetCanStart();
|
| + state.UpdateState(state.NextAction());
|
| + state.DidCreateAndInitializeOutputSurface();
|
| + state.SetCanDraw(true);
|
| + state.SetVisible(true);
|
| +
|
| + state.SetMainThreadNeedsLayerTextures();
|
| + EXPECT_EQ(
|
| + SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD,
|
| + state.NextAction());
|
| + state.UpdateState(state.NextAction());
|
| + EXPECT_TRUE(state.DrawSuspendedUntilCommit());
|
| +
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| +
|
| + state.SetNeedsCommit();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| + state.NextAction());
|
| + state.UpdateState(state.NextAction());
|
| + EXPECT_TRUE(state.DrawSuspendedUntilCommit());
|
| +
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| +
|
| + state.BeginFrameAbortedByMainThread(true);
|
| +
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_FALSE(state.DrawSuspendedUntilCommit());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|