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

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

Issue 228173002: cc: Separate RasterWorkerPool interface from implementation details. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/atomic_sequence_num.h" 9 #include "base/atomic_sequence_num.h"
10 #include "base/debug/trace_event_synthetic_delay.h" 10 #include "base/debug/trace_event_synthetic_delay.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 base::ThreadLocalPointer<ThreadLocalState> current_tls_; 78 base::ThreadLocalPointer<ThreadLocalState> current_tls_;
79 }; 79 };
80 80
81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = 81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner =
82 LAZY_INSTANCE_INITIALIZER; 82 LAZY_INSTANCE_INITIALIZER;
83 83
84 const int kDefaultNumRasterThreads = 1; 84 const int kDefaultNumRasterThreads = 1;
85 85
86 int g_num_raster_threads = 0; 86 int g_num_raster_threads = 0;
87 87
88 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { 88 class RasterFinishedTaskImpl : public internal::RasterizerTask {
89 public: 89 public:
90 explicit RasterFinishedWorkerPoolTaskImpl( 90 explicit RasterFinishedTaskImpl(
91 base::SequencedTaskRunner* task_runner, 91 base::SequencedTaskRunner* task_runner,
92 const base::Closure& on_raster_finished_callback) 92 const base::Closure& on_raster_finished_callback)
93 : task_runner_(task_runner), 93 : task_runner_(task_runner),
94 on_raster_finished_callback_(on_raster_finished_callback) {} 94 on_raster_finished_callback_(on_raster_finished_callback) {}
95 95
96 // Overridden from internal::Task: 96 // Overridden from internal::Task:
97 virtual void RunOnWorkerThread() OVERRIDE { 97 virtual void RunOnWorkerThread() OVERRIDE {
98 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); 98 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread");
99 RasterFinished(); 99 RasterFinished();
100 } 100 }
101 101
102 // Overridden from internal::WorkerPoolTask: 102 // Overridden from internal::RasterizerTask:
103 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 103 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client)
104 OVERRIDE {} 104 OVERRIDE {}
105 virtual void RunOnOriginThread() OVERRIDE { 105 virtual void RunOnOriginThread() OVERRIDE {
106 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread"); 106 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnOriginThread");
107 RasterFinished(); 107 RasterFinished();
108 } 108 }
109 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 109 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client)
110 OVERRIDE {} 110 OVERRIDE {}
111 virtual void RunReplyOnOriginThread() OVERRIDE {} 111 virtual void RunReplyOnOriginThread() OVERRIDE {}
112 112
113 protected: 113 protected:
114 virtual ~RasterFinishedWorkerPoolTaskImpl() {} 114 virtual ~RasterFinishedTaskImpl() {}
115 115
116 void RasterFinished() { 116 void RasterFinished() {
117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); 117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_);
118 } 118 }
119 119
120 private: 120 private:
121 scoped_refptr<base::SequencedTaskRunner> task_runner_; 121 scoped_refptr<base::SequencedTaskRunner> task_runner_;
122 const base::Closure on_raster_finished_callback_; 122 const base::Closure on_raster_finished_callback_;
123 123
124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); 124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl);
125 }; 125 };
126 126
127 class RasterRequiredForActivationFinishedWorkerPoolTaskImpl 127 class RasterRequiredForActivationFinishedTaskImpl
128 : public RasterFinishedWorkerPoolTaskImpl { 128 : public RasterFinishedTaskImpl {
129 public: 129 public:
130 RasterRequiredForActivationFinishedWorkerPoolTaskImpl( 130 RasterRequiredForActivationFinishedTaskImpl(
131 base::SequencedTaskRunner* task_runner, 131 base::SequencedTaskRunner* task_runner,
132 const base::Closure& on_raster_finished_callback, 132 const base::Closure& on_raster_finished_callback,
133 size_t tasks_required_for_activation_count) 133 size_t tasks_required_for_activation_count)
134 : RasterFinishedWorkerPoolTaskImpl(task_runner, 134 : RasterFinishedTaskImpl(task_runner, on_raster_finished_callback),
135 on_raster_finished_callback),
136 tasks_required_for_activation_count_( 135 tasks_required_for_activation_count_(
137 tasks_required_for_activation_count) { 136 tasks_required_for_activation_count) {
138 if (tasks_required_for_activation_count_) { 137 if (tasks_required_for_activation_count_) {
139 g_raster_required_for_activation_delay.Get().delay->BeginParallel( 138 g_raster_required_for_activation_delay.Get().delay->BeginParallel(
140 &activation_delay_end_time_); 139 &activation_delay_end_time_);
141 } 140 }
142 } 141 }
143 142
144 // Overridden from internal::Task: 143 // Overridden from internal::Task:
145 virtual void RunOnWorkerThread() OVERRIDE { 144 virtual void RunOnWorkerThread() OVERRIDE {
146 TRACE_EVENT0("cc", 145 TRACE_EVENT0(
147 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" 146 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnWorkerThread");
148 "RunOnWorkerThread");
149 RunRasterFinished(); 147 RunRasterFinished();
150 } 148 }
151 149
152 // Overridden from internal::WorkerPoolTask: 150 // Overridden from internal::RasterizerTask:
153 virtual void RunOnOriginThread() OVERRIDE { 151 virtual void RunOnOriginThread() OVERRIDE {
154 TRACE_EVENT0("cc", 152 TRACE_EVENT0(
155 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" 153 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnOriginThread");
156 "RunOnOriginThread");
157 RunRasterFinished(); 154 RunRasterFinished();
158 } 155 }
159 156
160 private: 157 private:
161 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} 158 virtual ~RasterRequiredForActivationFinishedTaskImpl() {}
162 159
163 void RunRasterFinished() { 160 void RunRasterFinished() {
164 if (tasks_required_for_activation_count_) { 161 if (tasks_required_for_activation_count_) {
165 g_raster_required_for_activation_delay.Get().delay->EndParallel( 162 g_raster_required_for_activation_delay.Get().delay->EndParallel(
166 activation_delay_end_time_); 163 activation_delay_end_time_);
167 } 164 }
168 RasterFinished(); 165 RasterFinished();
169 } 166 }
170 167
171 base::TimeTicks activation_delay_end_time_; 168 base::TimeTicks activation_delay_end_time_;
172 const size_t tasks_required_for_activation_count_; 169 const size_t tasks_required_for_activation_count_;
173 170
174 DISALLOW_COPY_AND_ASSIGN( 171 DISALLOW_COPY_AND_ASSIGN(RasterRequiredForActivationFinishedTaskImpl);
175 RasterRequiredForActivationFinishedWorkerPoolTaskImpl);
176 }; 172 };
177 173
178 } // namespace 174 } // namespace
179 175
180 namespace internal {
181
182 WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {}
183
184 WorkerPoolTask::~WorkerPoolTask() {
185 DCHECK(!did_schedule_);
186 DCHECK(!did_run_ || did_complete_);
187 }
188
189 void WorkerPoolTask::WillSchedule() { DCHECK(!did_schedule_); }
190
191 void WorkerPoolTask::DidSchedule() {
192 did_schedule_ = true;
193 did_complete_ = false;
194 }
195
196 bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; }
197
198 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); }
199
200 void WorkerPoolTask::DidComplete() {
201 DCHECK(did_schedule_);
202 DCHECK(!did_complete_);
203 did_schedule_ = false;
204 did_complete_ = true;
205 }
206
207 bool WorkerPoolTask::HasCompleted() const { return did_complete_; }
208
209 RasterWorkerPoolTask::RasterWorkerPoolTask(
210 const Resource* resource,
211 internal::WorkerPoolTask::Vector* dependencies)
212 : resource_(resource) {
213 dependencies_.swap(*dependencies);
214 }
215
216 RasterWorkerPoolTask::~RasterWorkerPoolTask() {}
217
218 } // namespace internal
219
220 RasterTaskQueue::Item::Item(internal::RasterWorkerPoolTask* task,
221 bool required_for_activation)
222 : task(task), required_for_activation(required_for_activation) {}
223
224 RasterTaskQueue::Item::~Item() {}
225
226 RasterTaskQueue::RasterTaskQueue() : required_for_activation_count(0u) {}
227
228 RasterTaskQueue::~RasterTaskQueue() {}
229
230 void RasterTaskQueue::Swap(RasterTaskQueue* other) {
231 items.swap(other->items);
232 std::swap(required_for_activation_count,
233 other->required_for_activation_count);
234 }
235
236 void RasterTaskQueue::Reset() {
237 required_for_activation_count = 0u;
238 items.clear();
239 }
240
241 // This allows an external rasterize on-demand system to run raster tasks 176 // This allows an external rasterize on-demand system to run raster tasks
242 // with highest priority using the same task graph runner instance. 177 // with highest priority using the same task graph runner instance.
243 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; 178 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u;
244 // This allows a micro benchmark system to run tasks with highest priority, 179 // This allows a micro benchmark system to run tasks with highest priority,
245 // since it should finish as quickly as possible. 180 // since it should finish as quickly as possible.
246 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; 181 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u;
247 // Task priorities that make sure raster finished tasks run before any 182 // Task priorities that make sure raster finished tasks run before any
248 // remaining raster tasks. 183 // remaining raster tasks.
249 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; 184 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u;
250 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = 185 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority =
251 1u; 186 1u;
252 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; 187 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u;
253 188
189 RasterWorkerPool::RasterWorkerPool() {}
190
191 RasterWorkerPool::~RasterWorkerPool() {}
192
254 // static 193 // static
255 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { 194 void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
256 DCHECK_LT(0, num_threads); 195 DCHECK_LT(0, num_threads);
257 DCHECK_EQ(0, g_num_raster_threads); 196 DCHECK_EQ(0, g_num_raster_threads);
258 197
259 g_num_raster_threads = num_threads; 198 g_num_raster_threads = num_threads;
260 } 199 }
261 200
262 // static 201 // static
263 int RasterWorkerPool::GetNumRasterThreads() { 202 int RasterWorkerPool::GetNumRasterThreads() {
264 if (!g_num_raster_threads) 203 if (!g_num_raster_threads)
265 g_num_raster_threads = kDefaultNumRasterThreads; 204 g_num_raster_threads = kDefaultNumRasterThreads;
266 205
267 return g_num_raster_threads; 206 return g_num_raster_threads;
268 } 207 }
269 208
270 // static 209 // static
271 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { 210 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() {
272 return g_task_graph_runner.Pointer(); 211 return g_task_graph_runner.Pointer();
273 } 212 }
274 213
275 // static 214 // static
276 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() { 215 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() {
277 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread(); 216 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread();
278 } 217 }
279 218
280 // static 219 // static
281 scoped_refptr<internal::WorkerPoolTask> 220 scoped_refptr<internal::RasterizerTask>
282 RasterWorkerPool::CreateRasterFinishedTask( 221 RasterWorkerPool::CreateRasterFinishedTask(
283 base::SequencedTaskRunner* task_runner, 222 base::SequencedTaskRunner* task_runner,
284 const base::Closure& on_raster_finished_callback) { 223 const base::Closure& on_raster_finished_callback) {
285 return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl( 224 return make_scoped_refptr(
286 task_runner, on_raster_finished_callback)); 225 new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback));
287 } 226 }
288 227
289 // static 228 // static
290 scoped_refptr<internal::WorkerPoolTask> 229 scoped_refptr<internal::RasterizerTask>
291 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( 230 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask(
292 size_t tasks_required_for_activation_count, 231 size_t tasks_required_for_activation_count,
293 base::SequencedTaskRunner* task_runner, 232 base::SequencedTaskRunner* task_runner,
294 const base::Closure& on_raster_finished_callback) { 233 const base::Closure& on_raster_finished_callback) {
295 return make_scoped_refptr( 234 return make_scoped_refptr(new RasterRequiredForActivationFinishedTaskImpl(
296 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( 235 task_runner,
297 task_runner, 236 on_raster_finished_callback,
298 on_raster_finished_callback, 237 tasks_required_for_activation_count));
299 tasks_required_for_activation_count));
300 } 238 }
301 239
302 // static 240 // static
303 void RasterWorkerPool::ScheduleTasksOnOriginThread( 241 void RasterWorkerPool::ScheduleTasksOnOriginThread(
304 internal::WorkerPoolTaskClient* client, 242 internal::RasterizerTaskClient* client,
305 internal::TaskGraph* graph) { 243 internal::TaskGraph* graph) {
306 TRACE_EVENT0("cc", "RasterWorkerPool::ScheduleTasksOnOriginThread"); 244 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread");
307 245
308 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); 246 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
309 it != graph->nodes.end(); 247 it != graph->nodes.end();
310 ++it) { 248 ++it) {
311 internal::TaskGraph::Node& node = *it; 249 internal::TaskGraph::Node& node = *it;
312 internal::WorkerPoolTask* task = 250 internal::RasterizerTask* task =
313 static_cast<internal::WorkerPoolTask*>(node.task); 251 static_cast<internal::RasterizerTask*>(node.task);
314 252
315 if (!task->HasBeenScheduled()) { 253 if (!task->HasBeenScheduled()) {
316 task->WillSchedule(); 254 task->WillSchedule();
317 task->ScheduleOnOriginThread(client); 255 task->ScheduleOnOriginThread(client);
318 task->DidSchedule(); 256 task->DidSchedule();
319 } 257 }
320 } 258 }
321 } 259 }
322 260
323 // static 261 // static
324 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, 262 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph,
325 internal::WorkerPoolTask* task, 263 internal::RasterizerTask* task,
326 unsigned priority, 264 unsigned priority,
327 size_t dependencies) { 265 size_t dependencies) {
328 DCHECK(std::find_if(graph->nodes.begin(), 266 DCHECK(std::find_if(graph->nodes.begin(),
329 graph->nodes.end(), 267 graph->nodes.end(),
330 internal::TaskGraph::Node::TaskComparator(task)) == 268 internal::TaskGraph::Node::TaskComparator(task)) ==
331 graph->nodes.end()); 269 graph->nodes.end());
332 graph->nodes.push_back( 270 graph->nodes.push_back(
333 internal::TaskGraph::Node(task, priority, dependencies)); 271 internal::TaskGraph::Node(task, priority, dependencies));
334 } 272 }
335 273
336 // static 274 // static
337 void RasterWorkerPool::InsertNodesForRasterTask( 275 void RasterWorkerPool::InsertNodesForRasterTask(
338 internal::TaskGraph* graph, 276 internal::TaskGraph* graph,
339 internal::WorkerPoolTask* raster_task, 277 internal::RasterTask* raster_task,
340 const internal::WorkerPoolTask::Vector& decode_tasks, 278 const internal::ImageDecodeTask::Vector& decode_tasks,
341 unsigned priority) { 279 unsigned priority) {
342 size_t dependencies = 0u; 280 size_t dependencies = 0u;
343 281
344 // Insert image decode tasks. 282 // Insert image decode tasks.
345 for (internal::WorkerPoolTask::Vector::const_iterator it = 283 for (internal::ImageDecodeTask::Vector::const_iterator it =
346 decode_tasks.begin(); 284 decode_tasks.begin();
347 it != decode_tasks.end(); 285 it != decode_tasks.end();
348 ++it) { 286 ++it) {
349 internal::WorkerPoolTask* decode_task = it->get(); 287 internal::ImageDecodeTask* decode_task = it->get();
350 288
351 // Skip if already decoded. 289 // Skip if already decoded.
352 if (decode_task->HasCompleted()) 290 if (decode_task->HasCompleted())
353 continue; 291 continue;
354 292
355 dependencies++; 293 dependencies++;
356 294
357 // Add decode task if it doesn't already exists in graph. 295 // Add decode task if it doesn't already exists in graph.
358 internal::TaskGraph::Node::Vector::iterator decode_it = 296 internal::TaskGraph::Node::Vector::iterator decode_it =
359 std::find_if(graph->nodes.begin(), 297 std::find_if(graph->nodes.begin(),
360 graph->nodes.end(), 298 graph->nodes.end(),
361 internal::TaskGraph::Node::TaskComparator(decode_task)); 299 internal::TaskGraph::Node::TaskComparator(decode_task));
362 if (decode_it == graph->nodes.end()) 300 if (decode_it == graph->nodes.end())
363 InsertNodeForTask(graph, decode_task, priority, 0u); 301 InsertNodeForTask(graph, decode_task, priority, 0u);
364 302
365 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); 303 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task));
366 } 304 }
367 305
368 InsertNodeForTask(graph, raster_task, priority, dependencies); 306 InsertNodeForTask(graph, raster_task, priority, dependencies);
369 } 307 }
370 308
371 } // namespace cc 309 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698