Chromium Code Reviews| 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 aa5c4aac39a1164318196bfee92197fcbc1a2909..8d414a2770bedb888e42fa2b5c3101aefbe6d422 100644 |
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc |
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc |
| @@ -7,6 +7,7 @@ |
| #include <stddef.h> |
| #include "base/trace_event/trace_event.h" |
| +#include "cc/output/begin_frame_args.h" |
| #include "cc/scheduler/scheduler.h" |
| #include "cc/test/begin_frame_args_test.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -22,6 +23,19 @@ |
| EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \ |
| SchedulerStateMachine::enum_tostring(actual)) |
| +#define EXPECT_SEQUENCE_NUMBERS(current, main_frame, pending_tree, \ |
| + active_tree, compositor_frame) \ |
| + EXPECT_EQ(current, state.begin_frame_sequence_number()); \ |
| + EXPECT_EQ(main_frame, \ |
| + state.last_begin_frame_sequence_number_begin_main_frame_sent()); \ |
| + EXPECT_EQ(pending_tree, \ |
| + state.last_begin_frame_sequence_number_pending_tree_was_fresh()); \ |
| + EXPECT_EQ(active_tree, \ |
| + state.last_begin_frame_sequence_number_active_tree_was_fresh()); \ |
| + EXPECT_EQ( \ |
| + compositor_frame, \ |
| + state.last_begin_frame_sequence_number_compositor_frame_was_fresh()) |
| + |
| #define EXPECT_IMPL_FRAME_STATE(expected) \ |
| EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \ |
| state.begin_impl_frame_state()) \ |
| @@ -86,6 +100,10 @@ class StateMachine : public SchedulerStateMachine { |
| compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE; |
| } |
| + void IssueNextBeginImplFrame() { |
| + OnBeginImplFrame(0, next_begin_frame_number_++); |
| + } |
| + |
| void SetBeginMainFrameState(BeginMainFrameState cs) { |
| begin_main_frame_state_ = cs; |
| } |
| @@ -150,12 +168,26 @@ class StateMachine : public SchedulerStateMachine { |
| has_pending_tree_ = has_pending_tree; |
| } |
| + uint64_t begin_frame_sequence_number() const { |
| + return begin_frame_sequence_number_; |
| + } |
| + uint64_t last_begin_frame_sequence_number_begin_main_frame_sent() const { |
| + return last_begin_frame_sequence_number_begin_main_frame_sent_; |
| + } |
| + uint64_t last_begin_frame_sequence_number_pending_tree_was_fresh() const { |
| + return last_begin_frame_sequence_number_pending_tree_was_fresh_; |
| + } |
| + uint64_t last_begin_frame_sequence_number_active_tree_was_fresh() const { |
| + return last_begin_frame_sequence_number_active_tree_was_fresh_; |
| + } |
| + |
| using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; |
| using SchedulerStateMachine::ProactiveBeginFrameWanted; |
| using SchedulerStateMachine::WillCommit; |
| protected: |
| DrawResult draw_result_for_test_; |
| + uint64_t next_begin_frame_number_ = BeginFrameArgs::kStartingFrameNumber; |
| }; |
| void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) { |
| @@ -271,7 +303,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.NeedsCommit()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| @@ -290,7 +322,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_TRUE(state.NeedsCommit()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| @@ -318,7 +350,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| EXPECT_TRUE(state.NeedsCommit()); |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -345,7 +377,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -367,7 +399,7 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| // Commit to the pending tree. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -383,7 +415,7 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { |
| // Verify that the next commit starts while there is still a pending tree. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -420,7 +452,7 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| // Start a frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.CommitPending()); |
| @@ -438,7 +470,7 @@ TEST(SchedulerStateMachineTest, |
| // finishes and the requested commit wasn't actually necessary. |
| EXPECT_TRUE(state.CommitPending()); |
| EXPECT_TRUE(state.RedrawPending()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| @@ -457,7 +489,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| // Start a frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.CommitPending()); |
| @@ -475,7 +507,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| // It doesn't request a draw until we get a new commit though. |
| EXPECT_TRUE(state.CommitPending()); |
| EXPECT_FALSE(state.RedrawPending()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -493,7 +525,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| EXPECT_TRUE(state.RedrawPending()); |
| // Verify we draw with the new frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| state.SetDrawResultForTest(DRAW_SUCCESS); |
| @@ -514,7 +546,7 @@ TEST(SchedulerStateMachineTest, |
| // Start a commit. |
| state.SetNeedsBeginMainFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -545,7 +577,7 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_TRUE(state.RedrawPending()); |
| // The redraw should be forced at the end of the next BeginImplFrame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -569,7 +601,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { |
| // Start a commit. |
| state.SetNeedsBeginMainFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -583,7 +615,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { |
| // Fail the draw enough times to force a redraw. |
| for (int i = 0; i < draw_limit; ++i) { |
| state.SetNeedsRedraw(true); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| @@ -604,7 +636,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { |
| // redraw, but not back in IDLE. |
| for (int i = 0; i < draw_limit; ++i) { |
| state.SetNeedsRedraw(true); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| @@ -626,7 +658,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { |
| // Start a draw. |
| state.SetNeedsRedraw(true); |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_TRUE(state.RedrawPending()); |
| @@ -641,7 +673,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { |
| // We should not be trying to draw again now, but we have a commit pending. |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // We should try to draw again at the end of the next BeginImplFrame on |
| @@ -662,7 +694,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| // Draw the first frame. |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| @@ -678,7 +710,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| // Move to another frame. This should now draw. |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -816,7 +848,7 @@ TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { |
| state.SetVisible(false); |
| state.SetNeedsRedraw(true); |
| if (j == 1) |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| state.SetCanDraw(false); |
| EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, |
| @@ -839,7 +871,7 @@ TEST(SchedulerStateMachineTest, |
| state.SetNeedsBeginMainFrame(); |
| state.SetNeedsRedraw(true); |
| state.SetCanDraw(false); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| @@ -863,7 +895,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) { |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| // Begin the frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -892,7 +924,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) { |
| EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_IMPL_FRAME_STATE( |
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| @@ -924,7 +956,7 @@ TEST(SchedulerStateMachineTest, TestFullCycle) { |
| state.SetNeedsBeginMainFrame(); |
| // Begin the frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -970,7 +1002,7 @@ TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { |
| state.SetNeedsBeginMainFrame(); |
| // Make a main frame, commit and activate it. But don't draw it. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| state.NotifyBeginMainFrameStarted(); |
| @@ -983,7 +1015,7 @@ TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { |
| // pending tree and not clobber the active tree, we're able to start a new |
| // begin frame and commit it. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| state.NotifyBeginMainFrameStarted(); |
| @@ -1002,7 +1034,7 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { |
| state.SetNeedsBeginMainFrame(); |
| // Make a main frame, commit and activate it. But don't draw it. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| state.NotifyBeginMainFrameStarted(); |
| @@ -1014,7 +1046,7 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { |
| // Try to make a new main frame before drawing, but since we would clobber the |
| // active tree, we will not do so. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| } |
| @@ -1026,7 +1058,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { |
| // Perform a commit so that we have an active tree. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1041,7 +1073,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { |
| // Ask for another commit but abort it. Verify that we didn't reset pending |
| // tree state. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1055,7 +1087,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { |
| // Ask for another commit that doesn't abort. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1084,7 +1116,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { |
| state.SetNeedsBeginMainFrame(); |
| // Begin the frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -1111,7 +1143,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { |
| // Can't BeginMainFrame yet since last commit hasn't been drawn yet. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Now call ready to draw which will allow the draw to happen and |
| @@ -1124,7 +1156,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Can't BeginMainFrame yet since we're submit-frame throttled. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // CompositorFrameAck unblocks BeginMainFrame. |
| @@ -1154,7 +1186,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
| state.SetNeedsBeginMainFrame(); |
| // Begin the frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -1193,7 +1225,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
| EXPECT_FALSE(state.needs_redraw()); |
| // Next BeginImplFrame should initiate second commit. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1256,7 +1288,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) { |
| state.SetNeedsBeginMainFrame(); |
| // Begin the frame while visible. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -1290,7 +1322,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) { |
| EXPECT_TRUE(state.NeedsCommit()); |
| // Start a new frame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| @@ -1312,7 +1344,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { |
| // Get into a begin frame / commit state. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| @@ -1336,7 +1368,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { |
| EXPECT_FALSE(state.NeedsCommit()); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1344,7 +1376,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { |
| // Verify another commit can start if requested, though. |
| state.SetNeedsBeginMainFrame(); |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1360,14 +1392,14 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Check that the first init does not SetNeedsBeginMainFrame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Check that a needs commit initiates a BeginMainFrame. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1392,7 +1424,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { |
| state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| // When the context is recreated, we should begin a commit. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1414,14 +1446,14 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Once context recreation begins, nothing should happen. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // While context is recreating, commits shouldn't begin. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1438,7 +1470,7 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // When the BeginFrame comes in we should begin a commit |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1464,7 +1496,7 @@ TEST(SchedulerStateMachineTest, |
| // Finishing the first commit after initializing an CompositorFrameSink should |
| // automatically cause a redraw. |
| EXPECT_TRUE(state.RedrawPending()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -1472,7 +1504,7 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_FALSE(state.RedrawPending()); |
| // Next frame as no work to do. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1480,7 +1512,7 @@ TEST(SchedulerStateMachineTest, |
| // Once the context is recreated, whether we draw should be based on |
| // SetCanDraw if waiting on first draw after activate. |
| state.SetNeedsRedraw(true); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -1494,7 +1526,7 @@ TEST(SchedulerStateMachineTest, |
| // SetCanDraw if waiting on first draw after activate. |
| state.SetNeedsRedraw(true); |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1526,7 +1558,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
| // Set damage and expect a draw. |
| state.SetNeedsRedraw(true); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1560,7 +1592,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
| EXPECT_ACTION( |
| SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_IMPL_FRAME_STATE( |
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| @@ -1583,7 +1615,7 @@ TEST(SchedulerStateMachineTest, |
| // Set damage and expect a draw. |
| state.SetNeedsRedraw(true); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1617,7 +1649,7 @@ TEST(SchedulerStateMachineTest, |
| EXPECT_ACTION( |
| SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_IMPL_FRAME_STATE( |
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| @@ -1633,7 +1665,7 @@ TEST(SchedulerStateMachineTest, |
| // After we get a new CompositorFrameSink, the commit flow should start. |
| state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1667,7 +1699,7 @@ TEST(SchedulerStateMachineTest, |
| state.DidCreateAndInitializeCompositorFrameSink(); |
| EXPECT_FALSE(state.RedrawPending()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1730,7 +1762,7 @@ TEST(SchedulerStateMachineTest, TestNoBeginMainFrameWhenInvisible) { |
| // When become visible again, the needs commit should still be pending. |
| state.SetVisible(true); |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -1894,7 +1926,7 @@ TEST(SchedulerStateMachineTest, |
| // This test mirrors what happens during the first frame of a scroll gesture. |
| // First we get the input event and a BeginFrame. |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| // As a response the compositor requests a redraw and a commit to tell the |
| // main thread about the new scroll offset. |
| @@ -1929,7 +1961,7 @@ void FinishPreviousCommitAndDrawWithoutExitingDeadline( |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| @@ -1947,7 +1979,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { |
| // in prefer impl latency mode. |
| state.SetNeedsRedraw(true); |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1984,7 +2016,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { |
| // throttled and did not just submit one. |
| state.SetNeedsBeginMainFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| state.OnBeginImplFrameDeadline(); |
| @@ -1999,7 +2031,7 @@ TEST(SchedulerStateMachineTest, |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -2019,7 +2051,7 @@ TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) { |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -2039,7 +2071,7 @@ TEST(SchedulerStateMachineTest, |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -2062,14 +2094,14 @@ TEST(SchedulerStateMachineTest, TestDeferCommit) { |
| EXPECT_FALSE(state.BeginFrameNeeded()); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.SetDeferCommits(false); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| } |
| @@ -2083,7 +2115,7 @@ TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) { |
| bool commit_has_no_updates = true; |
| state.WillCommit(commit_has_no_updates); |
| EXPECT_TRUE(state.ProactiveBeginFrameWanted()); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| EXPECT_FALSE(state.ProactiveBeginFrameWanted()); |
| } |
| @@ -2095,7 +2127,7 @@ TEST(SchedulerStateMachineTest, |
| // Set up the request for a commit and start a frame. |
| state.SetNeedsBeginMainFrame(); |
| - state.OnBeginImplFrame(); |
| + state.IssueNextBeginImplFrame(); |
| PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| // Lose the CompositorFrameSink. |
| @@ -2123,5 +2155,266 @@ TEST(SchedulerStateMachineTest, |
| SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| } |
| +TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessInitialState) { |
| + SchedulerSettings default_scheduler_settings; |
| + StateMachine state(default_scheduler_settings); |
| + SET_UP_STATE(state) |
| + |
| + // Initially, we report a valid current frame number, but invalid frame |
| + // numbers for freshness. |
| + EXPECT_SEQUENCE_NUMBERS( |
| + BeginFrameArgs::kStartingFrameNumber, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| +} |
| + |
| +TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) { |
| + // Setup without any requested updates. |
| + SchedulerSettings default_scheduler_settings; |
| + StateMachine state(default_scheduler_settings); |
| + SET_UP_STATE(state) |
| + state.SetNeedsRedraw(false); |
| + EXPECT_FALSE(state.RedrawPending()); |
| + EXPECT_FALSE(state.NeedsCommit()); |
| + |
| + // OnBeginImplFrame() updates the sequence number. |
| + state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // When no updates are required, OnBeginImplFrameDeadline() updates active |
| + // tree and compositor frame freshness. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, 10u, 10u); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| +} |
| + |
| +TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) { |
| + // Setup with an impl-thread draw requested. |
| + SchedulerSettings default_scheduler_settings; |
| + StateMachine state(default_scheduler_settings); |
| + SET_UP_STATE(state) |
| + state.SetNeedsRedraw(true); |
| + EXPECT_TRUE(state.RedrawPending()); |
| + EXPECT_FALSE(state.NeedsCommit()); |
| + |
| + // OnBeginImplFrame() updates the sequence number. |
| + state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // With only an impl-thread draw requested, OnBeginImplFrameDeadline() |
| + // updates the active tree freshness. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, 10u, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // Compositor frame freshness is updated when active tree is drawn. |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.RedrawPending()); |
| + state.DidSubmitCompositorFrame(); |
| + state.DidReceiveCompositorFrameAck(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, 10u, 10u); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| +} |
| + |
| +TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) { |
| + // Setup with a BeginMainFrame requested. |
| + SchedulerSettings default_scheduler_settings; |
| + StateMachine state(default_scheduler_settings); |
| + SET_UP_STATE(state) |
| + state.SetNeedsRedraw(false); |
| + state.SetNeedsBeginMainFrameForTest(true); |
| + EXPECT_FALSE(state.RedrawPending()); |
| + EXPECT_TRUE(state.NeedsCommit()); |
| + |
| + // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame() |
| + // updates begin_main_frame_sent sequence number. |
| + state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.NeedsCommit()); |
| + EXPECT_TRUE(state.CommitPending()); |
| + EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // When a BeginMainFrame is needed, OnBeginImplFrameDeadline() updates no |
| + // freshness numbers. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // When a main frame is in progress, OnBeginImplFrameDeadline() updates no |
| + // freshness numbers. |
| + state.NotifyBeginMainFrameStarted(); |
| + state.OnBeginImplFrame(0, 11); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(11u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // Pending tree freshness is updated when the new pending tree is committed. |
| + state.NotifyReadyToCommit(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.CommitPending()); |
| + EXPECT_TRUE(state.has_pending_tree()); |
| + EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // If no further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| + // updates the pending tree's frame number. |
| + state.OnBeginImplFrame(0, 12); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(12u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber, |
|
brianderson
2017/02/15 00:13:54
Can you verify that before the deadline, the pendi
Eric Seckler
2017/02/17 00:07:27
Done.
|
| + BeginFrameArgs::kInvalidFrameNumber); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // If a further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| + // updates no freshness numbers. |
| + state.SetNeedsBeginMainFrameForTest(true); |
| + EXPECT_TRUE(state.NeedsCommit()); |
| + state.OnBeginImplFrame(0, 13); |
| + // BMF will be sent only after pending_tree activation. |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // Active tree freshness is updated when pending frame is activated. |
| + state.NotifyReadyToActivate(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.has_pending_tree()); |
| + EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, 12u, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + EXPECT_TRUE(state.RedrawPending()); |
| + |
| + // BMF requested above will be sent after activation. |
| + state.OnBeginImplFrame(0, 14); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // Active tree freshness is updated when commit didn't have updates. |
| + state.NotifyBeginMainFrameStarted(); |
| + state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| + EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // Compositor frame freshness is updated when active tree is drawn. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.RedrawPending()); |
| + state.DidSubmitCompositorFrame(); |
| + state.DidReceiveCompositorFrameAck(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, 14u); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // When no updates are required, OnBeginImplFrameDeadline() updates active |
| + // tree and compositor frame freshness. |
| + state.OnBeginImplFrame(0, 15); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(15u, 14u, 12u, 15u, 15u); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + |
| + // When the source changes, the current frame number is updated and frame |
| + // numbers for freshness are reset to invalid numbers. |
| + state.OnBeginImplFrame(1, 5); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // When no updates are required, OnBeginImplFrameDeadline() updates active |
| + // tree and compositor frame freshness. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, 5u, 5u); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| +} |
| + |
| +TEST(SchedulerStateMachineTest, |
| + TestBeginFrameFreshnessWithNoUpdatesCommitAndPendingTree) { |
| + // Setup with main_frame_before_activation_enabled, a pending tree, and a |
| + // new BeginMainFrame requested. |
| + SchedulerSettings settings; |
| + settings.main_frame_before_activation_enabled = true; |
| + StateMachine state(settings); |
| + SET_UP_STATE(state) |
| + state.SetHasPendingTree(true); |
| + state.SetNeedsRedraw(false); |
| + state.SetNeedsBeginMainFrameForTest(true); |
| + EXPECT_FALSE(state.RedrawPending()); |
| + EXPECT_TRUE(state.NeedsCommit()); |
| + |
| + // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame() |
| + // updates begin_main_frame_sent sequence number. |
| + state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_FALSE(state.NeedsCommit()); |
| + EXPECT_TRUE(state.CommitPending()); |
| + EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // Pending tree freshness is updated when commit didn't have updates, but an |
| + // older pending tree is still pending. |
| + state.NotifyBeginMainFrameStarted(); |
| + state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| + EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + |
| + // As no further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| + // updates the pending tree's frame number, but without any visible change. |
| + state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| + EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| + BeginFrameArgs::kInvalidFrameNumber); |
| + state.OnBeginImplFrameIdle(); |
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| +} |
| + |
| } // namespace |
| } // namespace cc |