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

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

Issue 1765723002: Hoist begin frame sources out of scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@scheduler_remove_throttle_flag
Patch Set: Created 4 years, 9 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 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698