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

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

Issue 218633010: cc: Handle retroactive BeginFrames in the Scheduler. (Closed) Base URL: http://git.chromium.org/chromium/src.git@compositorVsyncDisable
Patch Set: Created 6 years, 8 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
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 #include "base/auto_reset.h" 8 #include "base/auto_reset.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "cc/debug/devtools_instrumentation.h" 11 #include "cc/debug/devtools_instrumentation.h"
12 #include "cc/debug/traced_value.h" 12 #include "cc/debug/traced_value.h"
13 #include "ui/gfx/frame_time.h" 13 #include "ui/gfx/frame_time.h"
14 14
15 namespace cc { 15 namespace cc {
16 16
17 Scheduler::Scheduler( 17 Scheduler::Scheduler(
18 SchedulerClient* client, 18 SchedulerClient* client,
19 const SchedulerSettings& scheduler_settings, 19 const SchedulerSettings& scheduler_settings,
20 int layer_tree_host_id, 20 int layer_tree_host_id,
21 const scoped_refptr<base::SequencedTaskRunner>& impl_task_runner) 21 const scoped_refptr<base::SequencedTaskRunner>& impl_task_runner)
22 : settings_(scheduler_settings), 22 : settings_(scheduler_settings),
23 client_(client), 23 client_(client),
24 layer_tree_host_id_(layer_tree_host_id), 24 layer_tree_host_id_(layer_tree_host_id),
25 impl_task_runner_(impl_task_runner), 25 impl_task_runner_(impl_task_runner),
26 last_set_needs_begin_impl_frame_(false), 26 last_set_needs_begin_frame_(false),
27 begin_retro_frame_posted_(false),
27 state_machine_(scheduler_settings), 28 state_machine_(scheduler_settings),
28 inside_process_scheduled_actions_(false), 29 inside_process_scheduled_actions_(false),
29 inside_action_(SchedulerStateMachine::ACTION_NONE), 30 inside_action_(SchedulerStateMachine::ACTION_NONE),
30 weak_factory_(this) { 31 weak_factory_(this) {
31 DCHECK(client_); 32 DCHECK(client_);
32 DCHECK(!state_machine_.BeginImplFrameNeeded()); 33 DCHECK(!state_machine_.BeginFrameNeeded());
33 if (settings_.main_frame_before_activation_enabled) { 34 if (settings_.main_frame_before_activation_enabled) {
34 DCHECK(settings_.main_frame_before_draw_enabled); 35 DCHECK(settings_.main_frame_before_draw_enabled);
35 } 36 }
36 } 37 }
37 38
38 Scheduler::~Scheduler() {} 39 Scheduler::~Scheduler() {}
39 40
40 void Scheduler::SetCanStart() { 41 void Scheduler::SetCanStart() {
41 state_machine_.SetCanStart(); 42 state_machine_.SetCanStart();
42 ProcessScheduledActions(); 43 ProcessScheduledActions();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 ProcessScheduledActions(); 110 ProcessScheduledActions();
110 } 111 }
111 112
112 void Scheduler::DidManageTiles() { 113 void Scheduler::DidManageTiles() {
113 state_machine_.DidManageTiles(); 114 state_machine_.DidManageTiles();
114 } 115 }
115 116
116 void Scheduler::DidLoseOutputSurface() { 117 void Scheduler::DidLoseOutputSurface() {
117 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface"); 118 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface");
118 state_machine_.DidLoseOutputSurface(); 119 state_machine_.DidLoseOutputSurface();
119 last_set_needs_begin_impl_frame_ = false; 120 last_set_needs_begin_frame_ = false;
120 ProcessScheduledActions(); 121 ProcessScheduledActions();
121 } 122 }
122 123
123 void Scheduler::DidCreateAndInitializeOutputSurface() { 124 void Scheduler::DidCreateAndInitializeOutputSurface() {
124 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); 125 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface");
125 DCHECK(!last_set_needs_begin_impl_frame_); 126 DCHECK(!last_set_needs_begin_frame_);
126 DCHECK(begin_impl_frame_deadline_closure_.IsCancelled()); 127 DCHECK(begin_impl_frame_deadline_closure_.IsCancelled());
127 state_machine_.DidCreateAndInitializeOutputSurface(); 128 state_machine_.DidCreateAndInitializeOutputSurface();
128 ProcessScheduledActions(); 129 ProcessScheduledActions();
129 } 130 }
130 131
131 void Scheduler::NotifyBeginMainFrameStarted() { 132 void Scheduler::NotifyBeginMainFrameStarted() {
132 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); 133 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted");
133 state_machine_.NotifyBeginMainFrameStarted(); 134 state_machine_.NotifyBeginMainFrameStarted();
134 } 135 }
135 136
136 base::TimeTicks Scheduler::AnticipatedDrawTime() const { 137 base::TimeTicks Scheduler::AnticipatedDrawTime() const {
137 if (!last_set_needs_begin_impl_frame_ || 138 if (!last_set_needs_begin_frame_ ||
138 last_begin_impl_frame_args_.interval <= base::TimeDelta()) 139 begin_impl_frame_args_.interval <= base::TimeDelta())
139 return base::TimeTicks(); 140 return base::TimeTicks();
140 141
141 base::TimeTicks now = gfx::FrameTime::Now(); 142 base::TimeTicks now = gfx::FrameTime::Now();
142 base::TimeTicks timebase = std::max(last_begin_impl_frame_args_.frame_time, 143 base::TimeTicks timebase = std::max(begin_impl_frame_args_.frame_time,
143 last_begin_impl_frame_args_.deadline); 144 begin_impl_frame_args_.deadline);
144 int64 intervals = 145 int64 intervals = 1 + ((now - timebase) / begin_impl_frame_args_.interval);
145 1 + ((now - timebase) / last_begin_impl_frame_args_.interval); 146 return timebase + (begin_impl_frame_args_.interval * intervals);
146 return timebase + (last_begin_impl_frame_args_.interval * intervals);
147 } 147 }
148 148
149 base::TimeTicks Scheduler::LastBeginImplFrameTime() { 149 base::TimeTicks Scheduler::LastBeginImplFrameTime() {
150 return last_begin_impl_frame_args_.frame_time; 150 return begin_impl_frame_args_.frame_time;
151 } 151 }
152 152
153 void Scheduler::SetupNextBeginImplFrameIfNeeded() { 153 void Scheduler::SetupNextBeginFrameIfNeeded() {
154 bool needs_begin_impl_frame = 154 bool needs_begin_frame = state_machine_.BeginFrameNeeded();
155 state_machine_.BeginImplFrameNeeded(); 155 if (needs_begin_frame != last_set_needs_begin_frame_) {
156 client_->SetNeedsBeginFrame(needs_begin_frame);
157 last_set_needs_begin_frame_ = needs_begin_frame;
158 }
156 159
157 bool at_end_of_deadline = 160 // Handle Retroactive BeginFrames
Sami 2014/04/01 13:09:10 nit: Add '.'.
158 state_machine_.begin_impl_frame_state() == 161 if (state_machine_.begin_impl_frame_state() ==
159 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; 162 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE &&
160 163 begin_retro_frame_args_.IsValid()) {
Sami 2014/04/01 13:09:10 Do we also need to check for needs_begin_frame?
brianderson 2014/04/01 19:12:53 That would be better, yes. I was thinking that we
brianderson 2014/04/02 04:15:57 Done.
161 bool should_call_set_needs_begin_impl_frame = 164 begin_retro_frame_posted_ = true;
162 // Always request the BeginImplFrame immediately if it wasn't needed 165 begin_frame_args_ = begin_retro_frame_args_;
163 // before. 166 begin_retro_frame_args_ = BeginFrameArgs();
164 (needs_begin_impl_frame && !last_set_needs_begin_impl_frame_) || 167 impl_task_runner_->PostTask(
165 // We always need to explicitly request our next BeginImplFrame. 168 FROM_HERE,
166 at_end_of_deadline; 169 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()));
167
168 if (should_call_set_needs_begin_impl_frame) {
169 client_->SetNeedsBeginImplFrame(needs_begin_impl_frame);
170 last_set_needs_begin_impl_frame_ = needs_begin_impl_frame;
171 } 170 }
172 171
173 bool needs_advance_commit_state_timer = false; 172 bool needs_advance_commit_state_timer = false;
174 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but 173 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but
175 // aren't expecting any more BeginImplFrames. This should only be needed by 174 // aren't expecting any more BeginFrames. This should only be needed by
176 // the synchronous compositor when BeginImplFrameNeeded is false. 175 // the synchronous compositor when BeginFrameNeeded is false.
177 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { 176 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) {
178 DCHECK(!state_machine_.SupportsProactiveBeginImplFrame()); 177 DCHECK(!state_machine_.SupportsProactiveBeginFrame());
179 DCHECK(!needs_begin_impl_frame); 178 DCHECK(!needs_begin_frame);
180 if (poll_for_draw_triggers_closure_.IsCancelled()) { 179 if (poll_for_draw_triggers_closure_.IsCancelled()) {
181 poll_for_draw_triggers_closure_.Reset( 180 poll_for_draw_triggers_closure_.Reset(
182 base::Bind(&Scheduler::PollForAnticipatedDrawTriggers, 181 base::Bind(&Scheduler::PollForAnticipatedDrawTriggers,
183 weak_factory_.GetWeakPtr())); 182 weak_factory_.GetWeakPtr()));
184 impl_task_runner_->PostDelayedTask( 183 impl_task_runner_->PostDelayedTask(
185 FROM_HERE, 184 FROM_HERE,
186 poll_for_draw_triggers_closure_.callback(), 185 poll_for_draw_triggers_closure_.callback(),
187 last_begin_impl_frame_args_.interval); 186 begin_impl_frame_args_.interval);
188 } 187 }
189 } else { 188 } else {
190 poll_for_draw_triggers_closure_.Cancel(); 189 poll_for_draw_triggers_closure_.Cancel();
191 190
192 // At this point we'd prefer to advance through the commit flow by 191 // At this point we'd prefer to advance through the commit flow by
193 // drawing a frame, however it's possible that the frame rate controller 192 // drawing a frame, however it's possible that the frame rate controller
194 // will not give us a BeginImplFrame until the commit completes. See 193 // will not give us a BeginFrame until the commit completes. See
195 // crbug.com/317430 for an example of a swap ack being held on commit. Thus 194 // crbug.com/317430 for an example of a swap ack being held on commit. Thus
196 // we set a repeating timer to poll on ProcessScheduledActions until we 195 // we set a repeating timer to poll on ProcessScheduledActions until we
197 // successfully reach BeginImplFrame. Synchronous compositor does not use 196 // successfully reach BeginFrame. Synchronous compositor does not use
198 // frame rate controller or have the circular wait in the bug. 197 // frame rate controller or have the circular wait in the bug.
199 if (IsBeginMainFrameSentOrStarted() && 198 if (IsBeginMainFrameSentOrStarted() &&
200 !settings_.using_synchronous_renderer_compositor) { 199 !settings_.using_synchronous_renderer_compositor) {
201 needs_advance_commit_state_timer = true; 200 needs_advance_commit_state_timer = true;
202 } 201 }
203 } 202 }
204 if (needs_advance_commit_state_timer != 203 if (needs_advance_commit_state_timer !=
205 advance_commit_state_timer_.IsRunning()) { 204 advance_commit_state_timer_.IsRunning()) {
206 if (needs_advance_commit_state_timer && 205 if (needs_advance_commit_state_timer && begin_impl_frame_args_.IsValid()) {
207 last_begin_impl_frame_args_.IsValid()) {
208 // Since we'd rather get a BeginImplFrame by the normal mechanism, we 206 // Since we'd rather get a BeginImplFrame by the normal mechanism, we
209 // set the interval to twice the interval from the previous frame. 207 // set the interval to twice the interval from the previous frame.
210 advance_commit_state_timer_.Start( 208 advance_commit_state_timer_.Start(
211 FROM_HERE, 209 FROM_HERE,
212 last_begin_impl_frame_args_.interval * 2, 210 begin_impl_frame_args_.interval * 2,
213 base::Bind(&Scheduler::ProcessScheduledActions, 211 base::Bind(&Scheduler::ProcessScheduledActions,
214 base::Unretained(this))); 212 base::Unretained(this)));
215 } else { 213 } else {
216 advance_commit_state_timer_.Stop(); 214 advance_commit_state_timer_.Stop();
217 } 215 }
218 } 216 }
219 } 217 }
220 218
221 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { 219 void Scheduler::BeginFrame(const BeginFrameArgs& args) {
222 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame"); 220 if (!begin_retro_frame_posted_ &&
221 state_machine_.begin_impl_frame_state() ==
222 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) {
223 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame");
224 begin_frame_args_ = args;
225 BeginImplFrame();
226 } else {
227 TRACE_EVENT0("cc", "Scheduler::BeginFrame deferred");
228 begin_retro_frame_args_ = args;
229 }
230 }
231
232 void Scheduler::BeginRetroFrame() {
233 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame");
234 begin_retro_frame_posted_ = false;
235 BeginImplFrame();
236 }
237
238 void Scheduler::BeginImplFrame() {
223 DCHECK(state_machine_.begin_impl_frame_state() == 239 DCHECK(state_machine_.begin_impl_frame_state() ==
224 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 240 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
225 DCHECK(state_machine_.HasInitializedOutputSurface()); 241 DCHECK(state_machine_.HasInitializedOutputSurface());
226 242
227 last_begin_impl_frame_args_ = args; 243 begin_impl_frame_args_ = begin_frame_args_;
228 last_begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate(); 244 begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate();
229 245
230 if (!state_machine_.smoothness_takes_priority() && 246 if (!state_machine_.smoothness_takes_priority() &&
231 state_machine_.MainThreadIsInHighLatencyMode() && 247 state_machine_.MainThreadIsInHighLatencyMode() &&
232 CanCommitAndActivateBeforeDeadline()) { 248 CanCommitAndActivateBeforeDeadline()) {
233 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); 249 state_machine_.SetSkipNextBeginMainFrameToReduceLatency();
234 } 250 }
235 251
236 state_machine_.OnBeginImplFrame(last_begin_impl_frame_args_); 252 client_->OnBeginImplFrame(begin_impl_frame_args_);
253 state_machine_.OnBeginImplFrame(begin_impl_frame_args_);
237 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); 254 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_);
238 255
239 ProcessScheduledActions(); 256 ProcessScheduledActions();
240 257
241 if (!state_machine_.HasInitializedOutputSurface()) 258 if (!state_machine_.HasInitializedOutputSurface())
242 return; 259 return;
243 260
244 state_machine_.OnBeginImplFrameDeadlinePending(); 261 state_machine_.OnBeginImplFrameDeadlinePending();
245 base::TimeTicks adjusted_deadline = AdjustedBeginImplFrameDeadline(); 262 base::TimeTicks adjusted_deadline = AdjustedBeginImplFrameDeadline();
246 ScheduleBeginImplFrameDeadline(adjusted_deadline); 263 ScheduleBeginImplFrameDeadline(adjusted_deadline);
247 } 264 }
248 265
249 base::TimeTicks Scheduler::AdjustedBeginImplFrameDeadline() const { 266 base::TimeTicks Scheduler::AdjustedBeginImplFrameDeadline() const {
250 if (settings_.using_synchronous_renderer_compositor) { 267 if (settings_.using_synchronous_renderer_compositor) {
251 // The synchronous compositor needs to draw right away. 268 // The synchronous compositor needs to draw right away.
252 return base::TimeTicks(); 269 return base::TimeTicks();
253 } else if (state_machine_.ShouldTriggerBeginImplFrameDeadlineEarly()) { 270 } else if (state_machine_.ShouldTriggerBeginImplFrameDeadlineEarly()) {
254 // We are ready to draw a new active tree immediately. 271 // We are ready to draw a new active tree immediately.
255 return base::TimeTicks(); 272 return base::TimeTicks();
256 } else if (state_machine_.needs_redraw()) { 273 } else if (state_machine_.needs_redraw()) {
257 // We have an animation or fast input path on the impl thread that wants 274 // We have an animation or fast input path on the impl thread that wants
258 // to draw, so don't wait too long for a new active tree. 275 // to draw, so don't wait too long for a new active tree.
259 return last_begin_impl_frame_args_.deadline; 276 return begin_impl_frame_args_.deadline;
260 } else { 277 } else {
261 // The impl thread doesn't have anything it wants to draw and we are just 278 // The impl thread doesn't have anything it wants to draw and we are just
262 // waiting for a new active tree, so post the deadline for the next 279 // waiting for a new active tree, so post the deadline for the next
263 // expected BeginImplFrame start. This allows us to draw immediately when 280 // expected BeginImplFrame start. This allows us to draw immediately when
264 // there is a new active tree, instead of waiting for the next 281 // there is a new active tree, instead of waiting for the next
265 // BeginImplFrame. 282 // BeginImplFrame.
266 // TODO(brianderson): Handle long deadlines (that are past the next frame's 283 // TODO(brianderson): Handle long deadlines (that are past the next frame's
267 // frame time) properly instead of using this hack. 284 // frame time) properly instead of using this hack.
268 return last_begin_impl_frame_args_.frame_time + 285 return begin_impl_frame_args_.frame_time + begin_impl_frame_args_.interval;
269 last_begin_impl_frame_args_.interval;
270 } 286 }
271 } 287 }
272 288
273 void Scheduler::ScheduleBeginImplFrameDeadline(base::TimeTicks deadline) { 289 void Scheduler::ScheduleBeginImplFrameDeadline(base::TimeTicks deadline) {
274 if (settings_.using_synchronous_renderer_compositor) { 290 if (settings_.using_synchronous_renderer_compositor) {
275 // The synchronous renderer compositor has to make its GL calls 291 // The synchronous renderer compositor has to make its GL calls
276 // within this call. 292 // within this call.
277 // TODO(brianderson): Have the OutputSurface initiate the deadline tasks 293 // TODO(brianderson): Have the OutputSurface initiate the deadline tasks
278 // so the sychronous renderer compositor can take advantage of splitting 294 // so the sychronous renderer compositor can take advantage of splitting
279 // up the BeginImplFrame and deadline as well. 295 // up the BeginImplFrame and deadline as well.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 break; 407 break;
392 case SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD: 408 case SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD:
393 client_->ScheduledActionAcquireLayerTexturesForMainThread(); 409 client_->ScheduledActionAcquireLayerTexturesForMainThread();
394 break; 410 break;
395 case SchedulerStateMachine::ACTION_MANAGE_TILES: 411 case SchedulerStateMachine::ACTION_MANAGE_TILES:
396 client_->ScheduledActionManageTiles(); 412 client_->ScheduledActionManageTiles();
397 break; 413 break;
398 } 414 }
399 } while (action != SchedulerStateMachine::ACTION_NONE); 415 } while (action != SchedulerStateMachine::ACTION_NONE);
400 416
401 SetupNextBeginImplFrameIfNeeded(); 417 SetupNextBeginFrameIfNeeded();
402 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime()); 418 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime());
403 419
404 if (state_machine_.ShouldTriggerBeginImplFrameDeadlineEarly()) { 420 if (state_machine_.ShouldTriggerBeginImplFrameDeadlineEarly()) {
405 DCHECK(!settings_.using_synchronous_renderer_compositor); 421 DCHECK(!settings_.using_synchronous_renderer_compositor);
406 ScheduleBeginImplFrameDeadline(base::TimeTicks()); 422 ScheduleBeginImplFrameDeadline(base::TimeTicks());
407 } 423 }
408 } 424 }
409 425
410 bool Scheduler::WillDrawIfNeeded() const { 426 bool Scheduler::WillDrawIfNeeded() const {
411 return !state_machine_.PendingDrawsShouldBeAborted(); 427 return !state_machine_.PendingDrawsShouldBeAborted();
(...skipping 16 matching lines...) Expand all
428 "commit_to_activate_duration_estimate_ms", 444 "commit_to_activate_duration_estimate_ms",
429 client_->CommitToActivateDurationEstimate().InMillisecondsF()); 445 client_->CommitToActivateDurationEstimate().InMillisecondsF());
430 state->Set("client_state", client_state.release()); 446 state->Set("client_state", client_state.release());
431 return state.PassAs<base::Value>(); 447 return state.PassAs<base::Value>();
432 } 448 }
433 449
434 bool Scheduler::CanCommitAndActivateBeforeDeadline() const { 450 bool Scheduler::CanCommitAndActivateBeforeDeadline() const {
435 // Check if the main thread computation and commit can be finished before the 451 // Check if the main thread computation and commit can be finished before the
436 // impl thread's deadline. 452 // impl thread's deadline.
437 base::TimeTicks estimated_draw_time = 453 base::TimeTicks estimated_draw_time =
438 last_begin_impl_frame_args_.frame_time + 454 begin_impl_frame_args_.frame_time +
439 client_->BeginMainFrameToCommitDurationEstimate() + 455 client_->BeginMainFrameToCommitDurationEstimate() +
440 client_->CommitToActivateDurationEstimate(); 456 client_->CommitToActivateDurationEstimate();
441 457
442 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), 458 TRACE_EVENT2(
443 "CanCommitAndActivateBeforeDeadline", 459 TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
444 "time_left_after_drawing_ms", 460 "CanCommitAndActivateBeforeDeadline",
445 (last_begin_impl_frame_args_.deadline - estimated_draw_time) 461 "time_left_after_drawing_ms",
446 .InMillisecondsF(), 462 (begin_impl_frame_args_.deadline - estimated_draw_time).InMillisecondsF(),
447 "state", 463 "state",
448 TracedValue::FromValue(StateAsValue().release())); 464 TracedValue::FromValue(StateAsValue().release()));
449 465
450 return estimated_draw_time < last_begin_impl_frame_args_.deadline; 466 return estimated_draw_time < begin_impl_frame_args_.deadline;
451 } 467 }
452 468
453 bool Scheduler::IsBeginMainFrameSentOrStarted() const { 469 bool Scheduler::IsBeginMainFrameSentOrStarted() const {
454 return (state_machine_.commit_state() == 470 return (state_machine_.commit_state() ==
455 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || 471 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
456 state_machine_.commit_state() == 472 state_machine_.commit_state() ==
457 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); 473 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED);
458 } 474 }
459 475
460 } // namespace cc 476 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698