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

Unified Diff: cc/resources/image_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/image_raster_worker_pool.cc
diff --git a/cc/resources/image_raster_worker_pool.cc b/cc/resources/image_raster_worker_pool.cc
index 1d96b27815e8e1e6d78407a8200b6666a0bead47..675686d6690b9c2ca62c10b196ca1c4f82c73166 100644
--- a/cc/resources/image_raster_worker_pool.cc
+++ b/cc/resources/image_raster_worker_pool.cc
@@ -28,6 +28,7 @@ class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
// Overridden from internal::WorkerPoolTask:
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
+ TRACE_EVENT0("cc", "ImageWorkerPoolTaskImpl::RunOnWorkerThread");
if (!buffer_)
return;
@@ -71,7 +72,25 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
RasterWorkerPool::SetRasterTasks(queue);
- RasterTaskGraph graph;
+ unsigned priority = 0u;
+ TaskGraph graph;
+
+ scoped_refptr<internal::WorkerPoolTask>
+ new_raster_required_for_activation_finished_task(
+ CreateRasterRequiredForActivationFinishedTask());
+ GraphNode* raster_required_for_activation_finished_node =
+ CreateGraphNodeForTask(
+ new_raster_required_for_activation_finished_task.get(),
+ priority++,
+ &graph);
+
+ scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
+ CreateRasterFinishedTask());
+ GraphNode* raster_finished_node =
+ CreateGraphNodeForTask(new_raster_finished_task.get(),
+ priority++,
+ &graph);
+
for (RasterTaskVector::const_iterator it = raster_tasks().begin();
it != raster_tasks().end(); ++it) {
internal::RasterWorkerPoolTask* task = it->get();
@@ -79,7 +98,14 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
TaskMap::iterator image_it = image_tasks_.find(task);
if (image_it != image_tasks_.end()) {
internal::WorkerPoolTask* image_task = image_it->second.get();
- graph.InsertRasterTask(image_task, task->dependencies());
+ CreateGraphNodeForImageTask(
+ image_task,
+ task->dependencies(),
+ priority++,
+ IsRasterTaskRequiredForActivation(task),
+ raster_required_for_activation_finished_node,
+ raster_finished_node,
+ &graph);
continue;
}
@@ -99,10 +125,29 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
base::Unretained(this),
make_scoped_refptr(task))));
image_tasks_[task] = new_image_task;
- graph.InsertRasterTask(new_image_task.get(), task->dependencies());
+ CreateGraphNodeForImageTask(
+ new_image_task.get(),
+ task->dependencies(),
+ priority++,
+ IsRasterTaskRequiredForActivation(task),
+ raster_required_for_activation_finished_node,
+ raster_finished_node,
+ &graph);
}
- SetRasterTaskGraph(&graph);
+ SetTaskGraph(&graph);
+
+ set_raster_finished_task(new_raster_finished_task);
+ set_raster_required_for_activation_finished_task(
+ new_raster_required_for_activation_finished_task);
+}
+
+void ImageRasterWorkerPool::OnRasterTasksFinished() {
+ client()->DidFinishedRunningTasks();
+}
+
+void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
+ client()->DidFinishedRunningTasksRequiredForActivation();
}
void ImageRasterWorkerPool::OnRasterTaskCompleted(
@@ -127,4 +172,27 @@ void ImageRasterWorkerPool::OnRasterTaskCompleted(
image_tasks_.erase(task.get());
}
+// static
+void ImageRasterWorkerPool::CreateGraphNodeForImageTask(
+ internal::WorkerPoolTask* image_task,
+ const TaskVector& decode_tasks,
+ unsigned priority,
+ bool is_required_for_activation,
+ GraphNode* raster_required_for_activation_finished_node,
+ GraphNode* raster_finished_node,
+ TaskGraph* graph) {
+ GraphNode* image_node = CreateGraphNodeForRasterTask(image_task,
+ decode_tasks,
+ priority,
+ graph);
+
+ if (is_required_for_activation) {
+ raster_required_for_activation_finished_node->add_dependency();
+ image_node->add_dependent(raster_required_for_activation_finished_node);
+ }
+
+ raster_finished_node->add_dependency();
+ image_node->add_dependent(raster_finished_node);
+}
+
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698