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 "base/debug/trace_event_synthetic_delay.h" | 7 #include "base/debug/trace_event_synthetic_delay.h" |
8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "base/lazy_instance.h" | |
10 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
11 #include "base/values.h" | 10 #include "base/values.h" |
12 #include "cc/debug/devtools_instrumentation.h" | 11 #include "cc/debug/devtools_instrumentation.h" |
13 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
14 #include "cc/resources/picture_pile_impl.h" | 13 #include "cc/resources/picture_pile_impl.h" |
15 #include "cc/resources/resource.h" | |
16 #include "cc/resources/resource_provider.h" | |
17 #include "skia/ext/paint_simplifier.h" | 14 #include "skia/ext/paint_simplifier.h" |
18 #include "third_party/skia/include/core/SkBitmap.h" | 15 #include "third_party/skia/include/core/SkBitmap.h" |
19 #include "third_party/skia/include/core/SkPixelRef.h" | 16 #include "third_party/skia/include/core/SkPixelRef.h" |
20 #include "third_party/skia/include/gpu/GrContext.h" | 17 #include "third_party/skia/include/gpu/GrContext.h" |
21 #include "third_party/skia/include/gpu/SkGpuDevice.h" | 18 #include "third_party/skia/include/gpu/SkGpuDevice.h" |
22 | 19 |
23 namespace cc { | 20 namespace cc { |
24 | 21 |
25 namespace { | 22 namespace { |
26 | 23 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 const gfx::Rect& content_rect, | 68 const gfx::Rect& content_rect, |
72 float contents_scale, | 69 float contents_scale, |
73 RasterMode raster_mode, | 70 RasterMode raster_mode, |
74 TileResolution tile_resolution, | 71 TileResolution tile_resolution, |
75 int layer_id, | 72 int layer_id, |
76 const void* tile_id, | 73 const void* tile_id, |
77 int source_frame_number, | 74 int source_frame_number, |
78 bool use_gpu_rasterization, | 75 bool use_gpu_rasterization, |
79 RenderingStatsInstrumentation* rendering_stats, | 76 RenderingStatsInstrumentation* rendering_stats, |
80 const RasterWorkerPool::RasterTask::Reply& reply, | 77 const RasterWorkerPool::RasterTask::Reply& reply, |
81 internal::Task::Vector* dependencies) | 78 TaskVector* dependencies) |
82 : internal::RasterWorkerPoolTask(resource, | 79 : internal::RasterWorkerPoolTask(resource, |
83 dependencies, | 80 dependencies, |
84 use_gpu_rasterization), | 81 use_gpu_rasterization), |
85 picture_pile_(picture_pile), | 82 picture_pile_(picture_pile), |
86 content_rect_(content_rect), | 83 content_rect_(content_rect), |
87 contents_scale_(contents_scale), | 84 contents_scale_(contents_scale), |
88 raster_mode_(raster_mode), | 85 raster_mode_(raster_mode), |
89 tile_resolution_(tile_resolution), | 86 tile_resolution_(tile_resolution), |
90 layer_id_(layer_id), | 87 layer_id_(layer_id), |
91 tile_id_(tile_id), | 88 tile_id_(tile_id), |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 public: | 306 public: |
310 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, | 307 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, |
311 int layer_id, | 308 int layer_id, |
312 RenderingStatsInstrumentation* rendering_stats, | 309 RenderingStatsInstrumentation* rendering_stats, |
313 const RasterWorkerPool::Task::Reply& reply) | 310 const RasterWorkerPool::Task::Reply& reply) |
314 : pixel_ref_(skia::SharePtr(pixel_ref)), | 311 : pixel_ref_(skia::SharePtr(pixel_ref)), |
315 layer_id_(layer_id), | 312 layer_id_(layer_id), |
316 rendering_stats_(rendering_stats), | 313 rendering_stats_(rendering_stats), |
317 reply_(reply) {} | 314 reply_(reply) {} |
318 | 315 |
319 // Overridden from internal::Task: | 316 // Overridden from internal::WorkerPoolTask: |
320 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 317 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
321 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); | 318 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); |
322 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( | 319 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
323 pixel_ref_.get()); | 320 pixel_ref_.get()); |
324 // This will cause the image referred to by pixel ref to be decoded. | 321 // This will cause the image referred to by pixel ref to be decoded. |
325 pixel_ref_->lockPixels(); | 322 pixel_ref_->lockPixels(); |
326 pixel_ref_->unlockPixels(); | 323 pixel_ref_->unlockPixels(); |
327 } | 324 } |
328 | |
329 // Overridden from internal::WorkerPoolTask: | |
330 virtual void CompleteOnOriginThread() OVERRIDE { | 325 virtual void CompleteOnOriginThread() OVERRIDE { |
331 reply_.Run(!HasFinishedRunning()); | 326 reply_.Run(!HasFinishedRunning()); |
332 } | 327 } |
333 | 328 |
334 protected: | 329 protected: |
335 virtual ~ImageDecodeWorkerPoolTaskImpl() {} | 330 virtual ~ImageDecodeWorkerPoolTaskImpl() {} |
336 | 331 |
337 private: | 332 private: |
338 skia::RefPtr<SkPixelRef> pixel_ref_; | 333 skia::RefPtr<SkPixelRef> pixel_ref_; |
339 int layer_id_; | 334 int layer_id_; |
340 RenderingStatsInstrumentation* rendering_stats_; | 335 RenderingStatsInstrumentation* rendering_stats_; |
341 const RasterWorkerPool::Task::Reply reply_; | 336 const RasterWorkerPool::Task::Reply reply_; |
342 | 337 |
343 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); | 338 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); |
344 }; | 339 }; |
345 | 340 |
346 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 341 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
347 public: | 342 public: |
348 typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback; | 343 typedef base::Callback<void(const internal::WorkerPoolTask* source)> |
| 344 Callback; |
349 | 345 |
350 RasterFinishedWorkerPoolTaskImpl( | 346 RasterFinishedWorkerPoolTaskImpl( |
351 const Callback& on_raster_finished_callback) | 347 const Callback& on_raster_finished_callback) |
352 : origin_loop_(base::MessageLoopProxy::current().get()), | 348 : origin_loop_(base::MessageLoopProxy::current().get()), |
353 on_raster_finished_callback_(on_raster_finished_callback) { | 349 on_raster_finished_callback_(on_raster_finished_callback) { |
354 } | 350 } |
355 | 351 |
356 // Overridden from internal::WorkerPoolTask: | 352 // Overridden from internal::WorkerPoolTask: |
357 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 353 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
358 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); | 354 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 private: | 403 private: |
408 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} | 404 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} |
409 | 405 |
410 base::TimeTicks activation_delay_end_time_; | 406 base::TimeTicks activation_delay_end_time_; |
411 const size_t tasks_required_for_activation_count_; | 407 const size_t tasks_required_for_activation_count_; |
412 | 408 |
413 DISALLOW_COPY_AND_ASSIGN( | 409 DISALLOW_COPY_AND_ASSIGN( |
414 RasterRequiredForActivationFinishedWorkerPoolTaskImpl); | 410 RasterRequiredForActivationFinishedWorkerPoolTaskImpl); |
415 }; | 411 }; |
416 | 412 |
417 class RasterTaskGraphRunner : public internal::TaskGraphRunner { | |
418 public: | |
419 RasterTaskGraphRunner() | |
420 : internal::TaskGraphRunner(RasterWorkerPool::GetNumRasterThreads(), | |
421 "CompositorRaster") {} | |
422 }; | |
423 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = | |
424 LAZY_INSTANCE_INITIALIZER; | |
425 | |
426 const int kDefaultNumRasterThreads = 1; | |
427 | |
428 int g_num_raster_threads = 0; | |
429 | 413 |
430 } // namespace | 414 } // namespace |
431 | 415 |
432 namespace internal { | 416 namespace internal { |
433 | 417 |
434 WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {} | 418 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
435 | 419 TaskVector* dependencies, |
436 WorkerPoolTask::~WorkerPoolTask() { | 420 bool use_gpu_rasterization) |
437 DCHECK_EQ(did_schedule_, did_complete_); | |
438 DCHECK(!did_run_ || did_complete_); | |
439 } | |
440 | |
441 void WorkerPoolTask::WillComplete() { | |
442 DCHECK(!did_complete_); | |
443 } | |
444 | |
445 void WorkerPoolTask::DidComplete() { | |
446 DCHECK(did_schedule_); | |
447 DCHECK(!did_complete_); | |
448 did_complete_ = true; | |
449 } | |
450 | |
451 bool WorkerPoolTask::HasCompleted() const { | |
452 return did_complete_; | |
453 } | |
454 | |
455 RasterWorkerPoolTask::RasterWorkerPoolTask( | |
456 const Resource* resource, | |
457 internal::Task::Vector* dependencies, | |
458 bool use_gpu_rasterization) | |
459 : did_run_(false), | 421 : did_run_(false), |
460 did_complete_(false), | 422 did_complete_(false), |
461 was_canceled_(false), | 423 was_canceled_(false), |
462 resource_(resource), | 424 resource_(resource), |
463 use_gpu_rasterization_(use_gpu_rasterization) { | 425 use_gpu_rasterization_(use_gpu_rasterization) { |
464 dependencies_.swap(*dependencies); | 426 dependencies_.swap(*dependencies); |
465 } | 427 } |
466 | 428 |
467 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} | 429 RasterWorkerPoolTask::~RasterWorkerPoolTask() { |
| 430 } |
468 | 431 |
469 void RasterWorkerPoolTask::DidRun(bool was_canceled) { | 432 void RasterWorkerPoolTask::DidRun(bool was_canceled) { |
470 DCHECK(!did_run_); | 433 DCHECK(!did_run_); |
471 did_run_ = true; | 434 did_run_ = true; |
472 was_canceled_ = was_canceled; | 435 was_canceled_ = was_canceled; |
473 } | 436 } |
474 | 437 |
475 bool RasterWorkerPoolTask::HasFinishedRunning() const { | 438 bool RasterWorkerPoolTask::HasFinishedRunning() const { |
476 return did_run_; | 439 return did_run_; |
477 } | 440 } |
(...skipping 10 matching lines...) Expand all Loading... |
488 DCHECK(!did_complete_); | 451 DCHECK(!did_complete_); |
489 did_complete_ = true; | 452 did_complete_ = true; |
490 } | 453 } |
491 | 454 |
492 bool RasterWorkerPoolTask::HasCompleted() const { | 455 bool RasterWorkerPoolTask::HasCompleted() const { |
493 return did_complete_; | 456 return did_complete_; |
494 } | 457 } |
495 | 458 |
496 } // namespace internal | 459 } // namespace internal |
497 | 460 |
498 RasterWorkerPool::Task::Set::Set() {} | 461 RasterWorkerPool::Task::Set::Set() { |
| 462 } |
499 | 463 |
500 RasterWorkerPool::Task::Set::~Set() {} | 464 RasterWorkerPool::Task::Set::~Set() { |
| 465 } |
501 | 466 |
502 void RasterWorkerPool::Task::Set::Insert(const Task& task) { | 467 void RasterWorkerPool::Task::Set::Insert(const Task& task) { |
503 DCHECK(!task.is_null()); | 468 DCHECK(!task.is_null()); |
504 tasks_.push_back(task.internal_); | 469 tasks_.push_back(task.internal_); |
505 } | 470 } |
506 | 471 |
507 RasterWorkerPool::Task::Task() {} | 472 RasterWorkerPool::Task::Task() { |
| 473 } |
508 | 474 |
509 RasterWorkerPool::Task::Task(internal::WorkerPoolTask* internal) | 475 RasterWorkerPool::Task::Task(internal::WorkerPoolTask* internal) |
510 : internal_(internal) { | 476 : internal_(internal) { |
511 } | 477 } |
512 | 478 |
513 RasterWorkerPool::Task::~Task() {} | 479 RasterWorkerPool::Task::~Task() { |
| 480 } |
514 | 481 |
515 void RasterWorkerPool::Task::Reset() { | 482 void RasterWorkerPool::Task::Reset() { |
516 internal_ = NULL; | 483 internal_ = NULL; |
517 } | 484 } |
518 | 485 |
519 RasterWorkerPool::RasterTask::Queue::Queue() {} | 486 RasterWorkerPool::RasterTask::Queue::Queue() { |
| 487 } |
520 | 488 |
521 RasterWorkerPool::RasterTask::Queue::~Queue() {} | 489 RasterWorkerPool::RasterTask::Queue::~Queue() { |
| 490 } |
522 | 491 |
523 void RasterWorkerPool::RasterTask::Queue::Append( | 492 void RasterWorkerPool::RasterTask::Queue::Append( |
524 const RasterTask& task, bool required_for_activation) { | 493 const RasterTask& task, bool required_for_activation) { |
525 DCHECK(!task.is_null()); | 494 DCHECK(!task.is_null()); |
526 tasks_.push_back(task.internal_); | 495 tasks_.push_back(task.internal_); |
527 if (required_for_activation) | 496 if (required_for_activation) |
528 tasks_required_for_activation_.insert(task.internal_.get()); | 497 tasks_required_for_activation_.insert(task.internal_.get()); |
529 } | 498 } |
530 | 499 |
531 RasterWorkerPool::RasterTask::RasterTask() {} | 500 RasterWorkerPool::RasterTask::RasterTask() { |
| 501 } |
532 | 502 |
533 RasterWorkerPool::RasterTask::RasterTask( | 503 RasterWorkerPool::RasterTask::RasterTask( |
534 internal::RasterWorkerPoolTask* internal) | 504 internal::RasterWorkerPoolTask* internal) |
535 : internal_(internal) { | 505 : internal_(internal) { |
536 } | 506 } |
537 | 507 |
538 void RasterWorkerPool::RasterTask::Reset() { | 508 void RasterWorkerPool::RasterTask::Reset() { |
539 internal_ = NULL; | 509 internal_ = NULL; |
540 } | 510 } |
541 | 511 |
542 RasterWorkerPool::RasterTask::~RasterTask() {} | 512 RasterWorkerPool::RasterTask::~RasterTask() { |
543 | |
544 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, | |
545 ContextProvider* context_provider) | |
546 : namespace_token_(g_task_graph_runner.Pointer()->GetNamespaceToken()), | |
547 client_(NULL), | |
548 resource_provider_(resource_provider), | |
549 context_provider_(context_provider), | |
550 weak_ptr_factory_(this) {} | |
551 | |
552 RasterWorkerPool::~RasterWorkerPool() {} | |
553 | |
554 // static | |
555 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { | |
556 DCHECK_LT(0, num_threads); | |
557 DCHECK_EQ(0, g_num_raster_threads); | |
558 | |
559 g_num_raster_threads = num_threads; | |
560 } | 513 } |
561 | 514 |
562 // static | 515 // static |
563 int RasterWorkerPool::GetNumRasterThreads() { | |
564 if (!g_num_raster_threads) | |
565 g_num_raster_threads = kDefaultNumRasterThreads; | |
566 | |
567 return g_num_raster_threads; | |
568 } | |
569 | |
570 // static | |
571 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 516 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
572 const Resource* resource, | 517 const Resource* resource, |
573 PicturePileImpl* picture_pile, | 518 PicturePileImpl* picture_pile, |
574 const gfx::Rect& content_rect, | 519 const gfx::Rect& content_rect, |
575 float contents_scale, | 520 float contents_scale, |
576 RasterMode raster_mode, | 521 RasterMode raster_mode, |
577 TileResolution tile_resolution, | 522 TileResolution tile_resolution, |
578 int layer_id, | 523 int layer_id, |
579 const void* tile_id, | 524 const void* tile_id, |
580 int source_frame_number, | 525 int source_frame_number, |
(...skipping 22 matching lines...) Expand all Loading... |
603 SkPixelRef* pixel_ref, | 548 SkPixelRef* pixel_ref, |
604 int layer_id, | 549 int layer_id, |
605 RenderingStatsInstrumentation* stats_instrumentation, | 550 RenderingStatsInstrumentation* stats_instrumentation, |
606 const Task::Reply& reply) { | 551 const Task::Reply& reply) { |
607 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 552 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
608 layer_id, | 553 layer_id, |
609 stats_instrumentation, | 554 stats_instrumentation, |
610 reply)); | 555 reply)); |
611 } | 556 } |
612 | 557 |
| 558 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
| 559 ContextProvider* context_provider) |
| 560 : client_(NULL), |
| 561 resource_provider_(resource_provider), |
| 562 context_provider_(context_provider), |
| 563 weak_ptr_factory_(this) { |
| 564 } |
| 565 |
| 566 RasterWorkerPool::~RasterWorkerPool() { |
| 567 } |
| 568 |
613 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 569 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
614 client_ = client; | 570 client_ = client; |
615 } | 571 } |
616 | 572 |
617 void RasterWorkerPool::Shutdown() { | 573 void RasterWorkerPool::Shutdown() { |
618 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); | |
619 | |
620 raster_tasks_.clear(); | 574 raster_tasks_.clear(); |
621 TaskGraph empty; | 575 TaskGraph empty; |
622 SetTaskGraph(&empty); | 576 SetTaskGraph(&empty); |
623 g_task_graph_runner.Pointer()->WaitForTasksToFinishRunning(namespace_token_); | 577 WorkerPool::Shutdown(); |
624 weak_ptr_factory_.InvalidateWeakPtrs(); | 578 weak_ptr_factory_.InvalidateWeakPtrs(); |
625 } | 579 } |
626 | 580 |
627 void RasterWorkerPool::CheckForCompletedTasks() { | 581 void RasterWorkerPool::CheckForCompletedTasks() { |
628 TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks"); | 582 TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks"); |
629 | 583 |
630 CheckForCompletedWorkerPoolTasks(); | 584 // Check for completed worker-thread tasks. |
| 585 CheckForCompletedWorkerTasks(); |
631 | 586 |
632 // Complete gpu rasterization tasks. | 587 // Complete gpu rasterization tasks. |
633 while (!completed_gpu_raster_tasks_.empty()) { | 588 while (!completed_gpu_raster_tasks_.empty()) { |
634 internal::RasterWorkerPoolTask* task = | 589 internal::RasterWorkerPoolTask* task = |
635 completed_gpu_raster_tasks_.front().get(); | 590 completed_gpu_raster_tasks_.front().get(); |
636 | |
637 task->WillComplete(); | 591 task->WillComplete(); |
638 task->CompleteOnOriginThread(); | 592 task->CompleteOnOriginThread(); |
639 task->DidComplete(); | 593 task->DidComplete(); |
640 | 594 |
641 completed_gpu_raster_tasks_.pop_front(); | 595 completed_gpu_raster_tasks_.pop_front(); |
642 } | 596 } |
643 } | 597 } |
644 | 598 |
645 void RasterWorkerPool::CheckForCompletedWorkerPoolTasks() { | |
646 internal::Task::Vector completed_tasks; | |
647 g_task_graph_runner.Pointer()->CollectCompletedTasks(namespace_token_, | |
648 &completed_tasks); | |
649 | |
650 for (internal::Task::Vector::const_iterator it = completed_tasks.begin(); | |
651 it != completed_tasks.end(); | |
652 ++it) { | |
653 internal::WorkerPoolTask* task = static_cast<internal::WorkerPoolTask*>( | |
654 it->get()); | |
655 | |
656 task->WillComplete(); | |
657 task->CompleteOnOriginThread(); | |
658 task->DidComplete(); | |
659 } | |
660 } | |
661 | |
662 void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { | |
663 TRACE_EVENT1( | |
664 "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size()); | |
665 | |
666 g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); | |
667 } | |
668 | |
669 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { | 599 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
670 raster_tasks_.swap(queue->tasks_); | 600 raster_tasks_.swap(queue->tasks_); |
671 raster_tasks_required_for_activation_.swap( | 601 raster_tasks_required_for_activation_.swap( |
672 queue->tasks_required_for_activation_); | 602 queue->tasks_required_for_activation_); |
673 } | 603 } |
674 | 604 |
675 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 605 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
676 internal::RasterWorkerPoolTask* task) const { | 606 internal::RasterWorkerPoolTask* task) const { |
677 return | 607 return |
678 raster_tasks_required_for_activation_.find(task) != | 608 raster_tasks_required_for_activation_.find(task) != |
(...skipping 27 matching lines...) Expand all Loading... |
706 scoped_refptr<internal::WorkerPoolTask> | 636 scoped_refptr<internal::WorkerPoolTask> |
707 RasterWorkerPool::CreateRasterFinishedTask() { | 637 RasterWorkerPool::CreateRasterFinishedTask() { |
708 return make_scoped_refptr( | 638 return make_scoped_refptr( |
709 new RasterFinishedWorkerPoolTaskImpl( | 639 new RasterFinishedWorkerPoolTaskImpl( |
710 base::Bind(&RasterWorkerPool::OnRasterFinished, | 640 base::Bind(&RasterWorkerPool::OnRasterFinished, |
711 weak_ptr_factory_.GetWeakPtr()))); | 641 weak_ptr_factory_.GetWeakPtr()))); |
712 } | 642 } |
713 | 643 |
714 scoped_refptr<internal::WorkerPoolTask> | 644 scoped_refptr<internal::WorkerPoolTask> |
715 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( | 645 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
716 size_t tasks_required_for_activation_count) { | 646 size_t tasks_required_for_activation_count) { |
717 return make_scoped_refptr( | 647 return make_scoped_refptr( |
718 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( | 648 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( |
719 base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, | 649 base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, |
720 weak_ptr_factory_.GetWeakPtr()), | 650 weak_ptr_factory_.GetWeakPtr()), |
721 tasks_required_for_activation_count)); | 651 tasks_required_for_activation_count)); |
722 } | 652 } |
723 | 653 |
724 void RasterWorkerPool::OnRasterFinished( | 654 void RasterWorkerPool::OnRasterFinished( |
725 const internal::WorkerPoolTask* source) { | 655 const internal::WorkerPoolTask* source) { |
726 TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished"); | 656 TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished"); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 TaskGraph* graph) { | 689 TaskGraph* graph) { |
760 internal::GraphNode* node = new internal::GraphNode(task, priority); | 690 internal::GraphNode* node = new internal::GraphNode(task, priority); |
761 DCHECK(graph->find(task) == graph->end()); | 691 DCHECK(graph->find(task) == graph->end()); |
762 graph->set(task, make_scoped_ptr(node)); | 692 graph->set(task, make_scoped_ptr(node)); |
763 return node; | 693 return node; |
764 } | 694 } |
765 | 695 |
766 // static | 696 // static |
767 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( | 697 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
768 internal::WorkerPoolTask* raster_task, | 698 internal::WorkerPoolTask* raster_task, |
769 const internal::Task::Vector& decode_tasks, | 699 const TaskVector& decode_tasks, |
770 unsigned priority, | 700 unsigned priority, |
771 TaskGraph* graph) { | 701 TaskGraph* graph) { |
772 DCHECK(!raster_task->HasCompleted()); | 702 DCHECK(!raster_task->HasCompleted()); |
773 | 703 |
774 internal::GraphNode* raster_node = CreateGraphNodeForTask( | 704 internal::GraphNode* raster_node = CreateGraphNodeForTask( |
775 raster_task, priority, graph); | 705 raster_task, priority, graph); |
776 | 706 |
777 // Insert image decode tasks. | 707 // Insert image decode tasks. |
778 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); | 708 for (TaskVector::const_iterator it = decode_tasks.begin(); |
779 it != decode_tasks.end(); ++it) { | 709 it != decode_tasks.end(); ++it) { |
780 internal::WorkerPoolTask* decode_task = | 710 internal::WorkerPoolTask* decode_task = it->get(); |
781 static_cast<internal::WorkerPoolTask*>(it->get()); | |
782 | 711 |
783 // Skip if already decoded. | 712 // Skip if already decoded. |
784 if (decode_task->HasCompleted()) | 713 if (decode_task->HasCompleted()) |
785 continue; | 714 continue; |
786 | 715 |
787 raster_node->add_dependency(); | 716 raster_node->add_dependency(); |
788 | 717 |
789 // Check if decode task already exists in graph. | 718 // Check if decode task already exists in graph. |
790 internal::GraphNode::Map::iterator decode_it = graph->find(decode_task); | 719 GraphNodeMap::iterator decode_it = graph->find(decode_task); |
791 if (decode_it != graph->end()) { | 720 if (decode_it != graph->end()) { |
792 internal::GraphNode* decode_node = decode_it->second; | 721 internal::GraphNode* decode_node = decode_it->second; |
793 decode_node->add_dependent(raster_node); | 722 decode_node->add_dependent(raster_node); |
794 continue; | 723 continue; |
795 } | 724 } |
796 | 725 |
797 internal::GraphNode* decode_node = CreateGraphNodeForTask( | 726 internal::GraphNode* decode_node = CreateGraphNodeForTask( |
798 decode_task, priority, graph); | 727 decode_task, priority, graph); |
799 decode_node->add_dependent(raster_node); | 728 decode_node->add_dependent(raster_node); |
800 } | 729 } |
801 | 730 |
802 return raster_node; | 731 return raster_node; |
803 } | 732 } |
804 | 733 |
805 } // namespace cc | 734 } // namespace cc |
OLD | NEW |