Chromium Code Reviews| 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.h" | 5 #include "cc/scheduler/scheduler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 DCHECK(!scheduler->vsync_observer_); | 42 DCHECK(!scheduler->vsync_observer_); |
| 43 scheduler->vsync_observer_ = synthetic_source.get(); | 43 scheduler->vsync_observer_ = synthetic_source.get(); |
| 44 | 44 |
| 45 DCHECK(!scheduler->primary_frame_source_internal_); | 45 DCHECK(!scheduler->primary_frame_source_internal_); |
| 46 scheduler->primary_frame_source_internal_ = synthetic_source.Pass(); | 46 scheduler->primary_frame_source_internal_ = synthetic_source.Pass(); |
| 47 return scheduler->primary_frame_source_internal_.get(); | 47 return scheduler->primary_frame_source_internal_.get(); |
| 48 } | 48 } |
| 49 } | 49 } |
| 50 | 50 |
| 51 BeginFrameSource* | 51 BeginFrameSource* |
| 52 SchedulerFrameSourcesConstructor::ConstructBackgroundFrameSource( | |
| 53 Scheduler* scheduler) { | |
| 54 TRACE_EVENT1("cc", | |
| 55 "Scheduler::Scheduler()", | |
| 56 "BackgroundFrameSource", | |
| 57 "SyntheticBeginFrameSource"); | |
| 58 DCHECK(!(scheduler->background_frame_source_internal_)); | |
| 59 scheduler->background_frame_source_internal_ = | |
| 60 SyntheticBeginFrameSource::Create( | |
| 61 scheduler->task_runner_.get(), scheduler->Now(), | |
| 62 scheduler->settings_.background_frame_interval); | |
| 63 return scheduler->background_frame_source_internal_.get(); | |
| 64 } | |
| 65 | |
| 66 BeginFrameSource* | |
| 67 SchedulerFrameSourcesConstructor::ConstructUnthrottledFrameSource( | 52 SchedulerFrameSourcesConstructor::ConstructUnthrottledFrameSource( |
| 68 Scheduler* scheduler) { | 53 Scheduler* scheduler) { |
| 69 TRACE_EVENT1("cc", "Scheduler::Scheduler()", "UnthrottledFrameSource", | 54 TRACE_EVENT1("cc", "Scheduler::Scheduler()", "UnthrottledFrameSource", |
| 70 "BackToBackBeginFrameSource"); | 55 "BackToBackBeginFrameSource"); |
| 71 DCHECK(!scheduler->unthrottled_frame_source_internal_); | 56 DCHECK(!scheduler->unthrottled_frame_source_internal_); |
| 72 scheduler->unthrottled_frame_source_internal_ = | 57 scheduler->unthrottled_frame_source_internal_ = |
| 73 BackToBackBeginFrameSource::Create(scheduler->task_runner_.get()); | 58 BackToBackBeginFrameSource::Create(scheduler->task_runner_.get()); |
| 74 return scheduler->unthrottled_frame_source_internal_.get(); | 59 return scheduler->unthrottled_frame_source_internal_.get(); |
| 75 } | 60 } |
| 76 | 61 |
| 77 Scheduler::Scheduler( | 62 Scheduler::Scheduler( |
| 78 SchedulerClient* client, | 63 SchedulerClient* client, |
| 79 const SchedulerSettings& scheduler_settings, | 64 const SchedulerSettings& scheduler_settings, |
| 80 int layer_tree_host_id, | 65 int layer_tree_host_id, |
| 81 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 66 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 82 scoped_ptr<BeginFrameSource> external_begin_frame_source, | 67 scoped_ptr<BeginFrameSource> external_begin_frame_source, |
| 83 SchedulerFrameSourcesConstructor* frame_sources_constructor) | 68 SchedulerFrameSourcesConstructor* frame_sources_constructor) |
| 84 : frame_source_(), | 69 : frame_source_(), |
| 85 primary_frame_source_(NULL), | 70 primary_frame_source_(NULL), |
| 86 background_frame_source_(NULL), | |
| 87 primary_frame_source_internal_(external_begin_frame_source.Pass()), | 71 primary_frame_source_internal_(external_begin_frame_source.Pass()), |
| 88 background_frame_source_internal_(), | |
| 89 vsync_observer_(NULL), | 72 vsync_observer_(NULL), |
| 90 authoritative_vsync_interval_(base::TimeDelta()), | 73 authoritative_vsync_interval_(base::TimeDelta()), |
| 91 last_vsync_timebase_(base::TimeTicks()), | 74 last_vsync_timebase_(base::TimeTicks()), |
| 92 throttle_frame_production_(scheduler_settings.throttle_frame_production), | 75 throttle_frame_production_(false), |
| 93 settings_(scheduler_settings), | 76 settings_(scheduler_settings), |
| 94 client_(client), | 77 client_(client), |
| 95 layer_tree_host_id_(layer_tree_host_id), | 78 layer_tree_host_id_(layer_tree_host_id), |
| 96 task_runner_(task_runner), | 79 task_runner_(task_runner), |
| 97 state_machine_(scheduler_settings), | 80 state_machine_(scheduler_settings), |
| 98 inside_process_scheduled_actions_(false), | 81 inside_process_scheduled_actions_(false), |
| 99 inside_action_(SchedulerStateMachine::ACTION_NONE), | 82 inside_action_(SchedulerStateMachine::ACTION_NONE), |
| 100 weak_factory_(this) { | 83 weak_factory_(this) { |
| 101 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), | 84 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| 102 "Scheduler::Scheduler", | 85 "Scheduler::Scheduler", |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 116 | 99 |
| 117 frame_source_ = BeginFrameSourceMultiplexer::Create(); | 100 frame_source_ = BeginFrameSourceMultiplexer::Create(); |
| 118 frame_source_->AddObserver(this); | 101 frame_source_->AddObserver(this); |
| 119 | 102 |
| 120 // Primary frame source | 103 // Primary frame source |
| 121 primary_frame_source_ = | 104 primary_frame_source_ = |
| 122 frame_sources_constructor->ConstructPrimaryFrameSource(this); | 105 frame_sources_constructor->ConstructPrimaryFrameSource(this); |
| 123 frame_source_->AddSource(primary_frame_source_); | 106 frame_source_->AddSource(primary_frame_source_); |
| 124 primary_frame_source_->SetClientReady(); | 107 primary_frame_source_->SetClientReady(); |
| 125 | 108 |
| 126 // Background ticking frame source | |
| 127 background_frame_source_ = | |
| 128 frame_sources_constructor->ConstructBackgroundFrameSource(this); | |
| 129 frame_source_->AddSource(background_frame_source_); | |
| 130 | |
| 131 // Unthrottled frame source | 109 // Unthrottled frame source |
| 132 unthrottled_frame_source_ = | 110 unthrottled_frame_source_ = |
| 133 frame_sources_constructor->ConstructUnthrottledFrameSource(this); | 111 frame_sources_constructor->ConstructUnthrottledFrameSource(this); |
| 134 frame_source_->AddSource(unthrottled_frame_source_); | 112 frame_source_->AddSource(unthrottled_frame_source_); |
| 113 | |
| 114 SetThrottleFrameProduction(scheduler_settings.throttle_frame_production); | |
| 135 } | 115 } |
| 136 | 116 |
| 137 Scheduler::~Scheduler() { | 117 Scheduler::~Scheduler() { |
| 138 if (frame_source_->NeedsBeginFrames()) | 118 if (frame_source_->NeedsBeginFrames()) |
| 139 frame_source_->SetNeedsBeginFrames(false); | 119 frame_source_->SetNeedsBeginFrames(false); |
| 140 } | 120 } |
| 141 | 121 |
| 142 base::TimeTicks Scheduler::Now() const { | 122 base::TimeTicks Scheduler::Now() const { |
| 143 base::TimeTicks now = gfx::FrameTime::Now(); | 123 base::TimeTicks now = gfx::FrameTime::Now(); |
| 144 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), | 124 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 166 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | 146 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
| 167 DCHECK_GE(draw_time.ToInternalValue(), 0); | 147 DCHECK_GE(draw_time.ToInternalValue(), 0); |
| 168 estimated_parent_draw_time_ = draw_time; | 148 estimated_parent_draw_time_ = draw_time; |
| 169 } | 149 } |
| 170 | 150 |
| 171 void Scheduler::SetCanStart() { | 151 void Scheduler::SetCanStart() { |
| 172 state_machine_.SetCanStart(); | 152 state_machine_.SetCanStart(); |
| 173 ProcessScheduledActions(); | 153 ProcessScheduledActions(); |
| 174 } | 154 } |
| 175 | 155 |
| 176 void Scheduler::UpdateActiveFrameSource() { | 156 void Scheduler::UpdateActiveFrameSource() { |
|
brianderson
2015/04/01 21:58:08
Delete?
mithro-old
2015/04/02 01:03:59
Done.
| |
| 177 if (state_machine_.visible()) { | |
| 178 if (throttle_frame_production_) { | |
| 179 frame_source_->SetActiveSource(primary_frame_source_); | |
| 180 } else { | |
| 181 frame_source_->SetActiveSource(unthrottled_frame_source_); | |
| 182 } | |
| 183 } else { | |
| 184 frame_source_->SetActiveSource(background_frame_source_); | |
|
jdduke (slow)
2015/04/01 19:21:21
Why not set the active source to null if we're inv
mithro-old
2015/04/02 01:03:59
The approach I took was to make scheduler understa
| |
| 185 } | |
| 186 ProcessScheduledActions(); | |
| 187 } | 157 } |
| 188 | 158 |
| 189 void Scheduler::SetVisible(bool visible) { | 159 void Scheduler::SetVisible(bool visible) { |
| 190 state_machine_.SetVisible(visible); | 160 state_machine_.SetVisible(visible); |
| 191 UpdateActiveFrameSource(); | 161 ProcessScheduledActions(); |
| 192 } | 162 } |
| 193 | 163 |
| 194 void Scheduler::SetCanDraw(bool can_draw) { | 164 void Scheduler::SetCanDraw(bool can_draw) { |
| 195 state_machine_.SetCanDraw(can_draw); | 165 state_machine_.SetCanDraw(can_draw); |
| 196 ProcessScheduledActions(); | 166 ProcessScheduledActions(); |
| 197 } | 167 } |
| 198 | 168 |
| 199 void Scheduler::NotifyReadyToActivate() { | 169 void Scheduler::NotifyReadyToActivate() { |
| 200 state_machine_.NotifyReadyToActivate(); | 170 state_machine_.NotifyReadyToActivate(); |
| 201 ProcessScheduledActions(); | 171 ProcessScheduledActions(); |
| 202 } | 172 } |
| 203 | 173 |
| 204 void Scheduler::NotifyReadyToDraw() { | 174 void Scheduler::NotifyReadyToDraw() { |
| 205 // Empty for now, until we take action based on the notification as part of | 175 // Empty for now, until we take action based on the notification as part of |
| 206 // crbugs 352894, 383157, 421923. | 176 // crbugs 352894, 383157, 421923. |
| 207 } | 177 } |
| 208 | 178 |
| 209 void Scheduler::SetThrottleFrameProduction(bool throttle) { | 179 void Scheduler::SetThrottleFrameProduction(bool throttle) { |
| 210 throttle_frame_production_ = throttle; | 180 throttle_frame_production_ = throttle; |
| 211 UpdateActiveFrameSource(); | 181 if (throttle) { |
| 182 frame_source_->SetActiveSource(primary_frame_source_); | |
| 183 } else { | |
| 184 frame_source_->SetActiveSource(unthrottled_frame_source_); | |
| 185 } | |
| 186 ProcessScheduledActions(); | |
| 212 } | 187 } |
| 213 | 188 |
| 214 void Scheduler::SetNeedsCommit() { | 189 void Scheduler::SetNeedsCommit() { |
| 215 state_machine_.SetNeedsCommit(); | 190 state_machine_.SetNeedsCommit(); |
| 216 ProcessScheduledActions(); | 191 ProcessScheduledActions(); |
| 217 } | 192 } |
| 218 | 193 |
| 219 void Scheduler::SetNeedsRedraw() { | 194 void Scheduler::SetNeedsRedraw() { |
| 220 state_machine_.SetNeedsRedraw(); | 195 state_machine_.SetNeedsRedraw(); |
| 221 ProcessScheduledActions(); | 196 ProcessScheduledActions(); |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 842 } | 817 } |
| 843 | 818 |
| 844 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 819 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 845 return (state_machine_.commit_state() == | 820 return (state_machine_.commit_state() == |
| 846 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 821 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
| 847 state_machine_.commit_state() == | 822 state_machine_.commit_state() == |
| 848 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 823 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
| 849 } | 824 } |
| 850 | 825 |
| 851 } // namespace cc | 826 } // namespace cc |
| OLD | NEW |