OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | |
9 #include "base/debug/trace_event_argument.h" | |
8 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
9 #include "cc/output/begin_frame_args.h" | 11 #include "cc/output/begin_frame_args.h" |
10 #include "content/renderer/scheduler/renderer_scheduler_selector.h" | 12 #include "content/renderer/scheduler/renderer_scheduler_selector.h" |
11 #include "ui/gfx/frame_time.h" | 13 #include "ui/gfx/frame_time.h" |
12 | 14 |
13 namespace content { | 15 namespace content { |
14 | 16 |
15 RendererSchedulerImpl::RendererSchedulerImpl() | 17 RendererSchedulerImpl::RendererSchedulerImpl() |
16 : RendererSchedulerImpl(base::MessageLoopProxy::current()) { | 18 : RendererSchedulerImpl(base::MessageLoopProxy::current()) { |
17 } | 19 } |
(...skipping 10 matching lines...) Expand all Loading... | |
28 current_policy_(kNormalPriorityPolicy), | 30 current_policy_(kNormalPriorityPolicy), |
29 weak_factory_(this) { | 31 weak_factory_(this) { |
30 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); | 32 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); |
31 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( | 33 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( |
32 task_queue_manager_.TaskRunnerForQueue(kIdleTaskQueue), | 34 task_queue_manager_.TaskRunnerForQueue(kIdleTaskQueue), |
33 weak_factory_.GetWeakPtr())); | 35 weak_factory_.GetWeakPtr())); |
34 renderer_scheduler_selector_->SetQueuePriority( | 36 renderer_scheduler_selector_->SetQueuePriority( |
35 kControlTaskQueue, RendererSchedulerSelector::kControlPriority); | 37 kControlTaskQueue, RendererSchedulerSelector::kControlPriority); |
36 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); | 38 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); |
37 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false); | 39 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false); |
40 | |
41 for (size_t i = 0; i < kTaskQueueCount; i++) { | |
42 renderer_scheduler_selector_->SetQueueName( | |
43 i, TaskQueueIdToString(static_cast<QueueId>(i))); | |
44 } | |
45 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | |
46 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), "RendererScheduler", this); | |
38 } | 47 } |
picksi1
2014/10/28 11:01:40
Does it still make sense to use a "blink.scheduler
Sami
2014/10/28 12:57:47
You're probably right, let's go for renderer.sched
| |
39 | 48 |
40 RendererSchedulerImpl::~RendererSchedulerImpl() { | 49 RendererSchedulerImpl::~RendererSchedulerImpl() { |
50 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | |
51 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), "RendererScheduler", this); | |
41 } | 52 } |
42 | 53 |
43 scoped_refptr<base::SingleThreadTaskRunner> | 54 scoped_refptr<base::SingleThreadTaskRunner> |
44 RendererSchedulerImpl::DefaultTaskRunner() { | 55 RendererSchedulerImpl::DefaultTaskRunner() { |
45 return task_queue_manager_.TaskRunnerForQueue(kDefaultTaskQueue); | 56 return task_queue_manager_.TaskRunnerForQueue(kDefaultTaskQueue); |
46 } | 57 } |
47 | 58 |
48 scoped_refptr<base::SingleThreadTaskRunner> | 59 scoped_refptr<base::SingleThreadTaskRunner> |
49 RendererSchedulerImpl::CompositorTaskRunner() { | 60 RendererSchedulerImpl::CompositorTaskRunner() { |
50 return task_queue_manager_.TaskRunnerForQueue(kCompositorTaskQueue); | 61 return task_queue_manager_.TaskRunnerForQueue(kCompositorTaskQueue); |
(...skipping 17 matching lines...) Expand all Loading... | |
68 } | 79 } |
69 } | 80 } |
70 | 81 |
71 void RendererSchedulerImpl::DidReceiveInputEvent() { | 82 void RendererSchedulerImpl::DidReceiveInputEvent() { |
72 base::AutoLock lock(incoming_signals_lock_); | 83 base::AutoLock lock(incoming_signals_lock_); |
73 if (last_input_time_.is_null()) { | 84 if (last_input_time_.is_null()) { |
74 // Update scheduler policy if should start a new compositor policy mode. | 85 // Update scheduler policy if should start a new compositor policy mode. |
75 base::subtle::Release_Store(&policy_may_need_update_, 1); | 86 base::subtle::Release_Store(&policy_may_need_update_, 1); |
76 PostUpdatePolicyOnControlRunner(base::TimeDelta()); | 87 PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
77 } | 88 } |
78 last_input_time_ = Now(); | 89 last_input_time_ = Now(); |
alexclarke
2014/10/27 17:58:11
I know last_input_time_ is in the json blob, but i
Sami
2014/10/28 12:57:47
Good idea, I'll just add tracing here.
| |
79 } | 90 } |
80 | 91 |
81 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { | 92 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { |
82 main_thread_checker_.CalledOnValidThread(); | 93 main_thread_checker_.CalledOnValidThread(); |
83 return SchedulerPolicy() == kCompositorPriorityPolicy && | 94 return SchedulerPolicy() == kCompositorPriorityPolicy && |
84 !task_queue_manager_.IsQueueEmpty(kCompositorTaskQueue); | 95 !task_queue_manager_.IsQueueEmpty(kCompositorTaskQueue); |
85 } | 96 } |
86 | 97 |
87 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadline() const { | 98 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadline() const { |
88 main_thread_checker_.CalledOnValidThread(); | 99 main_thread_checker_.CalledOnValidThread(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 case kCompositorPriorityPolicy: | 148 case kCompositorPriorityPolicy: |
138 renderer_scheduler_selector_->SetQueuePriority( | 149 renderer_scheduler_selector_->SetQueuePriority( |
139 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority); | 150 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority); |
140 break; | 151 break; |
141 case kNormalPriorityPolicy: | 152 case kNormalPriorityPolicy: |
142 renderer_scheduler_selector_->SetQueuePriority( | 153 renderer_scheduler_selector_->SetQueuePriority( |
143 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority); | 154 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority); |
144 break; | 155 break; |
145 } | 156 } |
146 current_policy_ = new_policy; | 157 current_policy_ = new_policy; |
158 | |
159 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | |
160 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), | |
161 "RendererScheduler", | |
162 this, | |
163 AsValueLocked()); | |
164 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), | |
165 "RendererScheduler.policy", | |
166 current_policy_); | |
147 } | 167 } |
148 | 168 |
149 void RendererSchedulerImpl::StartIdlePeriod() { | 169 void RendererSchedulerImpl::StartIdlePeriod() { |
170 TRACE_EVENT_ASYNC_BEGIN0(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), | |
171 "RendererSchedulerIdlePeriod", | |
172 this); | |
150 renderer_scheduler_selector_->EnableQueue( | 173 renderer_scheduler_selector_->EnableQueue( |
151 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority); | 174 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority); |
152 task_queue_manager_.PumpQueue(kIdleTaskQueue); | 175 task_queue_manager_.PumpQueue(kIdleTaskQueue); |
153 } | 176 } |
154 | 177 |
155 void RendererSchedulerImpl::EndIdlePeriod() { | 178 void RendererSchedulerImpl::EndIdlePeriod() { |
179 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), | |
180 "RendererSchedulerIdlePeriod", | |
181 this); | |
156 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); | 182 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); |
157 } | 183 } |
158 | 184 |
159 base::TimeTicks RendererSchedulerImpl::Now() const { | 185 base::TimeTicks RendererSchedulerImpl::Now() const { |
160 return gfx::FrameTime::Now(); | 186 return gfx::FrameTime::Now(); |
161 } | 187 } |
162 | 188 |
189 // static | |
190 const char* RendererSchedulerImpl::TaskQueueIdToString(QueueId queue_id) { | |
191 switch (queue_id) { | |
192 case kDefaultTaskQueue: | |
193 return "default_tq"; | |
194 case kCompositorTaskQueue: | |
195 return "compositor_tq"; | |
196 case kIdleTaskQueue: | |
197 return "idle_tq"; | |
198 case kControlTaskQueue: | |
199 return "control_tq"; | |
200 default: | |
201 NOTREACHED(); | |
202 return nullptr; | |
203 } | |
204 } | |
205 | |
206 // static | |
207 const char* RendererSchedulerImpl::PolicyToString(Policy policy) { | |
208 switch (policy) { | |
209 case kNormalPriorityPolicy: | |
210 return "normal"; | |
211 case kCompositorPriorityPolicy: | |
212 return "compositor"; | |
213 default: | |
214 NOTREACHED(); | |
215 return nullptr; | |
216 } | |
217 } | |
218 | |
219 scoped_refptr<base::debug::ConvertableToTraceFormat> | |
220 RendererSchedulerImpl::AsValueLocked() const { | |
221 main_thread_checker_.CalledOnValidThread(); | |
222 incoming_signals_lock_.AssertAcquired(); | |
223 scoped_refptr<base::debug::TracedValue> state = | |
224 new base::debug::TracedValue(); | |
225 | |
226 state->SetString("current_policy", PolicyToString(current_policy_)); | |
227 state->BeginDictionary("task_queue_manager"); | |
228 task_queue_manager_.AsValueInto(state.get()); | |
229 state->EndDictionary(); | |
230 state->BeginDictionary("renderer_scheduler_selector"); | |
231 renderer_scheduler_selector_->AsValueInto(state.get()); | |
232 state->EndDictionary(); | |
233 state->SetDouble("now", | |
234 (Now() - base::TimeTicks()).InMicroseconds() / 1000.0L); | |
rmcilroy
2014/10/27 17:51:28
Maybe pass in the value of "Now()" from it's use i
Sami
2014/10/28 12:57:47
Done, although it's a little messy since I want to
| |
235 state->SetDouble( | |
236 "last_input_time", | |
237 (last_input_time_ - base::TimeTicks()).InMicroseconds() / 1000.0L); | |
picksi1
2014/10/28 11:01:40
Would InMillisecondsF() do the same here?
Sami
2014/10/28 12:57:47
Yes, that's much cleaner. I wonder why cc -- where
| |
238 state->SetDouble( | |
239 "estimated_next_frame_begin", | |
240 (estimated_next_frame_begin_ - base::TimeTicks()).InMicroseconds() / | |
241 1000.0L); | |
242 | |
243 return state; | |
244 } | |
245 | |
163 } // namespace content | 246 } // namespace content |
OLD | NEW |