| 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 53a2e09686c701dd48cdaea8e74dba93c231e227..e3cedfd5cdd9ab4c842cc2aca341a673df094187 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -7,6 +7,10 @@
|
| #include "cc/scheduler/scheduler.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +#define EXPECT_ACTION_UPDATE_STATE(action) \
|
| + EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \
|
| + state.UpdateState(action);
|
| +
|
| namespace cc {
|
|
|
| namespace {
|
| @@ -41,8 +45,22 @@ class StateMachine : public SchedulerStateMachine {
|
| void SetNeedsRedraw(bool b) { needs_redraw_ = b; }
|
| bool NeedsRedraw() const { return needs_redraw_; }
|
|
|
| - void SetNeedsForcedRedraw(bool b) { needs_forced_redraw_ = b; }
|
| - bool NeedsForcedRedraw() const { return needs_forced_redraw_; }
|
| + void SetNeedsForcedRedrawForTimeout(bool b) {
|
| + forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
|
| + commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
|
| + }
|
| + bool NeedsForcedRedrawForTimeout() const {
|
| + return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
|
| + }
|
| +
|
| + void SetNeedsForcedRedrawForReadback() {
|
| + readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
|
| + commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
|
| + }
|
| +
|
| + bool NeedsForcedRedrawForReadback() const {
|
| + return readback_state_ != READBACK_STATE_IDLE;
|
| + }
|
|
|
| bool CanDraw() const { return can_draw_; }
|
| bool Visible() const { return visible_; }
|
| @@ -55,7 +73,8 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION)
|
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| state.SetNeedsRedraw(false);
|
| @@ -112,15 +131,6 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| }
|
| }
|
|
|
| -TEST(SchedulerStateMachineTest, TestSetForcedRedrawDoesNotSetsNormalRedraw) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| - state.SetCanDraw(true);
|
| - state.SetNeedsForcedRedraw();
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| -}
|
| -
|
| TEST(SchedulerStateMachineTest,
|
| TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) {
|
| SchedulerSettings default_scheduler_settings;
|
| @@ -136,8 +146,9 @@ TEST(SchedulerStateMachineTest,
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // We're drawing now.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| EXPECT_FALSE(state.RedrawPending());
|
| EXPECT_FALSE(state.CommitPending());
|
| @@ -168,8 +179,9 @@ TEST(SchedulerStateMachineTest,
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // We're drawing now.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| EXPECT_FALSE(state.RedrawPending());
|
| EXPECT_FALSE(state.CommitPending());
|
| @@ -208,11 +220,12 @@ TEST(SchedulerStateMachineTest,
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| state.DidDrawIfPossibleCompleted(false);
|
| EXPECT_TRUE(state.RedrawPending());
|
| @@ -226,73 +239,20 @@ TEST(SchedulerStateMachineTest,
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // And we should be allowed to draw again.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestCommitAfterFailedAndSuccessfulDrawDoesNotAllowDrawInSameFrame) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(true);
|
| -
|
| - // Start a commit.
|
| - state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
| - state.UpdateState(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Then initiate a draw.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -
|
| - // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - state.DidDrawIfPossibleCompleted(false);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - // But the commit is ongoing.
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Force a draw.
|
| - state.SetNeedsForcedRedraw(true);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| -
|
| - // Do the forced draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_FORCED);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - // And the commit is still ongoing.
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Finish the commit.
|
| - state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -
|
| - // And we should not be allowed to draw again in the same frame..
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| + SchedulerSettings scheduler_settings;
|
| + scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
|
| + StateMachine state(scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| - state.SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(1);
|
|
|
| // Start a commit.
|
| state.SetNeedsCommit();
|
| @@ -306,11 +266,12 @@ TEST(SchedulerStateMachineTest,
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| state.DidDrawIfPossibleCompleted(false);
|
| EXPECT_TRUE(state.RedrawPending());
|
| @@ -325,7 +286,8 @@ TEST(SchedulerStateMachineTest,
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // The redraw should be forced in this case.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED,
|
| + state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| @@ -342,11 +304,12 @@ TEST(SchedulerStateMachineTest,
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| state.DidDrawIfPossibleCompleted(false);
|
| EXPECT_TRUE(state.RedrawPending());
|
| @@ -360,7 +323,8 @@ TEST(SchedulerStateMachineTest,
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // We should try to draw again in the next begin frame on the impl thread.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| @@ -374,8 +338,9 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| // While still in the same begin frame for the impl thread, set needs redraw
|
| // again. This should not redraw.
|
| @@ -388,8 +353,9 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| }
|
| @@ -417,12 +383,12 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) {
|
| }
|
|
|
| // Case 1: needs_commit=false
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
|
|
| // Case 2: needs_commit=true
|
| state.SetNeedsCommit();
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
| }
|
| }
|
| @@ -432,38 +398,48 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) {
|
| // commit.
|
| for (size_t i = 0; i < num_commit_states; ++i) {
|
| for (size_t j = 0; j < 2; ++j) {
|
| + bool request_readback = j;
|
| +
|
| + // Skip invalid states
|
| + if (request_readback &&
|
| + (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW !=
|
| + all_commit_states[i]))
|
| + continue;
|
| +
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCanDraw(true);
|
| state.SetCommitState(all_commit_states[i]);
|
| - bool forced_draw = j;
|
| - if (!forced_draw) {
|
| + if (!request_readback) {
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| state.SetNeedsRedraw(true);
|
| state.SetVisible(true);
|
| } else {
|
| - state.SetNeedsForcedRedraw(true);
|
| + state.SetNeedsForcedRedrawForReadback();
|
| }
|
|
|
| SchedulerStateMachine::Action expected_action;
|
| if (all_commit_states[i] !=
|
| SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
|
| expected_action =
|
| - forced_draw ? SchedulerStateMachine::ACTION_DRAW_FORCED
|
| - : SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE;
|
| + request_readback
|
| + ? SchedulerStateMachine::ACTION_DRAW_AND_READBACK
|
| + : SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
|
| } else {
|
| expected_action = SchedulerStateMachine::ACTION_COMMIT;
|
| }
|
|
|
| // Case 1: needs_commit=false.
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback)
|
| + << *state.AsValue();
|
| EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue();
|
|
|
| // Case 2: needs_commit=true.
|
| state.SetNeedsCommit();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback)
|
| + << *state.AsValue();
|
| EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue();
|
| }
|
| }
|
| @@ -484,17 +460,16 @@ TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) {
|
| state.SetCommitState(all_commit_states[i]);
|
| state.SetVisible(false);
|
| state.SetNeedsRedraw(true);
|
| - state.SetNeedsForcedRedraw(false);
|
| if (j == 1)
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // Case 1: needs_commit=false.
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
|
|
| // Case 2: needs_commit=true.
|
| state.SetNeedsCommit();
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
| }
|
| }
|
| @@ -515,12 +490,11 @@ TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
|
| state.SetCommitState(all_commit_states[i]);
|
| state.SetVisible(false);
|
| state.SetNeedsRedraw(true);
|
| - state.SetNeedsForcedRedraw(false);
|
| if (j == 1)
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| state.SetCanDraw(false);
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
| }
|
| }
|
| @@ -533,17 +507,27 @@ TEST(SchedulerStateMachineTest,
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCommitState(
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
|
| +
|
| + state.SetVisible(true);
|
| + state.SetNeedsCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + state.FinishCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| + state.CommitState());
|
| +
|
| state.SetNeedsCommit();
|
| state.SetNeedsRedraw(true);
|
| state.SetVisible(true);
|
| state.SetCanDraw(false);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT)
|
| +
|
| + state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + state.DidLeaveBeginFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
|
| @@ -580,10 +564,11 @@ TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
|
|
|
| // Commit and make sure we draw on next BeginFrame
|
| state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
|
|
| // Verify that another commit will begin.
|
| @@ -631,8 +616,9 @@ TEST(SchedulerStateMachineTest, TestFullCycle) {
|
|
|
| // At BeginFrame, draw.
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| state.DidLeaveBeginFrame();
|
|
|
| @@ -685,8 +671,9 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
|
|
|
| // At BeginFrame, draw.
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| + state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| state.DidLeaveBeginFrame();
|
|
|
| @@ -791,7 +778,8 @@ TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) {
|
| // 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())
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction())
|
| << *state.AsValue();
|
| state.DidLeaveBeginFrame();
|
|
|
| @@ -900,7 +888,8 @@ TEST(SchedulerStateMachineTest,
|
| // Once the context is recreated, whether we draw should be based on
|
| // SetCanDraw.
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| state.SetCanDraw(false);
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
|
| state.NextAction());
|
| @@ -926,7 +915,8 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
| // Set damage and expect a draw.
|
| state.SetNeedsRedraw(true);
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| state.UpdateState(state.NextAction());
|
| state.DidLeaveBeginFrame();
|
|
|
| @@ -979,7 +969,8 @@ TEST(SchedulerStateMachineTest,
|
| // Set damage and expect a draw.
|
| state.SetNeedsRedraw(true);
|
| state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| state.UpdateState(state.NextAction());
|
| state.DidLeaveBeginFrame();
|
|
|
| @@ -1026,26 +1017,30 @@ TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) {
|
| // Cause a lost context lost.
|
| state.DidLoseOutputSurface();
|
|
|
| - // Ask a forced redraw and verify it ocurrs.
|
| - state.SetNeedsForcedRedraw(true);
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| + // Ask a forced redraw and verify it ocurrs, even with a lost context,
|
| + // independent of the BeginFrame stae.
|
| + state.SetNeedsForcedRedrawForReadback();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| +
|
| + // Forced redraws for readbacks need to be followed by a new commit
|
| + // to replace the readback commit.
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| + state.CommitState());
|
| + state.FinishCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - // Clear the forced redraw bit.
|
| - state.SetNeedsForcedRedraw(false);
|
| + // We don't yet have an output surface, so we the draw and swap should abort.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
|
|
| // Expect to be told to begin context recreation, independent of
|
| - // BeginFrame state
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + // BeginFrame state.
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
|
|
| - // Ask a forced redraw and verify it ocurrs.
|
| - state.SetNeedsForcedRedraw(true);
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| + // Ask a readback and verify it ocurrs.
|
| + state.SetNeedsForcedRedrawForReadback();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_READBACK,
|
| + state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
|
| @@ -1080,7 +1075,7 @@ TEST(SchedulerStateMachineTest,
|
| state.DidCreateAndInitializeOutputSurface();
|
| state.SetVisible(false);
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| }
|
| @@ -1092,7 +1087,7 @@ TEST(SchedulerStateMachineTest,
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| }
|
| @@ -1125,22 +1120,28 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(false);
|
| state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
|
|
| + // The commit for readback interupts the normal commit.
|
| state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
|
|
| - // If we are waiting for forced draw then we know a begin frame is already
|
| - // in flight for the main thread.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + // When the readback interrupts the normal commit, we should not get
|
| + // another BeginFrame on the impl thread when the readback completes.
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| + state.NextAction());
|
| +
|
| + // The normal commit can then proceed.
|
| + state.FinishCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) {
|
| @@ -1156,9 +1157,8 @@ TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) {
|
|
|
| // When we are visible, we normally want to begin output surface creation
|
| // as soon as possible.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction()) << *state.AsValue();
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
|
|
| state.DidCreateAndInitializeOutputSurface();
|
| EXPECT_EQ(state.output_surface_state(),
|
| @@ -1174,9 +1174,10 @@ TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) {
|
| // If there is a forced commit, however, we could be blocking a readback
|
| // on the main thread, so we need to unblock it before we can get our
|
| // output surface, even if we are not visible.
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction()) << *state.AsValue();
|
| + state.NextAction())
|
| + << *state.AsValue();
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) {
|
| @@ -1188,26 +1189,23 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) {
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| - // Schedule a forced frame, commit it, draw it.
|
| + // Schedule a readback, commit it, draw it.
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| - state.UpdateState(state.NextAction());
|
| + state.SetNeedsForcedCommitForReadback();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| state.FinishCommit();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
|
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - state.SetNeedsForcedRedraw(true);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Should be waiting for the normal begin frame from the main thread.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| @@ -1219,34 +1217,30 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Start a normal commit.
|
| state.SetNeedsCommit();
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
|
|
| - // Schedule a forced frame, commit it, draw it.
|
| + // Schedule a readback, commit it, draw it.
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| - state.UpdateState(state.NextAction());
|
| + state.SetNeedsForcedCommitForReadback();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
|
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - state.SetNeedsForcedRedraw(true);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Should be waiting for the normal begin frame from the main thread.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| @@ -1260,33 +1254,29 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| state.SetNeedsCommit();
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
|
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| - state.UpdateState(state.NextAction());
|
| + state.SetNeedsForcedCommitForReadback();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.FinishCommit();
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
|
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - state.SetNeedsForcedRedraw(true);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Should be waiting for the main thread's begin frame.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| @@ -1307,7 +1297,7 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(false);
|
|
|
| @@ -1315,25 +1305,20 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) {
|
| state.UpdateState(state.NextAction());
|
|
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| state.UpdateState(state.NextAction());
|
| state.FinishCommit();
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
|
| + EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
|
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - state.SetNeedsForcedRedraw(true);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, ReportIfNotDrawing) {
|
|
|