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 #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 "cc/scheduler/delay_based_time_source.h" |
13 #include "ui/gfx/frame_time.h" | 14 #include "ui/gfx/frame_time.h" |
14 | 15 |
15 namespace cc { | 16 namespace cc { |
16 | 17 |
| 18 class SyntheticBeginFrameSource : public TimeSourceClient { |
| 19 public: |
| 20 SyntheticBeginFrameSource(Scheduler* scheduler, |
| 21 base::SingleThreadTaskRunner* task_runner) |
| 22 : scheduler_(scheduler) { |
| 23 if (gfx::FrameTime::TimestampsAreHighRes()) { |
| 24 time_source_ = DelayBasedTimeSourceHighRes::Create( |
| 25 scheduler_->VSyncInterval(), task_runner); |
| 26 } else { |
| 27 time_source_ = DelayBasedTimeSource::Create(scheduler_->VSyncInterval(), |
| 28 task_runner); |
| 29 } |
| 30 time_source_->SetClient(this); |
| 31 } |
| 32 |
| 33 virtual ~SyntheticBeginFrameSource() {} |
| 34 |
| 35 // Updates the phase and frequency of the timer. |
| 36 void CommitVSyncParameters(base::TimeTicks timebase, |
| 37 base::TimeDelta interval) { |
| 38 time_source_->SetTimebaseAndInterval(timebase, interval); |
| 39 } |
| 40 |
| 41 // Activates future BeginFrames and, if activating, pushes the most |
| 42 // recently missed BeginFrame to the back of a retroactive queue. |
| 43 void SetNeedsBeginFrame(bool needs_begin_frame, |
| 44 std::deque<BeginFrameArgs>* begin_retro_frame_args) { |
| 45 base::TimeTicks missed_tick_time = |
| 46 time_source_->SetActive(needs_begin_frame); |
| 47 if (!missed_tick_time.is_null()) { |
| 48 begin_retro_frame_args->push_back( |
| 49 CreateSyntheticBeginFrameArgs(missed_tick_time)); |
| 50 } |
| 51 } |
| 52 |
| 53 // TimeSourceClient implementation of OnTimerTick triggers a BeginFrame. |
| 54 virtual void OnTimerTick() OVERRIDE { |
| 55 BeginFrameArgs begin_frame_args( |
| 56 CreateSyntheticBeginFrameArgs(time_source_->LastTickTime())); |
| 57 scheduler_->BeginFrame(begin_frame_args); |
| 58 } |
| 59 |
| 60 private: |
| 61 BeginFrameArgs CreateSyntheticBeginFrameArgs(base::TimeTicks frame_time) { |
| 62 base::TimeTicks deadline = |
| 63 time_source_->NextTickTime() - scheduler_->EstimatedParentDrawTime(); |
| 64 return BeginFrameArgs::Create( |
| 65 frame_time, deadline, scheduler_->VSyncInterval()); |
| 66 } |
| 67 |
| 68 Scheduler* scheduler_; |
| 69 scoped_refptr<TimeSource> time_source_; |
| 70 }; |
| 71 |
17 Scheduler::Scheduler( | 72 Scheduler::Scheduler( |
18 SchedulerClient* client, | 73 SchedulerClient* client, |
19 const SchedulerSettings& scheduler_settings, | 74 const SchedulerSettings& scheduler_settings, |
20 int layer_tree_host_id, | 75 int layer_tree_host_id, |
21 const scoped_refptr<base::SequencedTaskRunner>& impl_task_runner) | 76 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) |
22 : settings_(scheduler_settings), | 77 : settings_(scheduler_settings), |
23 client_(client), | 78 client_(client), |
24 layer_tree_host_id_(layer_tree_host_id), | 79 layer_tree_host_id_(layer_tree_host_id), |
25 impl_task_runner_(impl_task_runner), | 80 impl_task_runner_(impl_task_runner), |
| 81 vsync_interval_(BeginFrameArgs::DefaultInterval()), |
26 last_set_needs_begin_frame_(false), | 82 last_set_needs_begin_frame_(false), |
| 83 begin_unthrottled_frame_posted_(false), |
27 begin_retro_frame_posted_(false), | 84 begin_retro_frame_posted_(false), |
28 state_machine_(scheduler_settings), | 85 state_machine_(scheduler_settings), |
29 inside_process_scheduled_actions_(false), | 86 inside_process_scheduled_actions_(false), |
30 inside_action_(SchedulerStateMachine::ACTION_NONE), | 87 inside_action_(SchedulerStateMachine::ACTION_NONE), |
31 weak_factory_(this) { | 88 weak_factory_(this) { |
32 DCHECK(client_); | 89 DCHECK(client_); |
33 DCHECK(!state_machine_.BeginFrameNeeded()); | 90 DCHECK(!state_machine_.BeginFrameNeeded()); |
34 if (settings_.main_frame_before_activation_enabled) { | 91 if (settings_.main_frame_before_activation_enabled) { |
35 DCHECK(settings_.main_frame_before_draw_enabled); | 92 DCHECK(settings_.main_frame_before_draw_enabled); |
36 } | 93 } |
37 | 94 |
38 begin_retro_frame_closure_ = | 95 begin_retro_frame_closure_ = |
39 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); | 96 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
| 97 begin_unthrottled_frame_closure_ = |
| 98 base::Bind(&Scheduler::BeginUnthrottledFrame, weak_factory_.GetWeakPtr()); |
40 begin_impl_frame_deadline_closure_ = base::Bind( | 99 begin_impl_frame_deadline_closure_ = base::Bind( |
41 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); | 100 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); |
42 poll_for_draw_triggers_closure_ = base::Bind( | 101 poll_for_draw_triggers_closure_ = base::Bind( |
43 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); | 102 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); |
44 advance_commit_state_closure_ = base::Bind( | 103 advance_commit_state_closure_ = base::Bind( |
45 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); | 104 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); |
| 105 |
| 106 if (!settings_.begin_frame_scheduling_enabled) { |
| 107 SetupSyntheticBeginFrames(); |
| 108 } |
46 } | 109 } |
47 | 110 |
48 Scheduler::~Scheduler() {} | 111 Scheduler::~Scheduler() { |
| 112 if (synthetic_begin_frame_source_) { |
| 113 synthetic_begin_frame_source_->SetNeedsBeginFrame(false, |
| 114 &begin_retro_frame_args_); |
| 115 } |
| 116 } |
| 117 |
| 118 void Scheduler::SetupSyntheticBeginFrames() { |
| 119 DCHECK(!synthetic_begin_frame_source_); |
| 120 synthetic_begin_frame_source_.reset( |
| 121 new SyntheticBeginFrameSource(this, impl_task_runner_.get())); |
| 122 } |
| 123 |
| 124 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, |
| 125 base::TimeDelta interval) { |
| 126 // TODO(brianderson): We should not be receiving 0 intervals. |
| 127 if (interval == base::TimeDelta()) |
| 128 interval = BeginFrameArgs::DefaultInterval(); |
| 129 vsync_interval_ = interval; |
| 130 if (!settings_.begin_frame_scheduling_enabled) |
| 131 synthetic_begin_frame_source_->CommitVSyncParameters(timebase, interval); |
| 132 } |
| 133 |
| 134 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
| 135 estimated_parent_draw_time_ = draw_time; |
| 136 } |
49 | 137 |
50 void Scheduler::SetCanStart() { | 138 void Scheduler::SetCanStart() { |
51 state_machine_.SetCanStart(); | 139 state_machine_.SetCanStart(); |
52 ProcessScheduledActions(); | 140 ProcessScheduledActions(); |
53 } | 141 } |
54 | 142 |
55 void Scheduler::SetVisible(bool visible) { | 143 void Scheduler::SetVisible(bool visible) { |
56 state_machine_.SetVisible(visible); | 144 state_machine_.SetVisible(visible); |
57 ProcessScheduledActions(); | 145 ProcessScheduledActions(); |
58 } | 146 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 return timebase + (begin_impl_frame_args_.interval * intervals); | 257 return timebase + (begin_impl_frame_args_.interval * intervals); |
170 } | 258 } |
171 | 259 |
172 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 260 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
173 return begin_impl_frame_args_.frame_time; | 261 return begin_impl_frame_args_.frame_time; |
174 } | 262 } |
175 | 263 |
176 void Scheduler::SetupNextBeginFrameIfNeeded() { | 264 void Scheduler::SetupNextBeginFrameIfNeeded() { |
177 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); | 265 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); |
178 | 266 |
| 267 if (settings_.throttle_frame_production) { |
| 268 SetupNextBeginFrameWhenVSyncThrottlingEnabled(needs_begin_frame); |
| 269 } else { |
| 270 SetupNextBeginFrameWhenVSyncThrottlingDisabled(needs_begin_frame); |
| 271 } |
| 272 SetupPollingMechanisms(needs_begin_frame); |
| 273 } |
| 274 |
| 275 // When we are throttling frame production, we request BeginFrames |
| 276 // from the OutputSurface. |
| 277 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled( |
| 278 bool needs_begin_frame) { |
179 bool at_end_of_deadline = | 279 bool at_end_of_deadline = |
180 state_machine_.begin_impl_frame_state() == | 280 state_machine_.begin_impl_frame_state() == |
181 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; | 281 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; |
182 | 282 |
183 bool should_call_set_needs_begin_frame = | 283 bool should_call_set_needs_begin_frame = |
184 // Always request the BeginFrame immediately if it wasn't needed before. | 284 // Always request the BeginFrame immediately if it wasn't needed before. |
185 (needs_begin_frame && !last_set_needs_begin_frame_) || | 285 (needs_begin_frame && !last_set_needs_begin_frame_) || |
186 // We always need to explicitly request our next BeginFrame. | 286 // Only stop requesting BeginFrames after a deadline. |
187 at_end_of_deadline; | 287 (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); |
188 | 288 |
189 if (should_call_set_needs_begin_frame) { | 289 if (should_call_set_needs_begin_frame) { |
190 client_->SetNeedsBeginFrame(needs_begin_frame); | 290 if (settings_.begin_frame_scheduling_enabled) { |
| 291 client_->SetNeedsBeginFrame(needs_begin_frame); |
| 292 } else { |
| 293 synthetic_begin_frame_source_->SetNeedsBeginFrame( |
| 294 needs_begin_frame, &begin_retro_frame_args_); |
| 295 } |
191 last_set_needs_begin_frame_ = needs_begin_frame; | 296 last_set_needs_begin_frame_ = needs_begin_frame; |
192 } | 297 } |
193 | 298 |
194 // Handle retroactive BeginFrames. | 299 PostBeginRetroFrameIfNeeded(); |
195 if (last_set_needs_begin_frame_) | 300 } |
196 PostBeginRetroFrameIfNeeded(); | |
197 | 301 |
| 302 // When we aren't throttling frame production, we initiate a BeginFrame |
| 303 // as soon as one is needed. |
| 304 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingDisabled( |
| 305 bool needs_begin_frame) { |
| 306 last_set_needs_begin_frame_ = needs_begin_frame; |
| 307 |
| 308 if (!needs_begin_frame || begin_unthrottled_frame_posted_) |
| 309 return; |
| 310 |
| 311 if (state_machine_.begin_impl_frame_state() != |
| 312 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE && |
| 313 state_machine_.begin_impl_frame_state() != |
| 314 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { |
| 315 return; |
| 316 } |
| 317 |
| 318 begin_unthrottled_frame_posted_ = true; |
| 319 impl_task_runner_->PostTask(FROM_HERE, begin_unthrottled_frame_closure_); |
| 320 } |
| 321 |
| 322 // BeginUnthrottledFrame is used when we aren't throttling frame production. |
| 323 // This will usually be because VSync is disabled. |
| 324 void Scheduler::BeginUnthrottledFrame() { |
| 325 DCHECK(!settings_.throttle_frame_production); |
| 326 DCHECK(begin_retro_frame_args_.empty()); |
| 327 |
| 328 base::TimeTicks now = gfx::FrameTime::Now(); |
| 329 base::TimeTicks deadline = now + vsync_interval_; |
| 330 |
| 331 BeginFrameArgs begin_frame_args = |
| 332 BeginFrameArgs::Create(now, deadline, vsync_interval_); |
| 333 BeginImplFrame(begin_frame_args); |
| 334 |
| 335 begin_unthrottled_frame_posted_ = false; |
| 336 } |
| 337 |
| 338 // We may need to poll when we can't rely on BeginFrame to advance certain |
| 339 // state or to avoid deadlock. |
| 340 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { |
198 bool needs_advance_commit_state_timer = false; | 341 bool needs_advance_commit_state_timer = false; |
199 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but | 342 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but |
200 // aren't expecting any more BeginFrames. This should only be needed by | 343 // aren't expecting any more BeginFrames. This should only be needed by |
201 // the synchronous compositor when BeginFrameNeeded is false. | 344 // the synchronous compositor when BeginFrameNeeded is false. |
202 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { | 345 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { |
203 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); | 346 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); |
204 DCHECK(!needs_begin_frame); | 347 DCHECK(!needs_begin_frame); |
205 if (poll_for_draw_triggers_task_.IsCancelled()) { | 348 if (poll_for_draw_triggers_task_.IsCancelled()) { |
206 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); | 349 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); |
207 base::TimeDelta delay = begin_impl_frame_args_.IsValid() | 350 base::TimeDelta delay = begin_impl_frame_args_.IsValid() |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 } else { | 382 } else { |
240 advance_commit_state_task_.Cancel(); | 383 advance_commit_state_task_.Cancel(); |
241 } | 384 } |
242 } | 385 } |
243 | 386 |
244 // BeginFrame is the mechanism that tells us that now is a good time to start | 387 // BeginFrame is the mechanism that tells us that now is a good time to start |
245 // making a frame. Usually this means that user input for the frame is complete. | 388 // making a frame. Usually this means that user input for the frame is complete. |
246 // If the scheduler is busy, we queue the BeginFrame to be handled later as | 389 // If the scheduler is busy, we queue the BeginFrame to be handled later as |
247 // a BeginRetroFrame. | 390 // a BeginRetroFrame. |
248 void Scheduler::BeginFrame(const BeginFrameArgs& args) { | 391 void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
| 392 TRACE_EVENT0("cc", "Scheduler::BeginFrame"); |
| 393 DCHECK(settings_.throttle_frame_production); |
| 394 |
249 bool should_defer_begin_frame; | 395 bool should_defer_begin_frame; |
250 if (settings_.using_synchronous_renderer_compositor) { | 396 if (settings_.using_synchronous_renderer_compositor) { |
251 should_defer_begin_frame = false; | 397 should_defer_begin_frame = false; |
252 } else { | 398 } else { |
253 should_defer_begin_frame = | 399 should_defer_begin_frame = |
254 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || | 400 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || |
255 !last_set_needs_begin_frame_ || | 401 !last_set_needs_begin_frame_ || |
256 (state_machine_.begin_impl_frame_state() != | 402 (state_machine_.begin_impl_frame_state() != |
257 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 403 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
258 } | 404 } |
259 | 405 |
260 if (should_defer_begin_frame) { | 406 if (should_defer_begin_frame) { |
261 begin_retro_frame_args_.push_back(args); | 407 begin_retro_frame_args_.push_back(args); |
262 TRACE_EVENT_INSTANT0( | 408 TRACE_EVENT_INSTANT0( |
263 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); | 409 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); |
264 return; | 410 return; |
265 } | 411 } |
266 | 412 |
267 BeginImplFrame(args); | 413 BeginImplFrame(args); |
268 } | 414 } |
269 | 415 |
270 // BeginRetroFrame is called for BeginFrames that we've deferred because | 416 // BeginRetroFrame is called for BeginFrames that we've deferred because |
271 // the scheduler was in the middle of processing a previous BeginFrame. | 417 // the scheduler was in the middle of processing a previous BeginFrame. |
272 void Scheduler::BeginRetroFrame() { | 418 void Scheduler::BeginRetroFrame() { |
273 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); | 419 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); |
274 DCHECK(begin_retro_frame_posted_); | 420 DCHECK(begin_retro_frame_posted_); |
275 DCHECK(!begin_retro_frame_args_.empty()); | |
276 DCHECK(!settings_.using_synchronous_renderer_compositor); | 421 DCHECK(!settings_.using_synchronous_renderer_compositor); |
277 | 422 |
| 423 // If there aren't any retroactive BeginFrames, then we've lost the |
| 424 // OutputSurface and should abort. |
| 425 if (begin_retro_frame_args_.empty()) |
| 426 return; |
| 427 |
278 // Discard expired BeginRetroFrames | 428 // Discard expired BeginRetroFrames |
279 // Today, we should always end up with at most one un-expired BeginRetroFrame | 429 // Today, we should always end up with at most one un-expired BeginRetroFrame |
280 // because deadlines will not be greater than the next frame time. We don't | 430 // because deadlines will not be greater than the next frame time. We don't |
281 // DCHECK though because some systems don't always have monotonic timestamps. | 431 // DCHECK though because some systems don't always have monotonic timestamps. |
282 // TODO(brianderson): In the future, long deadlines could result in us not | 432 // TODO(brianderson): In the future, long deadlines could result in us not |
283 // draining the queue if we don't catch up. If we consistently can't catch | 433 // draining the queue if we don't catch up. If we consistently can't catch |
284 // up, our fallback should be to lower our frame rate. | 434 // up, our fallback should be to lower our frame rate. |
285 base::TimeTicks now = gfx::FrameTime::Now(); | 435 base::TimeTicks now = gfx::FrameTime::Now(); |
286 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); | 436 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); |
287 while (!begin_retro_frame_args_.empty() && | 437 while (!begin_retro_frame_args_.empty() && |
288 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), | 438 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), |
289 draw_duration_estimate)) { | 439 draw_duration_estimate)) { |
290 begin_retro_frame_args_.pop_front(); | 440 begin_retro_frame_args_.pop_front(); |
291 } | 441 } |
292 | 442 |
293 if (begin_retro_frame_args_.empty()) { | 443 if (begin_retro_frame_args_.empty()) { |
| 444 DCHECK(settings_.throttle_frame_production); |
294 TRACE_EVENT_INSTANT0( | 445 TRACE_EVENT_INSTANT0( |
295 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); | 446 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); |
296 } else { | 447 } else { |
297 BeginImplFrame(begin_retro_frame_args_.front()); | 448 BeginImplFrame(begin_retro_frame_args_.front()); |
298 begin_retro_frame_args_.pop_front(); | 449 begin_retro_frame_args_.pop_front(); |
299 } | 450 } |
300 | 451 |
301 begin_retro_frame_posted_ = false; | 452 begin_retro_frame_posted_ = false; |
302 } | 453 } |
303 | 454 |
304 // There could be a race between the posted BeginRetroFrame and a new | 455 // There could be a race between the posted BeginRetroFrame and a new |
305 // BeginFrame arriving via the normal mechanism. Scheduler::BeginFrame | 456 // BeginFrame arriving via the normal mechanism. Scheduler::BeginFrame |
306 // will check if there is a pending BeginRetroFrame to ensure we handle | 457 // will check if there is a pending BeginRetroFrame to ensure we handle |
307 // BeginFrames in FIFO order. | 458 // BeginFrames in FIFO order. |
308 void Scheduler::PostBeginRetroFrameIfNeeded() { | 459 void Scheduler::PostBeginRetroFrameIfNeeded() { |
| 460 if (!last_set_needs_begin_frame_) |
| 461 return; |
| 462 |
309 if (begin_retro_frame_args_.empty() || begin_retro_frame_posted_) | 463 if (begin_retro_frame_args_.empty() || begin_retro_frame_posted_) |
310 return; | 464 return; |
311 | 465 |
312 // begin_retro_frame_args_ should always be empty for the | 466 // begin_retro_frame_args_ should always be empty for the |
313 // synchronous compositor. | 467 // synchronous compositor. |
314 DCHECK(!settings_.using_synchronous_renderer_compositor); | 468 DCHECK(!settings_.using_synchronous_renderer_compositor); |
315 | 469 |
316 if (state_machine_.begin_impl_frame_state() != | 470 if (state_machine_.begin_impl_frame_state() != |
317 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) | 471 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) |
318 return; | 472 return; |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 } | 728 } |
575 | 729 |
576 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 730 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
577 return (state_machine_.commit_state() == | 731 return (state_machine_.commit_state() == |
578 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 732 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
579 state_machine_.commit_state() == | 733 state_machine_.commit_state() == |
580 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 734 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
581 } | 735 } |
582 | 736 |
583 } // namespace cc | 737 } // namespace cc |
OLD | NEW |