| 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
|
|
|