image_raster_worker_pool.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/resources/image_raster_worker_pool.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/debug/trace_event.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/debug/traced_value.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/resources/resource.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmapDevice.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace cc {
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create(
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ResourceProvider* resource_provider,
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    unsigned texture_target) {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return make_scoped_ptr<RasterWorkerPool>(
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new ImageRasterWorkerPool(GetTaskGraphRunner(),
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                resource_provider,
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                texture_target));
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ImageRasterWorkerPool::ImageRasterWorkerPool(
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    internal::TaskGraphRunner* task_graph_runner,
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ResourceProvider* resource_provider,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    unsigned texture_target)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : RasterWorkerPool(task_graph_runner, resource_provider),
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      texture_target_(texture_target),
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      raster_tasks_pending_(false),
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      raster_tasks_required_for_activation_pending_(false) {}
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!raster_tasks_pending_)
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  raster_tasks_pending_ = true;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  raster_tasks_required_for_activation_pending_ = true;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  unsigned priority = kRasterTaskPriorityBase;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  graph_.Reset();
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<internal::WorkerPoolTask>
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new_raster_required_for_activation_finished_task(
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          CreateRasterRequiredForActivationFinishedTask(
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              queue->required_for_activation_count()));
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateRasterFinishedTask());
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (RasterTaskQueueIterator it(queue); it; ++it) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    internal::RasterWorkerPoolTask* task = *it;
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(!task->HasCompleted());
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (it.required_for_activation()) {
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      graph_.edges.push_back(internal::TaskGraph::Edge(
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          task, new_raster_required_for_activation_finished_task.get()));
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InsertNodeForRasterTask(&graph_, task, task->dependencies(), priority++);
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    graph_.edges.push_back(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        internal::TaskGraph::Edge(task, new_raster_finished_task.get()));
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InsertNodeForTask(&graph_,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    new_raster_required_for_activation_finished_task.get(),
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    kRasterRequiredForActivationFinishedTaskPriority,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    queue->required_for_activation_count());
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InsertNodeForTask(&graph_,
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    new_raster_finished_task.get(),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    kRasterFinishedTaskPriority,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    queue->count());
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  raster_tasks_.Swap(queue);
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetTaskGraph(&graph_);
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  set_raster_finished_task(new_raster_finished_task);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  set_raster_required_for_activation_finished_task(
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new_raster_required_for_activation_finished_task);
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TRACE_EVENT_ASYNC_STEP_INTO1(
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "cc",
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "ScheduledTasks",
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "rasterizing",
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "state",
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TracedValue::FromValue(StateAsValue().release()));
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)unsigned ImageRasterWorkerPool::GetResourceTarget() const {
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return texture_target_;
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ResourceFormat ImageRasterWorkerPool::GetResourceFormat() const {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return resource_provider()->best_texture_format();
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ImageRasterWorkerPool::CheckForCompletedTasks() {
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CollectCompletedWorkerPoolTasks(&completed_tasks_);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (internal::Task::Vector::const_iterator it = completed_tasks_.begin();
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != completed_tasks_.end();
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    internal::WorkerPoolTask* task =
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<internal::WorkerPoolTask*>(it->get());
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task->WillComplete();
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task->CompleteOnOriginThread(this);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task->DidComplete();
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task->RunReplyOnOriginThread();
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  completed_tasks_.clear();
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SkCanvas* ImageRasterWorkerPool::AcquireCanvasForRaster(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    internal::RasterWorkerPoolTask* task) {
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return resource_provider()->MapImageRasterBuffer(task->resource()->id());
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ImageRasterWorkerPool::OnRasterCompleted(
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    internal::RasterWorkerPoolTask* task,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const PicturePileImpl::Analysis& analysis) {
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resource_provider()->UnmapImageRasterBuffer(task->resource()->id());
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ImageRasterWorkerPool::OnRasterTasksFinished() {
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(raster_tasks_pending_);
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  raster_tasks_pending_ = false;
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  client()->DidFinishRunningTasks();
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(raster_tasks_required_for_activation_pending_);
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  raster_tasks_required_for_activation_pending_ = false;
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TRACE_EVENT_ASYNC_STEP_INTO1(
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "cc",
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "ScheduledTasks",
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "rasterizing",
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "state",
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TracedValue::FromValue(StateAsValue().release()));
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  client()->DidFinishRunningTasksRequiredForActivation();
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochscoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const {
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  state->SetBoolean("tasks_required_for_activation_pending",
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    raster_tasks_required_for_activation_pending_);
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return state.PassAs<base::Value>();
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace cc
164