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

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: fix flaky unit tests 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
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/pixel_buffer_raster_worker_pool.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/pixel_buffer_raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698