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

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: new 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 84a8e8a6209f948c02e888ded33de9fbefd4737f..7ca38ea6d40fcbe5ed6887d33deaac88d814145f 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -225,32 +225,6 @@ 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 RunOnWorkerThread(unsigned thread_index) OVERRIDE {
- origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_);
- }
- virtual void CompleteOnOriginThread() 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
@@ -362,56 +336,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,
@@ -452,9 +376,7 @@ RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
size_t num_threads)
: WorkerPool(num_threads, kWorkerThreadNamePrefix),
client_(NULL),
- resource_provider_(resource_provider),
- weak_ptr_factory_(this),
- schedule_raster_tasks_count_(0) {
+ resource_provider_(resource_provider) {
}
RasterWorkerPool::~RasterWorkerPool() {
@@ -465,12 +387,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();
}
void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) {
@@ -479,33 +399,6 @@ 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_);
-
- if (new_graph.empty()) {
- SetTaskGraph(&new_graph);
- raster_finished_task_ = NULL;
- return;
- }
-
- ++schedule_raster_tasks_count_;
-
- 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(
internal::RasterWorkerPoolTask* task) const {
return
@@ -513,14 +406,41 @@ 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();
+// static
+scoped_ptr<WorkerPool::GraphNode> RasterWorkerPool::CreateRasterTaskGraphNode(
vmpstr 2013/06/27 23:31:21 Can this be non-static on TaskGraph? Something li
reveman 2013/06/28 17:26:07 TaskGraph is just a ScopedPtrHashMap at the moment
+ internal::WorkerPoolTask* raster_task,
+ const TaskVector& decode_tasks,
+ unsigned priority,
+ TaskGraph* graph) {
+ DCHECK(!raster_task->HasCompleted());
+
+ scoped_ptr<GraphNode> raster_node(new GraphNode(raster_task, 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_task, priority));
+ decode_node->add_dependent(raster_node.get());
+ graph->set(decode_task, decode_node.Pass());
+ }
+
+ return raster_node.Pass();
}
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698