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" | |
8 #include "cc/scheduler/scheduler.h" | 7 #include "cc/scheduler/scheduler.h" |
9 #include "cc/test/begin_frame_args_test.h" | 8 #include "cc/test/begin_frame_args_test.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
11 | 10 |
12 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 11 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
13 EXPECT_EQ(action, state.NextAction()) << state.AsValue()->ToString(); \ | 12 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \ |
14 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ | 13 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ |
15 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ | 14 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ |
16 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ | 15 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ |
17 state.begin_impl_frame_state()) \ | 16 state.begin_impl_frame_state()) \ |
18 << state.AsValue()->ToString(); \ | 17 << *state.AsValue(); \ |
19 } \ | 18 } \ |
20 state.UpdateState(action); \ | 19 state.UpdateState(action); \ |
21 if (action == SchedulerStateMachine::ACTION_NONE) { \ | 20 if (action == SchedulerStateMachine::ACTION_NONE) { \ |
22 if (state.begin_impl_frame_state() == \ | 21 if (state.begin_impl_frame_state() == \ |
23 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ | 22 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ |
24 state.OnBeginImplFrameDeadlinePending(); \ | 23 state.OnBeginImplFrameDeadlinePending(); \ |
25 if (state.begin_impl_frame_state() == \ | 24 if (state.begin_impl_frame_state() == \ |
26 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ | 25 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ |
27 state.OnBeginImplFrameIdle(); \ | 26 state.OnBeginImplFrameIdle(); \ |
28 } | 27 } |
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 state.SetVisible(visible); | 683 state.SetVisible(visible); |
685 | 684 |
686 // Case 1: needs_commit=false | 685 // Case 1: needs_commit=false |
687 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 686 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
688 state.NextAction()); | 687 state.NextAction()); |
689 | 688 |
690 // Case 2: needs_commit=true | 689 // Case 2: needs_commit=true |
691 state.SetNeedsCommit(); | 690 state.SetNeedsCommit(); |
692 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 691 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
693 state.NextAction()) | 692 state.NextAction()) |
694 << state.AsValue()->ToString(); | 693 << *state.AsValue(); |
695 } | 694 } |
696 } | 695 } |
697 | 696 |
698 // When in BeginImplFrame deadline we should always draw for SetNeedsRedraw | 697 // When in BeginImplFrame deadline we should always draw for SetNeedsRedraw |
699 // except if we're ready to commit, in which case we expect a commit first. | 698 // except if we're ready to commit, in which case we expect a commit first. |
700 for (size_t i = 0; i < num_commit_states; ++i) { | 699 for (size_t i = 0; i < num_commit_states; ++i) { |
701 StateMachine state(default_scheduler_settings); | 700 StateMachine state(default_scheduler_settings); |
702 state.SetCanStart(); | 701 state.SetCanStart(); |
703 state.UpdateState(state.NextAction()); | 702 state.UpdateState(state.NextAction()); |
704 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 703 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
705 state.SetCanDraw(true); | 704 state.SetCanDraw(true); |
706 state.SetCommitState(all_commit_states[i]); | 705 state.SetCommitState(all_commit_states[i]); |
707 state.SetBeginImplFrameState( | 706 state.SetBeginImplFrameState( |
708 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 707 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
709 | 708 |
710 state.SetNeedsRedraw(true); | 709 state.SetNeedsRedraw(true); |
711 state.SetVisible(true); | 710 state.SetVisible(true); |
712 | 711 |
713 SchedulerStateMachine::Action expected_action; | 712 SchedulerStateMachine::Action expected_action; |
714 if (all_commit_states[i] == | 713 if (all_commit_states[i] == |
715 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { | 714 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { |
716 expected_action = SchedulerStateMachine::ACTION_COMMIT; | 715 expected_action = SchedulerStateMachine::ACTION_COMMIT; |
717 } else { | 716 } else { |
718 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; | 717 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; |
719 EXPECT_EQ(state.NextAction(), SchedulerStateMachine::ACTION_ANIMATE) | 718 EXPECT_EQ(state.NextAction(), SchedulerStateMachine::ACTION_ANIMATE) |
720 << state.AsValue()->ToString(); | 719 << *state.AsValue(); |
721 state.UpdateState(state.NextAction()); | 720 state.UpdateState(state.NextAction()); |
722 } | 721 } |
723 | 722 |
724 // Case 1: needs_commit=false. | 723 // Case 1: needs_commit=false. |
725 EXPECT_EQ(state.NextAction(), expected_action) | 724 EXPECT_EQ(state.NextAction(), expected_action) << *state.AsValue(); |
726 << state.AsValue()->ToString(); | |
727 | 725 |
728 // Case 2: needs_commit=true. | 726 // Case 2: needs_commit=true. |
729 state.SetNeedsCommit(); | 727 state.SetNeedsCommit(); |
730 EXPECT_EQ(state.NextAction(), expected_action) | 728 EXPECT_EQ(state.NextAction(), expected_action) << *state.AsValue(); |
731 << state.AsValue()->ToString(); | |
732 } | 729 } |
733 } | 730 } |
734 | 731 |
735 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { | 732 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { |
736 SchedulerSettings default_scheduler_settings; | 733 SchedulerSettings default_scheduler_settings; |
737 | 734 |
738 size_t num_commit_states = | 735 size_t num_commit_states = |
739 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 736 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
740 for (size_t i = 0; i < num_commit_states; ++i) { | 737 for (size_t i = 0; i < num_commit_states; ++i) { |
741 // There shouldn't be any drawing regardless of BeginImplFrame. | 738 // There shouldn't be any drawing regardless of BeginImplFrame. |
(...skipping 11 matching lines...) Expand all Loading... |
753 } | 750 } |
754 | 751 |
755 // Case 1: needs_commit=false. | 752 // Case 1: needs_commit=false. |
756 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 753 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
757 state.NextAction()); | 754 state.NextAction()); |
758 | 755 |
759 // Case 2: needs_commit=true. | 756 // Case 2: needs_commit=true. |
760 state.SetNeedsCommit(); | 757 state.SetNeedsCommit(); |
761 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 758 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
762 state.NextAction()) | 759 state.NextAction()) |
763 << state.AsValue()->ToString(); | 760 << *state.AsValue(); |
764 } | 761 } |
765 } | 762 } |
766 } | 763 } |
767 | 764 |
768 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { | 765 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { |
769 SchedulerSettings default_scheduler_settings; | 766 SchedulerSettings default_scheduler_settings; |
770 | 767 |
771 size_t num_commit_states = | 768 size_t num_commit_states = |
772 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 769 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
773 for (size_t i = 0; i < num_commit_states; ++i) { | 770 for (size_t i = 0; i < num_commit_states; ++i) { |
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 | 1648 |
1652 state.DidCreateAndInitializeOutputSurface(); | 1649 state.DidCreateAndInitializeOutputSurface(); |
1653 EXPECT_EQ(state.output_surface_state(), | 1650 EXPECT_EQ(state.output_surface_state(), |
1654 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); | 1651 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); |
1655 | 1652 |
1656 // We should not send a BeginMainFrame when we are invisible, even if we've | 1653 // We should not send a BeginMainFrame when we are invisible, even if we've |
1657 // lost the output surface and are trying to get the first commit, since the | 1654 // lost the output surface and are trying to get the first commit, since the |
1658 // main thread will just abort anyway. | 1655 // main thread will just abort anyway. |
1659 state.SetVisible(false); | 1656 state.SetVisible(false); |
1660 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()) | 1657 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()) |
1661 << state.AsValue()->ToString(); | 1658 << *state.AsValue(); |
1662 } | 1659 } |
1663 | 1660 |
1664 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { | 1661 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { |
1665 SchedulerSettings default_scheduler_settings; | 1662 SchedulerSettings default_scheduler_settings; |
1666 StateMachine state(default_scheduler_settings); | 1663 StateMachine state(default_scheduler_settings); |
1667 state.SetCanStart(); | 1664 state.SetCanStart(); |
1668 state.UpdateState(state.NextAction()); | 1665 state.UpdateState(state.NextAction()); |
1669 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1666 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1670 | 1667 |
1671 state.SetCanDraw(true); | 1668 state.SetCanDraw(true); |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1902 state.SetNeedsAnimate(); | 1899 state.SetNeedsAnimate(); |
1903 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1900 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1904 | 1901 |
1905 state.OnBeginImplFrameDeadline(); | 1902 state.OnBeginImplFrameDeadline(); |
1906 EXPECT_ACTION_UPDATE_STATE( | 1903 EXPECT_ACTION_UPDATE_STATE( |
1907 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1904 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
1908 } | 1905 } |
1909 | 1906 |
1910 } // namespace | 1907 } // namespace |
1911 } // namespace cc | 1908 } // namespace cc |
OLD | NEW |