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 |