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