OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/scheduler/scheduler_state_machine.h" | 5 #include "cc/scheduler/scheduler_state_machine.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/scheduler/scheduler.h" | 8 #include "cc/scheduler/scheduler.h" |
9 #include "cc/test/begin_frame_args_test.h" | 9 #include "cc/test/begin_frame_args_test.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 | 11 |
12 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 12 // Macro to compare two enum values and get nice output. |
13 EXPECT_STREQ(SchedulerStateMachine::ActionToString(action), \ | 13 // Without: |
14 SchedulerStateMachine::ActionToString(state.NextAction())) \ | 14 // Value of: actual() Actual: 7 |
15 << state.AsValue()->ToString(); \ | 15 // Expected: expected() Which is: 0 |
16 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ | 16 // With: |
17 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ | 17 // Value of: actual() Actual: "ACTION_ANIMATE" |
18 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ | 18 // Expected: expected() Which is: "ACTION_NONE" |
19 state.begin_impl_frame_state()) \ | 19 #define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \ |
20 << state.AsValue()->ToString(); \ | 20 EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \ |
21 } \ | 21 SchedulerStateMachine::enum_tostring(actual)) |
22 state.UpdateState(action); \ | 22 |
23 if (action == SchedulerStateMachine::ACTION_NONE) { \ | 23 #define EXPECT_IMPL_FRAME_STATE(expected) \ |
24 if (state.begin_impl_frame_state() == \ | 24 EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \ |
25 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ | 25 state.begin_impl_frame_state()) \ |
26 state.OnBeginImplFrameDeadlinePending(); \ | 26 << state.AsValue()->ToString() |
27 if (state.begin_impl_frame_state() == \ | 27 |
28 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ | 28 #define EXPECT_COMMIT_STATE(expected) \ |
29 state.OnBeginImplFrameIdle(); \ | 29 EXPECT_ENUM_EQ(CommitStateToString, expected, state.CommitState()) |
| 30 |
| 31 #define EXPECT_ACTION(expected) \ |
| 32 EXPECT_ENUM_EQ(ActionToString, expected, state.NextAction()) \ |
| 33 << state.AsValue()->ToString() |
| 34 |
| 35 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
| 36 EXPECT_ACTION(action); \ |
| 37 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ |
| 38 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ |
| 39 EXPECT_IMPL_FRAME_STATE( \ |
| 40 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \ |
| 41 } \ |
| 42 state.UpdateState(action); \ |
| 43 if (action == SchedulerStateMachine::ACTION_NONE) { \ |
| 44 if (state.begin_impl_frame_state() == \ |
| 45 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ |
| 46 state.OnBeginImplFrameDeadlinePending(); \ |
| 47 if (state.begin_impl_frame_state() == \ |
| 48 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ |
| 49 state.OnBeginImplFrameIdle(); \ |
30 } | 50 } |
31 | 51 |
32 namespace cc { | 52 namespace cc { |
33 | 53 |
34 namespace { | 54 namespace { |
35 | 55 |
36 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] = | 56 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] = |
37 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 57 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
38 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 58 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
39 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 59 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 } | 190 } |
171 | 191 |
172 // Begin the frame, make sure needs_commit and commit_state update correctly. | 192 // Begin the frame, make sure needs_commit and commit_state update correctly. |
173 { | 193 { |
174 StateMachine state(default_scheduler_settings); | 194 StateMachine state(default_scheduler_settings); |
175 state.SetCanStart(); | 195 state.SetCanStart(); |
176 state.UpdateState(state.NextAction()); | 196 state.UpdateState(state.NextAction()); |
177 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 197 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
178 state.SetVisible(true); | 198 state.SetVisible(true); |
179 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 199 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
180 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 200 EXPECT_COMMIT_STATE( |
181 state.CommitState()); | 201 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
182 EXPECT_FALSE(state.NeedsCommit()); | 202 EXPECT_FALSE(state.NeedsCommit()); |
183 } | 203 } |
184 } | 204 } |
185 | 205 |
186 // Explicitly test main_frame_before_activation_enabled = true | 206 // Explicitly test main_frame_before_activation_enabled = true |
187 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { | 207 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { |
188 SchedulerSettings scheduler_settings; | 208 SchedulerSettings scheduler_settings; |
189 scheduler_settings.impl_side_painting = true; | 209 scheduler_settings.impl_side_painting = true; |
190 scheduler_settings.main_frame_before_activation_enabled = true; | 210 scheduler_settings.main_frame_before_activation_enabled = true; |
191 StateMachine state(scheduler_settings); | 211 StateMachine state(scheduler_settings); |
(...skipping 11 matching lines...) Expand all Loading... |
203 // Commit to the pending tree. | 223 // Commit to the pending tree. |
204 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 224 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
205 EXPECT_ACTION_UPDATE_STATE( | 225 EXPECT_ACTION_UPDATE_STATE( |
206 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 226 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
207 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 227 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
208 | 228 |
209 state.NotifyBeginMainFrameStarted(); | 229 state.NotifyBeginMainFrameStarted(); |
210 state.NotifyReadyToCommit(); | 230 state.NotifyReadyToCommit(); |
211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 231 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
212 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 232 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
213 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 233 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
214 | 234 |
215 state.OnBeginImplFrameDeadline(); | 235 state.OnBeginImplFrameDeadline(); |
216 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
217 | 237 |
218 // Verify that the next commit starts while there is still a pending tree. | 238 // Verify that the next commit starts while there is still a pending tree. |
219 state.SetNeedsCommit(); | 239 state.SetNeedsCommit(); |
220 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 240 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
221 EXPECT_ACTION_UPDATE_STATE( | 241 EXPECT_ACTION_UPDATE_STATE( |
222 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 242 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
223 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
(...skipping 12 matching lines...) Expand all Loading... |
236 | 256 |
237 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 257 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
238 state.OnBeginImplFrameDeadline(); | 258 state.OnBeginImplFrameDeadline(); |
239 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 259 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
240 EXPECT_ACTION_UPDATE_STATE( | 260 EXPECT_ACTION_UPDATE_STATE( |
241 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 261 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
242 state.DidSwapBuffers(); | 262 state.DidSwapBuffers(); |
243 state.DidSwapBuffersComplete(); | 263 state.DidSwapBuffersComplete(); |
244 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 264 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
245 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 265 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
246 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 266 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
247 } | 267 } |
248 | 268 |
249 TEST(SchedulerStateMachineTest, | 269 TEST(SchedulerStateMachineTest, |
250 TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { | 270 TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { |
251 SchedulerSettings default_scheduler_settings; | 271 SchedulerSettings default_scheduler_settings; |
252 StateMachine state(default_scheduler_settings); | 272 StateMachine state(default_scheduler_settings); |
253 state.SetCanStart(); | 273 state.SetCanStart(); |
254 state.UpdateState(state.NextAction()); | 274 state.UpdateState(state.NextAction()); |
255 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 275 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
256 state.SetVisible(true); | 276 state.SetVisible(true); |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 | 634 |
615 state.SetNeedsRedraw(true); | 635 state.SetNeedsRedraw(true); |
616 state.SetVisible(true); | 636 state.SetVisible(true); |
617 | 637 |
618 SchedulerStateMachine::Action expected_action; | 638 SchedulerStateMachine::Action expected_action; |
619 if (all_commit_states[i] == | 639 if (all_commit_states[i] == |
620 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { | 640 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { |
621 expected_action = SchedulerStateMachine::ACTION_COMMIT; | 641 expected_action = SchedulerStateMachine::ACTION_COMMIT; |
622 } else { | 642 } else { |
623 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; | 643 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; |
624 EXPECT_EQ(state.NextAction(), SchedulerStateMachine::ACTION_ANIMATE) | 644 EXPECT_ACTION(SchedulerStateMachine::ACTION_ANIMATE); |
625 << state.AsValue()->ToString(); | |
626 state.UpdateState(state.NextAction()); | 645 state.UpdateState(state.NextAction()); |
627 } | 646 } |
628 | 647 |
629 // Case 1: needs_commit=false. | 648 // Case 1: needs_commit=false. |
630 EXPECT_EQ(state.NextAction(), expected_action) | 649 EXPECT_ACTION(expected_action); |
631 << state.AsValue()->ToString(); | |
632 | 650 |
633 // Case 2: needs_commit=true. | 651 // Case 2: needs_commit=true. |
634 state.SetNeedsCommit(); | 652 state.SetNeedsCommit(); |
635 EXPECT_EQ(state.NextAction(), expected_action) | 653 EXPECT_ACTION(expected_action); |
636 << state.AsValue()->ToString(); | |
637 } | 654 } |
638 } | 655 } |
639 | 656 |
640 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { | 657 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { |
641 SchedulerSettings default_scheduler_settings; | 658 SchedulerSettings default_scheduler_settings; |
642 | 659 |
643 size_t num_commit_states = | 660 size_t num_commit_states = |
644 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 661 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
645 for (size_t i = 0; i < num_commit_states; ++i) { | 662 for (size_t i = 0; i < num_commit_states; ++i) { |
646 // There shouldn't be any drawing regardless of BeginImplFrame. | 663 // There shouldn't be any drawing regardless of BeginImplFrame. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 state.SetNeedsCommit(); | 750 state.SetNeedsCommit(); |
734 state.SetVisible(true); | 751 state.SetVisible(true); |
735 state.SetCanDraw(true); | 752 state.SetCanDraw(true); |
736 | 753 |
737 EXPECT_TRUE(state.BeginFrameNeeded()); | 754 EXPECT_TRUE(state.BeginFrameNeeded()); |
738 | 755 |
739 // Begin the frame. | 756 // Begin the frame. |
740 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 757 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
741 EXPECT_ACTION_UPDATE_STATE( | 758 EXPECT_ACTION_UPDATE_STATE( |
742 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 759 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
743 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 760 EXPECT_COMMIT_STATE( |
744 state.CommitState()); | 761 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
745 | 762 |
746 // Now, while the frame is in progress, set another commit. | 763 // Now, while the frame is in progress, set another commit. |
747 state.SetNeedsCommit(); | 764 state.SetNeedsCommit(); |
748 EXPECT_TRUE(state.NeedsCommit()); | 765 EXPECT_TRUE(state.NeedsCommit()); |
749 | 766 |
750 // Let the frame finish. | 767 // Let the frame finish. |
751 state.NotifyBeginMainFrameStarted(); | 768 state.NotifyBeginMainFrameStarted(); |
752 state.NotifyReadyToCommit(); | 769 state.NotifyReadyToCommit(); |
753 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 770 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT); |
754 state.CommitState()); | |
755 | 771 |
756 // Expect to commit regardless of BeginImplFrame state. | 772 // Expect to commit regardless of BeginImplFrame state. |
757 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 773 EXPECT_IMPL_FRAME_STATE( |
758 state.begin_impl_frame_state()); | 774 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); |
759 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 775 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
760 | 776 |
761 state.OnBeginImplFrameDeadlinePending(); | 777 state.OnBeginImplFrameDeadlinePending(); |
762 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 778 EXPECT_IMPL_FRAME_STATE( |
763 state.begin_impl_frame_state()); | 779 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
764 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 780 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
765 | 781 |
766 state.OnBeginImplFrameDeadline(); | 782 state.OnBeginImplFrameDeadline(); |
767 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, | 783 EXPECT_IMPL_FRAME_STATE( |
768 state.begin_impl_frame_state()); | 784 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
769 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 785 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
770 | 786 |
771 state.OnBeginImplFrameIdle(); | 787 state.OnBeginImplFrameIdle(); |
772 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 788 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
773 state.begin_impl_frame_state()); | 789 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
774 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | |
775 | 790 |
776 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 791 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
777 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 792 EXPECT_IMPL_FRAME_STATE( |
778 state.begin_impl_frame_state()); | 793 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); |
779 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 794 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
780 | 795 |
781 // Finish the commit, then make sure we start the next commit immediately | 796 // Finish the commit, then make sure we start the next commit immediately |
782 // and draw on the next BeginImplFrame. | 797 // and draw on the next BeginImplFrame. |
783 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 798 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
784 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 799 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
785 EXPECT_ACTION_UPDATE_STATE( | 800 EXPECT_ACTION_UPDATE_STATE( |
786 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 801 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
787 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 802 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
788 | 803 |
789 state.OnBeginImplFrameDeadline(); | 804 state.OnBeginImplFrameDeadline(); |
(...skipping 16 matching lines...) Expand all Loading... |
806 state.SetVisible(true); | 821 state.SetVisible(true); |
807 state.SetCanDraw(true); | 822 state.SetCanDraw(true); |
808 | 823 |
809 // Start clean and set commit. | 824 // Start clean and set commit. |
810 state.SetNeedsCommit(); | 825 state.SetNeedsCommit(); |
811 | 826 |
812 // Begin the frame. | 827 // Begin the frame. |
813 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 828 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
814 EXPECT_ACTION_UPDATE_STATE( | 829 EXPECT_ACTION_UPDATE_STATE( |
815 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 830 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
816 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 831 EXPECT_COMMIT_STATE( |
817 state.CommitState()); | 832 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
818 EXPECT_FALSE(state.NeedsCommit()); | 833 EXPECT_FALSE(state.NeedsCommit()); |
819 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 834 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
820 | 835 |
821 // Tell the scheduler the frame finished. | 836 // Tell the scheduler the frame finished. |
822 state.NotifyBeginMainFrameStarted(); | 837 state.NotifyBeginMainFrameStarted(); |
823 state.NotifyReadyToCommit(); | 838 state.NotifyReadyToCommit(); |
824 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 839 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT); |
825 state.CommitState()); | |
826 | 840 |
827 // Commit. | 841 // Commit. |
828 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 842 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
829 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 843 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
830 EXPECT_TRUE(state.needs_redraw()); | 844 EXPECT_TRUE(state.needs_redraw()); |
831 | 845 |
832 // Expect to do nothing until BeginImplFrame deadline | 846 // Expect to do nothing until BeginImplFrame deadline |
833 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 847 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
834 | 848 |
835 // At BeginImplFrame deadline, draw. | 849 // At BeginImplFrame deadline, draw. |
836 state.OnBeginImplFrameDeadline(); | 850 state.OnBeginImplFrameDeadline(); |
837 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 851 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
838 EXPECT_ACTION_UPDATE_STATE( | 852 EXPECT_ACTION_UPDATE_STATE( |
839 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 853 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
840 state.DidSwapBuffers(); | 854 state.DidSwapBuffers(); |
841 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); | 855 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); |
842 state.DidSwapBuffersComplete(); | 856 state.DidSwapBuffersComplete(); |
843 | 857 |
844 // Should be synchronized, no draw needed, no action needed. | 858 // Should be synchronized, no draw needed, no action needed. |
845 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 859 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
846 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 860 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
847 EXPECT_FALSE(state.needs_redraw()); | 861 EXPECT_FALSE(state.needs_redraw()); |
848 } | 862 } |
849 | 863 |
850 TEST(SchedulerStateMachineTest, TestFullCycleWithMainThreadLowLatencyMode) { | 864 TEST(SchedulerStateMachineTest, TestFullCycleWithMainThreadLowLatencyMode) { |
851 SchedulerSettings scheduler_settings; | 865 SchedulerSettings scheduler_settings; |
852 scheduler_settings.main_thread_should_always_be_low_latency = true; | 866 scheduler_settings.main_thread_should_always_be_low_latency = true; |
853 StateMachine state(scheduler_settings); | 867 StateMachine state(scheduler_settings); |
854 state.SetCanStart(); | 868 state.SetCanStart(); |
855 state.UpdateState(state.NextAction()); | 869 state.UpdateState(state.NextAction()); |
856 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 870 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
857 state.SetVisible(true); | 871 state.SetVisible(true); |
858 state.SetCanDraw(true); | 872 state.SetCanDraw(true); |
859 | 873 |
860 // Start clean and set commit. | 874 // Start clean and set commit. |
861 state.SetNeedsCommit(); | 875 state.SetNeedsCommit(); |
862 | 876 |
863 // Begin the frame. | 877 // Begin the frame. |
864 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 878 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
865 EXPECT_ACTION_UPDATE_STATE( | 879 EXPECT_ACTION_UPDATE_STATE( |
866 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 880 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
867 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 881 EXPECT_COMMIT_STATE( |
868 state.CommitState()); | 882 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
869 EXPECT_FALSE(state.NeedsCommit()); | 883 EXPECT_FALSE(state.NeedsCommit()); |
870 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 884 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
871 | 885 |
872 // Tell the scheduler the frame finished. | 886 // Tell the scheduler the frame finished. |
873 state.NotifyBeginMainFrameStarted(); | 887 state.NotifyBeginMainFrameStarted(); |
874 state.NotifyReadyToCommit(); | 888 state.NotifyReadyToCommit(); |
875 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 889 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT); |
876 state.CommitState()); | |
877 | 890 |
878 // Commit. | 891 // Commit. |
879 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 892 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
880 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 893 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
881 EXPECT_TRUE(state.needs_redraw()); | 894 EXPECT_TRUE(state.needs_redraw()); |
882 | 895 |
883 // Now commit should wait for draw. | 896 // Now commit should wait for draw. |
884 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW, | 897 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW); |
885 state.CommitState()); | |
886 | 898 |
887 // Swap throttled. Do not draw. | 899 // Swap throttled. Do not draw. |
888 state.DidSwapBuffers(); | 900 state.DidSwapBuffers(); |
889 state.OnBeginImplFrameDeadline(); | 901 state.OnBeginImplFrameDeadline(); |
890 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 902 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
891 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 903 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
892 state.DidSwapBuffersComplete(); | 904 state.DidSwapBuffersComplete(); |
893 | 905 |
894 // Haven't draw since last commit, do not begin new main frame. | 906 // Haven't draw since last commit, do not begin new main frame. |
895 state.SetNeedsCommit(); | 907 state.SetNeedsCommit(); |
896 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 908 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
897 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 909 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
898 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 910 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
899 | 911 |
900 // At BeginImplFrame deadline, draw. | 912 // At BeginImplFrame deadline, draw. |
901 state.OnBeginImplFrameDeadline(); | 913 state.OnBeginImplFrameDeadline(); |
902 EXPECT_ACTION_UPDATE_STATE( | 914 EXPECT_ACTION_UPDATE_STATE( |
903 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 915 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
904 state.DidSwapBuffers(); | 916 state.DidSwapBuffers(); |
905 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); | 917 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); |
906 state.DidSwapBuffersComplete(); | 918 state.DidSwapBuffersComplete(); |
907 | 919 |
908 // Now will be able to start main frame. | 920 // Now will be able to start main frame. |
909 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 921 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
910 EXPECT_FALSE(state.needs_redraw()); | 922 EXPECT_FALSE(state.needs_redraw()); |
911 EXPECT_ACTION_UPDATE_STATE( | 923 EXPECT_ACTION_UPDATE_STATE( |
912 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 924 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
913 } | 925 } |
914 | 926 |
915 TEST(SchedulerStateMachineTest, | 927 TEST(SchedulerStateMachineTest, |
916 TestFullCycleWithMainThreadLowLatencyMode_ImplSidePaint) { | 928 TestFullCycleWithMainThreadLowLatencyMode_ImplSidePaint) { |
917 SchedulerSettings scheduler_settings; | 929 SchedulerSettings scheduler_settings; |
918 scheduler_settings.main_thread_should_always_be_low_latency = true; | 930 scheduler_settings.main_thread_should_always_be_low_latency = true; |
919 scheduler_settings.impl_side_painting = true; | 931 scheduler_settings.impl_side_painting = true; |
920 StateMachine state(scheduler_settings); | 932 StateMachine state(scheduler_settings); |
921 state.SetCanStart(); | 933 state.SetCanStart(); |
922 state.UpdateState(state.NextAction()); | 934 state.UpdateState(state.NextAction()); |
923 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 935 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
924 state.SetVisible(true); | 936 state.SetVisible(true); |
925 state.SetCanDraw(true); | 937 state.SetCanDraw(true); |
926 | 938 |
927 // Start clean and set commit. | 939 // Start clean and set commit. |
928 state.SetNeedsCommit(); | 940 state.SetNeedsCommit(); |
929 | 941 |
930 // Begin the frame. | 942 // Begin the frame. |
931 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 943 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
932 EXPECT_ACTION_UPDATE_STATE( | 944 EXPECT_ACTION_UPDATE_STATE( |
933 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 945 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
934 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 946 EXPECT_COMMIT_STATE( |
935 state.CommitState()); | 947 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
936 EXPECT_FALSE(state.NeedsCommit()); | 948 EXPECT_FALSE(state.NeedsCommit()); |
937 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 949 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
938 | 950 |
939 // Tell the scheduler the frame finished. | 951 // Tell the scheduler the frame finished. |
940 state.NotifyBeginMainFrameStarted(); | 952 state.NotifyBeginMainFrameStarted(); |
941 state.NotifyReadyToCommit(); | 953 state.NotifyReadyToCommit(); |
942 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 954 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT); |
943 state.CommitState()); | |
944 | 955 |
945 // Commit. | 956 // Commit. |
946 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 957 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
947 | 958 |
948 // Now commit should wait for activation. | 959 // Now commit should wait for activation. |
949 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION, | 960 EXPECT_COMMIT_STATE( |
950 state.CommitState()); | 961 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION); |
951 | 962 |
952 // No activation yet, so this commit is not drawn yet. Force to draw this | 963 // No activation yet, so this commit is not drawn yet. Force to draw this |
953 // frame, and still block BeginMainFrame. | 964 // frame, and still block BeginMainFrame. |
954 state.SetNeedsRedraw(true); | 965 state.SetNeedsRedraw(true); |
955 state.SetNeedsCommit(); | 966 state.SetNeedsCommit(); |
956 state.OnBeginImplFrameDeadline(); | 967 state.OnBeginImplFrameDeadline(); |
957 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 968 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
958 EXPECT_ACTION_UPDATE_STATE( | 969 EXPECT_ACTION_UPDATE_STATE( |
959 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 970 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
960 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 971 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
961 | 972 |
962 // Cannot BeginMainFrame yet since last commit is not yet activated and drawn. | 973 // Cannot BeginMainFrame yet since last commit is not yet activated and drawn. |
963 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 974 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
964 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION, | 975 EXPECT_COMMIT_STATE( |
965 state.CommitState()); | 976 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION); |
966 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 977 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
967 | 978 |
968 // Now activate sync tree. | 979 // Now activate sync tree. |
969 state.NotifyReadyToActivate(); | 980 state.NotifyReadyToActivate(); |
970 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 981 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
971 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 982 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
972 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 983 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
973 EXPECT_TRUE(state.needs_redraw()); | 984 EXPECT_TRUE(state.needs_redraw()); |
974 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW, | 985 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW); |
975 state.CommitState()); | |
976 | 986 |
977 // Swap throttled. Do not draw. | 987 // Swap throttled. Do not draw. |
978 state.DidSwapBuffers(); | 988 state.DidSwapBuffers(); |
979 state.OnBeginImplFrameDeadline(); | 989 state.OnBeginImplFrameDeadline(); |
980 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 990 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
981 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
982 state.DidSwapBuffersComplete(); | 992 state.DidSwapBuffersComplete(); |
983 | 993 |
984 // Haven't draw since last commit, do not begin new main frame. | 994 // Haven't draw since last commit, do not begin new main frame. |
985 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 995 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
986 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 996 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
987 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 997 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
988 | 998 |
989 // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame. | 999 // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame. |
990 state.OnBeginImplFrameDeadline(); | 1000 state.OnBeginImplFrameDeadline(); |
991 EXPECT_ACTION_UPDATE_STATE( | 1001 EXPECT_ACTION_UPDATE_STATE( |
992 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1002 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
993 state.DidSwapBuffers(); | 1003 state.DidSwapBuffers(); |
994 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); | 1004 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); |
995 state.DidSwapBuffersComplete(); | 1005 state.DidSwapBuffersComplete(); |
996 | 1006 |
997 // Now will be able to start main frame. | 1007 // Now will be able to start main frame. |
998 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1008 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
999 EXPECT_FALSE(state.needs_redraw()); | 1009 EXPECT_FALSE(state.needs_redraw()); |
1000 EXPECT_ACTION_UPDATE_STATE( | 1010 EXPECT_ACTION_UPDATE_STATE( |
1001 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1011 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1002 } | 1012 } |
1003 | 1013 |
1004 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 1014 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
1005 SchedulerSettings default_scheduler_settings; | 1015 SchedulerSettings default_scheduler_settings; |
1006 StateMachine state(default_scheduler_settings); | 1016 StateMachine state(default_scheduler_settings); |
1007 state.SetCanStart(); | 1017 state.SetCanStart(); |
1008 state.UpdateState(state.NextAction()); | 1018 state.UpdateState(state.NextAction()); |
1009 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1019 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1010 state.SetVisible(true); | 1020 state.SetVisible(true); |
1011 state.SetCanDraw(true); | 1021 state.SetCanDraw(true); |
1012 | 1022 |
1013 // Start clean and set commit. | 1023 // Start clean and set commit. |
1014 state.SetNeedsCommit(); | 1024 state.SetNeedsCommit(); |
1015 | 1025 |
1016 // Begin the frame. | 1026 // Begin the frame. |
1017 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1027 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1018 EXPECT_ACTION_UPDATE_STATE( | 1028 EXPECT_ACTION_UPDATE_STATE( |
1019 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1029 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1020 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1030 EXPECT_COMMIT_STATE( |
1021 state.CommitState()); | 1031 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1022 EXPECT_FALSE(state.NeedsCommit()); | 1032 EXPECT_FALSE(state.NeedsCommit()); |
1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1033 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1024 | 1034 |
1025 // Request another commit while the commit is in flight. | 1035 // Request another commit while the commit is in flight. |
1026 state.SetNeedsCommit(); | 1036 state.SetNeedsCommit(); |
1027 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1037 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1028 | 1038 |
1029 // Tell the scheduler the frame finished. | 1039 // Tell the scheduler the frame finished. |
1030 state.NotifyBeginMainFrameStarted(); | 1040 state.NotifyBeginMainFrameStarted(); |
1031 state.NotifyReadyToCommit(); | 1041 state.NotifyReadyToCommit(); |
1032 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1042 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT); |
1033 state.CommitState()); | |
1034 | 1043 |
1035 // First commit. | 1044 // First commit. |
1036 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1045 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1037 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1046 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
1038 EXPECT_TRUE(state.needs_redraw()); | 1047 EXPECT_TRUE(state.needs_redraw()); |
1039 | 1048 |
1040 // Expect to do nothing until BeginImplFrame deadline. | 1049 // Expect to do nothing until BeginImplFrame deadline. |
1041 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1050 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1042 | 1051 |
1043 // At BeginImplFrame deadline, draw. | 1052 // At BeginImplFrame deadline, draw. |
1044 state.OnBeginImplFrameDeadline(); | 1053 state.OnBeginImplFrameDeadline(); |
1045 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1054 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1046 EXPECT_ACTION_UPDATE_STATE( | 1055 EXPECT_ACTION_UPDATE_STATE( |
1047 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1056 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1048 state.DidSwapBuffers(); | 1057 state.DidSwapBuffers(); |
1049 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); | 1058 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); |
1050 state.DidSwapBuffersComplete(); | 1059 state.DidSwapBuffersComplete(); |
1051 | 1060 |
1052 // Should be synchronized, no draw needed, no action needed. | 1061 // Should be synchronized, no draw needed, no action needed. |
1053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1062 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1054 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1063 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1055 EXPECT_FALSE(state.needs_redraw()); | 1064 EXPECT_FALSE(state.needs_redraw()); |
1056 | 1065 |
1057 // Next BeginImplFrame should initiate second commit. | 1066 // Next BeginImplFrame should initiate second commit. |
1058 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1067 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1059 EXPECT_ACTION_UPDATE_STATE( | 1068 EXPECT_ACTION_UPDATE_STATE( |
1060 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1069 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1061 } | 1070 } |
1062 | 1071 |
1063 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { | 1072 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { |
1064 SchedulerSettings default_scheduler_settings; | 1073 SchedulerSettings default_scheduler_settings; |
(...skipping 14 matching lines...) Expand all Loading... |
1079 state.SetVisible(true); | 1088 state.SetVisible(true); |
1080 state.SetCanDraw(true); | 1089 state.SetCanDraw(true); |
1081 | 1090 |
1082 // Start clean and set commit. | 1091 // Start clean and set commit. |
1083 state.SetNeedsCommit(); | 1092 state.SetNeedsCommit(); |
1084 | 1093 |
1085 // Begin the frame while visible. | 1094 // Begin the frame while visible. |
1086 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1095 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1087 EXPECT_ACTION_UPDATE_STATE( | 1096 EXPECT_ACTION_UPDATE_STATE( |
1088 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1097 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1089 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1098 EXPECT_COMMIT_STATE( |
1090 state.CommitState()); | 1099 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1091 EXPECT_FALSE(state.NeedsCommit()); | 1100 EXPECT_FALSE(state.NeedsCommit()); |
1092 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1101 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1093 | 1102 |
1094 // Become invisible and abort BeginMainFrame. | 1103 // Become invisible and abort BeginMainFrame. |
1095 state.SetVisible(false); | 1104 state.SetVisible(false); |
1096 state.BeginMainFrameAborted(false); | 1105 state.BeginMainFrameAborted(false); |
1097 | 1106 |
1098 // We should now be back in the idle state as if we never started the frame. | 1107 // We should now be back in the idle state as if we never started the frame. |
1099 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1108 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1100 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1109 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1101 | 1110 |
1102 // We shouldn't do anything on the BeginImplFrame deadline. | 1111 // We shouldn't do anything on the BeginImplFrame deadline. |
1103 state.OnBeginImplFrameDeadline(); | 1112 state.OnBeginImplFrameDeadline(); |
1104 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1113 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1105 | 1114 |
1106 // Become visible again. | 1115 // Become visible again. |
1107 state.SetVisible(true); | 1116 state.SetVisible(true); |
1108 | 1117 |
1109 // Although we have aborted on this frame and haven't cancelled the commit | 1118 // Although we have aborted on this frame and haven't cancelled the commit |
1110 // (i.e. need another), don't send another BeginMainFrame yet. | 1119 // (i.e. need another), don't send another BeginMainFrame yet. |
1111 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1120 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1112 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1121 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1113 EXPECT_TRUE(state.NeedsCommit()); | 1122 EXPECT_TRUE(state.NeedsCommit()); |
1114 | 1123 |
1115 // Start a new frame. | 1124 // Start a new frame. |
1116 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1125 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1117 EXPECT_ACTION_UPDATE_STATE( | 1126 EXPECT_ACTION_UPDATE_STATE( |
1118 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1127 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1119 | 1128 |
1120 // We should be starting the commit now. | 1129 // We should be starting the commit now. |
1121 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1130 EXPECT_COMMIT_STATE( |
1122 state.CommitState()); | 1131 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1123 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1132 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1124 } | 1133 } |
1125 | 1134 |
1126 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { | 1135 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { |
1127 SchedulerSettings default_scheduler_settings; | 1136 SchedulerSettings default_scheduler_settings; |
1128 StateMachine state(default_scheduler_settings); | 1137 StateMachine state(default_scheduler_settings); |
1129 state.SetCanStart(); | 1138 state.SetCanStart(); |
1130 state.UpdateState(state.NextAction()); | 1139 state.UpdateState(state.NextAction()); |
1131 state.DidCreateAndInitializeOutputSurface(); | 1140 state.DidCreateAndInitializeOutputSurface(); |
1132 state.SetVisible(true); | 1141 state.SetVisible(true); |
1133 state.SetCanDraw(true); | 1142 state.SetCanDraw(true); |
1134 | 1143 |
1135 // Get into a begin frame / commit state. | 1144 // Get into a begin frame / commit state. |
1136 state.SetNeedsCommit(); | 1145 state.SetNeedsCommit(); |
1137 | 1146 |
1138 EXPECT_ACTION_UPDATE_STATE( | 1147 EXPECT_ACTION_UPDATE_STATE( |
1139 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1148 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1140 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1149 EXPECT_COMMIT_STATE( |
1141 state.CommitState()); | 1150 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1142 EXPECT_FALSE(state.NeedsCommit()); | 1151 EXPECT_FALSE(state.NeedsCommit()); |
1143 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1152 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1144 | 1153 |
1145 // Abort the commit, cancelling future commits. | 1154 // Abort the commit, cancelling future commits. |
1146 state.BeginMainFrameAborted(true); | 1155 state.BeginMainFrameAborted(true); |
1147 | 1156 |
1148 // Verify that another commit doesn't start on the same frame. | 1157 // Verify that another commit doesn't start on the same frame. |
1149 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1158 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1150 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1159 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1151 EXPECT_FALSE(state.NeedsCommit()); | 1160 EXPECT_FALSE(state.NeedsCommit()); |
1152 | 1161 |
1153 // Start a new frame; draw because this is the first frame since output | 1162 // Start a new frame; draw because this is the first frame since output |
1154 // surface init'd. | 1163 // surface init'd. |
1155 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1164 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1156 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1165 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1157 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1166 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1158 state.OnBeginImplFrameDeadline(); | 1167 state.OnBeginImplFrameDeadline(); |
1159 EXPECT_ACTION_UPDATE_STATE( | 1168 EXPECT_ACTION_UPDATE_STATE( |
1160 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1169 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1161 state.DidSwapBuffers(); | 1170 state.DidSwapBuffers(); |
1162 state.DidSwapBuffersComplete(); | 1171 state.DidSwapBuffersComplete(); |
1163 | 1172 |
1164 // Verify another commit doesn't start on another frame either. | 1173 // Verify another commit doesn't start on another frame either. |
1165 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1174 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1166 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1175 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1167 EXPECT_FALSE(state.NeedsCommit()); | 1176 EXPECT_FALSE(state.NeedsCommit()); |
1168 | 1177 |
1169 // Verify another commit can start if requested, though. | 1178 // Verify another commit can start if requested, though. |
1170 state.SetNeedsCommit(); | 1179 state.SetNeedsCommit(); |
1171 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1180 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1172 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, | 1181 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1173 state.NextAction()); | |
1174 } | 1182 } |
1175 | 1183 |
1176 TEST(SchedulerStateMachineTest, | 1184 TEST(SchedulerStateMachineTest, |
1177 AbortBeginMainFrameAndCancelCommitWhenInvisible) { | 1185 AbortBeginMainFrameAndCancelCommitWhenInvisible) { |
1178 SchedulerSettings default_scheduler_settings; | 1186 SchedulerSettings default_scheduler_settings; |
1179 StateMachine state(default_scheduler_settings); | 1187 StateMachine state(default_scheduler_settings); |
1180 state.SetCanStart(); | 1188 state.SetCanStart(); |
1181 state.UpdateState(state.NextAction()); | 1189 state.UpdateState(state.NextAction()); |
1182 state.DidCreateAndInitializeOutputSurface(); | 1190 state.DidCreateAndInitializeOutputSurface(); |
1183 state.SetVisible(true); | 1191 state.SetVisible(true); |
1184 state.SetCanDraw(true); | 1192 state.SetCanDraw(true); |
1185 | 1193 |
1186 // Get into a begin frame / commit state. | 1194 // Get into a begin frame / commit state. |
1187 state.SetNeedsCommit(); | 1195 state.SetNeedsCommit(); |
1188 | 1196 |
1189 EXPECT_ACTION_UPDATE_STATE( | 1197 EXPECT_ACTION_UPDATE_STATE( |
1190 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1198 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1191 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1199 EXPECT_COMMIT_STATE( |
1192 state.CommitState()); | 1200 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1193 EXPECT_FALSE(state.NeedsCommit()); | 1201 EXPECT_FALSE(state.NeedsCommit()); |
1194 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1202 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1195 | 1203 |
1196 // Become invisible and abort BeginMainFrame. | 1204 // Become invisible and abort BeginMainFrame. |
1197 state.SetVisible(false); | 1205 state.SetVisible(false); |
1198 state.BeginMainFrameAborted(true); | 1206 state.BeginMainFrameAborted(true); |
1199 | 1207 |
1200 // Verify that another commit doesn't start on the same frame. | 1208 // Verify that another commit doesn't start on the same frame. |
1201 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1209 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1202 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1210 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1203 EXPECT_FALSE(state.NeedsCommit()); | 1211 EXPECT_FALSE(state.NeedsCommit()); |
1204 | 1212 |
1205 // Become visible and start a new frame. | 1213 // Become visible and start a new frame. |
1206 state.SetVisible(true); | 1214 state.SetVisible(true); |
1207 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1215 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1208 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1216 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1209 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1217 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1210 | 1218 |
1211 // Draw because this is the first frame since output surface init'd. | 1219 // Draw because this is the first frame since output surface init'd. |
1212 state.OnBeginImplFrameDeadline(); | 1220 state.OnBeginImplFrameDeadline(); |
1213 EXPECT_ACTION_UPDATE_STATE( | 1221 EXPECT_ACTION_UPDATE_STATE( |
1214 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1222 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1215 state.DidSwapBuffers(); | 1223 state.DidSwapBuffers(); |
1216 state.DidSwapBuffersComplete(); | 1224 state.DidSwapBuffersComplete(); |
1217 | 1225 |
1218 // Verify another commit doesn't start on another frame either. | 1226 // Verify another commit doesn't start on another frame either. |
1219 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1227 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1220 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1228 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1221 EXPECT_FALSE(state.NeedsCommit()); | 1229 EXPECT_FALSE(state.NeedsCommit()); |
1222 | 1230 |
1223 // Verify another commit can start if requested, though. | 1231 // Verify another commit can start if requested, though. |
1224 state.SetNeedsCommit(); | 1232 state.SetNeedsCommit(); |
1225 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1233 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1226 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, | 1234 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1227 state.NextAction()); | |
1228 } | 1235 } |
1229 | 1236 |
1230 TEST(SchedulerStateMachineTest, | 1237 TEST(SchedulerStateMachineTest, |
1231 AbortBeginMainFrameAndRequestCommitWhenInvisible) { | 1238 AbortBeginMainFrameAndRequestCommitWhenInvisible) { |
1232 SchedulerSettings default_scheduler_settings; | 1239 SchedulerSettings default_scheduler_settings; |
1233 StateMachine state(default_scheduler_settings); | 1240 StateMachine state(default_scheduler_settings); |
1234 state.SetCanStart(); | 1241 state.SetCanStart(); |
1235 state.UpdateState(state.NextAction()); | 1242 state.UpdateState(state.NextAction()); |
1236 state.DidCreateAndInitializeOutputSurface(); | 1243 state.DidCreateAndInitializeOutputSurface(); |
1237 state.SetVisible(true); | 1244 state.SetVisible(true); |
1238 state.SetCanDraw(true); | 1245 state.SetCanDraw(true); |
1239 | 1246 |
1240 // Get into a begin frame / commit state. | 1247 // Get into a begin frame / commit state. |
1241 state.SetNeedsCommit(); | 1248 state.SetNeedsCommit(); |
1242 | 1249 |
1243 EXPECT_ACTION_UPDATE_STATE( | 1250 EXPECT_ACTION_UPDATE_STATE( |
1244 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1251 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1245 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1252 EXPECT_COMMIT_STATE( |
1246 state.CommitState()); | 1253 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1247 EXPECT_FALSE(state.NeedsCommit()); | 1254 EXPECT_FALSE(state.NeedsCommit()); |
1248 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1255 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1249 | 1256 |
1250 // Become invisible and abort BeginMainFrame. | 1257 // Become invisible and abort BeginMainFrame. |
1251 state.SetVisible(false); | 1258 state.SetVisible(false); |
1252 state.BeginMainFrameAborted(true); | 1259 state.BeginMainFrameAborted(true); |
1253 | 1260 |
1254 // Verify that another commit doesn't start on the same frame. | 1261 // Verify that another commit doesn't start on the same frame. |
1255 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1262 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1256 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1263 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1257 EXPECT_FALSE(state.NeedsCommit()); | 1264 EXPECT_FALSE(state.NeedsCommit()); |
1258 | 1265 |
1259 // Asking for a commit while not visible won't make it happen. | 1266 // Asking for a commit while not visible won't make it happen. |
1260 state.SetNeedsCommit(); | 1267 state.SetNeedsCommit(); |
1261 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1268 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1262 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1269 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1263 EXPECT_TRUE(state.NeedsCommit()); | 1270 EXPECT_TRUE(state.NeedsCommit()); |
1264 | 1271 |
1265 // Become visible but nothing happens until the next frame. | 1272 // Become visible but nothing happens until the next frame. |
1266 state.SetVisible(true); | 1273 state.SetVisible(true); |
1267 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1274 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1268 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1275 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1269 EXPECT_TRUE(state.NeedsCommit()); | 1276 EXPECT_TRUE(state.NeedsCommit()); |
1270 | 1277 |
1271 // We should get that commit when we begin the next frame. | 1278 // We should get that commit when we begin the next frame. |
1272 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1279 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1273 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1280 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1274 EXPECT_ACTION_UPDATE_STATE( | 1281 EXPECT_ACTION_UPDATE_STATE( |
1275 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1282 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1276 } | 1283 } |
1277 | 1284 |
1278 TEST(SchedulerStateMachineTest, | 1285 TEST(SchedulerStateMachineTest, |
1279 AbortBeginMainFrameAndRequestCommitAndBeginImplFrameWhenInvisible) { | 1286 AbortBeginMainFrameAndRequestCommitAndBeginImplFrameWhenInvisible) { |
1280 SchedulerSettings default_scheduler_settings; | 1287 SchedulerSettings default_scheduler_settings; |
1281 StateMachine state(default_scheduler_settings); | 1288 StateMachine state(default_scheduler_settings); |
1282 state.SetCanStart(); | 1289 state.SetCanStart(); |
1283 state.UpdateState(state.NextAction()); | 1290 state.UpdateState(state.NextAction()); |
1284 state.DidCreateAndInitializeOutputSurface(); | 1291 state.DidCreateAndInitializeOutputSurface(); |
1285 state.SetVisible(true); | 1292 state.SetVisible(true); |
1286 state.SetCanDraw(true); | 1293 state.SetCanDraw(true); |
1287 | 1294 |
1288 // Get into a begin frame / commit state. | 1295 // Get into a begin frame / commit state. |
1289 state.SetNeedsCommit(); | 1296 state.SetNeedsCommit(); |
1290 | 1297 |
1291 EXPECT_ACTION_UPDATE_STATE( | 1298 EXPECT_ACTION_UPDATE_STATE( |
1292 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1299 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1293 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1300 EXPECT_COMMIT_STATE( |
1294 state.CommitState()); | 1301 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1295 EXPECT_FALSE(state.NeedsCommit()); | 1302 EXPECT_FALSE(state.NeedsCommit()); |
1296 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1303 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1297 | 1304 |
1298 // Become invisible and abort BeginMainFrame. | 1305 // Become invisible and abort BeginMainFrame. |
1299 state.SetVisible(false); | 1306 state.SetVisible(false); |
1300 state.BeginMainFrameAborted(true); | 1307 state.BeginMainFrameAborted(true); |
1301 | 1308 |
1302 // Asking for a commit while not visible won't make it happen. | 1309 // Asking for a commit while not visible won't make it happen. |
1303 state.SetNeedsCommit(); | 1310 state.SetNeedsCommit(); |
1304 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1311 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1305 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1312 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1306 EXPECT_TRUE(state.NeedsCommit()); | 1313 EXPECT_TRUE(state.NeedsCommit()); |
1307 | 1314 |
1308 // Begin a frame when not visible, the scheduler animates but does not commit. | 1315 // Begin a frame when not visible, the scheduler animates but does not commit. |
1309 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1316 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1310 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1317 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1311 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1318 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1312 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1319 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1313 EXPECT_TRUE(state.NeedsCommit()); | 1320 EXPECT_TRUE(state.NeedsCommit()); |
1314 | 1321 |
1315 // Become visible and the requested commit happens immediately. | 1322 // Become visible and the requested commit happens immediately. |
1316 state.SetVisible(true); | 1323 state.SetVisible(true); |
1317 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1324 EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE); |
1318 EXPECT_ACTION_UPDATE_STATE( | 1325 EXPECT_ACTION_UPDATE_STATE( |
1319 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1326 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1320 } | 1327 } |
1321 | 1328 |
1322 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { | 1329 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
1323 SchedulerSettings default_scheduler_settings; | 1330 SchedulerSettings default_scheduler_settings; |
1324 StateMachine state(default_scheduler_settings); | 1331 StateMachine state(default_scheduler_settings); |
1325 state.SetCanStart(); | 1332 state.SetCanStart(); |
1326 state.SetVisible(true); | 1333 state.SetVisible(true); |
1327 state.SetCanDraw(true); | 1334 state.SetCanDraw(true); |
(...skipping 23 matching lines...) Expand all Loading... |
1351 state.UpdateState(state.NextAction()); | 1358 state.UpdateState(state.NextAction()); |
1352 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1359 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1353 | 1360 |
1354 state.SetVisible(true); | 1361 state.SetVisible(true); |
1355 state.SetCanDraw(true); | 1362 state.SetCanDraw(true); |
1356 | 1363 |
1357 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1364 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
1358 state.NextAction()); | 1365 state.NextAction()); |
1359 state.DidLoseOutputSurface(); | 1366 state.DidLoseOutputSurface(); |
1360 | 1367 |
1361 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1368 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1362 state.NextAction()); | |
1363 state.UpdateState(state.NextAction()); | 1369 state.UpdateState(state.NextAction()); |
1364 | 1370 |
1365 // Once context recreation begins, nothing should happen. | 1371 // Once context recreation begins, nothing should happen. |
1366 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1372 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1367 | 1373 |
1368 // Recreate the context. | 1374 // Recreate the context. |
1369 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1375 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1370 | 1376 |
1371 // When the context is recreated, we should begin a commit. | 1377 // When the context is recreated, we should begin a commit. |
1372 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1378 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1412 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1407 | 1413 |
1408 // Recreate the context | 1414 // Recreate the context |
1409 state.DidCreateAndInitializeOutputSurface(); | 1415 state.DidCreateAndInitializeOutputSurface(); |
1410 EXPECT_FALSE(state.RedrawPending()); | 1416 EXPECT_FALSE(state.RedrawPending()); |
1411 | 1417 |
1412 // When the context is recreated, we should begin a commit | 1418 // When the context is recreated, we should begin a commit |
1413 EXPECT_ACTION_UPDATE_STATE( | 1419 EXPECT_ACTION_UPDATE_STATE( |
1414 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1420 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1415 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1421 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1416 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1422 EXPECT_COMMIT_STATE( |
1417 state.CommitState()); | 1423 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1418 | 1424 |
1419 state.NotifyBeginMainFrameStarted(); | 1425 state.NotifyBeginMainFrameStarted(); |
1420 state.NotifyReadyToCommit(); | 1426 state.NotifyReadyToCommit(); |
1421 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1427 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1422 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1428 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1423 // Finishing the first commit after initializing an output surface should | 1429 // Finishing the first commit after initializing an output surface should |
1424 // automatically cause a redraw. | 1430 // automatically cause a redraw. |
1425 EXPECT_TRUE(state.RedrawPending()); | 1431 EXPECT_TRUE(state.RedrawPending()); |
1426 | 1432 |
1427 // Once the context is recreated, whether we draw should be based on | 1433 // Once the context is recreated, whether we draw should be based on |
1428 // SetCanDraw. | 1434 // SetCanDraw. |
1429 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1435 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1430 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1436 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
1431 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1437 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1432 state.OnBeginImplFrameDeadline(); | 1438 state.OnBeginImplFrameDeadline(); |
1433 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 1439 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1434 state.NextAction()); | |
1435 state.SetCanDraw(false); | 1440 state.SetCanDraw(false); |
1436 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, | 1441 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1437 state.NextAction()); | |
1438 state.SetCanDraw(true); | 1442 state.SetCanDraw(true); |
1439 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 1443 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1440 state.NextAction()); | |
1441 } | 1444 } |
1442 | 1445 |
1443 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { | 1446 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
1444 SchedulerSettings scheduler_settings; | 1447 SchedulerSettings scheduler_settings; |
1445 StateMachine state(scheduler_settings); | 1448 StateMachine state(scheduler_settings); |
1446 state.SetCanStart(); | 1449 state.SetCanStart(); |
1447 state.UpdateState(state.NextAction()); | 1450 state.UpdateState(state.NextAction()); |
1448 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1451 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1449 state.SetVisible(true); | 1452 state.SetVisible(true); |
1450 state.SetCanDraw(true); | 1453 state.SetCanDraw(true); |
(...skipping 13 matching lines...) Expand all Loading... |
1464 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1467 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1465 state.DidSwapBuffers(); | 1468 state.DidSwapBuffers(); |
1466 state.DidSwapBuffersComplete(); | 1469 state.DidSwapBuffersComplete(); |
1467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1470 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1468 | 1471 |
1469 // Cause a lost context while the BeginMainFrame is in flight. | 1472 // Cause a lost context while the BeginMainFrame is in flight. |
1470 state.DidLoseOutputSurface(); | 1473 state.DidLoseOutputSurface(); |
1471 | 1474 |
1472 // Ask for another draw. Expect nothing happens. | 1475 // Ask for another draw. Expect nothing happens. |
1473 state.SetNeedsRedraw(true); | 1476 state.SetNeedsRedraw(true); |
1474 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1477 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1475 | 1478 |
1476 // Finish the frame, and commit. | 1479 // Finish the frame, and commit. |
1477 state.NotifyBeginMainFrameStarted(); | 1480 state.NotifyBeginMainFrameStarted(); |
1478 state.NotifyReadyToCommit(); | 1481 state.NotifyReadyToCommit(); |
1479 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1482 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1480 | 1483 |
1481 // We will abort the draw when the output surface is lost if we are | 1484 // We will abort the draw when the output surface is lost if we are |
1482 // waiting for the first draw to unblock the main thread. | 1485 // waiting for the first draw to unblock the main thread. |
1483 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1486 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
1484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1487 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1485 | 1488 |
1486 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1489 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
1487 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 1490 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
1488 state.begin_impl_frame_state()); | 1491 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1489 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | |
1490 state.NextAction()); | |
1491 | 1492 |
1492 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1493 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1493 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 1494 EXPECT_IMPL_FRAME_STATE( |
1494 state.begin_impl_frame_state()); | 1495 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); |
1495 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1496 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1496 | 1497 |
1497 state.OnBeginImplFrameDeadlinePending(); | 1498 state.OnBeginImplFrameDeadlinePending(); |
1498 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 1499 EXPECT_IMPL_FRAME_STATE( |
1499 state.begin_impl_frame_state()); | 1500 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
1500 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1501 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1501 | 1502 |
1502 state.OnBeginImplFrameDeadline(); | 1503 state.OnBeginImplFrameDeadline(); |
1503 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, | 1504 EXPECT_IMPL_FRAME_STATE( |
1504 state.begin_impl_frame_state()); | 1505 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
1505 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1506 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1506 } | 1507 } |
1507 | 1508 |
1508 TEST(SchedulerStateMachineTest, | 1509 TEST(SchedulerStateMachineTest, |
1509 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { | 1510 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { |
1510 SchedulerSettings scheduler_settings; | 1511 SchedulerSettings scheduler_settings; |
1511 StateMachine state(scheduler_settings); | 1512 StateMachine state(scheduler_settings); |
1512 state.SetCanStart(); | 1513 state.SetCanStart(); |
1513 state.UpdateState(state.NextAction()); | 1514 state.UpdateState(state.NextAction()); |
1514 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1515 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1515 state.SetVisible(true); | 1516 state.SetVisible(true); |
(...skipping 28 matching lines...) Expand all Loading... |
1544 // Finish the frame, and commit. | 1545 // Finish the frame, and commit. |
1545 state.NotifyBeginMainFrameStarted(); | 1546 state.NotifyBeginMainFrameStarted(); |
1546 state.NotifyReadyToCommit(); | 1547 state.NotifyReadyToCommit(); |
1547 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1548 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1549 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
1549 | 1550 |
1550 // Because the output surface is missing, we expect the draw to abort. | 1551 // Because the output surface is missing, we expect the draw to abort. |
1551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1552 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1552 | 1553 |
1553 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1554 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
1554 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 1555 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
1555 state.begin_impl_frame_state()); | 1556 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1556 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | |
1557 state.NextAction()); | |
1558 | 1557 |
1559 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1558 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1560 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 1559 EXPECT_IMPL_FRAME_STATE( |
1561 state.begin_impl_frame_state()); | 1560 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); |
1562 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1561 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1563 | 1562 |
1564 state.OnBeginImplFrameDeadlinePending(); | 1563 state.OnBeginImplFrameDeadlinePending(); |
1565 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 1564 EXPECT_IMPL_FRAME_STATE( |
1566 state.begin_impl_frame_state()); | 1565 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
1567 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1566 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1568 | 1567 |
1569 state.OnBeginImplFrameDeadline(); | 1568 state.OnBeginImplFrameDeadline(); |
1570 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, | 1569 EXPECT_IMPL_FRAME_STATE( |
1571 state.begin_impl_frame_state()); | 1570 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
1572 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1571 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1573 | 1572 |
1574 state.OnBeginImplFrameIdle(); | 1573 state.OnBeginImplFrameIdle(); |
1575 EXPECT_ACTION_UPDATE_STATE( | 1574 EXPECT_ACTION_UPDATE_STATE( |
1576 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1575 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1577 | 1576 |
1578 // After we get a new output surface, the commit flow should start. | 1577 // After we get a new output surface, the commit flow should start. |
1579 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1578 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1580 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1579 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1581 EXPECT_ACTION_UPDATE_STATE( | 1580 EXPECT_ACTION_UPDATE_STATE( |
1582 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1581 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
(...skipping 17 matching lines...) Expand all Loading... |
1600 state.SetCanStart(); | 1599 state.SetCanStart(); |
1601 state.UpdateState(state.NextAction()); | 1600 state.UpdateState(state.NextAction()); |
1602 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1601 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1603 state.SetVisible(true); | 1602 state.SetVisible(true); |
1604 state.SetCanDraw(true); | 1603 state.SetCanDraw(true); |
1605 | 1604 |
1606 state.SetNeedsRedraw(true); | 1605 state.SetNeedsRedraw(true); |
1607 | 1606 |
1608 // Cause a lost output surface, and restore it. | 1607 // Cause a lost output surface, and restore it. |
1609 state.DidLoseOutputSurface(); | 1608 state.DidLoseOutputSurface(); |
1610 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1609 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1611 state.NextAction()); | |
1612 state.UpdateState(state.NextAction()); | 1610 state.UpdateState(state.NextAction()); |
1613 state.DidCreateAndInitializeOutputSurface(); | 1611 state.DidCreateAndInitializeOutputSurface(); |
1614 | 1612 |
1615 EXPECT_FALSE(state.RedrawPending()); | 1613 EXPECT_FALSE(state.RedrawPending()); |
1616 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 1614 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); |
1617 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, | 1615 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
1618 state.NextAction()); | |
1619 } | 1616 } |
1620 | 1617 |
1621 TEST(SchedulerStateMachineTest, | 1618 TEST(SchedulerStateMachineTest, |
1622 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) { | 1619 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) { |
1623 SchedulerSettings settings; | 1620 SchedulerSettings settings; |
1624 settings.impl_side_painting = true; | 1621 settings.impl_side_painting = true; |
1625 StateMachine state(settings); | 1622 StateMachine state(settings); |
1626 state.SetCanStart(); | 1623 state.SetCanStart(); |
1627 state.UpdateState(state.NextAction()); | 1624 state.UpdateState(state.NextAction()); |
1628 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1625 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
(...skipping 18 matching lines...) Expand all Loading... |
1647 } | 1644 } |
1648 | 1645 |
1649 TEST(SchedulerStateMachineTest, TestNoBeginMainFrameWhenInvisible) { | 1646 TEST(SchedulerStateMachineTest, TestNoBeginMainFrameWhenInvisible) { |
1650 SchedulerSettings default_scheduler_settings; | 1647 SchedulerSettings default_scheduler_settings; |
1651 StateMachine state(default_scheduler_settings); | 1648 StateMachine state(default_scheduler_settings); |
1652 state.SetCanStart(); | 1649 state.SetCanStart(); |
1653 state.UpdateState(state.NextAction()); | 1650 state.UpdateState(state.NextAction()); |
1654 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1651 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1655 state.SetVisible(false); | 1652 state.SetVisible(false); |
1656 state.SetNeedsCommit(); | 1653 state.SetNeedsCommit(); |
1657 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1654 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1658 } | 1655 } |
1659 | 1656 |
1660 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { | 1657 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { |
1661 SchedulerSettings default_scheduler_settings; | 1658 SchedulerSettings default_scheduler_settings; |
1662 StateMachine state(default_scheduler_settings); | 1659 StateMachine state(default_scheduler_settings); |
1663 state.SetCanStart(); | 1660 state.SetCanStart(); |
1664 state.UpdateState(state.NextAction()); | 1661 state.UpdateState(state.NextAction()); |
1665 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1662 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1666 state.SetVisible(false); | 1663 state.SetVisible(false); |
1667 state.SetCommitState( | 1664 state.SetCommitState( |
1668 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); | 1665 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); |
1669 state.SetNeedsCommit(); | 1666 state.SetNeedsCommit(); |
1670 | 1667 |
1671 state.NotifyBeginMainFrameStarted(); | 1668 state.NotifyBeginMainFrameStarted(); |
1672 state.NotifyReadyToCommit(); | 1669 state.NotifyReadyToCommit(); |
1673 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 1670 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
1674 state.UpdateState(state.NextAction()); | 1671 state.UpdateState(state.NextAction()); |
1675 | 1672 |
1676 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1673 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
1677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1674 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1678 } | 1675 } |
1679 | 1676 |
1680 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) { | 1677 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) { |
1681 SchedulerSettings default_scheduler_settings; | 1678 SchedulerSettings default_scheduler_settings; |
1682 StateMachine state(default_scheduler_settings); | 1679 StateMachine state(default_scheduler_settings); |
1683 state.SetCanStart(); | 1680 state.SetCanStart(); |
(...skipping 10 matching lines...) Expand all Loading... |
1694 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1691 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1695 | 1692 |
1696 state.DidCreateAndInitializeOutputSurface(); | 1693 state.DidCreateAndInitializeOutputSurface(); |
1697 EXPECT_EQ(state.output_surface_state(), | 1694 EXPECT_EQ(state.output_surface_state(), |
1698 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); | 1695 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); |
1699 | 1696 |
1700 // We should not send a BeginMainFrame when we are invisible, even if we've | 1697 // We should not send a BeginMainFrame when we are invisible, even if we've |
1701 // lost the output surface and are trying to get the first commit, since the | 1698 // lost the output surface and are trying to get the first commit, since the |
1702 // main thread will just abort anyway. | 1699 // main thread will just abort anyway. |
1703 state.SetVisible(false); | 1700 state.SetVisible(false); |
1704 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()) | 1701 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1705 << state.AsValue()->ToString(); | |
1706 } | 1702 } |
1707 | 1703 |
1708 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { | 1704 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { |
1709 SchedulerSettings default_scheduler_settings; | 1705 SchedulerSettings default_scheduler_settings; |
1710 StateMachine state(default_scheduler_settings); | 1706 StateMachine state(default_scheduler_settings); |
1711 state.SetCanStart(); | 1707 state.SetCanStart(); |
1712 state.UpdateState(state.NextAction()); | 1708 state.UpdateState(state.NextAction()); |
1713 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1709 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1714 | 1710 |
1715 state.SetCanDraw(true); | 1711 state.SetCanDraw(true); |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1996 state.SetVisible(true); | 1992 state.SetVisible(true); |
1997 state.SetCanDraw(true); | 1993 state.SetCanDraw(true); |
1998 | 1994 |
1999 EXPECT_FALSE(state.BeginFrameNeeded()); | 1995 EXPECT_FALSE(state.BeginFrameNeeded()); |
2000 state.SetChildrenNeedBeginFrames(true); | 1996 state.SetChildrenNeedBeginFrames(true); |
2001 EXPECT_TRUE(state.BeginFrameNeeded()); | 1997 EXPECT_TRUE(state.BeginFrameNeeded()); |
2002 } | 1998 } |
2003 | 1999 |
2004 } // namespace | 2000 } // namespace |
2005 } // namespace cc | 2001 } // namespace cc |
OLD | NEW |