| 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/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 current_frame_number_; | 713 current_frame_number_; |
| 714 } | 714 } |
| 715 | 715 |
| 716 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { | 716 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { |
| 717 TRACE_EVENT_INSTANT0("cc", | 717 TRACE_EVENT_INSTANT0("cc", |
| 718 "Scheduler: SkipNextBeginMainFrameToReduceLatency", | 718 "Scheduler: SkipNextBeginMainFrameToReduceLatency", |
| 719 TRACE_EVENT_SCOPE_THREAD); | 719 TRACE_EVENT_SCOPE_THREAD); |
| 720 skip_next_begin_main_frame_to_reduce_latency_ = true; | 720 skip_next_begin_main_frame_to_reduce_latency_ = true; |
| 721 } | 721 } |
| 722 | 722 |
| 723 bool SchedulerStateMachine::BeginFrameNeededForChildren() const { | 723 bool SchedulerStateMachine::BeginFrameRequiredForChildren() const { |
| 724 return children_need_begin_frames_; | 724 return children_need_begin_frames_; |
| 725 } | 725 } |
| 726 | 726 |
| 727 bool SchedulerStateMachine::BeginFrameNeeded() const { | 727 bool SchedulerStateMachine::BeginFrameNeeded() const { |
| 728 // We can't handle BeginFrames when output surface isn't initialized. | 728 // We can't handle BeginFrames when output surface isn't initialized. |
| 729 // TODO(brianderson): Support output surface creation inside a BeginFrame. | 729 // TODO(brianderson): Support output surface creation inside a BeginFrame. |
| 730 if (!HasInitializedOutputSurface()) | 730 if (!HasInitializedOutputSurface()) |
| 731 return false; | 731 return false; |
| 732 return (BeginFrameNeededToAnimateOrDraw() || BeginFrameNeededForChildren() || | 732 return (BeginFrameRequiredForAction() || BeginFrameRequiredForChildren() || |
| 733 ProactiveBeginFrameWanted()); | 733 ProactiveBeginFrameWanted()); |
| 734 } | 734 } |
| 735 | 735 |
| 736 void SchedulerStateMachine::SetChildrenNeedBeginFrames( | 736 void SchedulerStateMachine::SetChildrenNeedBeginFrames( |
| 737 bool children_need_begin_frames) { | 737 bool children_need_begin_frames) { |
| 738 children_need_begin_frames_ = children_need_begin_frames; | 738 children_need_begin_frames_ = children_need_begin_frames; |
| 739 } | 739 } |
| 740 | 740 |
| 741 void SchedulerStateMachine::SetDeferCommits(bool defer_commits) { | 741 void SchedulerStateMachine::SetDeferCommits(bool defer_commits) { |
| 742 defer_commits_ = defer_commits; | 742 defer_commits_ = defer_commits; |
| 743 } | 743 } |
| 744 | 744 |
| 745 // These are the cases where we definitely (or almost definitely) have a | 745 // These are the cases where we require a BeginFrame message to make progress |
| 746 // new frame to animate and/or draw and can draw. | 746 // on requested actions. |
| 747 bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const { | 747 bool SchedulerStateMachine::BeginFrameRequiredForAction() const { |
| 748 // The forced draw respects our normal draw scheduling, so we need to | 748 // The forced draw respects our normal draw scheduling, so we need to |
| 749 // request a BeginImplFrame for it. | 749 // request a BeginImplFrame for it. |
| 750 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 750 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
| 751 return true; | 751 return true; |
| 752 | 752 |
| 753 // TODO(mithro): Remove background animation ticking. crbug.com/371747 | 753 // TODO(mithro): Remove background animation ticking. crbug.com/371747 |
| 754 if (needs_animate_) | 754 if (needs_animate_) |
| 755 return true; | 755 return true; |
| 756 | 756 |
| 757 // Only background tick for animations - not draws, which will never happen. | 757 // Only background tick for animations - not draws, which will never happen. |
| 758 if (!visible_) | 758 if (!visible_) |
| 759 return false; | 759 return false; |
| 760 | 760 |
| 761 return needs_redraw_; | 761 return needs_redraw_ || (needs_commit_ && !defer_commits_); |
| 762 } | 762 } |
| 763 | 763 |
| 764 // These are cases where we are very likely to draw soon, but might not | 764 // These are cases where we are very likely want a BeginFrame message in the |
| 765 // actually have a new frame to draw when we receive the next BeginImplFrame. | 765 // near future. Proactively requesting the BeginImplFrame helps hide the round |
| 766 // Proactively requesting the BeginImplFrame helps hide the round trip latency | 766 // trip latency of the SetNeedsBeginFrame request that has to go to the |
| 767 // of the SetNeedsBeginFrame request that has to go to the Browser. | 767 // Browser. |
| 768 // This includes things like drawing soon, but might not actually have a new |
| 769 // frame to draw when we receive the next BeginImplFrame. |
| 768 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { | 770 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { |
| 769 // Do not be proactive when invisible. | 771 // Do not be proactive when invisible. |
| 770 if (!visible_) | 772 if (!visible_) |
| 771 return false; | 773 return false; |
| 772 | 774 |
| 773 // We should proactively request a BeginImplFrame if a commit is pending | 775 // We should proactively request a BeginImplFrame if a commit is pending |
| 774 // because we will want to draw if the commit completes quickly. Do not | 776 // because we will want to draw if the commit completes quickly. Do not |
| 775 // request frames when commits are disabled, because the frame requests will | 777 // request frames when commits are disabled, because the frame requests will |
| 776 // not provide the needed commit (and will wake up the process when it could | 778 // not provide the needed commit (and will wake up the process when it could |
| 777 // stay idle). | 779 // stay idle). |
| 778 if ((needs_commit_ || commit_state_ != COMMIT_STATE_IDLE) && !defer_commits_) | 780 if ((commit_state_ != COMMIT_STATE_IDLE) && !defer_commits_) |
| 779 return true; | 781 return true; |
| 780 | 782 |
| 781 // If the pending tree activates quickly, we'll want a BeginImplFrame soon | 783 // If the pending tree activates quickly, we'll want a BeginImplFrame soon |
| 782 // to draw the new active tree. | 784 // to draw the new active tree. |
| 783 if (has_pending_tree_) | 785 if (has_pending_tree_) |
| 784 return true; | 786 return true; |
| 785 | 787 |
| 786 // Changing priorities may allow us to activate (given the new priorities), | 788 // Changing priorities may allow us to activate (given the new priorities), |
| 787 // which may result in a new frame. | 789 // which may result in a new frame. |
| 788 if (needs_prepare_tiles_) | 790 if (needs_prepare_tiles_) |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 static_cast<int>(begin_impl_frame_state_), | 1127 static_cast<int>(begin_impl_frame_state_), |
| 1126 static_cast<int>(commit_state_), | 1128 static_cast<int>(commit_state_), |
| 1127 has_pending_tree_ ? 'T' : 'F', | 1129 has_pending_tree_ ? 'T' : 'F', |
| 1128 pending_tree_is_ready_for_activation_ ? 'T' : 'F', | 1130 pending_tree_is_ready_for_activation_ ? 'T' : 'F', |
| 1129 active_tree_needs_first_draw_ ? 'T' : 'F', | 1131 active_tree_needs_first_draw_ ? 'T' : 'F', |
| 1130 max_pending_swaps_, | 1132 max_pending_swaps_, |
| 1131 pending_swaps_); | 1133 pending_swaps_); |
| 1132 } | 1134 } |
| 1133 | 1135 |
| 1134 } // namespace cc | 1136 } // namespace cc |
| OLD | NEW |