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 #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 "cc/scheduler/delay_based_time_source.h" |
| 14 #include "cc/scheduler/frame_source.h" | |
| 14 #include "ui/gfx/frame_time.h" | 15 #include "ui/gfx/frame_time.h" |
| 15 | 16 |
| 16 namespace cc { | 17 namespace cc { |
| 17 | 18 |
| 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 | |
| 72 Scheduler::Scheduler( | 19 Scheduler::Scheduler( |
| 73 SchedulerClient* client, | 20 SchedulerClient* client, |
| 74 const SchedulerSettings& scheduler_settings, | 21 const SchedulerSettings& scheduler_settings, |
| 75 int layer_tree_host_id, | 22 int layer_tree_host_id, |
| 23 FrameSource* external_frame_source, | |
| 76 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) | 24 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) |
| 77 : settings_(scheduler_settings), | 25 : settings_(scheduler_settings), |
| 78 client_(client), | 26 client_(client), |
| 79 layer_tree_host_id_(layer_tree_host_id), | 27 layer_tree_host_id_(layer_tree_host_id), |
| 80 impl_task_runner_(impl_task_runner), | 28 impl_task_runner_(impl_task_runner), |
| 81 vsync_interval_(BeginFrameArgs::DefaultInterval()), | |
| 82 last_set_needs_begin_frame_(false), | 29 last_set_needs_begin_frame_(false), |
| 83 begin_unthrottled_frame_posted_(false), | 30 begin_unthrottled_frame_posted_(false), |
| 84 begin_retro_frame_posted_(false), | 31 begin_retro_frame_posted_(false), |
| 85 state_machine_(scheduler_settings), | 32 state_machine_(scheduler_settings), |
| 86 inside_process_scheduled_actions_(false), | 33 inside_process_scheduled_actions_(false), |
| 87 inside_action_(SchedulerStateMachine::ACTION_NONE), | 34 inside_action_(SchedulerStateMachine::ACTION_NONE), |
| 88 weak_factory_(this) { | 35 weak_factory_(this) { |
| 89 DCHECK(client_); | 36 DCHECK(client_); |
| 90 DCHECK(!state_machine_.BeginFrameNeeded()); | 37 DCHECK(!state_machine_.BeginFrameNeeded()); |
| 91 if (settings_.main_frame_before_activation_enabled) { | 38 if (settings_.main_frame_before_activation_enabled) { |
| 92 DCHECK(settings_.main_frame_before_draw_enabled); | 39 DCHECK(settings_.main_frame_before_draw_enabled); |
| 93 } | 40 } |
| 94 | 41 |
| 95 begin_retro_frame_closure_ = | 42 begin_retro_frame_closure_ = |
| 96 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); | 43 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
| 97 begin_unthrottled_frame_closure_ = | 44 // begin_unthrottled_frame_closure_ = |
| 98 base::Bind(&Scheduler::BeginUnthrottledFrame, weak_factory_.GetWeakPtr()); | 45 // base::Bind(&Scheduler::BeginUnthrottledFrame, |
| 46 // weak_factory_.GetWeakPtr()); | |
| 99 begin_impl_frame_deadline_closure_ = base::Bind( | 47 begin_impl_frame_deadline_closure_ = base::Bind( |
| 100 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); | 48 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); |
| 101 poll_for_draw_triggers_closure_ = base::Bind( | 49 poll_for_draw_triggers_closure_ = base::Bind( |
| 102 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); | 50 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); |
| 103 advance_commit_state_closure_ = base::Bind( | 51 advance_commit_state_closure_ = base::Bind( |
| 104 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); | 52 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); |
| 105 | 53 |
| 106 if (!settings_.begin_frame_scheduling_enabled) { | 54 scoped_ptr<FrameSource> primary_frame_source; |
| 107 SetupSyntheticBeginFrames(); | 55 if (settings_.begin_frame_scheduling_enabled) { |
| 56 TRACE_EVENT0("frame_time", "Scheduler::Scheduler() ProxyFrameSource"); | |
|
brianderson
2014/05/07 17:20:16
Should the category be "cc" instead of "frame_time
mithro-old
2014/05/07 22:02:32
Good question.
I was pondering introducing "fram
brianderson
2014/05/08 00:55:58
If we don't assign it to cc or a new category, the
| |
| 57 primary_frame_source = scoped_ptr<FrameSource>( | |
| 58 new ProxyFrameSource(this, external_frame_source)); | |
| 59 } else if (!settings_.throttle_frame_production) { | |
|
brianderson
2014/05/07 17:20:16
throttle_frame_production should take precidence,
mithro-old
2014/05/07 23:42:28
Done.
| |
| 60 TRACE_EVENT0("frame_time", "Scheduler::Scheduler() BackToBackFrameSource"); | |
| 61 primary_frame_source = scoped_ptr<FrameSource>( | |
| 62 new BackToBackFrameSource(this, impl_task_runner_)); | |
| 63 } else { | |
| 64 TRACE_EVENT0("frame_time", "Scheduler::Scheduler() SyntheticFrameSource"); | |
| 65 primary_frame_source = scoped_ptr<FrameSource>(new SyntheticFrameSource( | |
| 66 this, impl_task_runner_, base::TimeDelta::FromMilliseconds(16))); | |
| 108 } | 67 } |
| 68 scoped_ptr<FrameSource> background_frame_source(new SyntheticFrameSource( | |
| 69 this, impl_task_runner_, base::TimeDelta::FromSeconds(1))); | |
| 70 | |
| 71 frame_source_ = scoped_ptr<DualFrameSource>(new DualFrameSource( | |
| 72 this, primary_frame_source.Pass(), background_frame_source.Pass())); | |
| 109 } | 73 } |
| 110 | 74 |
| 111 Scheduler::~Scheduler() { | 75 Scheduler::~Scheduler() { |
| 112 if (synthetic_begin_frame_source_) { | 76 frame_source_->SetNeedsBeginFrame(false); |
| 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 } | 77 } |
| 123 | 78 |
| 124 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, | 79 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, |
| 125 base::TimeDelta interval) { | 80 base::TimeDelta interval) { |
| 126 // TODO(brianderson): We should not be receiving 0 intervals. | 81 // TODO(brianderson): We should not be receiving 0 intervals. |
| 127 if (interval == base::TimeDelta()) | 82 if (interval == base::TimeDelta()) |
| 128 interval = BeginFrameArgs::DefaultInterval(); | 83 interval = BeginFrameArgs::DefaultInterval(); |
| 129 vsync_interval_ = interval; | 84 |
| 130 if (!settings_.begin_frame_scheduling_enabled) | 85 frame_source_->SetTimeBaseAndInterval(timebase, interval); |
| 131 synthetic_begin_frame_source_->CommitVSyncParameters(timebase, interval); | |
| 132 } | 86 } |
| 133 | 87 |
| 134 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | 88 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
| 135 estimated_parent_draw_time_ = draw_time; | 89 estimated_parent_draw_time_ = draw_time; |
| 136 } | 90 } |
| 137 | 91 |
| 138 void Scheduler::SetCanStart() { | 92 void Scheduler::SetCanStart() { |
| 139 state_machine_.SetCanStart(); | 93 state_machine_.SetCanStart(); |
| 140 ProcessScheduledActions(); | 94 ProcessScheduledActions(); |
| 141 } | 95 } |
| 142 | 96 |
| 143 void Scheduler::SetVisible(bool visible) { | 97 void Scheduler::SetVisible(bool visible) { |
| 144 state_machine_.SetVisible(visible); | 98 state_machine_.SetVisible(visible); |
| 99 if (visible) { | |
| 100 frame_source_->SwitchSource(frame_source_->SourceSecondary()); | |
| 101 } else { | |
| 102 frame_source_->SwitchSource(frame_source_->SourcePrimary()); | |
| 103 } | |
| 145 ProcessScheduledActions(); | 104 ProcessScheduledActions(); |
| 146 } | 105 } |
| 147 | 106 |
| 148 void Scheduler::SetCanDraw(bool can_draw) { | 107 void Scheduler::SetCanDraw(bool can_draw) { |
| 149 state_machine_.SetCanDraw(can_draw); | 108 state_machine_.SetCanDraw(can_draw); |
| 150 ProcessScheduledActions(); | 109 ProcessScheduledActions(); |
| 151 } | 110 } |
| 152 | 111 |
| 153 void Scheduler::NotifyReadyToActivate() { | 112 void Scheduler::NotifyReadyToActivate() { |
| 154 state_machine_.NotifyReadyToActivate(); | 113 state_machine_.NotifyReadyToActivate(); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 return timebase + (begin_impl_frame_args_.interval * intervals); | 221 return timebase + (begin_impl_frame_args_.interval * intervals); |
| 263 } | 222 } |
| 264 | 223 |
| 265 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 224 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
| 266 return begin_impl_frame_args_.frame_time; | 225 return begin_impl_frame_args_.frame_time; |
| 267 } | 226 } |
| 268 | 227 |
| 269 void Scheduler::SetupNextBeginFrameIfNeeded() { | 228 void Scheduler::SetupNextBeginFrameIfNeeded() { |
| 270 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); | 229 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); |
| 271 | 230 |
| 272 if (settings_.throttle_frame_production) { | 231 // Only stop requesting BeginFrames after a deadline. |
| 273 SetupNextBeginFrameWhenVSyncThrottlingEnabled(needs_begin_frame); | |
| 274 } else { | |
| 275 SetupNextBeginFrameWhenVSyncThrottlingDisabled(needs_begin_frame); | |
| 276 } | |
| 277 SetupPollingMechanisms(needs_begin_frame); | |
| 278 } | |
| 279 | |
| 280 // When we are throttling frame production, we request BeginFrames | |
| 281 // from the OutputSurface. | |
| 282 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled( | |
| 283 bool needs_begin_frame) { | |
| 284 bool at_end_of_deadline = | |
| 285 state_machine_.begin_impl_frame_state() == | |
| 286 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; | |
| 287 | |
| 288 bool should_call_set_needs_begin_frame = | |
| 289 // Always request the BeginFrame immediately if it wasn't needed before. | |
| 290 (needs_begin_frame && !last_set_needs_begin_frame_) || | |
| 291 // Only stop requesting BeginFrames after a deadline. | |
| 292 (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); | |
| 293 | |
| 294 if (should_call_set_needs_begin_frame) { | |
| 295 if (settings_.begin_frame_scheduling_enabled) { | |
| 296 client_->SetNeedsBeginFrame(needs_begin_frame); | |
| 297 } else { | |
| 298 synthetic_begin_frame_source_->SetNeedsBeginFrame( | |
| 299 needs_begin_frame, &begin_retro_frame_args_); | |
| 300 } | |
| 301 last_set_needs_begin_frame_ = needs_begin_frame; | |
| 302 } | |
| 303 | |
| 304 PostBeginRetroFrameIfNeeded(); | |
| 305 } | |
| 306 | |
| 307 // When we aren't throttling frame production, we initiate a BeginFrame | |
| 308 // as soon as one is needed. | |
| 309 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingDisabled( | |
| 310 bool needs_begin_frame) { | |
| 311 last_set_needs_begin_frame_ = needs_begin_frame; | |
| 312 | |
| 313 if (!needs_begin_frame || begin_unthrottled_frame_posted_) | |
| 314 return; | |
| 315 | |
| 316 if (state_machine_.begin_impl_frame_state() != | 232 if (state_machine_.begin_impl_frame_state() != |
| 317 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE && | 233 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE && |
| 318 state_machine_.begin_impl_frame_state() != | 234 state_machine_.begin_impl_frame_state() != |
| 319 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { | 235 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { |
| 320 return; | 236 return; |
|
brianderson
2014/05/07 18:09:59
I don't think we can't return early here, otherwis
mithro-old
2014/05/07 23:42:28
Will look at this further as I fix the unittests.
| |
| 321 } | 237 } |
| 322 | 238 |
| 323 begin_unthrottled_frame_posted_ = true; | 239 // Always request the BeginFrame immediately if it wasn't needed before. |
| 324 impl_task_runner_->PostTask(FROM_HERE, begin_unthrottled_frame_closure_); | 240 if (needs_begin_frame && !last_set_needs_begin_frame_) { |
| 325 } | 241 frame_source_->SetNeedsBeginFrame(needs_begin_frame); |
| 242 last_set_needs_begin_frame_ = needs_begin_frame; | |
| 243 } | |
| 326 | 244 |
| 327 // BeginUnthrottledFrame is used when we aren't throttling frame production. | 245 SetupPollingMechanisms(needs_begin_frame); |
| 328 // This will usually be because VSync is disabled. | |
| 329 void Scheduler::BeginUnthrottledFrame() { | |
| 330 DCHECK(!settings_.throttle_frame_production); | |
| 331 DCHECK(begin_retro_frame_args_.empty()); | |
| 332 | 246 |
| 333 base::TimeTicks now = gfx::FrameTime::Now(); | 247 PostBeginRetroFrameIfNeeded(); |
| 334 base::TimeTicks deadline = now + vsync_interval_; | |
| 335 | |
| 336 BeginFrameArgs begin_frame_args = | |
| 337 BeginFrameArgs::Create(now, deadline, vsync_interval_); | |
| 338 BeginImplFrame(begin_frame_args); | |
| 339 | |
| 340 begin_unthrottled_frame_posted_ = false; | |
| 341 } | 248 } |
| 342 | 249 |
| 343 // We may need to poll when we can't rely on BeginFrame to advance certain | 250 // We may need to poll when we can't rely on BeginFrame to advance certain |
| 344 // state or to avoid deadlock. | 251 // state or to avoid deadlock. |
| 345 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { | 252 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { |
| 346 bool needs_advance_commit_state_timer = false; | 253 bool needs_advance_commit_state_timer = false; |
| 347 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but | 254 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but |
| 348 // aren't expecting any more BeginFrames. This should only be needed by | 255 // aren't expecting any more BeginFrames. This should only be needed by |
| 349 // the synchronous compositor when BeginFrameNeeded is false. | 256 // the synchronous compositor when BeginFrameNeeded is false. |
| 350 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { | 257 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 } else { | 294 } else { |
| 388 advance_commit_state_task_.Cancel(); | 295 advance_commit_state_task_.Cancel(); |
| 389 } | 296 } |
| 390 } | 297 } |
| 391 | 298 |
| 392 // BeginFrame is the mechanism that tells us that now is a good time to start | 299 // BeginFrame is the mechanism that tells us that now is a good time to start |
| 393 // making a frame. Usually this means that user input for the frame is complete. | 300 // making a frame. Usually this means that user input for the frame is complete. |
| 394 // If the scheduler is busy, we queue the BeginFrame to be handled later as | 301 // If the scheduler is busy, we queue the BeginFrame to be handled later as |
| 395 // a BeginRetroFrame. | 302 // a BeginRetroFrame. |
| 396 void Scheduler::BeginFrame(const BeginFrameArgs& args) { | 303 void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
| 397 TRACE_EVENT1("cc", "Scheduler::BeginFrame", "frame_time", args.frame_time); | 304 TRACE_EVENT1( |
| 305 "cc", "Scheduler::SchedulerBeginFrame", "frame_time", args.frame_time); | |
| 306 | |
| 398 DCHECK(settings_.throttle_frame_production); | 307 DCHECK(settings_.throttle_frame_production); |
| 399 | 308 |
| 400 bool should_defer_begin_frame; | 309 bool should_defer_begin_frame; |
| 401 if (settings_.using_synchronous_renderer_compositor) { | 310 if (settings_.using_synchronous_renderer_compositor) { |
| 402 should_defer_begin_frame = false; | 311 should_defer_begin_frame = false; |
| 403 } else { | 312 } else { |
| 404 should_defer_begin_frame = | 313 should_defer_begin_frame = |
| 405 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || | 314 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || |
| 406 !last_set_needs_begin_frame_ || | 315 !last_set_needs_begin_frame_ || |
| 407 (state_machine_.begin_impl_frame_state() != | 316 (state_machine_.begin_impl_frame_state() != |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 683 } | 592 } |
| 684 } | 593 } |
| 685 | 594 |
| 686 bool Scheduler::WillDrawIfNeeded() const { | 595 bool Scheduler::WillDrawIfNeeded() const { |
| 687 return !state_machine_.PendingDrawsShouldBeAborted(); | 596 return !state_machine_.PendingDrawsShouldBeAborted(); |
| 688 } | 597 } |
| 689 | 598 |
| 690 scoped_ptr<base::Value> Scheduler::StateAsValue() const { | 599 scoped_ptr<base::Value> Scheduler::StateAsValue() const { |
| 691 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); | 600 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); |
| 692 state->Set("state_machine", state_machine_.AsValue().release()); | 601 state->Set("state_machine", state_machine_.AsValue().release()); |
| 602 state->Set("frame_source", frame_source_->FrameSourceAsValue().release()); | |
| 693 | 603 |
| 694 scoped_ptr<base::DictionaryValue> scheduler_state(new base::DictionaryValue); | 604 scoped_ptr<base::DictionaryValue> scheduler_state(new base::DictionaryValue); |
| 695 scheduler_state->SetDouble( | 605 scheduler_state->SetDouble( |
| 696 "time_until_anticipated_draw_time_ms", | 606 "time_until_anticipated_draw_time_ms", |
| 697 (AnticipatedDrawTime() - base::TimeTicks::Now()).InMillisecondsF()); | 607 (AnticipatedDrawTime() - base::TimeTicks::Now()).InMillisecondsF()); |
| 698 scheduler_state->SetDouble("vsync_interval_ms", | |
| 699 vsync_interval_.InMillisecondsF()); | |
| 700 scheduler_state->SetDouble("estimated_parent_draw_time_ms", | 608 scheduler_state->SetDouble("estimated_parent_draw_time_ms", |
| 701 estimated_parent_draw_time_.InMillisecondsF()); | 609 estimated_parent_draw_time_.InMillisecondsF()); |
| 702 scheduler_state->SetBoolean("last_set_needs_begin_frame_", | 610 scheduler_state->SetBoolean("last_set_needs_begin_frame_", |
| 703 last_set_needs_begin_frame_); | 611 last_set_needs_begin_frame_); |
| 704 scheduler_state->SetBoolean("begin_unthrottled_frame_posted_", | 612 scheduler_state->SetBoolean("begin_unthrottled_frame_posted_", |
| 705 begin_unthrottled_frame_posted_); | 613 begin_unthrottled_frame_posted_); |
| 706 scheduler_state->SetBoolean("begin_retro_frame_posted_", | 614 scheduler_state->SetBoolean("begin_retro_frame_posted_", |
| 707 begin_retro_frame_posted_); | 615 begin_retro_frame_posted_); |
| 708 scheduler_state->SetInteger("begin_retro_frame_args_", | 616 scheduler_state->SetInteger("begin_retro_frame_args_", |
| 709 begin_retro_frame_args_.size()); | 617 begin_retro_frame_args_.size()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 748 } | 656 } |
| 749 | 657 |
| 750 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 658 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 751 return (state_machine_.commit_state() == | 659 return (state_machine_.commit_state() == |
| 752 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 660 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
| 753 state_machine_.commit_state() == | 661 state_machine_.commit_state() == |
| 754 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 662 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
| 755 } | 663 } |
| 756 | 664 |
| 757 } // namespace cc | 665 } // namespace cc |
| OLD | NEW |