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

Side by Side Diff: cc/resources/raster_worker_pool.cc

Issue 523243002: cc: Generalize raster task notifications (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove obsolete HasPendingTasks Created 6 years, 3 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/resources/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event_synthetic_delay.h" 9 #include "base/debug/trace_event_synthetic_delay.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/threading/simple_thread.h" 12 #include "base/threading/simple_thread.h"
13 #include "cc/base/scoped_ptr_deque.h" 13 #include "cc/base/scoped_ptr_deque.h"
14 14
15 namespace cc { 15 namespace cc {
16 namespace { 16 namespace {
17 17
18 class RasterTaskGraphRunner : public TaskGraphRunner, 18 class RasterTaskGraphRunner : public TaskGraphRunner,
19 public base::DelegateSimpleThread::Delegate { 19 public base::DelegateSimpleThread::Delegate {
20 public: 20 public:
21 RasterTaskGraphRunner() 21 RasterTaskGraphRunner() {
22 : synthetic_delay_(base::debug::TraceEventSyntheticDelay::Lookup(
23 "cc.RasterRequiredForActivation")) {
24 size_t num_threads = RasterWorkerPool::GetNumRasterThreads(); 22 size_t num_threads = RasterWorkerPool::GetNumRasterThreads();
25 while (workers_.size() < num_threads) { 23 while (workers_.size() < num_threads) {
26 scoped_ptr<base::DelegateSimpleThread> worker = 24 scoped_ptr<base::DelegateSimpleThread> worker =
27 make_scoped_ptr(new base::DelegateSimpleThread( 25 make_scoped_ptr(new base::DelegateSimpleThread(
28 this, 26 this,
29 base::StringPrintf("CompositorRasterWorker%u", 27 base::StringPrintf("CompositorRasterWorker%u",
30 static_cast<unsigned>(workers_.size() + 1)) 28 static_cast<unsigned>(workers_.size() + 1))
31 .c_str())); 29 .c_str()));
32 worker->Start(); 30 worker->Start();
33 #if defined(OS_ANDROID) || defined(OS_LINUX) 31 #if defined(OS_ANDROID) || defined(OS_LINUX)
34 worker->SetThreadPriority(base::kThreadPriority_Background); 32 worker->SetThreadPriority(base::kThreadPriority_Background);
35 #endif 33 #endif
36 workers_.push_back(worker.Pass()); 34 workers_.push_back(worker.Pass());
37 } 35 }
38 } 36 }
39 37
40 virtual ~RasterTaskGraphRunner() { NOTREACHED(); } 38 virtual ~RasterTaskGraphRunner() { NOTREACHED(); }
41 39
42 base::debug::TraceEventSyntheticDelay* synthetic_delay() {
43 return synthetic_delay_;
44 }
45
46 private: 40 private:
47 // Overridden from base::DelegateSimpleThread::Delegate: 41 // Overridden from base::DelegateSimpleThread::Delegate:
48 virtual void Run() OVERRIDE { 42 virtual void Run() OVERRIDE {
49 TaskGraphRunner::Run(); 43 TaskGraphRunner::Run();
50 } 44 }
51 45
52 ScopedPtrDeque<base::DelegateSimpleThread> workers_; 46 ScopedPtrDeque<base::DelegateSimpleThread> workers_;
53 base::debug::TraceEventSyntheticDelay* synthetic_delay_;
54 }; 47 };
55 48
56 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = 49 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner =
57 LAZY_INSTANCE_INITIALIZER; 50 LAZY_INSTANCE_INITIALIZER;
58 51
59 const int kDefaultNumRasterThreads = 1; 52 const int kDefaultNumRasterThreads = 1;
60 53
61 int g_num_raster_threads = 0; 54 int g_num_raster_threads = 0;
62 55
63 class RasterFinishedTaskImpl : public RasterizerTask { 56 class RasterFinishedTaskImpl : public RasterizerTask {
64 public: 57 public:
65 explicit RasterFinishedTaskImpl( 58 explicit RasterFinishedTaskImpl(
66 base::SequencedTaskRunner* task_runner, 59 base::SequencedTaskRunner* task_runner,
67 const base::Closure& on_raster_finished_callback) 60 const base::Closure& on_raster_finished_callback,
61 base::debug::TraceEventSyntheticDelay* synthetic_delay)
68 : task_runner_(task_runner), 62 : task_runner_(task_runner),
69 on_raster_finished_callback_(on_raster_finished_callback) {} 63 on_raster_finished_callback_(on_raster_finished_callback),
64 synthetic_delay_(synthetic_delay) {
65 if (synthetic_delay_)
66 synthetic_delay_->BeginParallel(&activation_delay_end_time_);
67 }
70 68
71 // Overridden from Task: 69 // Overridden from Task:
72 virtual void RunOnWorkerThread() OVERRIDE { 70 virtual void RunOnWorkerThread() OVERRIDE {
73 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread"); 71 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread");
72
73 if (synthetic_delay_)
74 synthetic_delay_->EndParallel(activation_delay_end_time_);
74 RasterFinished(); 75 RasterFinished();
75 } 76 }
76 77
77 // Overridden from RasterizerTask: 78 // Overridden from RasterizerTask:
78 virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) OVERRIDE {} 79 virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) OVERRIDE {}
79 virtual void CompleteOnOriginThread(RasterizerTaskClient* client) OVERRIDE {} 80 virtual void CompleteOnOriginThread(RasterizerTaskClient* client) OVERRIDE {}
80 virtual void RunReplyOnOriginThread() OVERRIDE {} 81 virtual void RunReplyOnOriginThread() OVERRIDE {}
81 82
82 protected: 83 protected:
83 virtual ~RasterFinishedTaskImpl() {} 84 virtual ~RasterFinishedTaskImpl() {}
84 85
85 void RasterFinished() { 86 void RasterFinished() {
86 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); 87 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_);
87 } 88 }
88 89
89 private: 90 private:
90 scoped_refptr<base::SequencedTaskRunner> task_runner_; 91 scoped_refptr<base::SequencedTaskRunner> task_runner_;
91 const base::Closure on_raster_finished_callback_; 92 const base::Closure on_raster_finished_callback_;
93 base::debug::TraceEventSyntheticDelay* synthetic_delay_;
94 base::TimeTicks activation_delay_end_time_;
92 95
93 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl); 96 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl);
94 }; 97 };
95 98
96 class RasterRequiredForActivationFinishedTaskImpl
97 : public RasterFinishedTaskImpl {
98 public:
99 RasterRequiredForActivationFinishedTaskImpl(
100 base::SequencedTaskRunner* task_runner,
101 const base::Closure& on_raster_finished_callback,
102 size_t tasks_required_for_activation_count)
103 : RasterFinishedTaskImpl(task_runner, on_raster_finished_callback),
104 tasks_required_for_activation_count_(
105 tasks_required_for_activation_count) {
106 if (tasks_required_for_activation_count_) {
107 g_task_graph_runner.Get().synthetic_delay()->BeginParallel(
108 &activation_delay_end_time_);
109 }
110 }
111
112 // Overridden from Task:
113 virtual void RunOnWorkerThread() OVERRIDE {
114 TRACE_EVENT0(
115 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnWorkerThread");
116
117 if (tasks_required_for_activation_count_) {
118 g_task_graph_runner.Get().synthetic_delay()->EndParallel(
119 activation_delay_end_time_);
120 }
121 RasterFinished();
122 }
123
124 private:
125 virtual ~RasterRequiredForActivationFinishedTaskImpl() {}
126
127 base::TimeTicks activation_delay_end_time_;
128 const size_t tasks_required_for_activation_count_;
129
130 DISALLOW_COPY_AND_ASSIGN(RasterRequiredForActivationFinishedTaskImpl);
131 };
132
133 } // namespace 99 } // namespace
134 100
135 // This allows an external rasterize on-demand system to run raster tasks 101 // This allows an external rasterize on-demand system to run raster tasks
136 // with highest priority using the same task graph runner instance. 102 // with highest priority using the same task graph runner instance.
137 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; 103 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u;
138 // This allows a micro benchmark system to run tasks with highest priority, 104 // This allows a micro benchmark system to run tasks with highest priority,
139 // since it should finish as quickly as possible. 105 // since it should finish as quickly as possible.
140 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; 106 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u;
141 // Task priorities that make sure raster finished tasks run before any 107 // Task priorities that make sure raster finished tasks run before any
142 // remaining raster tasks. 108 // remaining raster tasks.
143 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; 109 unsigned RasterWorkerPool::kRasterTaskSetFinishedTaskPriority = 1u;
144 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = 110 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 2u;
145 1u; 111
146 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; 112 RasterWorkerPool::TaskSetSizes::TaskSetSizes() {
113 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++)
114 sizes_[task_set] = 0;
115 }
116
117 RasterWorkerPool::TaskSetSizes::TaskSetSizes(const RasterTaskQueue* queue) {
118 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++)
119 sizes_[task_set] = 0;
120
121 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
122 it != queue->items.end();
123 ++it) {
124 *this += it->task_sets;
125 }
126 }
127
128 TaskSetCollection RasterWorkerPool::TaskSetSizes::ToTaskSetCollection() const {
129 TaskSetCollection task_set_collection;
130 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
131 if (sizes_[task_set] > 0)
132 task_set_collection[task_set] = true;
133 }
134 return task_set_collection;
135 }
136
137 size_t& RasterWorkerPool::TaskSetSizes::operator[](TaskSet task_set) {
138 return sizes_[task_set];
139 }
140
141 const size_t& RasterWorkerPool::TaskSetSizes::operator[](
142 TaskSet task_set) const {
143 return sizes_[task_set];
144 }
145
146 bool RasterWorkerPool::TaskSetSizes::operator==(
147 const TaskSetSizes& other) const {
148 for (size_t i = 0; i < kNumberOfTaskSets; i++) {
149 if (sizes_[i] != other.sizes_[i])
150 return false;
151 }
152 return true;
153 }
154
155 void RasterWorkerPool::TaskSetSizes::operator+=(
156 const TaskSetCollection& task_set_collection) {
157 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
158 if (task_set_collection[task_set])
159 sizes_[task_set]++;
160 }
161 }
162
163 void RasterWorkerPool::TaskSetSizes::operator-=(
164 const TaskSetCollection& task_set_collection) {
165 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
166 if (task_set_collection[task_set])
167 sizes_[task_set]--;
168 }
169 }
147 170
148 RasterWorkerPool::RasterWorkerPool() {} 171 RasterWorkerPool::RasterWorkerPool() {}
149 172
150 RasterWorkerPool::~RasterWorkerPool() {} 173 RasterWorkerPool::~RasterWorkerPool() {}
151 174
152 // static 175 // static
153 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { 176 void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
154 DCHECK_LT(0, num_threads); 177 DCHECK_LT(0, num_threads);
155 DCHECK_EQ(0, g_num_raster_threads); 178 DCHECK_EQ(0, g_num_raster_threads);
156 179
157 g_num_raster_threads = num_threads; 180 g_num_raster_threads = num_threads;
158 } 181 }
159 182
160 // static 183 // static
161 int RasterWorkerPool::GetNumRasterThreads() { 184 int RasterWorkerPool::GetNumRasterThreads() {
162 if (!g_num_raster_threads) 185 if (!g_num_raster_threads)
163 g_num_raster_threads = kDefaultNumRasterThreads; 186 g_num_raster_threads = kDefaultNumRasterThreads;
164 187
165 return g_num_raster_threads; 188 return g_num_raster_threads;
166 } 189 }
167 190
168 // static 191 // static
169 TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { 192 TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() {
170 return g_task_graph_runner.Pointer(); 193 return g_task_graph_runner.Pointer();
171 } 194 }
172 195
173 // static 196 // static
174 scoped_refptr<RasterizerTask> RasterWorkerPool::CreateRasterFinishedTask( 197 scoped_refptr<RasterizerTask> RasterWorkerPool::CreateRasterFinishedTask(
175 base::SequencedTaskRunner* task_runner, 198 base::SequencedTaskRunner* task_runner,
176 const base::Closure& on_raster_finished_callback) { 199 const base::Closure& on_raster_finished_callback,
177 return make_scoped_refptr( 200 base::debug::TraceEventSyntheticDelay* synthetic_delay) {
178 new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback)); 201 return make_scoped_refptr(new RasterFinishedTaskImpl(
202 task_runner, on_raster_finished_callback, synthetic_delay));
179 } 203 }
180 204
181 // static 205 // static
182 scoped_refptr<RasterizerTask>
183 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask(
184 size_t tasks_required_for_activation_count,
185 base::SequencedTaskRunner* task_runner,
186 const base::Closure& on_raster_finished_callback) {
187 return make_scoped_refptr(new RasterRequiredForActivationFinishedTaskImpl(
188 task_runner,
189 on_raster_finished_callback,
190 tasks_required_for_activation_count));
191 }
192
193 // static
194 void RasterWorkerPool::ScheduleTasksOnOriginThread(RasterizerTaskClient* client, 206 void RasterWorkerPool::ScheduleTasksOnOriginThread(RasterizerTaskClient* client,
195 TaskGraph* graph) { 207 TaskGraph* graph) {
196 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread"); 208 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread");
197 209
198 for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); 210 for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
199 it != graph->nodes.end(); 211 it != graph->nodes.end();
200 ++it) { 212 ++it) {
201 TaskGraph::Node& node = *it; 213 TaskGraph::Node& node = *it;
202 RasterizerTask* task = static_cast<RasterizerTask*>(node.task); 214 RasterizerTask* task = static_cast<RasterizerTask*>(node.task);
203 215
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 if (decode_it == graph->nodes.end()) 261 if (decode_it == graph->nodes.end())
250 InsertNodeForTask(graph, decode_task, priority, 0u); 262 InsertNodeForTask(graph, decode_task, priority, 0u);
251 263
252 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task)); 264 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
253 } 265 }
254 266
255 InsertNodeForTask(graph, raster_task, priority, dependencies); 267 InsertNodeForTask(graph, raster_task, priority, dependencies);
256 } 268 }
257 269
258 } // namespace cc 270 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698