| 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 c7210eb2a05a0f9ea9ed7edf90a8c4fdf693acd0..7d6d9541750733d4648197d51c70b806b1358dd7 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -7,32 +7,79 @@
|
| #include "cc/scheduler/scheduler.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +#define EXPECT_ACTION_UPDATE_STATE(action) \
|
| + EXPECT_EQ(action, state.NextAction()) << state.ToString(); \
|
| + if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
|
| + action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \
|
| + if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW == \
|
| + state.CommitState() && \
|
| + SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE != \
|
| + state.output_surface_state()) \
|
| + return; \
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, \
|
| + state.begin_frame_state()) \
|
| + << state.ToString(); \
|
| + } \
|
| + state.UpdateState(action); \
|
| + if (action == SchedulerStateMachine::ACTION_NONE) { \
|
| + state.AdvanceBeginFrameStateWhenNoActionsRemain(); \
|
| + }
|
| +
|
| namespace cc {
|
|
|
| namespace {
|
|
|
| +const SchedulerStateMachine::BeginFrameState all_begin_frame_states[] = {
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, };
|
| +
|
| const SchedulerStateMachine::CommitState all_commit_states[] = {
|
| - SchedulerStateMachine::COMMIT_STATE_IDLE,
|
| - SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| - SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW
|
| -};
|
| + SchedulerStateMachine::COMMIT_STATE_IDLE,
|
| + SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| + SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| + SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
|
| + SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, };
|
|
|
| // Exposes the protected state fields of the SchedulerStateMachine for testing
|
| class StateMachine : public SchedulerStateMachine {
|
| public:
|
| explicit StateMachine(const SchedulerSettings& scheduler_settings)
|
| : SchedulerStateMachine(scheduler_settings) {}
|
| +
|
| + void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
|
| + DidCreateAndInitializeOutputSurface();
|
| + output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
|
| + }
|
| +
|
| void SetCommitState(CommitState cs) { commit_state_ = cs; }
|
| CommitState CommitState() const { return commit_state_; }
|
|
|
| + void SetBeginFrameState(BeginFrameState bfs) { begin_frame_state_ = bfs; }
|
| + BeginFrameState begin_frame_state() const { return begin_frame_state_; }
|
| +
|
| + OutputSurfaceState output_surface_state() { return output_surface_state_; }
|
| +
|
| bool NeedsCommit() const { return needs_commit_; }
|
|
|
| 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;
|
| + }
|
| + bool NeedsForcedRedrawForTimeout() const {
|
| + return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
|
| + }
|
| +
|
| + void SetNeedsForcedRedrawForReadback() {
|
| + readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
|
| + }
|
| +
|
| + bool NeedsForcedRedrawForReadback() const {
|
| + return readback_state_ != READBACK_STATE_IDLE;
|
| + }
|
|
|
| bool CanDraw() const { return can_draw_; }
|
| bool Visible() const { return visible_; }
|
| @@ -46,18 +93,19 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| state.SetNeedsRedraw(false);
|
| state.SetVisible(true);
|
|
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
|
|
| - state.DidLeaveBeginFrame();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| +
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| }
|
|
|
| // If commit requested but can_start is still false, do nothing.
|
| @@ -67,13 +115,13 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| state.SetNeedsRedraw(false);
|
| state.SetVisible(true);
|
|
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
|
|
| - state.DidLeaveBeginFrame();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| }
|
|
|
| // If commit requested, begin a main frame.
|
| @@ -83,7 +131,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| state.SetCanStart();
|
| state.SetNeedsRedraw(false);
|
| state.SetVisible(true);
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
| }
|
|
|
| // Begin the frame, make sure needs_commit and commit_state update correctly.
|
| @@ -91,7 +139,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.UpdateState(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| @@ -104,39 +152,41 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
|
|
| TEST(SchedulerStateMachineTest, TestSetForcedRedrawDoesNotSetsNormalRedraw) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanDraw(true);
|
| - state.SetNeedsForcedRedraw();
|
| + state.SetNeedsForcedRedrawForReadback();
|
| EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| - state.SetNeedsRedraw();
|
| + state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
|
|
| // We're drawing now.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + 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(false);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| EXPECT_TRUE(state.RedrawPending());
|
| EXPECT_TRUE(state.CommitPending());
|
| @@ -145,164 +195,70 @@ TEST(SchedulerStateMachineTest,
|
| TEST(SchedulerStateMachineTest,
|
| TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
|
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| - state.SetNeedsRedraw();
|
| + state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
|
|
| // We're drawing now.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_FALSE(state.RedrawPending());
|
| EXPECT_FALSE(state.CommitPending());
|
|
|
| // While still in the same begin frame callback on the main thread,
|
| // set needs redraw again. This should not redraw.
|
| - state.SetNeedsRedraw();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + state.SetNeedsRedraw(true);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Failing the draw makes us require a commit.
|
| state.DidDrawIfPossibleCompleted(false);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestCommitAfterFailedDrawAllowsDrawInSameFrame) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(true);
|
| -
|
| - // Start a commit.
|
| - 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_TRUE(state.CommitPending());
|
| -
|
| - // Then initiate a draw.
|
| - state.SetNeedsRedraw();
|
| - 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());
|
| -
|
| - // Finish the commit.
|
| - state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| - 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;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(true);
|
| -
|
| - // Start a commit.
|
| - state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Then initiate a draw.
|
| - state.SetNeedsRedraw();
|
| - 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();
|
| - 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;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| state.SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(1);
|
|
|
| // Start a commit.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_TRUE(state.CommitPending());
|
|
|
| // Then initiate a draw.
|
| - state.SetNeedsRedraw();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - EXPECT_TRUE(state.RedrawPending());
|
| + state.SetNeedsRedraw(true);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| state.DidDrawIfPossibleCompleted(false);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| EXPECT_TRUE(state.RedrawPending());
|
| // But the commit is ongoing.
|
| EXPECT_TRUE(state.CommitPending());
|
| @@ -310,151 +266,183 @@ TEST(SchedulerStateMachineTest,
|
| // Finish the commit. Note, we should not yet be forcing a draw, but should
|
| // continue the commit as usual.
|
| state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| - // The redraw should be forced in this case.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
|
| + // The redraw should be forced at the end of the next BeginFrame.
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| TestFailedDrawIsRetriedInNextBeginFrameForImplThread) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Start a draw.
|
| - state.SetNeedsRedraw();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + state.SetNeedsRedraw(true);
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| EXPECT_TRUE(state.RedrawPending());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| - // Fail the draw.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + // Fail the draw
|
| state.DidDrawIfPossibleCompleted(false);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_TRUE(state.RedrawPending());
|
|
|
| // We should not be trying to draw again now, but we have a commit pending.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| -
|
| - state.DidLeaveBeginFrame();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - 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_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // We should try to draw again at the end of the next BeginFrame on
|
| + // the impl thread.
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| - state.SetNeedsRedraw();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| -
|
| - // While still in the same begin frame for the impl thread, set needs redraw
|
| - // again. This should not redraw.
|
| - state.SetNeedsRedraw();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + state.SetNeedsRedraw(true);
|
|
|
| - // Move to another frame. This should now draw.
|
| + // Draw the first frame.
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // Before the next begin frame for the impl thread, set needs redraw
|
| + // again. This should not redraw until the next begin frame.
|
| + state.SetNeedsRedraw(true);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // Move to another frame. This should now draw.
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| +
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + EXPECT_FALSE(state.BeginFrameNeededByImplThread());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) {
|
| SchedulerSettings default_scheduler_settings;
|
|
|
| - // When not in BeginFrame, or in BeginFrame but not visible,
|
| + // When not in BeginFrame deadline, or in BeginFrame deadline but not visible,
|
| // don't draw.
|
| size_t num_commit_states =
|
| sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
|
| + size_t num_begin_frame_states =
|
| + sizeof(all_begin_frame_states) /
|
| + sizeof(SchedulerStateMachine::BeginFrameState);
|
| for (size_t i = 0; i < num_commit_states; ++i) {
|
| - for (size_t j = 0; j < 2; ++j) {
|
| + for (size_t j = 0; j < num_begin_frame_states; ++j) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(all_commit_states[i]);
|
| - bool visible = j;
|
| - if (!visible) {
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - state.SetVisible(false);
|
| - } else {
|
| - state.SetVisible(true);
|
| - }
|
| + state.SetBeginFrameState(all_begin_frame_states[j]);
|
| + bool visible = (all_begin_frame_states[j] !=
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
|
| + state.SetVisible(visible);
|
|
|
| // 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,
|
| - state.NextAction());
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction())
|
| + << state.ToString();
|
| }
|
| }
|
|
|
| - // When in BeginFrame, or not in BeginFrame but needs_forced_dedraw
|
| - // set, should always draw except if you're ready to commit, in which case
|
| - // commit.
|
| + // When in BeginFrame deadline we should always draw for SetNeedsRedraw or
|
| + // SetNeedsForcedRedrawForReadback have been called... except if we're
|
| + // ready to commit, in which case we expect a commit first.
|
| 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.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCanDraw(true);
|
| state.SetCommitState(all_commit_states[i]);
|
| - bool forced_draw = j;
|
| - if (!forced_draw) {
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + state.SetBeginFrameState(
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
|
| + if (request_readback) {
|
| + state.SetNeedsForcedRedrawForReadback();
|
| + } else {
|
| state.SetNeedsRedraw(true);
|
| state.SetVisible(true);
|
| - } else {
|
| - state.SetNeedsForcedRedraw(true);
|
| }
|
|
|
| SchedulerStateMachine::Action expected_action;
|
| - if (all_commit_states[i] !=
|
| + if (all_commit_states[i] ==
|
| SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
|
| - expected_action =
|
| - forced_draw ? SchedulerStateMachine::ACTION_DRAW_FORCED
|
| - : SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE;
|
| - } else {
|
| expected_action = SchedulerStateMachine::ACTION_COMMIT;
|
| + } else if (request_readback) {
|
| + if (all_commit_states[i] ==
|
| + SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW)
|
| + expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK;
|
| + else
|
| + expected_action = SchedulerStateMachine::ACTION_NONE;
|
| + } else {
|
| + expected_action =
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
|
| }
|
|
|
| // Case 1: needs_commit=false.
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - EXPECT_EQ(expected_action, state.NextAction());
|
| + EXPECT_EQ(state.BeginFrameNeededByImplThread(), !request_readback);
|
| + EXPECT_EQ(expected_action, state.NextAction()) << state.ToString();
|
|
|
| // Case 2: needs_commit=true.
|
| state.SetNeedsCommit();
|
| - EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
|
| - EXPECT_EQ(expected_action, state.NextAction());
|
| + EXPECT_EQ(state.BeginFrameNeededByImplThread(), !request_readback);
|
| + EXPECT_EQ(expected_action, state.NextAction()) << state.ToString();
|
| }
|
| }
|
| }
|
| @@ -470,22 +458,24 @@ TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(all_commit_states[i]);
|
| state.SetVisible(false);
|
| state.SetNeedsRedraw(true);
|
| - state.SetNeedsForcedRedraw(false);
|
| - if (j == 1)
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + if (j == 1) {
|
| + state.SetBeginFrameState(
|
| + SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
|
| + }
|
|
|
| // 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,
|
| - state.NextAction());
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction())
|
| + << state.ToString();
|
| }
|
| }
|
| }
|
| @@ -501,16 +491,15 @@ TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(all_commit_states[i]);
|
| state.SetVisible(false);
|
| state.SetNeedsRedraw(true);
|
| - state.SetNeedsForcedRedraw(false);
|
| if (j == 1)
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| state.SetCanDraw(false);
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
|
| + EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| state.NextAction());
|
| }
|
| }
|
| @@ -522,15 +511,23 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCommitState(
|
| SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
|
| state.SetNeedsCommit();
|
| state.SetNeedsRedraw(true);
|
| state.SetVisible(true);
|
| state.SetCanDraw(false);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.FinishCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
|
| @@ -538,15 +535,17 @@ TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetNeedsCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| + EXPECT_TRUE(state.BeginFrameNeededByImplThread());
|
| +
|
| // Begin the frame.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| state.CommitState());
|
|
|
| @@ -560,23 +559,44 @@ TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
|
| state.CommitState());
|
|
|
| // Expect to commit regardless of BeginFrame state.
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| +
|
| + state.AdvanceBeginFrameStateWhenNoActionsRemain();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| +
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| +
|
| + state.AdvanceBeginFrameStateWhenNoActionsRemain();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| +
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
|
|
| // Commit and make sure we draw on next BeginFrame
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
|
|
| - // Verify that another commit will begin.
|
| - state.DidLeaveBeginFrame();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| + // Verify that another commit will start immediately after draw.
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestFullCycle) {
|
| @@ -584,49 +604,46 @@ TEST(SchedulerStateMachineTest, TestFullCycle) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Start clean and set commit.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
|
|
| // Begin the frame.
|
| - state.UpdateState(
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| 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());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Tell the scheduler the frame finished.
|
| state.FinishCommit();
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
|
|
| // Commit.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| EXPECT_TRUE(state.NeedsRedraw());
|
|
|
| - // Expect to do nothing until BeginFrame.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + // Expect to do nothing until BeginFrame deadline
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - // At BeginFrame, draw.
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + // At BeginFrame deadline, draw.
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
|
|
| // Should be synchronized, no draw needed, no action needed.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| EXPECT_FALSE(state.NeedsRedraw());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
|
| @@ -634,54 +651,55 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Start clean and set commit.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
|
|
| // Begin the frame.
|
| - state.UpdateState(
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| 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());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Request another commit while the commit is in flight.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Tell the scheduler the frame finished.
|
| state.FinishCommit();
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| state.CommitState());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
|
|
| - // Commit.
|
| - state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
|
| + // First commit.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| EXPECT_TRUE(state.NeedsRedraw());
|
|
|
| - // Expect to do nothing until BeginFrame.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + // Expect to do nothing until BeginFrame deadline.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - // At BeginFrame, draw.
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| + // At BeginFrame deadline, draw.
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| state.DidDrawIfPossibleCompleted(true);
|
| - state.DidLeaveBeginFrame();
|
|
|
| // Should be synchronized, no draw needed, no action needed.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| EXPECT_FALSE(state.NeedsRedraw());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| +
|
| + // Next BeginFrame should initiate second commit.
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
|
| @@ -689,9 +707,9 @@ TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
| @@ -699,31 +717,33 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Start clean and set commit.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
|
|
| // Begin the frame while visible.
|
| - state.UpdateState(
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| 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());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Become invisible and abort the main thread's begin frame.
|
| state.SetVisible(false);
|
| state.BeginFrameAbortedByMainThread(false);
|
|
|
| - // We should now be back in the idle state as if we didn't start a frame at
|
| - // all.
|
| + // We should now be back in the idle state as if we never started the frame.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // We shouldn't do anything on the BeginFrame deadline.
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Become visible again.
|
| state.SetVisible(true);
|
| @@ -735,16 +755,14 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
|
| EXPECT_TRUE(state.NeedsCommit());
|
|
|
| // Start a new frame.
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| -
|
| - // Begin the frame.
|
| - state.UpdateState(state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
|
|
| // We should be starting the commit now.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| state.CommitState());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) {
|
| @@ -758,9 +776,8 @@ TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) {
|
|
|
| // Get into a begin frame / commit state.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(
|
| +
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| state.CommitState());
|
| @@ -777,9 +794,11 @@ 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());
|
| - state.DidLeaveBeginFrame();
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
|
|
| // Verify another commit doesn't start on another frame either.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
|
| @@ -800,15 +819,22 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Check that the first init does not SetNeedsCommit.
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + // Check that a needs commit initiates a BeginFrame to the main thread.
|
| state.SetNeedsCommit();
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
|
| @@ -816,7 +842,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
|
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| @@ -830,15 +856,15 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
|
| state.UpdateState(state.NextAction());
|
|
|
| // Once context recreation begins, nothing should happen.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Recreate the context.
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
|
|
| // 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());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest,
|
| @@ -847,7 +873,7 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| @@ -855,42 +881,52 @@ TEST(SchedulerStateMachineTest,
|
| state.NextAction());
|
| state.DidLoseOutputSurface();
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
|
|
| // Once context recreation begins, nothing should happen.
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // While context is recreating, commits shouldn't begin.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // 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_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| state.CommitState());
|
| state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| // 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.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| state.SetCanDraw(false);
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
|
| + state.NextAction());
|
| state.SetCanDraw(true);
|
| - state.DidLeaveBeginFrame();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| + state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
| @@ -898,22 +934,24 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Get a commit in flight.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Set damage and expect a draw.
|
| state.SetNeedsRedraw(true);
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Cause a lost context while the begin frame is in flight
|
| // for the main thread.
|
| @@ -925,21 +963,36 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
|
|
| // Finish the frame, and commit.
|
| state.FinishCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
|
|
| + // We will abort the draw when the output surface is lost if we are
|
| + // waiting for the first draw to unblock the main thread.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
| -
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
|
|
| // Expect to be told to begin context recreation, independent of
|
| // BeginFrame state.
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| + state.NextAction());
|
| +
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| + state.NextAction());
|
| +
|
| + state.AdvanceBeginFrameStateWhenNoActionsRemain();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| +
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| }
|
| @@ -950,22 +1003,24 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // Get a commit in flight.
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Set damage and expect a draw.
|
| state.SetNeedsRedraw(true);
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Cause a lost context while the begin frame is in flight
|
| // for the main thread.
|
| @@ -974,27 +1029,57 @@ TEST(SchedulerStateMachineTest,
|
| // Ask for another draw and also set needs commit. Expect nothing happens.
|
| state.SetNeedsRedraw(true);
|
| state.SetNeedsCommit();
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Finish the frame, and 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_DRAW,
|
| state.CommitState());
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + // Because the output surface is missing, we expect the draw to abort.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
|
|
| // Expect to be told to begin context recreation, independent of
|
| // BeginFrame state
|
| - state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| + state.NextAction());
|
| +
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| + state.begin_frame_state());
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| + state.NextAction());
|
| +
|
| + state.AdvanceBeginFrameStateWhenNoActionsRemain();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| - state.DidLeaveBeginFrame();
|
| +
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
|
| + state.begin_frame_state());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| +
|
| + // After we get a new output surface, the commit flow should start.
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.FinishCommit();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) {
|
| @@ -1002,33 +1087,47 @@ TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| // 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 for readback and verify it ocurrs.
|
| + state.SetCommitState(
|
| + SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
|
| + state.SetNeedsForcedRedrawForReadback();
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| - // Clear the forced redraw bit.
|
| - state.SetNeedsForcedRedraw(false);
|
| + // 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);
|
| +
|
| + // 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::COMMIT_STATE_IDLE, state.CommitState());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
|
|
| - // 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();
|
| + state.OnBeginFrameDeadline();
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| + state.NextAction());
|
| +
|
| + // Ask a readback and verify it occurs.
|
| + state.SetCommitState(
|
| + SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
|
| + state.SetNeedsForcedRedrawForReadback();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
|
| @@ -1036,7 +1135,7 @@ TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| @@ -1050,6 +1149,7 @@ TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
|
| state.DidCreateAndInitializeOutputSurface();
|
|
|
| EXPECT_FALSE(state.RedrawPending());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| }
|
| @@ -1060,10 +1160,10 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(false);
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| }
|
| @@ -1075,7 +1175,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());
|
| }
|
| @@ -1085,7 +1185,7 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
|
| 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();
|
| @@ -1097,7 +1197,9 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
|
| state.CommitState());
|
|
|
| - EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
| + // We should abort the draw because we are not visible.
|
| + EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
|
| + state.NextAction());
|
| }
|
|
|
| TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) {
|
| @@ -1105,22 +1207,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, TestSendBeginFrameToMainThreadWhenContextLost) {
|
| @@ -1128,11 +1236,11 @@ TEST(SchedulerStateMachineTest, TestSendBeginFrameToMainThreadWhenContextLost) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| state.DidLoseOutputSurface();
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
|
| state.NextAction());
|
| @@ -1143,30 +1251,28 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) {
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| 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,
|
| @@ -1178,34 +1284,28 @@ 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_NONE);
|
|
|
| - // Schedule a forced frame, commit it, draw it.
|
| - state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| - state.UpdateState(state.NextAction());
|
| + // Schedule a readback, commit it, draw it.
|
| + 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,
|
| @@ -1218,7 +1318,7 @@ TEST(SchedulerStateMachineTest,
|
| StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetVisible(true);
|
| state.SetCanDraw(true);
|
|
|
| @@ -1226,25 +1326,21 @@ TEST(SchedulerStateMachineTest,
|
| state.UpdateState(state.NextAction());
|
|
|
| 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 main thread's begin frame.
|
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
|
| @@ -1264,7 +1360,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);
|
|
|
| @@ -1272,7 +1368,7 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) {
|
| state.UpdateState(state.NextAction());
|
|
|
| state.SetNeedsCommit();
|
| - state.SetNeedsForcedCommit();
|
| + state.SetNeedsForcedCommitForReadback();
|
| state.UpdateState(state.NextAction());
|
| state.FinishCommit();
|
|
|
| @@ -1281,21 +1377,17 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) {
|
| state.CommitState());
|
| state.UpdateState(state.NextAction());
|
|
|
| - 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) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
|
|
| state.SetCanDraw(true);
|
| state.SetVisible(true);
|
| @@ -1320,28 +1412,23 @@ TEST(SchedulerStateMachineTest, ReportIfNotDrawing) {
|
|
|
| TEST(SchedulerStateMachineTest, ReportIfNotDrawingFromAcquiredTextures) {
|
| SchedulerSettings default_scheduler_settings;
|
| - SchedulerStateMachine state(default_scheduler_settings);
|
| + StateMachine state(default_scheduler_settings);
|
| state.SetCanStart();
|
| state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| + state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| state.SetCanDraw(true);
|
| state.SetVisible(true);
|
| EXPECT_FALSE(state.DrawSuspendedUntilCommit());
|
|
|
| state.SetMainThreadNeedsLayerTextures();
|
| - EXPECT_EQ(
|
| - SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD,
|
| - state.NextAction());
|
| - state.UpdateState(state.NextAction());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD);
|
| 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());
|
| + state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
|
| EXPECT_TRUE(state.DrawSuspendedUntilCommit());
|
|
|
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
|
|
|