| 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 "cc/scheduler/scheduler.h" | 7 #include "cc/scheduler/scheduler.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 10 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 | 64 |
| 65 BeginFrameState begin_frame_state() const { return begin_frame_state_; } | 65 BeginFrameState begin_frame_state() const { return begin_frame_state_; } |
| 66 | 66 |
| 67 OutputSurfaceState output_surface_state() const { | 67 OutputSurfaceState output_surface_state() const { |
| 68 return output_surface_state_; | 68 return output_surface_state_; |
| 69 } | 69 } |
| 70 | 70 |
| 71 bool NeedsCommit() const { return needs_commit_; } | 71 bool NeedsCommit() const { return needs_commit_; } |
| 72 | 72 |
| 73 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } | 73 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } |
| 74 bool NeedsRedraw() const { return needs_redraw_; } | |
| 75 | 74 |
| 76 void SetNeedsForcedRedrawForTimeout(bool b) { | 75 void SetNeedsForcedRedrawForTimeout(bool b) { |
| 77 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; | 76 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; |
| 78 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; | 77 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; |
| 79 } | 78 } |
| 80 bool NeedsForcedRedrawForTimeout() const { | 79 bool NeedsForcedRedrawForTimeout() const { |
| 81 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; | 80 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; |
| 82 } | 81 } |
| 83 | 82 |
| 84 void SetNeedsForcedRedrawForReadback() { | 83 void SetNeedsForcedRedrawForReadback() { |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 | 656 |
| 658 // Tell the scheduler the frame finished. | 657 // Tell the scheduler the frame finished. |
| 659 state.FinishCommit(); | 658 state.FinishCommit(); |
| 660 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 659 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 661 state.CommitState()); | 660 state.CommitState()); |
| 662 | 661 |
| 663 // Commit. | 662 // Commit. |
| 664 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 663 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 665 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 664 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 666 state.CommitState()); | 665 state.CommitState()); |
| 667 EXPECT_TRUE(state.NeedsRedraw()); | 666 EXPECT_TRUE(state.needs_redraw()); |
| 668 | 667 |
| 669 // Expect to do nothing until BeginFrame deadline | 668 // Expect to do nothing until BeginFrame deadline |
| 670 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 669 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 671 | 670 |
| 672 // At BeginFrame deadline, draw. | 671 // At BeginFrame deadline, draw. |
| 673 state.OnBeginFrameDeadline(); | 672 state.OnBeginFrameDeadline(); |
| 674 EXPECT_ACTION_UPDATE_STATE( | 673 EXPECT_ACTION_UPDATE_STATE( |
| 675 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 674 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 676 state.DidDrawIfPossibleCompleted(true); | 675 state.DidDrawIfPossibleCompleted(true); |
| 677 | 676 |
| 678 // Should be synchronized, no draw needed, no action needed. | 677 // Should be synchronized, no draw needed, no action needed. |
| 679 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 678 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 680 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 679 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 681 EXPECT_FALSE(state.NeedsRedraw()); | 680 EXPECT_FALSE(state.needs_redraw()); |
| 682 } | 681 } |
| 683 | 682 |
| 684 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 683 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
| 685 SchedulerSettings default_scheduler_settings; | 684 SchedulerSettings default_scheduler_settings; |
| 686 StateMachine state(default_scheduler_settings); | 685 StateMachine state(default_scheduler_settings); |
| 687 state.SetCanStart(); | 686 state.SetCanStart(); |
| 688 state.UpdateState(state.NextAction()); | 687 state.UpdateState(state.NextAction()); |
| 689 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 688 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 690 state.SetVisible(true); | 689 state.SetVisible(true); |
| 691 state.SetCanDraw(true); | 690 state.SetCanDraw(true); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 708 | 707 |
| 709 // Tell the scheduler the frame finished. | 708 // Tell the scheduler the frame finished. |
| 710 state.FinishCommit(); | 709 state.FinishCommit(); |
| 711 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 710 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 712 state.CommitState()); | 711 state.CommitState()); |
| 713 | 712 |
| 714 // First commit. | 713 // First commit. |
| 715 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 714 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 716 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 715 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 717 state.CommitState()); | 716 state.CommitState()); |
| 718 EXPECT_TRUE(state.NeedsRedraw()); | 717 EXPECT_TRUE(state.needs_redraw()); |
| 719 | 718 |
| 720 // Expect to do nothing until BeginFrame deadline. | 719 // Expect to do nothing until BeginFrame deadline. |
| 721 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 720 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 722 | 721 |
| 723 // At BeginFrame deadline, draw. | 722 // At BeginFrame deadline, draw. |
| 724 state.OnBeginFrameDeadline(); | 723 state.OnBeginFrameDeadline(); |
| 725 EXPECT_ACTION_UPDATE_STATE( | 724 EXPECT_ACTION_UPDATE_STATE( |
| 726 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 725 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 727 state.DidDrawIfPossibleCompleted(true); | 726 state.DidDrawIfPossibleCompleted(true); |
| 728 | 727 |
| 729 // Should be synchronized, no draw needed, no action needed. | 728 // Should be synchronized, no draw needed, no action needed. |
| 730 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 729 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 731 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 730 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 732 EXPECT_FALSE(state.NeedsRedraw()); | 731 EXPECT_FALSE(state.needs_redraw()); |
| 733 | 732 |
| 734 // Next BeginFrame should initiate second commit. | 733 // Next BeginFrame should initiate second commit. |
| 735 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); | 734 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 736 EXPECT_ACTION_UPDATE_STATE( | 735 EXPECT_ACTION_UPDATE_STATE( |
| 737 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | 736 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 738 } | 737 } |
| 739 | 738 |
| 740 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { | 739 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { |
| 741 SchedulerSettings default_scheduler_settings; | 740 SchedulerSettings default_scheduler_settings; |
| 742 StateMachine state(default_scheduler_settings); | 741 StateMachine state(default_scheduler_settings); |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 EXPECT_TRUE(state.PendingDrawsShouldBeAborted()); | 1606 EXPECT_TRUE(state.PendingDrawsShouldBeAborted()); |
| 1608 | 1607 |
| 1609 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1608 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1610 | 1609 |
| 1611 state.BeginFrameAbortedByMainThread(true); | 1610 state.BeginFrameAbortedByMainThread(true); |
| 1612 | 1611 |
| 1613 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1612 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1614 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); | 1613 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); |
| 1615 } | 1614 } |
| 1616 | 1615 |
| 1616 TEST(SchedulerStateMachineTest, |
| 1617 TestTriggerDeadlineEarlyAfterAbortedCommit) { |
| 1618 SchedulerSettings settings; |
| 1619 settings.deadline_scheduling_enabled = true; |
| 1620 settings.impl_side_painting = true; |
| 1621 StateMachine state(settings); |
| 1622 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1623 state.SetVisible(true); |
| 1624 state.SetCanDraw(true); |
| 1625 |
| 1626 // This test mirrors what happens during the first frame of a scroll gesture. |
| 1627 // First we get the input event and a BeginFrame. |
| 1628 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 1629 |
| 1630 // As a response the compositor requests a redraw and a commit to tell the |
| 1631 // main thread about the new scroll offset. |
| 1632 state.SetNeedsRedraw(true); |
| 1633 state.SetNeedsCommit(); |
| 1634 |
| 1635 // We should start the commit normally. |
| 1636 EXPECT_ACTION_UPDATE_STATE( |
| 1637 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 1638 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1639 |
| 1640 // Since only the scroll offset changed, the main thread will abort the |
| 1641 // commit. |
| 1642 state.BeginFrameAbortedByMainThread(true); |
| 1643 |
| 1644 // Since the commit was aborted, we should draw right away instead of waiting |
| 1645 // for the deadline. |
| 1646 EXPECT_TRUE(state.ShouldTriggerBeginFrameDeadlineEarly()); |
| 1647 } |
| 1648 |
| 1617 } // namespace | 1649 } // namespace |
| 1618 } // namespace cc | 1650 } // namespace cc |
| OLD | NEW |