summaryrefslogtreecommitdiffstats
path: root/chromium/cc/resources/image_raster_worker_pool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/resources/image_raster_worker_pool.cc')
-rw-r--r--chromium/cc/resources/image_raster_worker_pool.cc301
1 files changed, 130 insertions, 171 deletions
diff --git a/chromium/cc/resources/image_raster_worker_pool.cc b/chromium/cc/resources/image_raster_worker_pool.cc
index 90572ab417d..007c1ed83f3 100644
--- a/chromium/cc/resources/image_raster_worker_pool.cc
+++ b/chromium/cc/resources/image_raster_worker_pool.cc
@@ -5,75 +5,56 @@
#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/SkBitmapDevice.h"
namespace cc {
-namespace {
-
-class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
- public:
- typedef base::Callback<void(bool was_canceled)> Reply;
-
- ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
- uint8_t* buffer,
- int stride,
- const Reply& reply)
- : task_(task),
- buffer_(buffer),
- stride_(stride),
- reply_(reply) {
- }
-
- // Overridden from internal::WorkerPoolTask:
- virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
- TRACE_EVENT0("cc", "ImageWorkerPoolTaskImpl::RunOnWorkerThread");
- if (!buffer_)
- return;
-
- task_->RunOnWorkerThread(thread_index,
- buffer_,
- task_->resource()->size(),
- stride_);
- }
- virtual void CompleteOnOriginThread() OVERRIDE {
- reply_.Run(!HasFinishedRunning());
- }
-
- private:
- virtual ~ImageWorkerPoolTaskImpl() {}
+// static
+scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider) {
+ return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool(
+ task_runner, task_graph_runner, resource_provider));
+}
- scoped_refptr<internal::RasterWorkerPoolTask> task_;
- uint8_t* buffer_;
- int stride_;
- const Reply reply_;
+ImageRasterWorkerPool::ImageRasterWorkerPool(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider)
+ : task_runner_(task_runner),
+ task_graph_runner_(task_graph_runner),
+ namespace_token_(task_graph_runner->GetNamespaceToken()),
+ resource_provider_(resource_provider),
+ raster_tasks_pending_(false),
+ raster_tasks_required_for_activation_pending_(false),
+ raster_finished_weak_ptr_factory_(this) {}
- DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl);
-};
+ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
-} // namespace
+Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; }
-ImageRasterWorkerPool::ImageRasterWorkerPool(
- ResourceProvider* resource_provider,
- size_t num_threads,
- GLenum texture_target)
- : RasterWorkerPool(resource_provider, num_threads),
- texture_target_(texture_target),
- raster_tasks_pending_(false),
- raster_tasks_required_for_activation_pending_(false) {
+void ImageRasterWorkerPool::SetClient(RasterizerClient* client) {
+ client_ = client;
}
-ImageRasterWorkerPool::~ImageRasterWorkerPool() {
- DCHECK_EQ(0u, image_tasks_.size());
+void ImageRasterWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown");
+
+ TaskGraph empty;
+ task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
+ task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
}
-void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
+void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
- RasterWorkerPool::SetRasterTasks(queue);
+ DCHECK_EQ(queue->required_for_activation_count,
+ static_cast<size_t>(
+ std::count_if(queue->items.begin(),
+ queue->items.end(),
+ RasterTaskQueue::Item::IsRequiredForActivation)));
if (!raster_tasks_pending_)
TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
@@ -81,123 +62,125 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
raster_tasks_pending_ = true;
raster_tasks_required_for_activation_pending_ = true;
- unsigned priority = 0u;
- TaskGraph graph;
+ unsigned priority = kRasterTaskPriorityBase;
- scoped_refptr<internal::WorkerPoolTask>
+ graph_.Reset();
+
+ // Cancel existing OnRasterFinished callbacks.
+ raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+
+ scoped_refptr<RasterizerTask>
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();
+ CreateRasterRequiredForActivationFinishedTask(
+ queue->required_for_activation_count,
+ task_runner_.get(),
+ base::Bind(
+ &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished,
+ raster_finished_weak_ptr_factory_.GetWeakPtr())));
+ scoped_refptr<RasterizerTask> new_raster_finished_task(
+ CreateRasterFinishedTask(
+ task_runner_.get(),
+ base::Bind(&ImageRasterWorkerPool::OnRasterFinished,
+ raster_finished_weak_ptr_factory_.GetWeakPtr())));
+
+ for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end();
+ ++it) {
+ const RasterTaskQueue::Item& item = *it;
+ RasterTask* task = item.task;
DCHECK(!task->HasCompleted());
- DCHECK(!task->WasCanceled());
-
- TaskMap::iterator image_it = image_tasks_.find(task);
- if (image_it != image_tasks_.end()) {
- internal::WorkerPoolTask* image_task = image_it->second.get();
- CreateGraphNodeForImageTask(
- image_task,
- task->dependencies(),
- priority++,
- IsRasterTaskRequiredForActivation(task),
- raster_required_for_activation_finished_node,
- raster_finished_node,
- &graph);
- continue;
+
+ if (item.required_for_activation) {
+ graph_.edges.push_back(TaskGraph::Edge(
+ task, new_raster_required_for_activation_finished_task.get()));
}
- // Acquire image for resource.
- resource_provider()->AcquireImage(task->resource()->id());
-
- // Map image for raster.
- uint8* buffer = resource_provider()->MapImage(task->resource()->id());
- int stride = resource_provider()->GetImageStride(task->resource()->id());
-
- scoped_refptr<internal::WorkerPoolTask> new_image_task(
- new ImageWorkerPoolTaskImpl(
- task,
- buffer,
- stride,
- base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted,
- base::Unretained(this),
- make_scoped_refptr(task))));
- image_tasks_[task] = new_image_task;
- CreateGraphNodeForImageTask(
- new_image_task.get(),
- task->dependencies(),
- priority++,
- IsRasterTaskRequiredForActivation(task),
- raster_required_for_activation_finished_node,
- raster_finished_node,
- &graph);
+ InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
+
+ graph_.edges.push_back(
+ TaskGraph::Edge(task, new_raster_finished_task.get()));
}
- SetTaskGraph(&graph);
+ InsertNodeForTask(&graph_,
+ new_raster_required_for_activation_finished_task.get(),
+ kRasterRequiredForActivationFinishedTaskPriority,
+ queue->required_for_activation_count);
+ InsertNodeForTask(&graph_,
+ new_raster_finished_task.get(),
+ kRasterFinishedTaskPriority,
+ queue->items.size());
+
+ ScheduleTasksOnOriginThread(this, &graph_);
+ task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
- set_raster_finished_task(new_raster_finished_task);
- set_raster_required_for_activation_finished_task(
- new_raster_required_for_activation_finished_task);
+ raster_finished_task_ = new_raster_finished_task;
+ raster_required_for_activation_finished_task_ =
+ new_raster_required_for_activation_finished_task;
TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing",
- "state", TracedValue::FromValue(StateAsValue().release()));
+ "cc",
+ "ScheduledTasks",
+ this,
+ "rasterizing",
+ "state",
+ TracedValue::FromValue(StateAsValue().release()));
}
-GLenum ImageRasterWorkerPool::GetResourceTarget() const {
- return texture_target_;
+void ImageRasterWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
+
+ task_graph_runner_->CollectCompletedTasks(namespace_token_,
+ &completed_tasks_);
+ for (Task::Vector::const_iterator it = completed_tasks_.begin();
+ it != completed_tasks_.end();
+ ++it) {
+ RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
+
+ task->WillComplete();
+ task->CompleteOnOriginThread(this);
+ task->DidComplete();
+
+ task->RunReplyOnOriginThread();
+ }
+ completed_tasks_.clear();
+}
+
+SkCanvas* ImageRasterWorkerPool::AcquireCanvasForRaster(RasterTask* task) {
+ return resource_provider_->MapImageRasterBuffer(task->resource()->id());
}
-ResourceFormat ImageRasterWorkerPool::GetResourceFormat() const {
- return resource_provider()->best_texture_format();
+void ImageRasterWorkerPool::ReleaseCanvasForRaster(RasterTask* task) {
+ resource_provider_->UnmapImageRasterBuffer(task->resource()->id());
+
+ // Map/UnmapImageRasterBuffer provides direct access to the memory used by the
+ // GPU. Read lock fences are required to ensure that we're not trying to map a
+ // resource that is currently in-use by the GPU.
+ resource_provider_->EnableReadLockFences(task->resource()->id(), true);
}
-void ImageRasterWorkerPool::OnRasterTasksFinished() {
+void ImageRasterWorkerPool::OnRasterFinished() {
+ TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished");
+
DCHECK(raster_tasks_pending_);
raster_tasks_pending_ = false;
TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
- client()->DidFinishRunningTasks();
+ client_->DidFinishRunningTasks();
}
-void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
+void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() {
+ TRACE_EVENT0("cc",
+ "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished");
+
DCHECK(raster_tasks_required_for_activation_pending_);
raster_tasks_required_for_activation_pending_ = false;
TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing",
- "state", TracedValue::FromValue(StateAsValue().release()));
- client()->DidFinishRunningTasksRequiredForActivation();
-}
-
-void ImageRasterWorkerPool::OnRasterTaskCompleted(
- scoped_refptr<internal::RasterWorkerPoolTask> task,
- bool was_canceled) {
- TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted",
- "was_canceled", was_canceled);
-
- DCHECK(image_tasks_.find(task.get()) != image_tasks_.end());
-
- // Balanced with MapImage() call in ScheduleTasks().
- resource_provider()->UnmapImage(task->resource()->id());
-
- task->DidRun(was_canceled);
- task->WillComplete();
- task->CompleteOnOriginThread();
- task->DidComplete();
-
- image_tasks_.erase(task.get());
+ "cc",
+ "ScheduledTasks",
+ this,
+ "rasterizing",
+ "state",
+ TracedValue::FromValue(StateAsValue().release()));
+ client_->DidFinishRunningTasksRequiredForActivation();
}
scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const {
@@ -205,31 +188,7 @@ scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const {
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