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 13 matching lines...) Expand all Loading... | |
| 24 // for message latency and kernel scheduling variability. | 24 // for message latency and kernel scheduling variability. |
| 25 const base::TimeDelta kDeadlineFudgeFactor = | 25 const base::TimeDelta kDeadlineFudgeFactor = |
| 26 base::TimeDelta::FromMicroseconds(1000); | 26 base::TimeDelta::FromMicroseconds(1000); |
| 27 } | 27 } |
| 28 | 28 |
| 29 scoped_ptr<Scheduler> Scheduler::Create( | 29 scoped_ptr<Scheduler> Scheduler::Create( |
| 30 SchedulerClient* client, | 30 SchedulerClient* client, |
| 31 const SchedulerSettings& settings, | 31 const SchedulerSettings& settings, |
| 32 int layer_tree_host_id, | 32 int layer_tree_host_id, |
| 33 base::SingleThreadTaskRunner* task_runner, | 33 base::SingleThreadTaskRunner* task_runner, |
| 34 BeginFrameSource* external_frame_source, | 34 BeginFrameSource* begin_frame_source, |
| 35 scoped_ptr<CompositorTimingHistory> compositor_timing_history) { | 35 scoped_ptr<CompositorTimingHistory> compositor_timing_history) { |
| 36 scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source; | 36 return make_scoped_ptr(new Scheduler(client, settings, layer_tree_host_id, |
| 37 if (!settings.use_external_begin_frame_source) { | 37 task_runner, begin_frame_source, |
| 38 synthetic_frame_source = SyntheticBeginFrameSource::Create( | 38 std::move(compositor_timing_history))); |
| 39 task_runner, BeginFrameArgs::DefaultInterval()); | |
| 40 } | |
| 41 scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source = | |
| 42 BackToBackBeginFrameSource::Create(task_runner); | |
| 43 return make_scoped_ptr(new Scheduler( | |
| 44 client, settings, layer_tree_host_id, task_runner, external_frame_source, | |
| 45 std::move(synthetic_frame_source), std::move(unthrottled_frame_source), | |
| 46 std::move(compositor_timing_history))); | |
| 47 } | 39 } |
| 48 | 40 |
| 49 Scheduler::Scheduler( | 41 Scheduler::Scheduler( |
| 50 SchedulerClient* client, | 42 SchedulerClient* client, |
| 51 const SchedulerSettings& settings, | 43 const SchedulerSettings& settings, |
| 52 int layer_tree_host_id, | 44 int layer_tree_host_id, |
| 53 base::SingleThreadTaskRunner* task_runner, | 45 base::SingleThreadTaskRunner* task_runner, |
| 54 BeginFrameSource* external_frame_source, | 46 BeginFrameSource* begin_frame_source, |
| 55 scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source, | |
| 56 scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source, | |
| 57 scoped_ptr<CompositorTimingHistory> compositor_timing_history) | 47 scoped_ptr<CompositorTimingHistory> compositor_timing_history) |
| 58 : settings_(settings), | 48 : settings_(settings), |
| 59 client_(client), | 49 client_(client), |
| 60 layer_tree_host_id_(layer_tree_host_id), | 50 layer_tree_host_id_(layer_tree_host_id), |
| 61 task_runner_(task_runner), | 51 task_runner_(task_runner), |
| 62 external_frame_source_(external_frame_source), | 52 frame_source_(begin_frame_source), |
| 63 synthetic_frame_source_(std::move(synthetic_frame_source)), | |
| 64 unthrottled_frame_source_(std::move(unthrottled_frame_source)), | |
| 65 frame_source_(BeginFrameSourceMultiplexer::Create()), | |
| 66 observing_frame_source_(false), | 53 observing_frame_source_(false), |
| 67 compositor_timing_history_(std::move(compositor_timing_history)), | 54 compositor_timing_history_(std::move(compositor_timing_history)), |
| 68 begin_impl_frame_deadline_mode_( | 55 begin_impl_frame_deadline_mode_( |
| 69 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), | 56 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), |
| 70 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), | 57 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| 71 state_machine_(settings), | 58 state_machine_(settings), |
| 72 inside_process_scheduled_actions_(false), | 59 inside_process_scheduled_actions_(false), |
| 73 inside_action_(SchedulerStateMachine::ACTION_NONE), | 60 inside_action_(SchedulerStateMachine::ACTION_NONE), |
| 74 weak_factory_(this) { | 61 weak_factory_(this) { |
| 75 TRACE_EVENT1("cc", "Scheduler::Scheduler", "settings", settings_.AsValue()); | 62 TRACE_EVENT1("cc", "Scheduler::Scheduler", "settings", settings_.AsValue()); |
| 76 DCHECK(client_); | 63 DCHECK(client_); |
| 77 DCHECK(!state_machine_.BeginFrameNeeded()); | 64 DCHECK(!state_machine_.BeginFrameNeeded()); |
| 78 DCHECK(!settings_.use_external_begin_frame_source || external_frame_source_); | |
| 79 DCHECK(settings_.use_external_begin_frame_source || synthetic_frame_source_); | |
| 80 DCHECK(unthrottled_frame_source_); | |
| 81 | 65 |
| 82 begin_retro_frame_closure_ = | 66 begin_retro_frame_closure_ = |
| 83 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); | 67 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
| 84 begin_impl_frame_deadline_closure_ = base::Bind( | 68 begin_impl_frame_deadline_closure_ = base::Bind( |
| 85 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); | 69 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); |
| 86 | 70 |
| 87 frame_source_->AddSource(primary_frame_source()); | 71 frame_source_->SetClientReady(); |
| 88 primary_frame_source()->SetClientReady(); | |
| 89 | |
| 90 frame_source_->AddSource(unthrottled_frame_source_.get()); | |
| 91 unthrottled_frame_source_->SetClientReady(); | |
| 92 | |
| 93 if (settings_.throttle_frame_production) { | |
| 94 frame_source_->SetActiveSource(primary_frame_source()); | |
| 95 } else { | |
| 96 frame_source_->SetActiveSource(unthrottled_frame_source_.get()); | |
| 97 } | |
| 98 ProcessScheduledActions(); | 72 ProcessScheduledActions(); |
| 99 } | 73 } |
| 100 | 74 |
| 101 Scheduler::~Scheduler() { | 75 Scheduler::~Scheduler() { |
| 102 if (observing_frame_source_) | 76 if (observing_frame_source_) |
| 103 frame_source_->RemoveObserver(this); | 77 frame_source_->RemoveObserver(this); |
| 104 frame_source_->SetActiveSource(nullptr); | |
| 105 } | 78 } |
| 106 | 79 |
| 107 base::TimeTicks Scheduler::Now() const { | 80 base::TimeTicks Scheduler::Now() const { |
| 108 base::TimeTicks now = base::TimeTicks::Now(); | 81 base::TimeTicks now = base::TimeTicks::Now(); |
| 109 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), | 82 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), |
| 110 "Scheduler::Now", | 83 "Scheduler::Now", |
| 111 "now", | 84 "now", |
| 112 now); | 85 now); |
| 113 return now; | 86 return now; |
| 114 } | 87 } |
| 115 | 88 |
| 116 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, | |
| 117 base::TimeDelta interval) { | |
| 118 if (authoritative_vsync_interval_ != base::TimeDelta()) { | |
| 119 interval = authoritative_vsync_interval_; | |
| 120 } else if (interval == base::TimeDelta()) { | |
| 121 // TODO(brianderson): We should not be receiving 0 intervals. | |
| 122 interval = BeginFrameArgs::DefaultInterval(); | |
| 123 } | |
| 124 | |
| 125 last_vsync_timebase_ = timebase; | |
| 126 | |
| 127 if (synthetic_frame_source_) | |
| 128 synthetic_frame_source_->OnUpdateVSyncParameters(timebase, interval); | |
| 129 } | |
| 130 | |
| 131 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | 89 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
| 132 DCHECK_GE(draw_time.ToInternalValue(), 0); | 90 DCHECK_GE(draw_time.ToInternalValue(), 0); |
| 133 estimated_parent_draw_time_ = draw_time; | 91 estimated_parent_draw_time_ = draw_time; |
| 134 } | 92 } |
| 135 | 93 |
| 136 void Scheduler::SetVisible(bool visible) { | 94 void Scheduler::SetVisible(bool visible) { |
| 137 state_machine_.SetVisible(visible); | 95 state_machine_.SetVisible(visible); |
| 138 UpdateCompositorTimingHistoryRecordingEnabled(); | 96 UpdateCompositorTimingHistoryRecordingEnabled(); |
| 139 ProcessScheduledActions(); | 97 ProcessScheduledActions(); |
| 140 } | 98 } |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 BeginImplFrameWithDeadline(adjusted_args); | 311 BeginImplFrameWithDeadline(adjusted_args); |
| 354 } | 312 } |
| 355 return true; | 313 return true; |
| 356 } | 314 } |
| 357 | 315 |
| 358 void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) { | 316 void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) { |
| 359 state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames); | 317 state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames); |
| 360 ProcessScheduledActions(); | 318 ProcessScheduledActions(); |
| 361 } | 319 } |
| 362 | 320 |
| 363 void Scheduler::SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) { | |
| 364 authoritative_vsync_interval_ = interval; | |
| 365 if (synthetic_frame_source_) { | |
| 366 synthetic_frame_source_->OnUpdateVSyncParameters(last_vsync_timebase_, | |
| 367 interval); | |
| 368 } | |
| 369 } | |
| 370 | |
| 371 void Scheduler::SetVideoNeedsBeginFrames(bool video_needs_begin_frames) { | 321 void Scheduler::SetVideoNeedsBeginFrames(bool video_needs_begin_frames) { |
| 372 state_machine_.SetVideoNeedsBeginFrames(video_needs_begin_frames); | 322 state_machine_.SetVideoNeedsBeginFrames(video_needs_begin_frames); |
| 373 ProcessScheduledActions(); | 323 ProcessScheduledActions(); |
| 374 } | 324 } |
| 375 | 325 |
| 376 void Scheduler::OnDrawForOutputSurface(bool resourceless_software_draw) { | 326 void Scheduler::OnDrawForOutputSurface(bool resourceless_software_draw) { |
| 377 DCHECK(settings_.using_synchronous_renderer_compositor); | 327 DCHECK(settings_.using_synchronous_renderer_compositor); |
| 378 DCHECK_EQ(state_machine_.begin_impl_frame_state(), | 328 DCHECK_EQ(state_machine_.begin_impl_frame_state(), |
| 379 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 329 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 380 DCHECK(!BeginImplFrameDeadlinePending()); | 330 DCHECK(!BeginImplFrameDeadlinePending()); |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 794 TRACE_EVENT_CATEGORY_GROUP_ENABLED( | 744 TRACE_EVENT_CATEGORY_GROUP_ENABLED( |
| 795 TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), | 745 TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), |
| 796 &frame_tracing_enabled); | 746 &frame_tracing_enabled); |
| 797 if (frame_tracing_enabled) { | 747 if (frame_tracing_enabled) { |
| 798 state->BeginDictionary("frame_source_"); | 748 state->BeginDictionary("frame_source_"); |
| 799 frame_source_->AsValueInto(state); | 749 frame_source_->AsValueInto(state); |
| 800 state->EndDictionary(); | 750 state->EndDictionary(); |
| 801 } | 751 } |
| 802 | 752 |
| 803 state->BeginDictionary("scheduler_state"); | 753 state->BeginDictionary("scheduler_state"); |
| 804 state->SetBoolean("external_frame_source_", !!external_frame_source_); | |
| 805 state->SetBoolean("throttle_frame_production_", | 754 state->SetBoolean("throttle_frame_production_", |
| 806 settings_.throttle_frame_production); | 755 settings_.throttle_frame_production); |
| 807 state->SetDouble("authoritative_vsync_interval_ms", | |
|
enne (OOO)
2016/03/03 23:06:14
I'm not sure if anybody was using this info, but I
Sami
2016/03/08 19:15:24
I think it was here just for debugging, so no need
| |
| 808 authoritative_vsync_interval_.InMillisecondsF()); | |
| 809 state->SetDouble( | |
| 810 "last_vsync_timebase_ms", | |
| 811 (last_vsync_timebase_ - base::TimeTicks()).InMillisecondsF()); | |
| 812 state->SetDouble("estimated_parent_draw_time_ms", | 756 state->SetDouble("estimated_parent_draw_time_ms", |
| 813 estimated_parent_draw_time_.InMillisecondsF()); | 757 estimated_parent_draw_time_.InMillisecondsF()); |
| 814 state->SetBoolean("observing_frame_source", observing_frame_source_); | 758 state->SetBoolean("observing_frame_source", observing_frame_source_); |
| 815 state->SetInteger("begin_retro_frame_args", | 759 state->SetInteger("begin_retro_frame_args", |
| 816 static_cast<int>(begin_retro_frame_args_.size())); | 760 static_cast<int>(begin_retro_frame_args_.size())); |
| 817 state->SetBoolean("begin_retro_frame_task", | 761 state->SetBoolean("begin_retro_frame_task", |
| 818 !begin_retro_frame_task_.IsCancelled()); | 762 !begin_retro_frame_task_.IsCancelled()); |
| 819 state->SetBoolean("begin_impl_frame_deadline_task", | 763 state->SetBoolean("begin_impl_frame_deadline_task", |
| 820 !begin_impl_frame_deadline_task_.IsCancelled()); | 764 !begin_impl_frame_deadline_task_.IsCancelled()); |
| 821 state->SetString("inside_action", | 765 state->SetString("inside_action", |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 906 } | 850 } |
| 907 | 851 |
| 908 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 852 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 909 return (state_machine_.begin_main_frame_state() == | 853 return (state_machine_.begin_main_frame_state() == |
| 910 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || | 854 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || |
| 911 state_machine_.begin_main_frame_state() == | 855 state_machine_.begin_main_frame_state() == |
| 912 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 856 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); |
| 913 } | 857 } |
| 914 | 858 |
| 915 } // namespace cc | 859 } // namespace cc |
| OLD | NEW |