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()); |