Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/scheduler/renderer_scheduler.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/message_loop/message_loop_proxy.h" | |
| 9 #include "cc/output/begin_frame_args.h" | |
| 10 #include "content/renderer/scheduler/renderer_scheduler_selector.h" | |
| 11 | |
| 12 namespace content { | |
| 13 | |
| 14 RendererScheduler::RendererScheduler() | |
| 15 : renderer_scheduler_selector_(new RendererSchedulerSelector()), | |
| 16 task_queue_manager_(kTaskAndControlQueueCount, | |
| 17 base::MessageLoopProxy::current(), | |
| 18 renderer_scheduler_selector_.get()), | |
| 19 control_task_runner_( | |
| 20 task_queue_manager_.TaskRunnerForQueue(kControlQueue)) { | |
| 21 // renderer_scheduler_selector_->SetQueuePriority( | |
| 22 // kControlQueue, RendererSchedulerSelector::kControlPriority);; | |
| 23 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); | |
| 24 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false); | |
| 25 } | |
| 26 | |
| 27 RendererScheduler::~RendererScheduler() { | |
| 28 } | |
| 29 | |
| 30 scoped_refptr<base::SingleThreadTaskRunner> | |
| 31 RendererScheduler::TaskRunnerForQueue(QueueId queue) { | |
| 32 return task_queue_manager_.TaskRunnerForQueue(queue); | |
| 33 } | |
| 34 | |
| 35 void RendererScheduler::WillBeginFrame(const cc::BeginFrameArgs& args) { | |
| 36 main_thread_checker_.CalledOnValidThread(); | |
| 37 EndIdlePeriod(); | |
| 38 estimated_next_frame_begin_ = args.frame_time + args.interval; | |
| 39 } | |
| 40 | |
| 41 void RendererScheduler::DidCommitFrameToCompositor() { | |
| 42 main_thread_checker_.CalledOnValidThread(); | |
| 43 if (base::TimeTicks::Now() < estimated_next_frame_begin_) { | |
| 44 StartIdlePeriod(); | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 void RendererScheduler::DidReceiveInputEvent() { | |
| 49 control_task_runner_->PostTask( | |
|
alexclarke
2014/10/20 10:10:10
On one hand I like the idea of posting tasks to av
rmcilroy
2014/10/20 11:34:03
Good point. We could potentially update the curren
alexclarke
2014/10/20 12:48:35
I think it may be necessary to change policy here.
rmcilroy
2014/10/21 17:21:26
I've updated this to have a policy_may_need_update
| |
| 50 FROM_HERE, | |
| 51 base::Bind(&RendererScheduler::EnterSchedulerPolicy, | |
| 52 base::Unretained(this), | |
| 53 kCompositorPriorityPolicy)); | |
| 54 } | |
| 55 | |
| 56 bool RendererScheduler::ShouldYieldForHighPriorityWork() { | |
| 57 return (SchedulerPolicy() == kCompositorPriorityPolicy) && | |
| 58 task_queue_manager_.PollQueue(kCompositorTaskQueue); | |
| 59 } | |
| 60 | |
| 61 base::TimeTicks RendererScheduler::CurrentFrameDeadlineForIdleTasks() const { | |
| 62 main_thread_checker_.CalledOnValidThread(); | |
| 63 return estimated_next_frame_begin_; | |
| 64 } | |
| 65 | |
| 66 RendererScheduler::Policy RendererScheduler::SchedulerPolicy() const { | |
| 67 return static_cast<Policy>(base::subtle::Acquire_Load(¤t_policy_)); | |
| 68 } | |
| 69 | |
| 70 void RendererScheduler::EnterSchedulerPolicy(Policy policy) { | |
| 71 main_thread_checker_.CalledOnValidThread(); | |
| 72 if (SchedulerPolicy() != policy) { | |
|
picksi1
2014/10/20 11:42:04
Should we early out if SchedulerPolicy() == policy
rmcilroy
2014/10/21 17:21:26
Done.
| |
| 73 switch(policy) { | |
| 74 case kCompositorPriorityPolicy: | |
| 75 renderer_scheduler_selector_->SetQueuePriority( | |
| 76 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority); | |
| 77 control_task_runner_->PostDelayedTask( | |
|
alexclarke
2014/10/20 12:48:35
Suppose you keep your finger down longer than kCom
rmcilroy
2014/10/21 17:21:26
Yes I guess you would go to normal prio, then imme
| |
| 78 FROM_HERE, | |
| 79 base::Bind(&RendererScheduler::EnterSchedulerPolicy, | |
| 80 base::Unretained(this), | |
| 81 kNormalPriorityPolicy), | |
| 82 kCompositoryPriorityAfterTouchTime); | |
| 83 break; | |
|
picksi1
2014/10/20 11:42:04
When we set Scheduler Policy to Compositor Priorit
rmcilroy
2014/10/21 17:21:26
The updated patchset changes this around and shoul
| |
| 84 case kNormalPriorityPolicy: | |
| 85 renderer_scheduler_selector_->SetQueuePriority( | |
| 86 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority); | |
| 87 break; | |
| 88 } | |
| 89 base::subtle::Release_Store(¤t_policy_, policy); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 void RendererScheduler::StartIdlePeriod() { | |
| 94 renderer_scheduler_selector_->EnableQueue( | |
| 95 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority); | |
| 96 task_queue_manager_.PumpQueue(kIdleTaskQueue); | |
|
picksi1
2014/10/20 11:42:04
as above, do we need to clean any other 'return to
rmcilroy
2014/10/21 17:21:26
There is no delayed task which sets between idle t
| |
| 97 } | |
| 98 | |
| 99 void RendererScheduler::EndIdlePeriod() { | |
| 100 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); | |
| 101 } | |
| 102 | |
| 103 } // namespace content | |
| OLD | NEW |