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

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

Issue 17244003: cc: Move task graph construction to RasterWorkerPool classes. (Closed) Base URL: http://git.chromium.org/chromium/src.git@wp-run-count
Patch Set: remove unsused code Created 7 years, 6 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
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('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 "base/json/json_writer.h" 7 #include "base/json/json_writer.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "cc/debug/devtools_instrumentation.h" 10 #include "cc/debug/devtools_instrumentation.h"
(...skipping 11 matching lines...) Expand all
22 // SkDrawFilter interface. 22 // SkDrawFilter interface.
23 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { 23 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE {
24 if (type != SkDrawFilter::kText_Type) 24 if (type != SkDrawFilter::kText_Type)
25 return true; 25 return true;
26 26
27 paint->setLCDRenderText(false); 27 paint->setLCDRenderText(false);
28 return true; 28 return true;
29 } 29 }
30 }; 30 };
31 31
32 void Noop() {}
33
34 class RootWorkerPoolTaskImpl : public internal::WorkerPoolTask {
35 public:
36 RootWorkerPoolTaskImpl(const base::Closure& callback,
37 const base::Closure& reply)
38 : callback_(callback), reply_(reply) {}
39
40 explicit RootWorkerPoolTaskImpl(
41 internal::WorkerPoolTask::TaskVector* dependencies)
42 : internal::WorkerPoolTask(dependencies),
43 callback_(base::Bind(&Noop)),
44 reply_(base::Bind(&Noop)) {}
45
46 RootWorkerPoolTaskImpl(const base::Closure& callback,
47 internal::WorkerPoolTask::TaskVector* dependencies)
48 : internal::WorkerPoolTask(dependencies),
49 callback_(callback),
50 reply_(base::Bind(&Noop)) {}
51
52 // Overridden from internal::WorkerPoolTask:
53 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
54 callback_.Run();
55 }
56 virtual void DispatchCompletionCallback() OVERRIDE {
57 reply_.Run();
58 }
59
60 private:
61 virtual ~RootWorkerPoolTaskImpl() {}
62
63 const base::Closure callback_;
64 const base::Closure reply_;
65
66 DISALLOW_COPY_AND_ASSIGN(RootWorkerPoolTaskImpl);
67 };
68
69 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { 32 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
70 public: 33 public:
71 RasterWorkerPoolTaskImpl(const Resource* resource, 34 RasterWorkerPoolTaskImpl(const Resource* resource,
72 PicturePileImpl* picture_pile, 35 PicturePileImpl* picture_pile,
73 gfx::Rect content_rect, 36 gfx::Rect content_rect,
74 float contents_scale, 37 float contents_scale,
75 RasterMode raster_mode, 38 RasterMode raster_mode,
76 bool use_color_estimator, 39 bool use_color_estimator,
77 const RasterTaskMetadata& metadata, 40 const RasterTaskMetadata& metadata,
78 RenderingStatsInstrumentation* rendering_stats, 41 RenderingStatsInstrumentation* rendering_stats,
79 const RasterWorkerPool::RasterTask::Reply& reply, 42 const RasterWorkerPool::RasterTask::Reply& reply,
80 internal::WorkerPoolTask::TaskVector* dependencies) 43 TaskVector* dependencies)
81 : internal::RasterWorkerPoolTask(resource, dependencies), 44 : internal::RasterWorkerPoolTask(resource, dependencies),
82 picture_pile_(picture_pile), 45 picture_pile_(picture_pile),
83 content_rect_(content_rect), 46 content_rect_(content_rect),
84 contents_scale_(contents_scale), 47 contents_scale_(contents_scale),
85 raster_mode_(raster_mode), 48 raster_mode_(raster_mode),
86 use_color_estimator_(use_color_estimator), 49 use_color_estimator_(use_color_estimator),
87 metadata_(metadata), 50 metadata_(metadata),
88 rendering_stats_(rendering_stats), 51 rendering_stats_(rendering_stats),
89 reply_(reply) {} 52 reply_(reply) {}
90 53
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 193
231 private: 194 private:
232 skia::LazyPixelRef* pixel_ref_; 195 skia::LazyPixelRef* pixel_ref_;
233 int layer_id_; 196 int layer_id_;
234 RenderingStatsInstrumentation* rendering_stats_; 197 RenderingStatsInstrumentation* rendering_stats_;
235 const RasterWorkerPool::Task::Reply reply_; 198 const RasterWorkerPool::Task::Reply reply_;
236 199
237 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); 200 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl);
238 }; 201 };
239 202
203 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask {
204 public:
205 RasterFinishedWorkerPoolTaskImpl(
206 base::MessageLoopProxy* origin_loop,
207 const base::Closure& on_raster_finished_callback)
208 : origin_loop_(origin_loop),
209 on_raster_finished_callback_(on_raster_finished_callback) {
210 }
211
212 // Overridden from internal::WorkerPoolTask:
213 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
214 origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_);
215 }
216 virtual void DispatchCompletionCallback() OVERRIDE {}
217
218 private:
219 virtual ~RasterFinishedWorkerPoolTaskImpl() {}
220
221 scoped_refptr<base::MessageLoopProxy> origin_loop_;
222 const base::Closure on_raster_finished_callback_;
223
224 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl);
225 };
226
227 void Noop() {}
228
240 const char* kWorkerThreadNamePrefix = "CompositorRaster"; 229 const char* kWorkerThreadNamePrefix = "CompositorRaster";
241 230
242 } // namespace 231 } // namespace
243 232
244 namespace internal { 233 namespace internal {
245 234
246 RasterWorkerPoolTask::RasterWorkerPoolTask( 235 RasterWorkerPoolTask::RasterWorkerPoolTask(
247 const Resource* resource, 236 const Resource* resource, TaskVector* dependencies)
248 WorkerPoolTask::TaskVector* dependencies)
249 : did_run_(false), 237 : did_run_(false),
250 did_complete_(false), 238 did_complete_(false),
251 was_canceled_(false), 239 was_canceled_(false),
252 resource_(resource) { 240 resource_(resource) {
253 dependencies_.swap(*dependencies); 241 dependencies_.swap(*dependencies);
254 } 242 }
255 243
256 RasterWorkerPoolTask::~RasterWorkerPoolTask() { 244 RasterWorkerPoolTask::~RasterWorkerPoolTask() {
257 } 245 }
258 246
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 : internal_(internal) { 326 : internal_(internal) {
339 } 327 }
340 328
341 void RasterWorkerPool::RasterTask::Reset() { 329 void RasterWorkerPool::RasterTask::Reset() {
342 internal_ = NULL; 330 internal_ = NULL;
343 } 331 }
344 332
345 RasterWorkerPool::RasterTask::~RasterTask() { 333 RasterWorkerPool::RasterTask::~RasterTask() {
346 } 334 }
347 335
348 RasterWorkerPool::RootTask::RootTask() { 336 RasterWorkerPool::RasterTaskGraph::RasterTaskGraph()
337 : raster_finished_node_(new GraphNode),
338 next_priority_(1u) {
349 } 339 }
350 340
351 RasterWorkerPool::RootTask::RootTask( 341 RasterWorkerPool::RasterTaskGraph::~RasterTaskGraph() {
352 internal::WorkerPoolTask::TaskVector* dependencies)
353 : internal_(new RootWorkerPoolTaskImpl(dependencies)) {
354 } 342 }
355 343
356 RasterWorkerPool::RootTask::RootTask( 344 void RasterWorkerPool::RasterTaskGraph::InsertRasterTask(
357 const base::Closure& callback, 345 internal::WorkerPoolTask* raster_task,
358 internal::WorkerPoolTask::TaskVector* dependencies) 346 const TaskVector& decode_tasks) {
359 : internal_(new RootWorkerPoolTaskImpl(callback, dependencies)) { 347 DCHECK(!raster_task->HasCompleted());
360 } 348 DCHECK(graph_.find(raster_task) == graph_.end());
361 349
362 RasterWorkerPool::RootTask::~RootTask() { 350 scoped_ptr<GraphNode> raster_node(new GraphNode);
351 raster_node->set_task(raster_task);
352 raster_node->set_priority(next_priority_++);
353
354 // Insert image decode tasks.
355 for (TaskVector::const_iterator it = decode_tasks.begin();
356 it != decode_tasks.end(); ++it) {
357 internal::WorkerPoolTask* decode_task = it->get();
358
359 // Skip if already decoded.
360 if (decode_task->HasCompleted())
361 continue;
362
363 raster_node->add_dependency();
364
365 // Check if decode task already exists in graph.
366 GraphNodeMap::iterator decode_it = graph_.find(decode_task);
367 if (decode_it != graph_.end()) {
368 GraphNode* decode_node = decode_it->second;
369 decode_node->add_dependent(raster_node.get());
370 continue;
371 }
372
373 scoped_ptr<GraphNode> decode_node(new GraphNode);
374 decode_node->set_task(decode_task);
375 decode_node->set_priority(next_priority_++);
376 decode_node->add_dependent(raster_node.get());
377 graph_.set(decode_task, decode_node.Pass());
378 }
379
380 raster_finished_node_->add_dependency();
381 raster_node->add_dependent(raster_finished_node_.get());
382
383 graph_.set(raster_task, raster_node.Pass());
363 } 384 }
364 385
365 // static 386 // static
366 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( 387 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask(
367 const Resource* resource, 388 const Resource* resource,
368 PicturePileImpl* picture_pile, 389 PicturePileImpl* picture_pile,
369 gfx::Rect content_rect, 390 gfx::Rect content_rect,
370 float contents_scale, 391 float contents_scale,
371 RasterMode raster_mode, 392 RasterMode raster_mode,
372 bool use_color_estimator, 393 bool use_color_estimator,
373 const RasterTaskMetadata& metadata, 394 const RasterTaskMetadata& metadata,
374 RenderingStatsInstrumentation* rendering_stats, 395 RenderingStatsInstrumentation* rendering_stats,
375 const RasterTask::Reply& reply, 396 const RasterTask::Reply& reply,
376 Task::Set& dependencies) { 397 Task::Set* dependencies) {
377 return RasterTask(new RasterWorkerPoolTaskImpl(resource, 398 return RasterTask(new RasterWorkerPoolTaskImpl(resource,
378 picture_pile, 399 picture_pile,
379 content_rect, 400 content_rect,
380 contents_scale, 401 contents_scale,
381 raster_mode, 402 raster_mode,
382 use_color_estimator, 403 use_color_estimator,
383 metadata, 404 metadata,
384 rendering_stats, 405 rendering_stats,
385 reply, 406 reply,
386 &dependencies.tasks_)); 407 &dependencies->tasks_));
387 } 408 }
388 409
389 // static 410 // static
390 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( 411 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask(
391 skia::LazyPixelRef* pixel_ref, 412 skia::LazyPixelRef* pixel_ref,
392 int layer_id, 413 int layer_id,
393 RenderingStatsInstrumentation* stats_instrumentation, 414 RenderingStatsInstrumentation* stats_instrumentation,
394 const Task::Reply& reply) { 415 const Task::Reply& reply) {
395 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, 416 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref,
396 layer_id, 417 layer_id,
397 stats_instrumentation, 418 stats_instrumentation,
398 reply)); 419 reply));
399 } 420 }
400 421
401 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, 422 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
402 size_t num_threads) 423 size_t num_threads)
403 : WorkerPool(num_threads, kWorkerThreadNamePrefix), 424 : WorkerPool(num_threads, kWorkerThreadNamePrefix),
404 client_(NULL), 425 client_(NULL),
405 resource_provider_(resource_provider) { 426 resource_provider_(resource_provider),
427 weak_ptr_factory_(this),
428 schedule_raster_tasks_count_(0) {
406 } 429 }
407 430
408 RasterWorkerPool::~RasterWorkerPool() { 431 RasterWorkerPool::~RasterWorkerPool() {
409 } 432 }
410 433
411 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { 434 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) {
412 client_ = client; 435 client_ = client;
413 } 436 }
414 437
415 void RasterWorkerPool::Shutdown() { 438 void RasterWorkerPool::Shutdown() {
439 TaskGraph empty;
440 SetTaskGraph(&empty);
441 WorkerPool::Shutdown();
416 raster_tasks_.clear(); 442 raster_tasks_.clear();
417 WorkerPool::Shutdown(); 443 // Cancel any pending OnRasterFinished callback.
444 weak_ptr_factory_.InvalidateWeakPtrs();
418 } 445 }
419 446
420 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { 447 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) {
421 raster_tasks_.swap(queue->tasks_); 448 raster_tasks_.swap(queue->tasks_);
422 raster_tasks_required_for_activation_.swap( 449 raster_tasks_required_for_activation_.swap(
423 queue->tasks_required_for_activation_); 450 queue->tasks_required_for_activation_);
424 } 451 }
425 452
426 void RasterWorkerPool::ScheduleRasterTasks(const RootTask& root) { 453 void RasterWorkerPool::SetRasterTaskGraph(RasterTaskGraph* graph) {
427 scoped_refptr<internal::WorkerPoolTask> new_root(root.internal_); 454 scoped_ptr<GraphNode> raster_finished_node(
455 graph->raster_finished_node_.Pass());
456 TaskGraph new_graph;
457 new_graph.swap(graph->graph_);
428 458
429 TaskGraph graph; 459 if (new_graph.empty()) {
430 BuildTaskGraph(new_root.get(), &graph); 460 SetTaskGraph(&new_graph);
431 WorkerPool::SetTaskGraph(&graph); 461 raster_finished_task_ = NULL;
462 return;
463 }
432 464
433 root_.swap(new_root); 465 ++schedule_raster_tasks_count_;
vmpstr 2013/06/20 18:01:30 should this be incremented even if we schedule NUL
reveman 2013/06/20 18:34:09 we'll probably change this moving forward but I pr
466
467 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
468 new RasterFinishedWorkerPoolTaskImpl(
469 base::MessageLoopProxy::current(),
470 base::Bind(&RasterWorkerPool::OnRasterFinished,
471 weak_ptr_factory_.GetWeakPtr(),
472 schedule_raster_tasks_count_)));
473 raster_finished_node->set_task(new_raster_finished_task.get());
474 // Insert "raster finished" task before switching to new graph.
475 new_graph.set(new_raster_finished_task.get(), raster_finished_node.Pass());
476 SetTaskGraph(&new_graph);
477 raster_finished_task_.swap(new_raster_finished_task);
434 } 478 }
435 479
436 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( 480 bool RasterWorkerPool::IsRasterTaskRequiredForActivation(
437 internal::RasterWorkerPoolTask* task) const { 481 internal::RasterWorkerPoolTask* task) const {
438 return 482 return
439 raster_tasks_required_for_activation_.find(task) != 483 raster_tasks_required_for_activation_.find(task) !=
440 raster_tasks_required_for_activation_.end(); 484 raster_tasks_required_for_activation_.end();
441 } 485 }
442 486
487 void RasterWorkerPool::OnRasterFinished(int64 schedule_raster_tasks_count) {
488 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished",
489 "schedule_raster_tasks_count", schedule_raster_tasks_count);
490 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count);
491 // Call OnRasterTasksFinished() when we've finished running all raster
492 // tasks needed since last time SetRasterTaskGraph() was called.
493 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count)
494 OnRasterTasksFinished();
495 }
496
443 } // namespace cc 497 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698