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