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

Side by Side Diff: content/renderer/scheduler/renderer_scheduler.cc

Issue 664963002: content: Add RendererScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix bug in calculating remaining_compositor_priority_time Created 6 years, 1 month 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
(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 #include "ui/gfx/frame_time.h"
12
13 namespace content {
14
15 RendererScheduler::RendererScheduler()
16 : RendererScheduler(base::MessageLoopProxy::current()) { }
17
18 RendererScheduler::RendererScheduler(
19 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
20 : renderer_scheduler_selector_(new RendererSchedulerSelector()),
21 task_queue_manager_(kTaskQueueCount,
22 main_task_runner,
23 renderer_scheduler_selector_.get()),
24 control_task_runner_(
25 task_queue_manager_.TaskRunnerForQueue(kControlTaskQueue)),
26 policy_may_need_update_(0),
27 current_policy_(kNormalPriorityPolicy),
28 weak_factory_(this) {
29 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner(
30 task_queue_manager_.TaskRunnerForQueue(kIdleTaskQueue),
31 weak_factory_.GetWeakPtr()));
32 renderer_scheduler_selector_->SetQueuePriority(
33 kControlTaskQueue, RendererSchedulerSelector::kControlPriority);
34 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue);
35 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false);
36 }
37
38 RendererScheduler::~RendererScheduler() {
39 }
40
41 scoped_refptr<base::SingleThreadTaskRunner>
42 RendererScheduler::DefaultTaskRunner() {
43 return task_queue_manager_.TaskRunnerForQueue(kDefaultTaskQueue);
44 }
45
46 scoped_refptr<base::SingleThreadTaskRunner>
47 RendererScheduler::CompositorTaskRunner() {
48 return task_queue_manager_.TaskRunnerForQueue(kCompositorTaskQueue);
49 }
50
51 scoped_refptr<SingleThreadIdleTaskRunner>
52 RendererScheduler::IdleTaskRunner() {
53 return idle_task_runner_;
54 }
55
56 void RendererScheduler::WillBeginFrame(const cc::BeginFrameArgs& args) {
57 main_thread_checker_.CalledOnValidThread();
58 EndIdlePeriod();
59 estimated_next_frame_begin_ = args.frame_time + args.interval;
60 }
61
62 void RendererScheduler::DidCommitFrameToCompositor() {
63 main_thread_checker_.CalledOnValidThread();
64 if (Now() < estimated_next_frame_begin_) {
65 StartIdlePeriod();
66 }
67 }
68
69 void RendererScheduler::DidReceiveInputEvent() {
70 base::AutoLock lock(incoming_signals_lock_);
71 if (last_input_time_.is_null()) {
72 // Update scheduler policy if should start a new compositor policy mode.
73 base::subtle::Release_Store(&policy_may_need_update_, 1);
74 control_task_runner_->PostTask(
75 FROM_HERE,
76 base::Bind(&RendererScheduler::UpdatePolicy, base::Unretained(this)));
Sami 2014/10/24 10:46:13 |This| should be a weak pointer, right? Is this w
rmcilroy 2014/10/24 14:58:29 Done.
77 }
78 last_input_time_ = Now();
79 }
80
81 bool RendererScheduler::ShouldYieldForHighPriorityWork() {
82 main_thread_checker_.CalledOnValidThread();
83 return SchedulerPolicy() == kCompositorPriorityPolicy &&
84 !task_queue_manager_.IsQueueEmpty(kCompositorTaskQueue);
85 }
86
87 base::TimeTicks RendererScheduler::CurrentIdleTaskDeadline() const {
88 main_thread_checker_.CalledOnValidThread();
89 return estimated_next_frame_begin_;
90 }
91
92 RendererScheduler::Policy RendererScheduler::SchedulerPolicy() {
93 main_thread_checker_.CalledOnValidThread();
94 if (base::subtle::Acquire_Load(&policy_may_need_update_)) {
95 UpdatePolicy();
96 }
97 return current_policy_;
98 }
99
100 void RendererScheduler::UpdatePolicy() {
101 main_thread_checker_.CalledOnValidThread();
102 base::AutoLock lock(incoming_signals_lock_);
103 base::subtle::Release_Store(&policy_may_need_update_, 0);
104
105 Policy new_policy = kNormalPriorityPolicy;
106 if (!last_input_time_.is_null()) {
107 base::TimeDelta compositor_priority_time =
Sami 2014/10/24 10:46:13 nit: I'd call this compositor_priority_duration to
108 base::TimeDelta::FromMilliseconds(kCompositorPriorityAfterTouchMillis);
109 base::TimeDelta remaining_compositor_priority_time =
Sami 2014/10/24 10:46:13 Ditto.
rmcilroy 2014/10/24 14:58:29 Done.
110 last_input_time_ + compositor_priority_time - Now();
111 if (remaining_compositor_priority_time > base::TimeDelta()) {
112 new_policy = kCompositorPriorityPolicy;
113 control_task_runner_->PostDelayedTask(
114 FROM_HERE,
115 base::Bind(&RendererScheduler::UpdatePolicy, base::Unretained(this)),
Sami 2014/10/24 10:46:13 weak_ptr here too.
rmcilroy 2014/10/24 14:58:29 Done.
116 remaining_compositor_priority_time);
117 } else {
118 // Null out last_input_time_ to ensure DidReceiveInputEvent will post an
119 // UpdatePolicy task when it's next called.
120 last_input_time_ = base::TimeTicks();
121 }
122 }
123
124 if (new_policy == current_policy_) {
125 return;
126 }
127
128 switch (new_policy) {
129 case kCompositorPriorityPolicy:
130 renderer_scheduler_selector_->SetQueuePriority(
131 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority);
132 break;
133 case kNormalPriorityPolicy:
134 renderer_scheduler_selector_->SetQueuePriority(
135 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority);
136 break;
137 }
138 current_policy_ = new_policy;
139 }
140
141 void RendererScheduler::StartIdlePeriod() {
142 renderer_scheduler_selector_->EnableQueue(
143 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority);
144 task_queue_manager_.PumpQueue(kIdleTaskQueue);
145 }
146
147 void RendererScheduler::EndIdlePeriod() {
148 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue);
149 }
150
151 base::TimeTicks RendererScheduler::Now() const {
152 return gfx::FrameTime::Now();
153 }
154
155 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698