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

Unified Diff: cc/resources/raster_worker_pool.cc

Issue 17351017: Re-land: cc: Add raster finished signals to RasterWorkerPool. (Closed) Base URL: http://git.chromium.org/chromium/src.git@new-graph-build
Patch Set: hybrid approach 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
Index: cc/resources/raster_worker_pool.cc
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index 340f37eeb1ead2e8844a1b1488e640520e1fd22e..9bbdcc5b5c4b3efc153a204cff694301c7c06ebd 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -227,30 +227,40 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask {
public:
+ typedef base::Callback<void(const internal::WorkerPoolTask* source)>
+ Callback;
+
RasterFinishedWorkerPoolTaskImpl(
- base::MessageLoopProxy* origin_loop,
- const base::Closure& on_raster_finished_callback)
- : origin_loop_(origin_loop),
- on_raster_finished_callback_(on_raster_finished_callback) {
+ const Callback& on_raster_finished_callback)
+ : origin_loop_(base::MessageLoopProxy::current().get()),
+ run_on_origin_thread_callback_(
+ base::Bind(&RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread,
+ base::Unretained(this),
+ on_raster_finished_callback)) {
}
// Overridden from internal::WorkerPoolTask:
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
- origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_);
+ TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread");
+ origin_loop_->PostTask(FROM_HERE, run_on_origin_thread_callback_);
}
virtual void CompleteOnOriginThread() OVERRIDE {}
private:
virtual ~RasterFinishedWorkerPoolTaskImpl() {}
+ static void RunOnOriginThread(
+ const internal::WorkerPoolTask* source,
+ const Callback& on_raster_finished_callback) {
+ on_raster_finished_callback.Run(source);
+ }
+
scoped_refptr<base::MessageLoopProxy> origin_loop_;
- const base::Closure on_raster_finished_callback_;
+ const base::Closure run_on_origin_thread_callback_;
DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl);
};
-void Noop() {}
-
const char* kWorkerThreadNamePrefix = "CompositorRaster";
} // namespace
@@ -362,56 +372,6 @@ void RasterWorkerPool::RasterTask::Reset() {
RasterWorkerPool::RasterTask::~RasterTask() {
}
-RasterWorkerPool::RasterTaskGraph::RasterTaskGraph()
- : raster_finished_node_(new GraphNode),
- next_priority_(1u) {
-}
-
-RasterWorkerPool::RasterTaskGraph::~RasterTaskGraph() {
-}
-
-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();
-
- // 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
RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask(
const Resource* resource,
@@ -453,8 +413,7 @@ RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
: WorkerPool(num_threads, kWorkerThreadNamePrefix),
client_(NULL),
resource_provider_(resource_provider),
- weak_ptr_factory_(this),
- schedule_raster_tasks_count_(0) {
+ weak_ptr_factory_(this) {
}
RasterWorkerPool::~RasterWorkerPool() {
@@ -465,11 +424,10 @@ 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();
}
@@ -479,48 +437,99 @@ void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) {
queue->tasks_required_for_activation_);
}
-void RasterWorkerPool::SetRasterTaskGraph(RasterTaskGraph* graph) {
- scoped_ptr<GraphNode> raster_finished_node(
- graph->raster_finished_node_.Pass());
- TaskGraph new_graph;
- new_graph.swap(graph->graph_);
+bool RasterWorkerPool::IsRasterTaskRequiredForActivation(
+ internal::RasterWorkerPoolTask* task) const {
+ return
+ raster_tasks_required_for_activation_.find(task) !=
+ raster_tasks_required_for_activation_.end();
+}
- if (new_graph.empty()) {
- SetTaskGraph(&new_graph);
- raster_finished_task_ = NULL;
+scoped_refptr<internal::WorkerPoolTask>
+ RasterWorkerPool::CreateRasterFinishedTask() {
+ return make_scoped_refptr(
+ new RasterFinishedWorkerPoolTaskImpl(
+ base::Bind(&RasterWorkerPool::OnRasterFinished,
+ weak_ptr_factory_.GetWeakPtr())));
+}
+
+scoped_refptr<internal::WorkerPoolTask>
+ RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() {
+ return make_scoped_refptr(
+ new RasterFinishedWorkerPoolTaskImpl(
+ base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished,
+ weak_ptr_factory_.GetWeakPtr())));
+}
+
+void RasterWorkerPool::OnRasterFinished(
+ const internal::WorkerPoolTask* source) {
+ TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished");
+
+ // Early out if current |raster_finished_task_| is not the source.
+ if (source != raster_finished_task_.get())
return;
- }
- ++schedule_raster_tasks_count_;
+ OnRasterTasksFinished();
+}
- scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
- new RasterFinishedWorkerPoolTaskImpl(
- base::MessageLoopProxy::current().get(),
- 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);
+void RasterWorkerPool::OnRasterRequiredForActivationFinished(
+ const internal::WorkerPoolTask* source) {
+ TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterRequiredForActivationFinished");
+
+ // Early out if current |raster_required_for_activation_finished_task_|
+ // is not the source.
+ if (source != raster_required_for_activation_finished_task_.get())
+ return;
+
+ OnRasterTasksRequiredForActivationFinished();
}
-bool RasterWorkerPool::IsRasterTaskRequiredForActivation(
- internal::RasterWorkerPoolTask* task) const {
- return
- raster_tasks_required_for_activation_.find(task) !=
- raster_tasks_required_for_activation_.end();
+// static
+WorkerPool::GraphNode* RasterWorkerPool::CreateGraphNodeForTask(
+ internal::WorkerPoolTask* task,
+ unsigned priority,
+ TaskGraph* graph) {
+ GraphNode* node = new GraphNode(task, priority);
+ DCHECK(graph->find(task) == graph->end());
+ graph->set(task, make_scoped_ptr(node));
+ return node;
}
-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();
+// static
+WorkerPool::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask(
+ internal::WorkerPoolTask* raster_task,
+ const TaskVector& decode_tasks,
+ unsigned priority,
+ TaskGraph* graph) {
+ DCHECK(!raster_task->HasCompleted());
+
+ GraphNode* raster_node = CreateGraphNodeForTask(
+ raster_task, priority, graph);
+
+ // 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();
+
+ // 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);
+ continue;
+ }
+
+ GraphNode* decode_node = CreateGraphNodeForTask(
+ decode_task, priority, graph);
+ decode_node->add_dependent(raster_node);
+ }
+
+ return raster_node;
}
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698