Index: cc/tiles/tile_manager.cc |
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc |
index f7c3a3b8f69a1834de6610fa3cb42f493fe804ac..7e214697f509df2310b20d847d0fdd8aa59c1cc0 100644 |
--- a/cc/tiles/tile_manager.cc |
+++ b/cc/tiles/tile_manager.cc |
@@ -361,9 +361,9 @@ void TileManager::FinishTasksAndCleanUp() { |
signals_check_notifier_.Cancel(); |
task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
- for (auto& draw_image_pair : locked_images_) |
- image_decode_controller_->UnrefImage(draw_image_pair.first); |
+ image_manager_.UnrefImages(locked_images_); |
locked_images_.clear(); |
+ locked_image_tasks_.clear(); |
} |
void TileManager::SetResources(ResourcePool* resource_pool, |
@@ -378,7 +378,7 @@ void TileManager::SetResources(ResourcePool* resource_pool, |
use_gpu_rasterization_ = use_gpu_rasterization; |
scheduled_raster_task_limit_ = scheduled_raster_task_limit; |
resource_pool_ = resource_pool; |
- image_decode_controller_ = image_decode_controller; |
+ image_manager_.SetImageDecodeController(image_decode_controller); |
tile_task_manager_ = tile_task_manager; |
raster_buffer_provider_ = raster_buffer_provider; |
} |
@@ -836,7 +836,8 @@ void TileManager::ScheduleTasks( |
const std::vector<PrioritizedTile>& tiles_to_process_for_images = |
work_to_schedule.tiles_to_process_for_images; |
- std::vector<std::pair<DrawImage, scoped_refptr<TileTask>>> new_locked_images; |
+ std::vector<DrawImage> new_locked_images; |
+ std::vector<scoped_refptr<TileTask>> new_locked_image_tasks; |
for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { |
Tile* tile = prioritized_tile.tile(); |
@@ -845,45 +846,36 @@ void TileManager::ScheduleTasks( |
tile->enclosing_layer_rect(), tile->contents_scale(), &images); |
ImageDecodeController::TracingInfo tracing_info( |
prepare_tiles_count_, prioritized_tile.priority().priority_bin); |
- for (DrawImage& draw_image : images) { |
- scoped_refptr<TileTask> task; |
- bool need_to_unref_when_finished = |
- image_decode_controller_->GetTaskForImageAndRef(draw_image, |
- tracing_info, &task); |
- // We only care about images that need to be locked (ie they need to be |
- // unreffed later). |
- if (!need_to_unref_when_finished) |
- continue; |
- new_locked_images.emplace_back(draw_image, task); |
- |
- // If there's no actual task associated with this image, then we're done. |
- if (!task) |
- continue; |
+ image_manager_.GetTasksForImagesAndRef(&images, &new_locked_image_tasks, |
+ tracing_info); |
+ new_locked_images.insert(new_locked_images.end(), images.begin(), |
+ images.end()); |
+ } |
- auto decode_it = std::find_if(graph_.nodes.begin(), graph_.nodes.end(), |
- [&task](const TaskGraph::Node& node) { |
- return node.task == task.get(); |
- }); |
- // If this task is already in the graph, then we don't have to insert it. |
- if (decode_it != graph_.nodes.end()) |
- continue; |
+ for (auto& task : new_locked_image_tasks) { |
+ auto decode_it = std::find_if(graph_.nodes.begin(), graph_.nodes.end(), |
+ [&task](const TaskGraph::Node& node) { |
+ return node.task == task.get(); |
+ }); |
+ // If this task is already in the graph, then we don't have to insert it. |
+ if (decode_it != graph_.nodes.end()) |
+ continue; |
- InsertNodeForDecodeTask(&graph_, task.get(), false, priority++); |
- all_count++; |
- graph_.edges.push_back(TaskGraph::Edge(task.get(), all_done_task.get())); |
- } |
+ InsertNodeForDecodeTask(&graph_, task.get(), false, priority++); |
+ all_count++; |
+ graph_.edges.push_back(TaskGraph::Edge(task.get(), all_done_task.get())); |
} |
- for (auto& draw_image_pair : locked_images_) |
- image_decode_controller_->UnrefImage(draw_image_pair.first); |
+ image_manager_.UnrefImages(locked_images_); |
// The old locked images have to stay around until past the ScheduleTasks call |
// below, so we do a swap instead of a move. |
locked_images_.swap(new_locked_images); |
+ locked_image_tasks_.swap(new_locked_image_tasks); |
// We must reduce the amount of unused resources before calling |
// ScheduleTasks to prevent usage from rising above limits. |
resource_pool_->ReduceResourceUsage(); |
- image_decode_controller_->ReduceCacheUsage(); |
+ image_manager_.ReduceMemoryUsage(); |
// Insert nodes for our task completion tasks. We enqueue these using |
// NONCONCURRENT_FOREGROUND category this is the highest prioirty category and |
@@ -963,21 +955,12 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( |
// We can skip the image hijack canvas if we have no images. |
playback_settings.use_image_hijack_canvas = !images.empty(); |
+ |
+ // Get the tasks for the required images. |
ImageDecodeController::TracingInfo tracing_info( |
prepare_tiles_count_, prioritized_tile.priority().priority_bin); |
- for (auto it = images.begin(); it != images.end();) { |
- scoped_refptr<TileTask> task; |
- bool need_to_unref_when_finished = |
- image_decode_controller_->GetTaskForImageAndRef(*it, tracing_info, |
- &task); |
- if (task) |
- decode_tasks.push_back(task); |
- |
- if (need_to_unref_when_finished) |
- ++it; |
- else |
- it = images.erase(it); |
- } |
+ image_manager_.GetTasksForImagesAndRef(&images, &decode_tasks, tracing_info); |
+ |
bool supports_concurrent_execution = !use_gpu_rasterization_; |
std::unique_ptr<RasterBuffer> raster_buffer = |
raster_buffer_provider_->AcquireBufferForRaster( |
@@ -1006,8 +989,7 @@ void TileManager::OnRasterTaskCompleted( |
// Unref all the images. |
auto images_it = scheduled_draw_images_.find(tile->id()); |
const std::vector<DrawImage>& images = images_it->second; |
- for (const auto& image : images) |
- image_decode_controller_->UnrefImage(image); |
+ image_manager_.UnrefImages(images); |
scheduled_draw_images_.erase(images_it); |
if (was_canceled) { |
@@ -1157,15 +1139,15 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
// If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all |
// images since we're technically going idle here at least for this frame. |
if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) { |
- for (auto& draw_image_pair : locked_images_) |
- image_decode_controller_->UnrefImage(draw_image_pair.first); |
+ image_manager_.UnrefImages(locked_images_); |
locked_images_.clear(); |
+ locked_image_tasks_.clear(); |
} |
FreeResourcesForReleasedTiles(); |
resource_pool_->ReduceResourceUsage(); |
- image_decode_controller_->ReduceCacheUsage(); |
+ image_manager_.ReduceMemoryUsage(); |
signals_.all_tile_tasks_completed = true; |
signals_check_notifier_.Schedule(); |