Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 50668c01f8dc52cabaae57d9363e0e96e0a62ebc..ec0d2c104eac2b0702ce23c3f2ddb2c6fcb95abc 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -190,6 +190,7 @@ void TileManager::RegisterTile(Tile* tile) { |
DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
tiles_[tile->id()] = tile; |
+ used_layer_counts_[tile->layer_id()]++; |
prioritized_tiles_dirty_ = true; |
} |
@@ -198,6 +199,14 @@ void TileManager::UnregisterTile(Tile* tile) { |
DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
tiles_.erase(tile->id()); |
+ |
+ LayerCountMap::iterator layer_it = used_layer_counts_.find(tile->layer_id()); |
+ DCHECK_GT(layer_it->second, 0); |
+ if (--layer_it->second == 0) { |
+ used_layer_counts_.erase(layer_it); |
+ image_decode_tasks_.erase(tile->layer_id()); |
+ } |
+ |
prioritized_tiles_dirty_ = true; |
} |
@@ -369,7 +378,6 @@ void TileManager::ManageTiles() { |
TileVector tiles_that_need_to_be_rasterized; |
AssignGpuMemoryToTiles(GetPrioritizedTileSet(), |
&tiles_that_need_to_be_rasterized); |
- CleanUpUnusedImageDecodeTasks(); |
// Finally, schedule rasterizer tasks. |
ScheduleTasks(tiles_that_need_to_be_rasterized); |
@@ -620,33 +628,6 @@ void TileManager::AssignGpuMemoryToTiles( |
bytes_that_exceeded_memory_budget; |
} |
-void TileManager::CleanUpUnusedImageDecodeTasks() { |
- if (image_decode_tasks_.empty()) |
- return; |
- |
- // Calculate a set of layers that are used by at least one tile. |
- base::hash_set<int> used_layers; |
- for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) |
- used_layers.insert(it->second->layer_id()); |
- |
- // Now calculate the set of layers in |image_decode_tasks_| that are not used |
- // by any tile. |
- std::vector<int> unused_layers; |
- for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); |
- it != image_decode_tasks_.end(); |
- ++it) { |
- if (used_layers.find(it->first) == used_layers.end()) |
- unused_layers.push_back(it->first); |
- } |
- |
- // Erase unused layers from |image_decode_tasks_|. |
- for (std::vector<int>::iterator it = unused_layers.begin(); |
- it != unused_layers.end(); |
- ++it) { |
- image_decode_tasks_.erase(*it); |
- } |
-} |
- |
void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { |
ManagedTileState& mts = tile->managed_state(); |
if (mts.tile_versions[mode].resource_) { |