Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1178)

Side by Side Diff: cc/scheduler/scheduler.cc

Issue 1201573002: cc: Remove BeginFrameSourcesConstructor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove refptr changes Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/scheduler/scheduler.h ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "base/profiler/scoped_tracker.h" 11 #include "base/profiler/scoped_tracker.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "base/trace_event/trace_event_argument.h" 14 #include "base/trace_event/trace_event_argument.h"
15 #include "cc/debug/devtools_instrumentation.h" 15 #include "cc/debug/devtools_instrumentation.h"
16 #include "cc/debug/traced_value.h" 16 #include "cc/debug/traced_value.h"
17 #include "cc/scheduler/delay_based_time_source.h" 17 #include "cc/scheduler/delay_based_time_source.h"
18 18
19 namespace cc { 19 namespace cc {
20 20
21 BeginFrameSource* SchedulerFrameSourcesConstructor::ConstructPrimaryFrameSource( 21 scoped_ptr<Scheduler> Scheduler::Create(
22 Scheduler* scheduler) { 22 SchedulerClient* client,
23 if (scheduler->settings_.use_external_begin_frame_source) { 23 const SchedulerSettings& settings,
24 TRACE_EVENT1("cc", 24 int layer_tree_host_id,
25 "Scheduler::Scheduler()", 25 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
26 "PrimaryFrameSource", 26 BeginFrameSource* external_frame_source) {
27 "ExternalBeginFrameSource"); 27 scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source;
28 DCHECK(scheduler->primary_frame_source_internal_) 28 if (!settings.use_external_begin_frame_source) {
29 << "Need external BeginFrameSource"; 29 synthetic_frame_source = SyntheticBeginFrameSource::Create(
30 return scheduler->primary_frame_source_internal_.get(); 30 task_runner.get(), BeginFrameArgs::DefaultInterval());
31 } else {
32 TRACE_EVENT1("cc",
33 "Scheduler::Scheduler()",
34 "PrimaryFrameSource",
35 "SyntheticBeginFrameSource");
36 scoped_ptr<SyntheticBeginFrameSource> synthetic_source =
37 SyntheticBeginFrameSource::Create(scheduler->task_runner_.get(),
38 scheduler->Now(),
39 BeginFrameArgs::DefaultInterval());
40
41 DCHECK(!scheduler->vsync_observer_);
42 scheduler->vsync_observer_ = synthetic_source.get();
43
44 DCHECK(!scheduler->primary_frame_source_internal_);
45 scheduler->primary_frame_source_internal_ = synthetic_source.Pass();
46 return scheduler->primary_frame_source_internal_.get();
47 } 31 }
48 } 32 scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source =
49 33 BackToBackBeginFrameSource::Create(task_runner.get());
50 BeginFrameSource* 34 return make_scoped_ptr(new Scheduler(
51 SchedulerFrameSourcesConstructor::ConstructUnthrottledFrameSource( 35 client, settings, layer_tree_host_id, task_runner, external_frame_source,
52 Scheduler* scheduler) { 36 synthetic_frame_source.Pass(), unthrottled_frame_source.Pass()));
53 TRACE_EVENT1("cc", "Scheduler::Scheduler()", "UnthrottledFrameSource",
54 "BackToBackBeginFrameSource");
55 DCHECK(!scheduler->unthrottled_frame_source_internal_);
56 scheduler->unthrottled_frame_source_internal_ =
57 BackToBackBeginFrameSource::Create(scheduler->task_runner_.get());
58 return scheduler->unthrottled_frame_source_internal_.get();
59 } 37 }
60 38
61 Scheduler::Scheduler( 39 Scheduler::Scheduler(
62 SchedulerClient* client, 40 SchedulerClient* client,
63 const SchedulerSettings& scheduler_settings, 41 const SchedulerSettings& settings,
64 int layer_tree_host_id, 42 int layer_tree_host_id,
65 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 43 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
66 scoped_ptr<BeginFrameSource> external_begin_frame_source, 44 BeginFrameSource* external_frame_source,
67 SchedulerFrameSourcesConstructor* frame_sources_constructor) 45 scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source,
68 : frame_source_(), 46 scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source)
69 primary_frame_source_(NULL), 47 : settings_(settings),
70 primary_frame_source_internal_(external_begin_frame_source.Pass()),
71 vsync_observer_(NULL),
72 authoritative_vsync_interval_(base::TimeDelta()),
73 last_vsync_timebase_(base::TimeTicks()),
74 throttle_frame_production_(false),
75 settings_(scheduler_settings),
76 client_(client), 48 client_(client),
77 layer_tree_host_id_(layer_tree_host_id), 49 layer_tree_host_id_(layer_tree_host_id),
78 task_runner_(task_runner), 50 task_runner_(task_runner),
51 external_frame_source_(external_frame_source),
52 synthetic_frame_source_(synthetic_frame_source.Pass()),
53 unthrottled_frame_source_(unthrottled_frame_source.Pass()),
54 frame_source_(BeginFrameSourceMultiplexer::Create()),
55 throttle_frame_production_(false),
79 begin_impl_frame_deadline_mode_( 56 begin_impl_frame_deadline_mode_(
80 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), 57 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE),
81 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), 58 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE),
82 state_machine_(scheduler_settings), 59 state_machine_(settings),
83 inside_process_scheduled_actions_(false), 60 inside_process_scheduled_actions_(false),
84 inside_action_(SchedulerStateMachine::ACTION_NONE), 61 inside_action_(SchedulerStateMachine::ACTION_NONE),
85 weak_factory_(this) { 62 weak_factory_(this) {
86 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), 63 TRACE_EVENT1("cc", "Scheduler::Scheduler", "settings", settings_.AsValue());
87 "Scheduler::Scheduler",
88 "settings",
89 settings_.AsValue());
90 DCHECK(client_); 64 DCHECK(client_);
91 DCHECK(!state_machine_.BeginFrameNeeded()); 65 DCHECK(!state_machine_.BeginFrameNeeded());
66 DCHECK_IMPLIES(settings_.use_external_begin_frame_source,
67 external_frame_source_);
68 DCHECK_IMPLIES(!settings_.use_external_begin_frame_source,
69 synthetic_frame_source_);
70 DCHECK(unthrottled_frame_source_);
92 71
93 begin_retro_frame_closure_ = 72 begin_retro_frame_closure_ =
94 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); 73 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr());
95 begin_impl_frame_deadline_closure_ = base::Bind( 74 begin_impl_frame_deadline_closure_ = base::Bind(
96 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); 75 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr());
97 76
98 frame_source_ = BeginFrameSourceMultiplexer::Create();
99 frame_source_->AddObserver(this); 77 frame_source_->AddObserver(this);
78 frame_source_->AddSource(primary_frame_source());
79 primary_frame_source()->SetClientReady();
100 80
101 // Primary frame source 81 frame_source_->AddSource(unthrottled_frame_source_.get());
102 primary_frame_source_ = 82 unthrottled_frame_source_->SetClientReady();
103 frame_sources_constructor->ConstructPrimaryFrameSource(this);
104 frame_source_->AddSource(primary_frame_source_);
105 primary_frame_source_->SetClientReady();
106 83
107 // Unthrottled frame source 84 SetThrottleFrameProduction(settings_.throttle_frame_production);
108 unthrottled_frame_source_ =
109 frame_sources_constructor->ConstructUnthrottledFrameSource(this);
110 frame_source_->AddSource(unthrottled_frame_source_);
111
112 SetThrottleFrameProduction(scheduler_settings.throttle_frame_production);
113 } 85 }
114 86
115 Scheduler::~Scheduler() { 87 Scheduler::~Scheduler() {
116 if (frame_source_->NeedsBeginFrames()) 88 if (frame_source_->NeedsBeginFrames())
117 frame_source_->SetNeedsBeginFrames(false); 89 frame_source_->SetNeedsBeginFrames(false);
118 frame_source_->SetActiveSource(nullptr); 90 frame_source_->SetActiveSource(nullptr);
119 } 91 }
120 92
121 base::TimeTicks Scheduler::Now() const { 93 base::TimeTicks Scheduler::Now() const {
122 base::TimeTicks now = base::TimeTicks::Now(); 94 base::TimeTicks now = base::TimeTicks::Now();
123 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), 95 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"),
124 "Scheduler::Now", 96 "Scheduler::Now",
125 "now", 97 "now",
126 now); 98 now);
127 return now; 99 return now;
128 } 100 }
129 101
130 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, 102 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase,
131 base::TimeDelta interval) { 103 base::TimeDelta interval) {
132 if (authoritative_vsync_interval_ != base::TimeDelta()) { 104 if (authoritative_vsync_interval_ != base::TimeDelta()) {
133 interval = authoritative_vsync_interval_; 105 interval = authoritative_vsync_interval_;
134 } else if (interval == base::TimeDelta()) { 106 } else if (interval == base::TimeDelta()) {
135 // TODO(brianderson): We should not be receiving 0 intervals. 107 // TODO(brianderson): We should not be receiving 0 intervals.
136 interval = BeginFrameArgs::DefaultInterval(); 108 interval = BeginFrameArgs::DefaultInterval();
137 } 109 }
138 110
139 last_vsync_timebase_ = timebase; 111 last_vsync_timebase_ = timebase;
140 112
141 if (vsync_observer_) 113 if (synthetic_frame_source_)
142 vsync_observer_->OnUpdateVSyncParameters(timebase, interval); 114 synthetic_frame_source_->OnUpdateVSyncParameters(timebase, interval);
143 } 115 }
144 116
145 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { 117 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) {
146 DCHECK_GE(draw_time.ToInternalValue(), 0); 118 DCHECK_GE(draw_time.ToInternalValue(), 0);
147 estimated_parent_draw_time_ = draw_time; 119 estimated_parent_draw_time_ = draw_time;
148 } 120 }
149 121
150 void Scheduler::SetCanStart() { 122 void Scheduler::SetCanStart() {
151 state_machine_.SetCanStart(); 123 state_machine_.SetCanStart();
152 ProcessScheduledActions(); 124 ProcessScheduledActions();
(...skipping 16 matching lines...) Expand all
169 141
170 void Scheduler::NotifyReadyToDraw() { 142 void Scheduler::NotifyReadyToDraw() {
171 // Future work might still needed for crbug.com/352894. 143 // Future work might still needed for crbug.com/352894.
172 state_machine_.NotifyReadyToDraw(); 144 state_machine_.NotifyReadyToDraw();
173 ProcessScheduledActions(); 145 ProcessScheduledActions();
174 } 146 }
175 147
176 void Scheduler::SetThrottleFrameProduction(bool throttle) { 148 void Scheduler::SetThrottleFrameProduction(bool throttle) {
177 throttle_frame_production_ = throttle; 149 throttle_frame_production_ = throttle;
178 if (throttle) { 150 if (throttle) {
179 frame_source_->SetActiveSource(primary_frame_source_); 151 frame_source_->SetActiveSource(primary_frame_source());
180 } else { 152 } else {
181 frame_source_->SetActiveSource(unthrottled_frame_source_); 153 frame_source_->SetActiveSource(unthrottled_frame_source_.get());
182 } 154 }
183 ProcessScheduledActions(); 155 ProcessScheduledActions();
184 } 156 }
185 157
186 void Scheduler::SetNeedsCommit() { 158 void Scheduler::SetNeedsCommit() {
187 state_machine_.SetNeedsCommit(); 159 state_machine_.SetNeedsCommit();
188 ProcessScheduledActions(); 160 ProcessScheduledActions();
189 } 161 }
190 162
191 void Scheduler::SetNeedsRedraw() { 163 void Scheduler::SetNeedsRedraw() {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 return true; 325 return true;
354 } 326 }
355 327
356 void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) { 328 void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) {
357 state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames); 329 state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames);
358 ProcessScheduledActions(); 330 ProcessScheduledActions();
359 } 331 }
360 332
361 void Scheduler::SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) { 333 void Scheduler::SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) {
362 authoritative_vsync_interval_ = interval; 334 authoritative_vsync_interval_ = interval;
363 if (vsync_observer_) 335 if (synthetic_frame_source_) {
364 vsync_observer_->OnUpdateVSyncParameters(last_vsync_timebase_, interval); 336 synthetic_frame_source_->OnUpdateVSyncParameters(last_vsync_timebase_,
337 interval);
338 }
365 } 339 }
366 340
367 void Scheduler::SetVideoNeedsBeginFrames(bool video_needs_begin_frames) { 341 void Scheduler::SetVideoNeedsBeginFrames(bool video_needs_begin_frames) {
368 state_machine_.SetVideoNeedsBeginFrames(video_needs_begin_frames); 342 state_machine_.SetVideoNeedsBeginFrames(video_needs_begin_frames);
369 ProcessScheduledActions(); 343 ProcessScheduledActions();
370 } 344 }
371 345
372 void Scheduler::OnDrawForOutputSurface() { 346 void Scheduler::OnDrawForOutputSurface() {
373 DCHECK(settings_.using_synchronous_renderer_compositor); 347 DCHECK(settings_.using_synchronous_renderer_compositor);
374 DCHECK_EQ(state_machine_.begin_impl_frame_state(), 348 DCHECK_EQ(state_machine_.begin_impl_frame_state(),
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 } 735 }
762 736
763 bool Scheduler::IsBeginMainFrameSentOrStarted() const { 737 bool Scheduler::IsBeginMainFrameSentOrStarted() const {
764 return (state_machine_.commit_state() == 738 return (state_machine_.commit_state() ==
765 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || 739 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
766 state_machine_.commit_state() == 740 state_machine_.commit_state() ==
767 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); 741 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED);
768 } 742 }
769 743
770 } // namespace cc 744 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler.h ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698