11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2013 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/zero_copy_raster_worker_pool.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/debug/trace_event.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/debug/trace_event_argument.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/debug/traced_value.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/raster_buffer.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/resource.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/skia/include/utils/SkNullCanvas.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace cc {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RasterBufferImpl : public RasterBuffer {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RasterBufferImpl(ResourceProvider* resource_provider,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const Resource* resource)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : resource_provider_(resource_provider),
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        resource_(resource),
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        stride_(0),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        buffer_(resource_provider->MapImage(resource->id(), &stride_)) {}
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~RasterBufferImpl() {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_->UnmapImage(resource_->id());
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // This RasterBuffer implementation provides direct access to the memory
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // used by the GPU. Read lock fences are required to ensure that we're not
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // trying to map a resource that is currently in-use by the GPU.
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_->EnableReadLockFences(resource_->id());
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Overridden from RasterBuffer:
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!buffer_)
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return skia::AdoptRef(SkCreateNullCanvas());
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RasterWorkerPool::AcquireBitmapForBuffer(
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &bitmap_, buffer_, resource_->format(), resource_->size(), stride_);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return skia::AdoptRef(new SkCanvas(bitmap_));
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!buffer_)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RasterWorkerPool::ReleaseBitmapForBuffer(
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &bitmap_, buffer_, resource_->format());
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourceProvider* resource_provider_;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const Resource* resource_;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int stride_;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint8_t* buffer_;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkBitmap bitmap_;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::SequencedTaskRunner* task_runner,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TaskGraphRunner* task_graph_runner,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ResourceProvider* resource_provider) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool(
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      task_runner, task_graph_runner, resource_provider));
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool(
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::SequencedTaskRunner* task_runner,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TaskGraphRunner* task_graph_runner,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ResourceProvider* resource_provider)
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : task_runner_(task_runner),
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      task_graph_runner_(task_graph_runner),
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      namespace_token_(task_graph_runner->GetNamespaceToken()),
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource_provider_(resource_provider),
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raster_finished_weak_ptr_factory_(this) {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return this;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client_ = client;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::Shutdown() {
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown");
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TaskGraph empty;
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks");
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (raster_pending_.none())
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Mark all task sets as pending.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  raster_pending_.set();
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned priority = kRasterTaskPriorityBase;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  graph_.Reset();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Cancel existing OnRasterFinished callbacks.
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t task_count[kNumberOfTaskSets] = {0};
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        task_runner_.get(),
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   raster_finished_weak_ptr_factory_.GetWeakPtr(),
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   task_set));
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != queue->items.end();
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const RasterTaskQueue::Item& item = *it;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RasterTask* task = item.task;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!task->HasCompleted());
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!item.task_sets[task_set])
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        continue;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ++task_count[task_set];
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      graph_.edges.push_back(
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    InsertNodeForTask(&graph_,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      new_raster_finished_tasks[task_set].get(),
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      kRasterFinishedTaskPriority,
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      task_count[task_set]);
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScheduleTasksOnOriginThread(this, &graph_);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::copy(new_raster_finished_tasks,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            new_raster_finished_tasks + kNumberOfTaskSets,
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            raster_finished_tasks_);
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT_ASYNC_STEP_INTO1(
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::CheckForCompletedTasks() {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks");
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  task_graph_runner_->CollectCompletedTasks(namespace_token_,
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            &completed_tasks_);
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (Task::Vector::const_iterator it = completed_tasks_.begin();
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != completed_tasks_.end();
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    task->WillComplete();
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    task->CompleteOnOriginThread(this);
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    task->DidComplete();
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    task->RunReplyOnOriginThread();
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  completed_tasks_.clear();
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster(
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const Resource* resource) {
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // RasterBuffer implementation depends on an image having been acquired for
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the resource.
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  resource_provider_->AcquireImage(resource->id());
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return make_scoped_ptr<RasterBuffer>(
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new RasterBufferImpl(resource_provider_, resource));
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::ReleaseBufferForRaster(
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<RasterBuffer> buffer) {
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT1(
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set);
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(raster_pending_[task_set]);
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  raster_pending_[task_set] = false;
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (raster_pending_.any()) {
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TRACE_EVENT_ASYNC_STEP_INTO1(
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client_->DidFinishRunningTasks(task_set);
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_refptr<base::debug::ConvertableToTraceFormat>
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciZeroCopyRasterWorkerPool::StateAsValue() const {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<base::debug::TracedValue> state =
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new base::debug::TracedValue();
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->BeginArray("tasks_pending");
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    state->AppendBoolean(raster_pending_[task_set]);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->EndArray();
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return state;
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace cc
234