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 |