Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Unified Diff: cc/resources/raster_worker_pool.cc

Issue 17244003: cc: Move task graph construction to RasterWorkerPool classes. (Closed) Base URL: http://git.chromium.org/chromium/src.git@wp-run-count
Patch Set: add missing CC_EXPORT Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
- 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
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698