Index: cc/resources/raster_worker_pool.cc |
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc |
index a4b4a503fe8156fddcdeb4b49a3631616f498d85..5f356e5b2122a304eb8eda800af5fd09e0914d3d 100644 |
--- a/cc/resources/raster_worker_pool.cc |
+++ b/cc/resources/raster_worker_pool.cc |
@@ -29,43 +29,6 @@ class DisableLCDTextFilter : public SkDrawFilter { |
} |
}; |
-void Noop() {} |
- |
-class RootWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
- public: |
- RootWorkerPoolTaskImpl(const base::Closure& callback, |
- const base::Closure& reply) |
- : callback_(callback), reply_(reply) {} |
- |
- explicit RootWorkerPoolTaskImpl( |
- internal::WorkerPoolTask::TaskVector* dependencies) |
- : internal::WorkerPoolTask(dependencies), |
- callback_(base::Bind(&Noop)), |
- reply_(base::Bind(&Noop)) {} |
- |
- RootWorkerPoolTaskImpl(const base::Closure& callback, |
- internal::WorkerPoolTask::TaskVector* dependencies) |
- : internal::WorkerPoolTask(dependencies), |
- callback_(callback), |
- reply_(base::Bind(&Noop)) {} |
- |
- // Overridden from internal::WorkerPoolTask: |
- virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
- callback_.Run(); |
- } |
- virtual void DispatchCompletionCallback() OVERRIDE { |
- reply_.Run(); |
- } |
- |
- private: |
- virtual ~RootWorkerPoolTaskImpl() {} |
- |
- const base::Closure callback_; |
- const base::Closure reply_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RootWorkerPoolTaskImpl); |
-}; |
- |
class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
public: |
RasterWorkerPoolTaskImpl(const Resource* resource, |
@@ -77,7 +40,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
const RasterTaskMetadata& metadata, |
RenderingStatsInstrumentation* rendering_stats, |
const RasterWorkerPool::RasterTask::Reply& reply, |
- internal::WorkerPoolTask::TaskVector* dependencies) |
+ TaskVector* dependencies) |
: internal::RasterWorkerPoolTask(resource, dependencies), |
picture_pile_(picture_pile), |
content_rect_(content_rect), |
@@ -237,6 +200,32 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); |
}; |
+class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
+ public: |
+ RasterFinishedWorkerPoolTaskImpl( |
+ base::MessageLoopProxy* origin_loop, |
+ const base::Closure& on_raster_finished_callback) |
+ : origin_loop_(origin_loop), |
+ on_raster_finished_callback_(on_raster_finished_callback) { |
+ } |
+ |
+ // Overridden from internal::WorkerPoolTask: |
+ virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
+ origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_); |
+ } |
+ virtual void DispatchCompletionCallback() OVERRIDE {} |
+ |
+ private: |
+ virtual ~RasterFinishedWorkerPoolTaskImpl() {} |
+ |
+ scoped_refptr<base::MessageLoopProxy> origin_loop_; |
+ const base::Closure on_raster_finished_callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); |
+}; |
+ |
+void Noop() {} |
+ |
const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
} // namespace |
@@ -244,8 +233,7 @@ const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
namespace internal { |
RasterWorkerPoolTask::RasterWorkerPoolTask( |
- const Resource* resource, |
- WorkerPoolTask::TaskVector* dependencies) |
+ const Resource* resource, TaskVector* dependencies) |
: did_run_(false), |
did_complete_(false), |
was_canceled_(false), |
@@ -345,21 +333,54 @@ void RasterWorkerPool::RasterTask::Reset() { |
RasterWorkerPool::RasterTask::~RasterTask() { |
} |
-RasterWorkerPool::RootTask::RootTask() { |
+RasterWorkerPool::RasterTaskGraph::RasterTaskGraph() |
+ : raster_finished_node_(new GraphNode), |
+ next_priority_(1u) { |
} |
-RasterWorkerPool::RootTask::RootTask( |
- internal::WorkerPoolTask::TaskVector* dependencies) |
- : internal_(new RootWorkerPoolTaskImpl(dependencies)) { |
+RasterWorkerPool::RasterTaskGraph::~RasterTaskGraph() { |
} |
-RasterWorkerPool::RootTask::RootTask( |
- const base::Closure& callback, |
- internal::WorkerPoolTask::TaskVector* dependencies) |
- : internal_(new RootWorkerPoolTaskImpl(callback, dependencies)) { |
-} |
+void RasterWorkerPool::RasterTaskGraph::InsertRasterTask( |
+ internal::WorkerPoolTask* raster_task, |
+ const TaskVector& decode_tasks) { |
+ DCHECK(!raster_task->HasCompleted()); |
+ DCHECK(graph_.find(raster_task) == graph_.end()); |
+ |
+ scoped_ptr<GraphNode> raster_node(new GraphNode); |
+ raster_node->set_task(raster_task); |
+ raster_node->set_priority(next_priority_++); |
+ |
+ // Insert image decode tasks. |
+ for (TaskVector::const_iterator it = decode_tasks.begin(); |
+ it != decode_tasks.end(); ++it) { |
+ internal::WorkerPoolTask* decode_task = it->get(); |
+ |
+ // Skip if already decoded. |
+ if (decode_task->HasCompleted()) |
+ continue; |
+ |
+ raster_node->add_dependency(); |
-RasterWorkerPool::RootTask::~RootTask() { |
+ // Check if decode task already exists in graph. |
+ GraphNodeMap::iterator decode_it = graph_.find(decode_task); |
+ if (decode_it != graph_.end()) { |
+ GraphNode* decode_node = decode_it->second; |
+ decode_node->add_dependent(raster_node.get()); |
+ continue; |
+ } |
+ |
+ scoped_ptr<GraphNode> decode_node(new GraphNode); |
+ decode_node->set_task(decode_task); |
+ decode_node->set_priority(next_priority_++); |
+ decode_node->add_dependent(raster_node.get()); |
+ graph_.set(decode_task, decode_node.Pass()); |
+ } |
+ |
+ raster_finished_node_->add_dependency(); |
+ raster_node->add_dependent(raster_finished_node_.get()); |
+ |
+ graph_.set(raster_task, raster_node.Pass()); |
} |
// static |
@@ -373,7 +394,7 @@ RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
const RasterTaskMetadata& metadata, |
RenderingStatsInstrumentation* rendering_stats, |
const RasterTask::Reply& reply, |
- Task::Set& dependencies) { |
+ Task::Set* dependencies) { |
return RasterTask(new RasterWorkerPoolTaskImpl(resource, |
picture_pile, |
content_rect, |
@@ -383,7 +404,7 @@ RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
metadata, |
rendering_stats, |
reply, |
- &dependencies.tasks_)); |
+ &dependencies->tasks_)); |
} |
// static |
@@ -402,7 +423,9 @@ RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
size_t num_threads) |
: WorkerPool(num_threads, kWorkerThreadNamePrefix), |
client_(NULL), |
- resource_provider_(resource_provider) { |
+ resource_provider_(resource_provider), |
+ weak_ptr_factory_(this), |
+ schedule_raster_tasks_count_(0) { |
} |
RasterWorkerPool::~RasterWorkerPool() { |
@@ -413,8 +436,12 @@ void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
} |
void RasterWorkerPool::Shutdown() { |
- raster_tasks_.clear(); |
+ TaskGraph empty; |
+ SetTaskGraph(&empty); |
WorkerPool::Shutdown(); |
+ raster_tasks_.clear(); |
+ // Cancel any pending OnRasterFinished callback. |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
} |
void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
@@ -423,14 +450,31 @@ void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
queue->tasks_required_for_activation_); |
} |
-void RasterWorkerPool::ScheduleRasterTasks(const RootTask& root) { |
- scoped_refptr<internal::WorkerPoolTask> new_root(root.internal_); |
+void RasterWorkerPool::SetRasterTaskGraph(RasterTaskGraph* graph) { |
+ scoped_ptr<GraphNode> raster_finished_node( |
+ graph->raster_finished_node_.Pass()); |
+ TaskGraph new_graph; |
+ new_graph.swap(graph->graph_); |
+ |
+ if (new_graph.empty()) { |
+ SetTaskGraph(&new_graph); |
+ raster_finished_task_ = NULL; |
+ return; |
+ } |
- TaskGraph graph; |
- BuildTaskGraph(new_root.get(), &graph); |
- WorkerPool::SetTaskGraph(&graph); |
+ ++schedule_raster_tasks_count_; |
vmpstr
2013/06/20 18:01:30
should this be incremented even if we schedule NUL
reveman
2013/06/20 18:34:09
we'll probably change this moving forward but I pr
|
- root_.swap(new_root); |
+ scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
+ new RasterFinishedWorkerPoolTaskImpl( |
+ base::MessageLoopProxy::current(), |
+ base::Bind(&RasterWorkerPool::OnRasterFinished, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ schedule_raster_tasks_count_))); |
+ raster_finished_node->set_task(new_raster_finished_task.get()); |
+ // Insert "raster finished" task before switching to new graph. |
+ new_graph.set(new_raster_finished_task.get(), raster_finished_node.Pass()); |
+ SetTaskGraph(&new_graph); |
+ raster_finished_task_.swap(new_raster_finished_task); |
} |
bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
@@ -440,4 +484,14 @@ bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
raster_tasks_required_for_activation_.end(); |
} |
+void RasterWorkerPool::OnRasterFinished(int64 schedule_raster_tasks_count) { |
+ TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", |
+ "schedule_raster_tasks_count", schedule_raster_tasks_count); |
+ DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); |
+ // Call OnRasterTasksFinished() when we've finished running all raster |
+ // tasks needed since last time SetRasterTaskGraph() was called. |
+ if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) |
+ OnRasterTasksFinished(); |
+} |
+ |
} // namespace cc |