| 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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // TODO(alokp): For now run-on-worker-thread implies software rasterization. | 172 // TODO(alokp): For now run-on-worker-thread implies software rasterization. |
| 173 DCHECK(!use_gpu_rasterization()); | 173 DCHECK(!use_gpu_rasterization()); |
| 174 RunAnalysisOnThread(thread_index); | 174 RunAnalysisOnThread(thread_index); |
| 175 if (buffer_ && !analysis_.is_solid_color) | 175 if (buffer_ && !analysis_.is_solid_color) |
| 176 RunRasterOnThread(thread_index, buffer_, resource()->size(), stride_); | 176 RunRasterOnThread(thread_index, buffer_, resource()->size(), stride_); |
| 177 } | 177 } |
| 178 | 178 |
| 179 // Overridden from internal::WorkerPoolTask: | 179 // Overridden from internal::WorkerPoolTask: |
| 180 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 180 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 181 OVERRIDE { | 181 OVERRIDE { |
| 182 DCHECK(!use_gpu_rasterization()); | 182 if (use_gpu_rasterization()) |
| 183 if (buffer_) | |
| 184 return; | 183 return; |
| 184 DCHECK(!buffer_); |
| 185 buffer_ = client->AcquireBufferForRaster(this, &stride_); | 185 buffer_ = client->AcquireBufferForRaster(this, &stride_); |
| 186 } | 186 } |
| 187 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 187 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 188 OVERRIDE { | 188 OVERRIDE { |
| 189 DCHECK(!use_gpu_rasterization()); | 189 if (use_gpu_rasterization()) |
| 190 return; |
| 190 buffer_ = NULL; | 191 buffer_ = NULL; |
| 191 client->OnRasterCompleted(this, analysis_); | 192 client->OnRasterCompleted(this, analysis_); |
| 192 } | 193 } |
| 193 virtual void RunReplyOnOriginThread() OVERRIDE { | 194 virtual void RunReplyOnOriginThread() OVERRIDE { |
| 194 DCHECK(!buffer_); | 195 DCHECK(!buffer_); |
| 195 reply_.Run(analysis_, !HasFinishedRunning()); | 196 reply_.Run(analysis_, !HasFinishedRunning()); |
| 196 } | 197 } |
| 197 | 198 |
| 198 // Overridden from internal::RasterWorkerPoolTask: | 199 // Overridden from internal::RasterWorkerPoolTask: |
| 199 virtual void RunOnOriginThread(ResourceProvider* resource_provider, | 200 virtual void RunOnOriginThread(ResourceProvider* resource_provider, |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 LAZY_INSTANCE_INITIALIZER; | 452 LAZY_INSTANCE_INITIALIZER; |
| 452 | 453 |
| 453 const int kDefaultNumRasterThreads = 1; | 454 const int kDefaultNumRasterThreads = 1; |
| 454 | 455 |
| 455 int g_num_raster_threads = 0; | 456 int g_num_raster_threads = 0; |
| 456 | 457 |
| 457 } // namespace | 458 } // namespace |
| 458 | 459 |
| 459 namespace internal { | 460 namespace internal { |
| 460 | 461 |
| 461 WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {} | 462 WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {} |
| 462 | 463 |
| 463 WorkerPoolTask::~WorkerPoolTask() { | 464 WorkerPoolTask::~WorkerPoolTask() { |
| 464 DCHECK_EQ(did_schedule_, did_complete_); | 465 DCHECK(!did_schedule_); |
| 465 DCHECK(!did_run_ || did_complete_); | 466 DCHECK(!did_run_ || did_complete_); |
| 466 } | 467 } |
| 467 | 468 |
| 469 void WorkerPoolTask::WillSchedule() { DCHECK(!did_schedule_); } |
| 470 |
| 471 void WorkerPoolTask::DidSchedule() { |
| 472 did_schedule_ = true; |
| 473 did_complete_ = false; |
| 474 } |
| 475 |
| 476 bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; } |
| 477 |
| 468 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } | 478 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } |
| 469 | 479 |
| 470 void WorkerPoolTask::DidComplete() { | 480 void WorkerPoolTask::DidComplete() { |
| 471 DCHECK(did_schedule_); | 481 DCHECK(did_schedule_); |
| 472 DCHECK(!did_complete_); | 482 DCHECK(!did_complete_); |
| 483 did_schedule_ = false; |
| 473 did_complete_ = true; | 484 did_complete_ = true; |
| 474 } | 485 } |
| 475 | 486 |
| 476 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } | 487 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } |
| 477 | 488 |
| 478 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, | 489 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
| 479 internal::Task::Vector* dependencies, | 490 internal::Task::Vector* dependencies, |
| 480 bool use_gpu_rasterization) | 491 bool use_gpu_rasterization) |
| 481 : resource_(resource), use_gpu_rasterization_(use_gpu_rasterization) { | 492 : resource_(resource), use_gpu_rasterization_(use_gpu_rasterization) { |
| 482 dependencies_.swap(*dependencies); | 493 dependencies_.swap(*dependencies); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 626 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
| 616 internal::RasterWorkerPoolTask* task) const { | 627 internal::RasterWorkerPoolTask* task) const { |
| 617 return raster_tasks_required_for_activation_.find(task) != | 628 return raster_tasks_required_for_activation_.find(task) != |
| 618 raster_tasks_required_for_activation_.end(); | 629 raster_tasks_required_for_activation_.end(); |
| 619 } | 630 } |
| 620 | 631 |
| 621 void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { | 632 void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { |
| 622 TRACE_EVENT1( | 633 TRACE_EVENT1( |
| 623 "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size()); | 634 "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size()); |
| 624 | 635 |
| 636 for (internal::GraphNode::Map::iterator it = graph->begin(); |
| 637 it != graph->end(); |
| 638 ++it) { |
| 639 internal::WorkerPoolTask* task = |
| 640 static_cast<internal::WorkerPoolTask*>(it->first); |
| 641 |
| 642 if (!task->HasBeenScheduled()) { |
| 643 task->WillSchedule(); |
| 644 task->ScheduleOnOriginThread(this); |
| 645 task->DidSchedule(); |
| 646 } |
| 647 } |
| 648 |
| 625 g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); | 649 g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); |
| 626 } | 650 } |
| 627 | 651 |
| 628 void RasterWorkerPool::CollectCompletedWorkerPoolTasks( | 652 void RasterWorkerPool::CollectCompletedWorkerPoolTasks( |
| 629 internal::Task::Vector* completed_tasks) { | 653 internal::Task::Vector* completed_tasks) { |
| 630 g_task_graph_runner.Pointer()->CollectCompletedTasks(namespace_token_, | 654 g_task_graph_runner.Pointer()->CollectCompletedTasks(namespace_token_, |
| 631 completed_tasks); | 655 completed_tasks); |
| 632 } | 656 } |
| 633 | 657 |
| 634 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { | 658 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { |
| 635 if (tasks.empty()) | 659 if (tasks.empty()) |
| 636 return; | 660 return; |
| 637 | 661 |
| 638 GrContext* gr_context = context_provider_->GrContext(); | 662 GrContext* gr_context = context_provider_->GrContext(); |
| 639 // TODO(alokp): Implement TestContextProvider::GrContext(). | 663 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 640 if (gr_context) | 664 if (gr_context) |
| 641 gr_context->resetContext(); | 665 gr_context->resetContext(); |
| 642 | 666 |
| 643 for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end(); | 667 for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end(); |
| 644 ++it) { | 668 ++it) { |
| 645 internal::RasterWorkerPoolTask* task = it->get(); | 669 internal::RasterWorkerPoolTask* task = it->get(); |
| 646 DCHECK(task->use_gpu_rasterization()); | 670 DCHECK(task->use_gpu_rasterization()); |
| 647 | 671 |
| 672 task->WillSchedule(); |
| 673 task->ScheduleOnOriginThread(this); |
| 648 task->DidSchedule(); | 674 task->DidSchedule(); |
| 675 |
| 649 task->WillRun(); | 676 task->WillRun(); |
| 650 task->RunOnOriginThread(resource_provider_, context_provider_); | 677 task->RunOnOriginThread(resource_provider_, context_provider_); |
| 651 task->DidRun(); | 678 task->DidRun(); |
| 679 |
| 652 task->WillComplete(); | 680 task->WillComplete(); |
| 681 task->CompleteOnOriginThread(this); |
| 653 task->DidComplete(); | 682 task->DidComplete(); |
| 654 | 683 |
| 655 completed_gpu_raster_tasks_.push_back(task); | 684 completed_gpu_raster_tasks_.push_back(task); |
| 656 } | 685 } |
| 657 | 686 |
| 658 // TODO(alokp): Implement TestContextProvider::GrContext(). | 687 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 659 if (gr_context) | 688 if (gr_context) |
| 660 gr_context->flush(); | 689 gr_context->flush(); |
| 661 } | 690 } |
| 662 | 691 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 graph->set(task, make_scoped_ptr(node)); | 757 graph->set(task, make_scoped_ptr(node)); |
| 729 return node; | 758 return node; |
| 730 } | 759 } |
| 731 | 760 |
| 732 // static | 761 // static |
| 733 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( | 762 internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
| 734 internal::WorkerPoolTask* raster_task, | 763 internal::WorkerPoolTask* raster_task, |
| 735 const internal::Task::Vector& decode_tasks, | 764 const internal::Task::Vector& decode_tasks, |
| 736 unsigned priority, | 765 unsigned priority, |
| 737 TaskGraph* graph) { | 766 TaskGraph* graph) { |
| 738 DCHECK(!raster_task->HasCompleted()); | |
| 739 | |
| 740 internal::GraphNode* raster_node = | 767 internal::GraphNode* raster_node = |
| 741 CreateGraphNodeForTask(raster_task, priority, graph); | 768 CreateGraphNodeForTask(raster_task, priority, graph); |
| 742 | 769 |
| 743 // Insert image decode tasks. | 770 // Insert image decode tasks. |
| 744 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); | 771 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); |
| 745 it != decode_tasks.end(); | 772 it != decode_tasks.end(); |
| 746 ++it) { | 773 ++it) { |
| 747 internal::WorkerPoolTask* decode_task = | 774 internal::WorkerPoolTask* decode_task = |
| 748 static_cast<internal::WorkerPoolTask*>(it->get()); | 775 static_cast<internal::WorkerPoolTask*>(it->get()); |
| 749 | 776 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 763 | 790 |
| 764 internal::GraphNode* decode_node = | 791 internal::GraphNode* decode_node = |
| 765 CreateGraphNodeForTask(decode_task, priority, graph); | 792 CreateGraphNodeForTask(decode_task, priority, graph); |
| 766 decode_node->add_dependent(raster_node); | 793 decode_node->add_dependent(raster_node); |
| 767 } | 794 } |
| 768 | 795 |
| 769 return raster_node; | 796 return raster_node; |
| 770 } | 797 } |
| 771 | 798 |
| 772 } // namespace cc | 799 } // namespace cc |
| OLD | NEW |