Chromium Code Reviews| Index: cc/resources/raster_worker_pool.cc |
| diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc |
| index 786f145d656c42b680a7c2ded7771030d930860f..6246bc53a453a273f542373f27a34c67e3940fa2 100644 |
| --- a/cc/resources/raster_worker_pool.cc |
| +++ b/cc/resources/raster_worker_pool.cc |
| @@ -6,11 +6,14 @@ |
| #include "base/debug/trace_event_synthetic_delay.h" |
| #include "base/json/json_writer.h" |
| +#include "base/lazy_instance.h" |
| #include "base/metrics/histogram.h" |
| #include "base/values.h" |
| #include "cc/debug/devtools_instrumentation.h" |
| #include "cc/debug/traced_value.h" |
| #include "cc/resources/picture_pile_impl.h" |
| +#include "cc/resources/resource.h" |
| +#include "cc/resources/resource_provider.h" |
| #include "skia/ext/paint_simplifier.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #include "third_party/skia/include/core/SkPixelRef.h" |
| @@ -75,7 +78,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| bool use_gpu_rasterization, |
| RenderingStatsInstrumentation* rendering_stats, |
| const RasterWorkerPool::RasterTask::Reply& reply, |
| - TaskVector* dependencies) |
| + internal::Task::Vector* dependencies) |
| : internal::RasterWorkerPoolTask(resource, |
| dependencies, |
| use_gpu_rasterization), |
| @@ -88,7 +91,8 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| tile_id_(tile_id), |
| source_frame_number_(source_frame_number), |
| rendering_stats_(rendering_stats), |
| - reply_(reply) {} |
| + reply_(reply) { |
|
sohanjg
2014/01/21 09:41:08
nit: do we need this line here ?
reveman
2014/01/21 15:37:48
I'm trying to make the code consistent in that onl
danakj
2014/01/21 15:47:05
FWIW the easiest way to be consistent is to just r
reveman
2014/01/21 16:10:44
Good point. I'm not going to "cl format" this patc
|
| + } |
| void RunAnalysisOnThread(unsigned thread_index) { |
| TRACE_EVENT1("cc", |
| @@ -311,9 +315,10 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| : pixel_ref_(skia::SharePtr(pixel_ref)), |
| layer_id_(layer_id), |
| rendering_stats_(rendering_stats), |
| - reply_(reply) {} |
| + reply_(reply) { |
|
sohanjg
2014/01/21 09:41:08
nit: do we need this line here ?
reveman
2014/01/21 19:51:32
sohanjg, you're right. clang-format prefer it the
|
| + } |
| - // Overridden from internal::WorkerPoolTask: |
| + // Overridden from internal::Task: |
| virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
| TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); |
| devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
| @@ -322,6 +327,8 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| pixel_ref_->lockPixels(); |
| pixel_ref_->unlockPixels(); |
| } |
| + |
| + // Overridden from internal::WorkerPoolTask: |
| virtual void CompleteOnOriginThread() OVERRIDE { |
| reply_.Run(!HasFinishedRunning()); |
| } |
| @@ -340,8 +347,7 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| public: |
| - typedef base::Callback<void(const internal::WorkerPoolTask* source)> |
| - Callback; |
| + typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback; |
| RasterFinishedWorkerPoolTaskImpl( |
| const Callback& on_raster_finished_callback) |
| @@ -410,14 +416,49 @@ class RasterRequiredForActivationFinishedWorkerPoolTaskImpl |
| RasterRequiredForActivationFinishedWorkerPoolTaskImpl); |
| }; |
| +class RasterTaskGraphRunner : public internal::TaskGraphRunner { |
| + public: |
| + RasterTaskGraphRunner() |
| + : internal::TaskGraphRunner(RasterWorkerPool::GetNumRasterThreads(), |
| + "CompositorRaster") { |
| + } |
| +}; |
| +base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = |
| + LAZY_INSTANCE_INITIALIZER; |
| + |
| +const int kDefaultNumRasterThreads = 1; |
| + |
| +int g_num_raster_threads = 0; |
|
alokp
2014/01/21 18:42:50
make these static members of RasterTaskGraphRunner
reveman
2014/01/21 19:51:32
I prefer anonymous namespace and hiding these from
|
| } // namespace |
| namespace internal { |
| -RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
| - TaskVector* dependencies, |
| - bool use_gpu_rasterization) |
| +WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {} |
| + |
| +WorkerPoolTask::~WorkerPoolTask() { |
| + DCHECK_EQ(did_schedule_, did_complete_); |
| + DCHECK(!did_run_ || did_complete_); |
| +} |
| + |
| +void WorkerPoolTask::WillComplete() { |
| + DCHECK(!did_complete_); |
| +} |
| + |
| +void WorkerPoolTask::DidComplete() { |
| + DCHECK(did_schedule_); |
| + DCHECK(!did_complete_); |
| + did_complete_ = true; |
| +} |
| + |
| +bool WorkerPoolTask::HasCompleted() const { |
| + return did_complete_; |
| +} |
| + |
| +RasterWorkerPoolTask::RasterWorkerPoolTask( |
| + const Resource* resource, |
| + internal::Task::Vector* dependencies, |
| + bool use_gpu_rasterization) |
| : did_run_(false), |
| did_complete_(false), |
| was_canceled_(false), |
| @@ -426,8 +467,7 @@ RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
| dependencies_.swap(*dependencies); |
| } |
| -RasterWorkerPoolTask::~RasterWorkerPoolTask() { |
| -} |
| +RasterWorkerPoolTask::~RasterWorkerPoolTask() {} |
| void RasterWorkerPoolTask::DidRun(bool was_canceled) { |
| DCHECK(!did_run_); |
| @@ -458,36 +498,30 @@ bool RasterWorkerPoolTask::HasCompleted() const { |
| } // namespace internal |
| -RasterWorkerPool::Task::Set::Set() { |
| -} |
| +RasterWorkerPool::Task::Set::Set() {} |
| -RasterWorkerPool::Task::Set::~Set() { |
| -} |
| +RasterWorkerPool::Task::Set::~Set() {} |
| void RasterWorkerPool::Task::Set::Insert(const Task& task) { |
| DCHECK(!task.is_null()); |
| tasks_.push_back(task.internal_); |
| } |
| -RasterWorkerPool::Task::Task() { |
| -} |
| +RasterWorkerPool::Task::Task() {} |
| RasterWorkerPool::Task::Task(internal::WorkerPoolTask* internal) |
| : internal_(internal) { |
| } |
| -RasterWorkerPool::Task::~Task() { |
| -} |
| +RasterWorkerPool::Task::~Task() {} |
| void RasterWorkerPool::Task::Reset() { |
| internal_ = NULL; |
| } |
| -RasterWorkerPool::RasterTask::Queue::Queue() { |
| -} |
| +RasterWorkerPool::RasterTask::Queue::Queue() {} |
| -RasterWorkerPool::RasterTask::Queue::~Queue() { |
| -} |
| +RasterWorkerPool::RasterTask::Queue::~Queue() {} |
| void RasterWorkerPool::RasterTask::Queue::Append( |
| const RasterTask& task, bool required_for_activation) { |
| @@ -497,8 +531,7 @@ void RasterWorkerPool::RasterTask::Queue::Append( |
| tasks_required_for_activation_.insert(task.internal_.get()); |
| } |
| -RasterWorkerPool::RasterTask::RasterTask() { |
| -} |
| +RasterWorkerPool::RasterTask::RasterTask() {} |
| RasterWorkerPool::RasterTask::RasterTask( |
| internal::RasterWorkerPoolTask* internal) |
| @@ -509,7 +542,33 @@ void RasterWorkerPool::RasterTask::Reset() { |
| internal_ = NULL; |
| } |
| -RasterWorkerPool::RasterTask::~RasterTask() { |
| +RasterWorkerPool::RasterTask::~RasterTask() {} |
| + |
| +RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
| + ContextProvider* context_provider) |
| + : namespace_token_(g_task_graph_runner.Pointer()->GetNamespaceToken()), |
| + client_(NULL), |
| + resource_provider_(resource_provider), |
| + context_provider_(context_provider), |
| + weak_ptr_factory_(this) { |
| +} |
| + |
| +RasterWorkerPool::~RasterWorkerPool() {} |
| + |
| +// static |
| +void RasterWorkerPool::SetNumRasterThreads(int num_threads) { |
| + DCHECK_LT(0, num_threads); |
| + DCHECK_EQ(0, g_num_raster_threads); |
|
alokp
2014/01/21 18:42:50
Are you trying to make sure that SetNumRasterThrea
reveman
2014/01/21 19:51:32
I also want to make sure it's not called after Get
|
| + |
| + g_num_raster_threads = num_threads; |
| +} |
| + |
| +// static |
| +int RasterWorkerPool::GetNumRasterThreads() { |
| + if (!g_num_raster_threads) |
| + g_num_raster_threads = kDefaultNumRasterThreads; |
| + |
| + return g_num_raster_threads; |
| } |
| // static |
| @@ -555,39 +614,30 @@ RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
| reply)); |
| } |
| -RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
| - ContextProvider* context_provider) |
| - : client_(NULL), |
| - resource_provider_(resource_provider), |
| - context_provider_(context_provider), |
| - weak_ptr_factory_(this) { |
| -} |
| - |
| -RasterWorkerPool::~RasterWorkerPool() { |
| -} |
| - |
| void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
| client_ = client; |
| } |
| void RasterWorkerPool::Shutdown() { |
| + TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); |
| + |
| raster_tasks_.clear(); |
| TaskGraph empty; |
| SetTaskGraph(&empty); |
| - WorkerPool::Shutdown(); |
| + g_task_graph_runner.Pointer()->WaitForTasksToFinishRunning(namespace_token_); |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| } |
| void RasterWorkerPool::CheckForCompletedTasks() { |
| TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks"); |
| - // Check for completed worker-thread tasks. |
| - CheckForCompletedWorkerTasks(); |
| + CheckForCompletedWorkerPoolTasks(); |
| // Complete gpu rasterization tasks. |
| while (!completed_gpu_raster_tasks_.empty()) { |
| internal::RasterWorkerPoolTask* task = |
| completed_gpu_raster_tasks_.front().get(); |
| + |
| task->WillComplete(); |
| task->CompleteOnOriginThread(); |
| task->DidComplete(); |
| @@ -596,6 +646,30 @@ void RasterWorkerPool::CheckForCompletedTasks() { |
| } |
| } |
| +void RasterWorkerPool::CheckForCompletedWorkerPoolTasks() { |
| + internal::Task::Vector completed_tasks; |
|
sohanjg
2014/01/21 09:41:08
nit: can we typedef internal::Task::Vector ?
reveman
2014/01/21 15:37:48
To what? I think it's good to not remove the inter
|
| + g_task_graph_runner.Pointer()->CollectCompletedTasks( |
| + namespace_token_, &completed_tasks); |
| + |
| + for (internal::Task::Vector::const_iterator it = completed_tasks.begin(); |
| + it != completed_tasks.end(); |
| + ++it) { |
| + internal::WorkerPoolTask* task = static_cast<internal::WorkerPoolTask*>( |
| + it->get()); |
| + |
| + task->WillComplete(); |
| + task->CompleteOnOriginThread(); |
| + task->DidComplete(); |
| + } |
| +} |
| + |
| +void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) { |
| + TRACE_EVENT1("cc", "RasterWorkerPool::SetTaskGraph", |
| + "num_tasks", graph->size()); |
| + |
| + g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph); |
| +} |
| + |
| void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
| raster_tasks_.swap(queue->tasks_); |
| raster_tasks_required_for_activation_.swap( |
| @@ -643,7 +717,7 @@ scoped_refptr<internal::WorkerPoolTask> |
| scoped_refptr<internal::WorkerPoolTask> |
| RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
| - size_t tasks_required_for_activation_count) { |
| + size_t tasks_required_for_activation_count) { |
| return make_scoped_refptr( |
| new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( |
| base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, |
| @@ -696,7 +770,7 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForTask( |
| // static |
| internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
| internal::WorkerPoolTask* raster_task, |
| - const TaskVector& decode_tasks, |
| + const internal::Task::Vector& decode_tasks, |
| unsigned priority, |
| TaskGraph* graph) { |
| DCHECK(!raster_task->HasCompleted()); |
| @@ -705,9 +779,10 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
| raster_task, priority, graph); |
| // Insert image decode tasks. |
| - for (TaskVector::const_iterator it = decode_tasks.begin(); |
| + for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); |
| it != decode_tasks.end(); ++it) { |
| - internal::WorkerPoolTask* decode_task = it->get(); |
| + internal::WorkerPoolTask* decode_task = |
| + static_cast<internal::WorkerPoolTask*>(it->get()); |
| // Skip if already decoded. |
| if (decode_task->HasCompleted()) |
| @@ -716,7 +791,7 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
| raster_node->add_dependency(); |
| // Check if decode task already exists in graph. |
| - GraphNodeMap::iterator decode_it = graph->find(decode_task); |
| + internal::GraphNode::Map::iterator decode_it = graph->find(decode_task); |
|
sohanjg
2014/01/21 09:41:08
nit: And typedef internal::GraphNode::Map too ?
sohanjg
2014/01/21 09:41:08
nit: And typedef internal::GraphNode::Map too ?
reveman
2014/01/21 15:37:48
what are you suggesting we typedef to? I like to k
|
| if (decode_it != graph->end()) { |
| internal::GraphNode* decode_node = decode_it->second; |
| decode_node->add_dependent(raster_node); |