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 51f167a567f603ffaeb0a91dee1f1fe26b88b913..bf40ed82f4effafe0dc87600fa53900391f47fb0 100644 |
--- a/cc/scheduler/scheduler_state_machine_unittest.cc |
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc |
@@ -7,15 +7,39 @@ |
#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_IF_POSSIBLE || \ |
+ action == SchedulerStateMachine::ACTION_DRAW_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, |
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, |
}; |
// Exposes the protected state fields of the SchedulerStateMachine for testing |
@@ -26,13 +50,32 @@ class StateMachine : public SchedulerStateMachine { |
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_; } |
@@ -51,13 +94,14 @@ 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 but can_start is still false, do nothing. |
@@ -67,13 +111,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 +127,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. |
@@ -104,39 +148,40 @@ 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.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_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,138 +190,46 @@ 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.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_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( |
+ 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()); |
- |
- // 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( |
- 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()); |
-} |
+//TestCommitAfterFailedDrawAllowsDrawInSameFrame) { |
+//TestCommitAfterFailedAndSuccessfulDrawDoesNotAllowDrawInSameFrame) { |
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(); |
@@ -286,23 +239,22 @@ TEST(SchedulerStateMachineTest, |
// 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_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,18 +262,21 @@ 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_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(); |
@@ -329,82 +284,96 @@ TEST(SchedulerStateMachineTest, |
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_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_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.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); |
+ state.SetNeedsRedraw(true); |
- // 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()); |
+ // Draw the first frame. |
+ EXPECT_TRUE(state.BeginFrameNeededByImplThread()); |
+ state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
- // Move to another frame. This should now draw. |
+ state.OnBeginFrameDeadline(); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
state.DidDrawIfPossibleCompleted(true); |
- state.DidLeaveBeginFrame(); |
- EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
- state.DidEnterBeginFrame(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); |
+ // 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); |
+ |
+ state.OnBeginFrameDeadline(); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_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_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) { |
+ // We aren't testing forced draws here. |
+ if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW == |
+ all_commit_states[i]) |
+ continue; |
+ |
StateMachine state(default_scheduler_settings); |
state.SetCanStart(); |
state.UpdateState(state.NextAction()); |
state.DidCreateAndInitializeOutputSurface(); |
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, |
@@ -417,43 +386,56 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) { |
} |
} |
- // 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 forced_draw_for_readback = j; |
+ // Skip invalid states |
+ if ((SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW == |
+ all_commit_states[i]) && |
+ !forced_draw_for_readback) |
+ continue; |
+ |
StateMachine state(default_scheduler_settings); |
state.SetCanStart(); |
state.UpdateState(state.NextAction()); |
state.DidCreateAndInitializeOutputSurface(); |
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 (!forced_draw_for_readback) { |
state.SetNeedsRedraw(true); |
state.SetVisible(true); |
} else { |
- state.SetNeedsForcedRedraw(true); |
+ state.SetNeedsForcedRedrawForReadback(); |
} |
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 (forced_draw_for_readback) { |
+ if (all_commit_states[i] == |
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW) |
+ expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK; |
+ else |
+ expected_action = SchedulerStateMachine::ACTION_NONE; |
+ } else { |
+ expected_action = SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE; |
} |
// Case 1: needs_commit=false. |
- EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
+ EXPECT_EQ(state.BeginFrameNeededByImplThread(), |
+ !forced_draw_for_readback); |
EXPECT_EQ(expected_action, state.NextAction()); |
// Case 2: needs_commit=true. |
state.SetNeedsCommit(); |
- EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
+ EXPECT_EQ(state.BeginFrameNeededByImplThread(), |
+ !forced_draw_for_readback); |
EXPECT_EQ(expected_action, state.NextAction()); |
} |
} |
@@ -474,9 +456,11 @@ TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { |
state.SetCommitState(all_commit_states[i]); |
state.SetVisible(false); |
state.SetNeedsRedraw(true); |
- state.SetNeedsForcedRedraw(false); |
- if (j == 1) |
- state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ state.SetNeedsForcedRedrawForReadback(); |
+ if (j == 1) { |
+ state.SetBeginFrameState( |
+ SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE); |
+ } |
// Case 1: needs_commit=false. |
EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, |
@@ -505,9 +489,9 @@ TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { |
state.SetCommitState(all_commit_states[i]); |
state.SetVisible(false); |
state.SetNeedsRedraw(true); |
- state.SetNeedsForcedRedraw(false); |
+ state.SetNeedsForcedRedrawForReadback(); |
if (j == 1) |
- state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
state.SetCanDraw(false); |
EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, |
@@ -529,8 +513,10 @@ TEST(SchedulerStateMachineTest, |
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_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
} |
TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { |
@@ -543,10 +529,12 @@ TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { |
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 +548,43 @@ 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.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ |
+ 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.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_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) { |
@@ -590,43 +598,39 @@ TEST(SchedulerStateMachineTest, TestFullCycle) { |
// 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_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) { |
@@ -640,48 +644,48 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
// 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_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) { |
@@ -691,7 +695,7 @@ TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { |
state.UpdateState(state.NextAction()); |
state.DidCreateAndInitializeOutputSurface(); |
state.SetNeedsCommit(); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
} |
TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
@@ -705,40 +709,41 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
// 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(); |
- // 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); |
- // We should be beginning a frame now. |
+ // We should handle the aborted commit on the next BeginFrame. |
+ state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
- state.NextAction()); |
- |
- // Begin the frame. |
- state.UpdateState(state.NextAction()); |
+ 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, TestFirstContextCreation) { |
@@ -748,15 +753,22 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
state.SetVisible(true); |
state.SetCanDraw(true); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
- state.NextAction()); |
- state.UpdateState(state.NextAction()); |
+ EXPECT_ACTION_UPDATE_STATE( |
+ SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
state.DidCreateAndInitializeOutputSurface(); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ 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) { |
@@ -778,15 +790,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(); |
// 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, |
@@ -803,34 +815,43 @@ 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(); |
// 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); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
+ state.FinishCommit(); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
// Once the context is recreated, whether we draw should be based on |
// SetCanDraw. |
+ state.OnBeginFrameDeadline(); |
state.SetNeedsRedraw(true); |
- state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); |
state.SetCanDraw(false); |
EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
state.SetCanDraw(true); |
- state.DidLeaveBeginFrame(); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); |
} |
TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
@@ -844,16 +865,17 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
// 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_IF_POSSIBLE); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
// Cause a lost context while the begin frame is in flight |
// for the main thread. |
@@ -865,21 +887,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 still attempt to draw when 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_IF_POSSIBLE); |
// 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.DidLeaveBeginFrame(); |
+ |
+ 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.OnBeginFrameDeadline(); |
+ EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, |
+ state.begin_frame_state()); |
EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
state.NextAction()); |
} |
@@ -896,16 +933,17 @@ TEST(SchedulerStateMachineTest, |
// 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_IF_POSSIBLE); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
// Cause a lost context while the begin frame is in flight |
// for the main thread. |
@@ -914,27 +952,53 @@ 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()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
// 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. |
+ state.DidCreateAndInitializeOutputSurface(); |
+ 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_IF_POSSIBLE); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
+ |
} |
TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { |
@@ -949,26 +1013,40 @@ TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { |
// Cause a lost context lost. |
state.DidLoseOutputSurface(); |
- // Ask a forced redraw and verify it ocurrs. |
- state.SetNeedsForcedRedraw(true); |
- state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); |
- state.DidLeaveBeginFrame(); |
- |
- // Clear the forced redraw bit. |
- state.SetNeedsForcedRedraw(false); |
+ // Ask a forced redraw for readback and verify it ocurrs. |
+ state.SetCommitState( |
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW); |
+ state.SetNeedsForcedRedrawForReadback(); |
+ state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
+ |
+ // 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); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
// Expect to be told to begin context recreation, independent of |
// BeginFrame state |
- EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
- state.NextAction()); |
- state.UpdateState(state.NextAction()); |
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
+ EXPECT_ACTION_UPDATE_STATE( |
+ SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
+ |
+ state.OnBeginFrameDeadline(); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
// 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.SetCommitState( |
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW); |
+ state.SetNeedsForcedRedrawForReadback(); |
+ state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
+ state.OnBeginFrameDeadline(); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_FORCED); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
} |
TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { |
@@ -990,6 +1068,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()); |
} |
@@ -1003,7 +1082,7 @@ TEST(SchedulerStateMachineTest, |
state.DidCreateAndInitializeOutputSurface(); |
state.SetVisible(false); |
state.SetNeedsCommit(); |
- state.SetNeedsForcedCommit(); |
+ state.SetNeedsForcedCommitForReadback(); |
EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
state.NextAction()); |
} |
@@ -1015,7 +1094,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()); |
} |
@@ -1049,18 +1128,25 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { |
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, |
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) { |
@@ -1072,7 +1158,7 @@ TEST(SchedulerStateMachineTest, TestSendBeginFrameToMainThreadWhenContextLost) { |
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()); |
@@ -1087,26 +1173,24 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { |
state.SetVisible(true); |
state.SetCanDraw(true); |
- // Schedule a forced frame, commit it, draw it. |
+ // Schedule a readback, commit it, draw it. |
state.SetNeedsCommit(); |
- state.SetNeedsForcedCommit(); |
- state.UpdateState(state.NextAction()); |
+ state.SetNeedsForcedCommitForReadback(); |
+ EXPECT_ACTION_UPDATE_STATE( |
+ SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
state.FinishCommit(); |
- EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
+ |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
state.CommitState()); |
- state.UpdateState(state.NextAction()); |
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, |
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, |
@@ -1124,28 +1208,22 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { |
// 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, |
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, |
@@ -1166,25 +1244,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, |
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, |
@@ -1212,7 +1286,7 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { |
state.UpdateState(state.NextAction()); |
state.SetNeedsCommit(); |
- state.SetNeedsForcedCommit(); |
+ state.SetNeedsForcedCommitForReadback(); |
state.UpdateState(state.NextAction()); |
state.FinishCommit(); |
@@ -1224,18 +1298,14 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_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); |
@@ -1260,7 +1330,7 @@ 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(); |
@@ -1269,16 +1339,13 @@ TEST(SchedulerStateMachineTest, ReportIfNotDrawingFromAcquiredTextures) { |
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_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()); |