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 "base/debug/trace_event_argument.h" | 8 #include "base/debug/trace_event_argument.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 visible_(false), | 40 visible_(false), |
41 can_start_(false), | 41 can_start_(false), |
42 can_draw_(false), | 42 can_draw_(false), |
43 has_pending_tree_(false), | 43 has_pending_tree_(false), |
44 pending_tree_is_ready_for_activation_(false), | 44 pending_tree_is_ready_for_activation_(false), |
45 active_tree_needs_first_draw_(false), | 45 active_tree_needs_first_draw_(false), |
46 did_create_and_initialize_first_output_surface_(false), | 46 did_create_and_initialize_first_output_surface_(false), |
47 impl_latency_takes_priority_(false), | 47 impl_latency_takes_priority_(false), |
48 skip_next_begin_main_frame_to_reduce_latency_(false), | 48 skip_next_begin_main_frame_to_reduce_latency_(false), |
49 skip_begin_main_frame_to_reduce_latency_(false), | 49 skip_begin_main_frame_to_reduce_latency_(false), |
50 continuous_painting_(false) { | 50 continuous_painting_(false), |
| 51 children_need_begin_frames_(false) { |
51 } | 52 } |
52 | 53 |
53 const char* SchedulerStateMachine::OutputSurfaceStateToString( | 54 const char* SchedulerStateMachine::OutputSurfaceStateToString( |
54 OutputSurfaceState state) { | 55 OutputSurfaceState state) { |
55 switch (state) { | 56 switch (state) { |
56 case OUTPUT_SURFACE_ACTIVE: | 57 case OUTPUT_SURFACE_ACTIVE: |
57 return "OUTPUT_SURFACE_ACTIVE"; | 58 return "OUTPUT_SURFACE_ACTIVE"; |
58 case OUTPUT_SURFACE_LOST: | 59 case OUTPUT_SURFACE_LOST: |
59 return "OUTPUT_SURFACE_LOST"; | 60 return "OUTPUT_SURFACE_LOST"; |
60 case OUTPUT_SURFACE_CREATING: | 61 case OUTPUT_SURFACE_CREATING: |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { | 706 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { |
706 skip_next_begin_main_frame_to_reduce_latency_ = true; | 707 skip_next_begin_main_frame_to_reduce_latency_ = true; |
707 } | 708 } |
708 | 709 |
709 bool SchedulerStateMachine::BeginFrameNeeded() const { | 710 bool SchedulerStateMachine::BeginFrameNeeded() const { |
710 // Proactive BeginFrames are bad for the synchronous compositor because we | 711 // Proactive BeginFrames are bad for the synchronous compositor because we |
711 // have to draw when we get the BeginFrame and could end up drawing many | 712 // have to draw when we get the BeginFrame and could end up drawing many |
712 // duplicate frames if our new frame isn't ready in time. | 713 // duplicate frames if our new frame isn't ready in time. |
713 // To poll for state with the synchronous compositor without having to draw, | 714 // To poll for state with the synchronous compositor without having to draw, |
714 // we rely on ShouldPollForAnticipatedDrawTriggers instead. | 715 // we rely on ShouldPollForAnticipatedDrawTriggers instead. |
715 if (!SupportsProactiveBeginFrame()) | 716 if (!SupportsProactiveBeginFrame()) { |
| 717 DCHECK(!BeginFrameNeededToChildren()); |
716 return BeginFrameNeededToAnimateOrDraw(); | 718 return BeginFrameNeededToAnimateOrDraw(); |
| 719 } |
717 | 720 |
718 return BeginFrameNeededToAnimateOrDraw() || ProactiveBeginFrameWanted(); | 721 return (BeginFrameNeededToAnimateOrDraw() || BeginFrameNeededToChildren() || |
| 722 ProactiveBeginFrameWanted()); |
719 } | 723 } |
720 | 724 |
721 bool SchedulerStateMachine::ShouldPollForAnticipatedDrawTriggers() const { | 725 bool SchedulerStateMachine::ShouldPollForAnticipatedDrawTriggers() const { |
722 // ShouldPollForAnticipatedDrawTriggers is what we use in place of | 726 // ShouldPollForAnticipatedDrawTriggers is what we use in place of |
723 // ProactiveBeginFrameWanted when we are using the synchronous | 727 // ProactiveBeginFrameWanted when we are using the synchronous |
724 // compositor. | 728 // compositor. |
725 if (!SupportsProactiveBeginFrame()) { | 729 if (!SupportsProactiveBeginFrame()) { |
726 return !BeginFrameNeededToAnimateOrDraw() && ProactiveBeginFrameWanted(); | 730 return !BeginFrameNeededToAnimateOrDraw() && ProactiveBeginFrameWanted(); |
727 } | 731 } |
728 | 732 |
729 // Non synchronous compositors should rely on | 733 // Non synchronous compositors should rely on |
730 // ProactiveBeginFrameWanted to poll for state instead. | 734 // ProactiveBeginFrameWanted to poll for state instead. |
731 return false; | 735 return false; |
732 } | 736 } |
733 | 737 |
734 // Note: If SupportsProactiveBeginFrame is false, the scheduler should poll | 738 // Note: If SupportsProactiveBeginFrame is false, the scheduler should poll |
735 // for changes in it's draw state so it can request a BeginFrame when it's | 739 // for changes in it's draw state so it can request a BeginFrame when it's |
736 // actually ready. | 740 // actually ready. |
737 bool SchedulerStateMachine::SupportsProactiveBeginFrame() const { | 741 bool SchedulerStateMachine::SupportsProactiveBeginFrame() const { |
738 // It is undesirable to proactively request BeginFrames if we are | 742 // It is undesirable to proactively request BeginFrames if we are |
739 // using a synchronous compositor because we *must* draw for every | 743 // using a synchronous compositor because we *must* draw for every |
740 // BeginFrame, which could cause duplicate draws. | 744 // BeginFrame, which could cause duplicate draws. |
741 return !settings_.using_synchronous_renderer_compositor; | 745 return !settings_.using_synchronous_renderer_compositor; |
742 } | 746 } |
743 | 747 |
| 748 void SchedulerStateMachine::SetChildrenNeedBeginFrames( |
| 749 bool children_need_begin_frames) { |
| 750 #if !defined(OS_ANDROID) && !defined(OS_MACOSX) |
| 751 DCHECK(settings_.begin_frame_publisher && !settings_.begin_frame_receiver); |
| 752 #endif |
| 753 children_need_begin_frames_ = children_need_begin_frames; |
| 754 } |
| 755 |
744 // These are the cases where we definitely (or almost definitely) have a | 756 // These are the cases where we definitely (or almost definitely) have a |
745 // new frame to animate and/or draw and can draw. | 757 // new frame to animate and/or draw and can draw. |
746 bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const { | 758 bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const { |
747 // The output surface is the provider of BeginImplFrames, so we are not going | 759 // The output surface is the provider of BeginImplFrames, so we are not going |
748 // to get them even if we ask for them. | 760 // to get them even if we ask for them. |
749 if (!HasInitializedOutputSurface()) | 761 if (!HasInitializedOutputSurface()) |
750 return false; | 762 return false; |
751 | 763 |
752 // If we can't draw, don't tick until we are notified that we can draw again. | 764 // If we can't draw, don't tick until we are notified that we can draw again. |
753 if (!can_draw_) | 765 if (!can_draw_) |
(...skipping 13 matching lines...) Expand all Loading... |
767 // additional visible tiles. | 779 // additional visible tiles. |
768 if (swap_used_incomplete_tile_) | 780 if (swap_used_incomplete_tile_) |
769 return true; | 781 return true; |
770 | 782 |
771 if (needs_animate_) | 783 if (needs_animate_) |
772 return true; | 784 return true; |
773 | 785 |
774 return needs_redraw_; | 786 return needs_redraw_; |
775 } | 787 } |
776 | 788 |
| 789 bool SchedulerStateMachine::BeginFrameNeededToChildren() const { |
| 790 if (!HasInitializedOutputSurface()) |
| 791 return false; |
| 792 |
| 793 // If we can't draw, don't tick until we are notified that we can draw again. |
| 794 if (!can_draw_) |
| 795 return false; |
| 796 |
| 797 return children_need_begin_frames_; |
| 798 } |
| 799 |
777 // These are cases where we are very likely to draw soon, but might not | 800 // These are cases where we are very likely to draw soon, but might not |
778 // actually have a new frame to draw when we receive the next BeginImplFrame. | 801 // actually have a new frame to draw when we receive the next BeginImplFrame. |
779 // Proactively requesting the BeginImplFrame helps hide the round trip latency | 802 // Proactively requesting the BeginImplFrame helps hide the round trip latency |
780 // of the SetNeedsBeginFrame request that has to go to the Browser. | 803 // of the SetNeedsBeginFrame request that has to go to the Browser. |
781 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { | 804 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { |
782 // The output surface is the provider of BeginImplFrames, | 805 // The output surface is the provider of BeginImplFrames, |
783 // so we are not going to get them even if we ask for them. | 806 // so we are not going to get them even if we ask for them. |
784 if (!HasInitializedOutputSurface()) | 807 if (!HasInitializedOutputSurface()) |
785 return false; | 808 return false; |
786 | 809 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1094 static_cast<int>(begin_impl_frame_state_), | 1117 static_cast<int>(begin_impl_frame_state_), |
1095 static_cast<int>(commit_state_), | 1118 static_cast<int>(commit_state_), |
1096 has_pending_tree_ ? 'T' : 'F', | 1119 has_pending_tree_ ? 'T' : 'F', |
1097 pending_tree_is_ready_for_activation_ ? 'T' : 'F', | 1120 pending_tree_is_ready_for_activation_ ? 'T' : 'F', |
1098 active_tree_needs_first_draw_ ? 'T' : 'F', | 1121 active_tree_needs_first_draw_ ? 'T' : 'F', |
1099 max_pending_swaps_, | 1122 max_pending_swaps_, |
1100 pending_swaps_); | 1123 pending_swaps_); |
1101 } | 1124 } |
1102 | 1125 |
1103 } // namespace cc | 1126 } // namespace cc |
OLD | NEW |