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