OLD | NEW |
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/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 if (type != SkDrawFilter::kText_Type) | 62 if (type != SkDrawFilter::kText_Type) |
63 return true; | 63 return true; |
64 | 64 |
65 paint->setLCDRenderText(false); | 65 paint->setLCDRenderText(false); |
66 return true; | 66 return true; |
67 } | 67 } |
68 }; | 68 }; |
69 | 69 |
70 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 70 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
71 public: | 71 public: |
72 RasterWorkerPoolTaskImpl(const Resource* resource, | 72 RasterWorkerPoolTaskImpl( |
73 PicturePileImpl* picture_pile, | 73 const Resource* resource, |
74 const gfx::Rect& content_rect, | 74 PicturePileImpl* picture_pile, |
75 float contents_scale, | 75 const gfx::Rect& content_rect, |
76 RasterMode raster_mode, | 76 float contents_scale, |
77 TileResolution tile_resolution, | 77 RasterMode raster_mode, |
78 int layer_id, | 78 TileResolution tile_resolution, |
79 const void* tile_id, | 79 int layer_id, |
80 int source_frame_number, | 80 const void* tile_id, |
81 RenderingStatsInstrumentation* rendering_stats, | 81 int source_frame_number, |
82 const RasterWorkerPool::RasterTask::Reply& reply, | 82 RenderingStatsInstrumentation* rendering_stats, |
83 internal::WorkerPoolTask::Vector* dependencies, | 83 const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
84 ContextProvider* context_provider) | 84 internal::WorkerPoolTask::Vector* dependencies, |
| 85 ContextProvider* context_provider) |
85 : internal::RasterWorkerPoolTask(resource, dependencies), | 86 : internal::RasterWorkerPoolTask(resource, dependencies), |
86 picture_pile_(picture_pile), | 87 picture_pile_(picture_pile), |
87 content_rect_(content_rect), | 88 content_rect_(content_rect), |
88 contents_scale_(contents_scale), | 89 contents_scale_(contents_scale), |
89 raster_mode_(raster_mode), | 90 raster_mode_(raster_mode), |
90 tile_resolution_(tile_resolution), | 91 tile_resolution_(tile_resolution), |
91 layer_id_(layer_id), | 92 layer_id_(layer_id), |
92 tile_id_(tile_id), | 93 tile_id_(tile_id), |
93 source_frame_number_(source_frame_number), | 94 source_frame_number_(source_frame_number), |
94 rendering_stats_(rendering_stats), | 95 rendering_stats_(rendering_stats), |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 PicturePileImpl::Analysis analysis_; | 230 PicturePileImpl::Analysis analysis_; |
230 scoped_refptr<PicturePileImpl> picture_pile_; | 231 scoped_refptr<PicturePileImpl> picture_pile_; |
231 gfx::Rect content_rect_; | 232 gfx::Rect content_rect_; |
232 float contents_scale_; | 233 float contents_scale_; |
233 RasterMode raster_mode_; | 234 RasterMode raster_mode_; |
234 TileResolution tile_resolution_; | 235 TileResolution tile_resolution_; |
235 int layer_id_; | 236 int layer_id_; |
236 const void* tile_id_; | 237 const void* tile_id_; |
237 int source_frame_number_; | 238 int source_frame_number_; |
238 RenderingStatsInstrumentation* rendering_stats_; | 239 RenderingStatsInstrumentation* rendering_stats_; |
239 const RasterWorkerPool::RasterTask::Reply reply_; | 240 const base::Callback<void(const PicturePileImpl::Analysis&, bool)> reply_; |
240 ContextProvider* context_provider_; | 241 ContextProvider* context_provider_; |
241 SkCanvas* canvas_; | 242 SkCanvas* canvas_; |
242 | 243 |
243 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 244 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
244 }; | 245 }; |
245 | 246 |
246 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 247 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
247 public: | 248 public: |
248 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, | 249 ImageDecodeWorkerPoolTaskImpl( |
249 int layer_id, | 250 SkPixelRef* pixel_ref, |
250 RenderingStatsInstrumentation* rendering_stats, | 251 int layer_id, |
251 const RasterWorkerPool::Task::Reply& reply) | 252 RenderingStatsInstrumentation* rendering_stats, |
| 253 const base::Callback<void(bool was_canceled)>& reply) |
252 : pixel_ref_(skia::SharePtr(pixel_ref)), | 254 : pixel_ref_(skia::SharePtr(pixel_ref)), |
253 layer_id_(layer_id), | 255 layer_id_(layer_id), |
254 rendering_stats_(rendering_stats), | 256 rendering_stats_(rendering_stats), |
255 reply_(reply) {} | 257 reply_(reply) {} |
256 | 258 |
257 // Overridden from internal::Task: | 259 // Overridden from internal::Task: |
258 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 260 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
259 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); | 261 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); |
260 Decode(); | 262 Decode(); |
261 } | 263 } |
(...skipping 21 matching lines...) Expand all Loading... |
283 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( | 285 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
284 pixel_ref_.get()); | 286 pixel_ref_.get()); |
285 // This will cause the image referred to by pixel ref to be decoded. | 287 // This will cause the image referred to by pixel ref to be decoded. |
286 pixel_ref_->lockPixels(); | 288 pixel_ref_->lockPixels(); |
287 pixel_ref_->unlockPixels(); | 289 pixel_ref_->unlockPixels(); |
288 } | 290 } |
289 | 291 |
290 skia::RefPtr<SkPixelRef> pixel_ref_; | 292 skia::RefPtr<SkPixelRef> pixel_ref_; |
291 int layer_id_; | 293 int layer_id_; |
292 RenderingStatsInstrumentation* rendering_stats_; | 294 RenderingStatsInstrumentation* rendering_stats_; |
293 const RasterWorkerPool::Task::Reply reply_; | 295 const base::Callback<void(bool was_canceled)>& reply_; |
294 | 296 |
295 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); | 297 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); |
296 }; | 298 }; |
297 | 299 |
298 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 300 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
299 public: | 301 public: |
300 typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback; | 302 typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback; |
301 | 303 |
302 explicit RasterFinishedWorkerPoolTaskImpl( | 304 explicit RasterFinishedWorkerPoolTaskImpl( |
303 const Callback& on_raster_finished_callback) | 305 const Callback& on_raster_finished_callback) |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 const Resource* resource, | 442 const Resource* resource, |
441 internal::WorkerPoolTask::Vector* dependencies) | 443 internal::WorkerPoolTask::Vector* dependencies) |
442 : resource_(resource) { | 444 : resource_(resource) { |
443 dependencies_.swap(*dependencies); | 445 dependencies_.swap(*dependencies); |
444 } | 446 } |
445 | 447 |
446 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} | 448 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} |
447 | 449 |
448 } // namespace internal | 450 } // namespace internal |
449 | 451 |
450 RasterWorkerPool::Task::Set::Set() {} | 452 RasterTaskQueue::Item::Item(internal::RasterWorkerPoolTask* task, |
| 453 bool required_for_activation) |
| 454 : task(task), required_for_activation(required_for_activation) {} |
451 | 455 |
452 RasterWorkerPool::Task::Set::~Set() {} | 456 RasterTaskQueue::Item::~Item() {} |
453 | 457 |
454 void RasterWorkerPool::Task::Set::Insert(const Task& task) { | 458 RasterTaskQueue::RasterTaskQueue() : required_for_activation_count(0u) {} |
455 DCHECK(!task.is_null()); | 459 |
456 tasks_.push_back(task.internal_); | 460 RasterTaskQueue::~RasterTaskQueue() {} |
| 461 |
| 462 void RasterTaskQueue::Swap(RasterTaskQueue* other) { |
| 463 items.swap(other->items); |
| 464 std::swap(required_for_activation_count, |
| 465 other->required_for_activation_count); |
457 } | 466 } |
458 | 467 |
459 RasterWorkerPool::Task::Task() {} | 468 void RasterTaskQueue::Reset() { |
460 | 469 required_for_activation_count = 0u; |
461 RasterWorkerPool::Task::Task(internal::WorkerPoolTask* internal) | 470 items.clear(); |
462 : internal_(internal) {} | |
463 | |
464 RasterWorkerPool::Task::~Task() {} | |
465 | |
466 void RasterWorkerPool::Task::Reset() { internal_ = NULL; } | |
467 | |
468 RasterWorkerPool::RasterTask::Queue::QueuedTask::QueuedTask( | |
469 internal::RasterWorkerPoolTask* task, | |
470 bool required_for_activation) | |
471 : task(task), required_for_activation(required_for_activation) {} | |
472 | |
473 RasterWorkerPool::RasterTask::Queue::QueuedTask::~QueuedTask() {} | |
474 | |
475 RasterWorkerPool::RasterTask::Queue::Queue() | |
476 : required_for_activation_count_(0u) {} | |
477 | |
478 RasterWorkerPool::RasterTask::Queue::~Queue() {} | |
479 | |
480 void RasterWorkerPool::RasterTask::Queue::Reset() { | |
481 tasks_.clear(); | |
482 required_for_activation_count_ = 0u; | |
483 } | 471 } |
484 | 472 |
485 void RasterWorkerPool::RasterTask::Queue::Append(const RasterTask& task, | |
486 bool required_for_activation) { | |
487 DCHECK(!task.is_null()); | |
488 tasks_.push_back(QueuedTask(task.internal_, required_for_activation)); | |
489 required_for_activation_count_ += required_for_activation; | |
490 } | |
491 | |
492 void RasterWorkerPool::RasterTask::Queue::Swap(Queue* other) { | |
493 tasks_.swap(other->tasks_); | |
494 std::swap(required_for_activation_count_, | |
495 other->required_for_activation_count_); | |
496 } | |
497 | |
498 RasterWorkerPool::RasterTask::RasterTask() {} | |
499 | |
500 RasterWorkerPool::RasterTask::RasterTask( | |
501 internal::RasterWorkerPoolTask* internal) | |
502 : internal_(internal) {} | |
503 | |
504 void RasterWorkerPool::RasterTask::Reset() { internal_ = NULL; } | |
505 | |
506 RasterWorkerPool::RasterTask::~RasterTask() {} | |
507 | |
508 // This allows an external rasterize on-demand system to run raster tasks | 473 // This allows an external rasterize on-demand system to run raster tasks |
509 // with highest priority using the same task graph runner instance. | 474 // with highest priority using the same task graph runner instance. |
510 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; | 475 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; |
511 // Task priorities that make sure raster finished tasks run before any | 476 // Task priorities that make sure raster finished tasks run before any |
512 // remaining raster tasks. | 477 // remaining raster tasks. |
513 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; | 478 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; |
514 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = | 479 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = |
515 1u; | 480 1u; |
516 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; | 481 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; |
517 | 482 |
(...skipping 24 matching lines...) Expand all Loading... |
542 | 507 |
543 return g_num_raster_threads; | 508 return g_num_raster_threads; |
544 } | 509 } |
545 | 510 |
546 // static | 511 // static |
547 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { | 512 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { |
548 return g_task_graph_runner.Pointer(); | 513 return g_task_graph_runner.Pointer(); |
549 } | 514 } |
550 | 515 |
551 // static | 516 // static |
552 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 517 scoped_refptr<internal::RasterWorkerPoolTask> |
| 518 RasterWorkerPool::CreateRasterTask( |
553 const Resource* resource, | 519 const Resource* resource, |
554 PicturePileImpl* picture_pile, | 520 PicturePileImpl* picture_pile, |
555 const gfx::Rect& content_rect, | 521 const gfx::Rect& content_rect, |
556 float contents_scale, | 522 float contents_scale, |
557 RasterMode raster_mode, | 523 RasterMode raster_mode, |
558 TileResolution tile_resolution, | 524 TileResolution tile_resolution, |
559 int layer_id, | 525 int layer_id, |
560 const void* tile_id, | 526 const void* tile_id, |
561 int source_frame_number, | 527 int source_frame_number, |
562 RenderingStatsInstrumentation* rendering_stats, | 528 RenderingStatsInstrumentation* rendering_stats, |
563 const RasterTask::Reply& reply, | 529 const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
564 Task::Set* dependencies, | 530 internal::WorkerPoolTask::Vector* dependencies, |
565 ContextProvider* context_provider) { | 531 ContextProvider* context_provider) { |
566 return RasterTask(new RasterWorkerPoolTaskImpl(resource, | 532 return make_scoped_refptr(new RasterWorkerPoolTaskImpl(resource, |
567 picture_pile, | 533 picture_pile, |
568 content_rect, | 534 content_rect, |
569 contents_scale, | 535 contents_scale, |
570 raster_mode, | 536 raster_mode, |
571 tile_resolution, | 537 tile_resolution, |
572 layer_id, | 538 layer_id, |
573 tile_id, | 539 tile_id, |
574 source_frame_number, | 540 source_frame_number, |
575 rendering_stats, | 541 rendering_stats, |
576 reply, | 542 reply, |
577 &dependencies->tasks_, | 543 dependencies, |
578 context_provider)); | 544 context_provider)); |
579 } | 545 } |
580 | 546 |
581 // static | 547 // static |
582 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 548 scoped_refptr<internal::WorkerPoolTask> RasterWorkerPool::CreateImageDecodeTask( |
583 SkPixelRef* pixel_ref, | 549 SkPixelRef* pixel_ref, |
584 int layer_id, | 550 int layer_id, |
585 RenderingStatsInstrumentation* rendering_stats, | 551 RenderingStatsInstrumentation* rendering_stats, |
586 const Task::Reply& reply) { | 552 const base::Callback<void(bool was_canceled)>& reply) { |
587 return Task(new ImageDecodeWorkerPoolTaskImpl( | 553 return make_scoped_refptr(new ImageDecodeWorkerPoolTaskImpl( |
588 pixel_ref, layer_id, rendering_stats, reply)); | 554 pixel_ref, layer_id, rendering_stats, reply)); |
589 } | 555 } |
590 | 556 |
591 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 557 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
592 client_ = client; | 558 client_ = client; |
593 } | 559 } |
594 | 560 |
595 void RasterWorkerPool::Shutdown() { | 561 void RasterWorkerPool::Shutdown() { |
596 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); | 562 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); |
597 | 563 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 if (decode_it == graph->nodes.end()) | 692 if (decode_it == graph->nodes.end()) |
727 InsertNodeForTask(graph, decode_task, priority, 0u); | 693 InsertNodeForTask(graph, decode_task, priority, 0u); |
728 | 694 |
729 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); | 695 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); |
730 } | 696 } |
731 | 697 |
732 InsertNodeForTask(graph, raster_task, priority, dependencies); | 698 InsertNodeForTask(graph, raster_task, priority, dependencies); |
733 } | 699 } |
734 | 700 |
735 } // namespace cc | 701 } // namespace cc |
OLD | NEW |