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..6a08e70a2d9ab56aa26f1263d8ce953f18c0d048 100644 |
--- a/cc/resources/image_raster_worker_pool.cc |
+++ b/cc/resources/image_raster_worker_pool.cc |
@@ -5,6 +5,8 @@ |
#include "cc/resources/image_raster_worker_pool.h" |
#include "base/debug/trace_event.h" |
+#include "base/values.h" |
+#include "cc/debug/traced_value.h" |
#include "cc/resources/resource.h" |
#include "third_party/skia/include/core/SkDevice.h" |
@@ -28,6 +30,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; |
@@ -59,7 +62,9 @@ class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
ImageRasterWorkerPool::ImageRasterWorkerPool( |
ResourceProvider* resource_provider, size_t num_threads) |
- : RasterWorkerPool(resource_provider, num_threads) { |
+ : RasterWorkerPool(resource_provider, num_threads), |
+ raster_tasks_pending_(false), |
+ raster_tasks_required_for_activation_pending_(false) { |
} |
ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
@@ -71,7 +76,31 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
RasterWorkerPool::SetRasterTasks(queue); |
- RasterTaskGraph graph; |
+ if (!raster_tasks_pending_) |
+ TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
+ |
+ raster_tasks_pending_ = true; |
+ raster_tasks_required_for_activation_pending_ = true; |
+ |
+ unsigned priority = 0u; |
+ TaskGraph graph; |
+ |
+ scoped_refptr<internal::WorkerPoolTask> |
+ new_raster_required_for_activation_finished_task( |
+ CreateRasterRequiredForActivationFinishedTask()); |
+ internal::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()); |
+ internal::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 +108,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 +135,41 @@ 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); |
+ |
+ TRACE_EVENT_ASYNC_STEP1( |
+ "cc", "ScheduledTasks", this, "rasterizing", |
+ "state", TracedValue::FromValue(StateAsValue().release())); |
+} |
+ |
+void ImageRasterWorkerPool::OnRasterTasksFinished() { |
+ DCHECK(raster_tasks_pending_); |
+ raster_tasks_pending_ = false; |
+ TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
+ client()->DidFinishedRunningTasks(); |
+} |
+ |
+void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { |
+ DCHECK(raster_tasks_required_for_activation_pending_); |
+ raster_tasks_required_for_activation_pending_ = false; |
+ TRACE_EVENT_ASYNC_STEP1( |
+ "cc", "ScheduledTasks", this, "rasterizing", |
+ "state", TracedValue::FromValue(StateAsValue().release())); |
+ client()->DidFinishedRunningTasksRequiredForActivation(); |
} |
void ImageRasterWorkerPool::OnRasterTaskCompleted( |
@@ -127,4 +194,36 @@ void ImageRasterWorkerPool::OnRasterTaskCompleted( |
image_tasks_.erase(task.get()); |
} |
+scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const { |
+ scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); |
+ |
+ state->SetBoolean("tasks_required_for_activation_pending", |
+ raster_tasks_required_for_activation_pending_); |
+ state->Set("scheduled_state", ScheduledStateAsValue().release()); |
+ return state.PassAs<base::Value>(); |
+} |
+ |
+// static |
+void ImageRasterWorkerPool::CreateGraphNodeForImageTask( |
+ internal::WorkerPoolTask* image_task, |
+ const TaskVector& decode_tasks, |
+ unsigned priority, |
+ bool is_required_for_activation, |
+ internal::GraphNode* raster_required_for_activation_finished_node, |
+ internal::GraphNode* raster_finished_node, |
+ TaskGraph* graph) { |
+ internal::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 |