Chromium Code Reviews| 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 |