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 |