Chromium Code Reviews| 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/lazy_instance.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 449 LAZY_INSTANCE_INITIALIZER; | 449 LAZY_INSTANCE_INITIALIZER; |
| 450 | 450 |
| 451 const int kDefaultNumRasterThreads = 1; | 451 const int kDefaultNumRasterThreads = 1; |
| 452 | 452 |
| 453 int g_num_raster_threads = 0; | 453 int g_num_raster_threads = 0; |
| 454 | 454 |
| 455 } // namespace | 455 } // namespace |
| 456 | 456 |
| 457 namespace internal { | 457 namespace internal { |
| 458 | 458 |
| 459 WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {} | 459 WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {} |
| 460 | 460 |
| 461 WorkerPoolTask::~WorkerPoolTask() { | 461 WorkerPoolTask::~WorkerPoolTask() { |
| 462 DCHECK_EQ(did_schedule_, did_complete_); | 462 DCHECK_EQ(did_schedule_, did_complete_); |
| 463 DCHECK(!did_run_ || did_complete_); | 463 DCHECK(!did_run_ || did_complete_); |
| 464 } | 464 } |
| 465 | 465 |
| 466 void WorkerPoolTask::WillSchedule() {} | |
| 467 | |
| 468 void WorkerPoolTask::DidSchedule() { | |
| 469 did_schedule_ = true; | |
| 470 did_complete_ = false; | |
| 471 } | |
| 472 | |
| 473 bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; } | |
| 474 | |
| 466 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } | 475 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } |
| 467 | 476 |
| 468 void WorkerPoolTask::DidComplete() { | 477 void WorkerPoolTask::DidComplete() { |
| 469 DCHECK(did_schedule_); | 478 DCHECK(did_schedule_); |
| 470 DCHECK(!did_complete_); | 479 DCHECK(!did_complete_); |
| 471 did_complete_ = true; | 480 did_complete_ = true; |
| 472 } | 481 } |
| 473 | 482 |
| 474 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } | 483 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } |
| 475 | 484 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 613 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 622 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
| 614 internal::RasterWorkerPoolTask* task) const { | 623 internal::RasterWorkerPoolTask* task) const { |
| 615 return raster_tasks_required_for_activation_.find(task) != | 624 return raster_tasks_required_for_activation_.find(task) != |
| 616 raster_tasks_required_for_activation_.end(); | 625 raster_tasks_required_for_activation_.end(); |
| 617 } | 626 } |
| 618 | 627 |
| 619 void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { | 628 void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { |
| 620 TRACE_EVENT1( | 629 TRACE_EVENT1( |
| 621 "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size()); | 630 "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size()); |
| 622 | 631 |
| 632 for (internal::GraphNode::Map::iterator it = graph->begin(); | |
| 633 it != graph->end(); | |
| 634 ++it) { | |
| 635 internal::WorkerPoolTask* task = | |
|
vmpstr
2014/02/05 16:56:23
Can you do a DCHECK here to ensure that this task
reveman
2014/02/05 18:00:00
The task might have finished running. We can't kno
vmpstr
2014/02/05 18:07:42
I think that makes sense. From the task perspectiv
reveman
2014/02/05 19:52:42
Take a look at latest patch.
| |
| 636 static_cast<internal::WorkerPoolTask*>(it->first); | |
| 637 | |
| 638 task->WillSchedule(); | |
| 639 task->ScheduleOnOriginThread(this); | |
| 640 task->DidSchedule(); | |
| 641 } | |
| 642 | |
| 623 g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); | 643 g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); |
| 624 } | 644 } |
| 625 | 645 |
| 626 void RasterWorkerPool::CollectCompletedWorkerPoolTasks( | 646 void RasterWorkerPool::CollectCompletedWorkerPoolTasks( |
| 627 internal::Task::Vector* completed_tasks) { | 647 internal::Task::Vector* completed_tasks) { |
| 628 g_task_graph_runner.Pointer()->CollectCompletedTasks(namespace_token_, | 648 g_task_graph_runner.Pointer()->CollectCompletedTasks(namespace_token_, |
| 629 completed_tasks); | 649 completed_tasks); |
| 630 } | 650 } |
| 631 | 651 |
| 632 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { | 652 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { |
| 633 if (tasks.empty()) | 653 if (tasks.empty()) |
| 634 return; | 654 return; |
| 635 | 655 |
| 636 GrContext* gr_context = context_provider_->GrContext(); | 656 GrContext* gr_context = context_provider_->GrContext(); |
| 637 // TODO(alokp): Implement TestContextProvider::GrContext(). | 657 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 638 if (gr_context) | 658 if (gr_context) |
| 639 gr_context->resetContext(); | 659 gr_context->resetContext(); |
| 640 | 660 |
| 641 for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end(); | 661 for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end(); |
| 642 ++it) { | 662 ++it) { |
| 643 internal::RasterWorkerPoolTask* task = it->get(); | 663 internal::RasterWorkerPoolTask* task = it->get(); |
| 644 DCHECK(task->use_gpu_rasterization()); | 664 DCHECK(task->use_gpu_rasterization()); |
| 645 | 665 |
| 666 task->WillSchedule(); | |
|
vmpstr
2014/02/05 16:56:23
Does this also need a ScheduleOnOriginThread? Ther
reveman
2014/02/05 18:00:00
I agree. Did the same for CompleteOnOriginThread()
vmpstr
2014/02/05 18:07:42
Thanks! I think it looks nice now (ie symmetrical
| |
| 646 task->DidSchedule(); | 667 task->DidSchedule(); |
| 647 task->WillRun(); | 668 task->WillRun(); |
| 648 task->RunOnOriginThread(resource_provider_, context_provider_); | 669 task->RunOnOriginThread(resource_provider_, context_provider_); |
| 649 task->DidRun(); | 670 task->DidRun(); |
| 650 task->WillComplete(); | 671 task->WillComplete(); |
| 651 task->DidComplete(); | 672 task->DidComplete(); |
| 652 | 673 |
| 653 completed_gpu_raster_tasks_.push_back(task); | 674 completed_gpu_raster_tasks_.push_back(task); |
| 654 } | 675 } |
| 655 | 676 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 726 graph->set(task, make_scoped_ptr(node)); | 747 graph->set(task, make_scoped_ptr(node)); |
| 727 return node; | 748 return node; |
| 728 } | 749 } |
| 729 | 750 |
| 730 // static | 751 // static |
| 731 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( | 752 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
| 732 internal::WorkerPoolTask* raster_task, | 753 internal::WorkerPoolTask* raster_task, |
| 733 const internal::Task::Vector& decode_tasks, | 754 const internal::Task::Vector& decode_tasks, |
| 734 unsigned priority, | 755 unsigned priority, |
| 735 TaskGraph* graph) { | 756 TaskGraph* graph) { |
| 736 DCHECK(!raster_task->HasCompleted()); | |
| 737 | |
| 738 internal::GraphNode* raster_node = | 757 internal::GraphNode* raster_node = |
| 739 CreateGraphNodeForTask(raster_task, priority, graph); | 758 CreateGraphNodeForTask(raster_task, priority, graph); |
| 740 | 759 |
| 741 // Insert image decode tasks. | 760 // Insert image decode tasks. |
| 742 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); | 761 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); |
| 743 it != decode_tasks.end(); | 762 it != decode_tasks.end(); |
| 744 ++it) { | 763 ++it) { |
| 745 internal::WorkerPoolTask* decode_task = | 764 internal::WorkerPoolTask* decode_task = |
| 746 static_cast<internal::WorkerPoolTask*>(it->get()); | 765 static_cast<internal::WorkerPoolTask*>(it->get()); |
| 747 | 766 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 761 | 780 |
| 762 internal::GraphNode* decode_node = | 781 internal::GraphNode* decode_node = |
| 763 CreateGraphNodeForTask(decode_task, priority, graph); | 782 CreateGraphNodeForTask(decode_task, priority, graph); |
| 764 decode_node->add_dependent(raster_node); | 783 decode_node->add_dependent(raster_node); |
| 765 } | 784 } |
| 766 | 785 |
| 767 return raster_node; | 786 return raster_node; |
| 768 } | 787 } |
| 769 | 788 |
| 770 } // namespace cc | 789 } // namespace cc |
| OLD | NEW |