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