Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/tile_manager.h" | 5 #include "cc/resources/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 global_state_.memory_limit_in_bytes, | 183 global_state_.memory_limit_in_bytes, |
| 184 global_state_.unused_memory_limit_in_bytes, | 184 global_state_.unused_memory_limit_in_bytes, |
| 185 global_state_.num_resources_limit); | 185 global_state_.num_resources_limit); |
| 186 } | 186 } |
| 187 | 187 |
| 188 void TileManager::RegisterTile(Tile* tile) { | 188 void TileManager::RegisterTile(Tile* tile) { |
| 189 DCHECK(!tile->required_for_activation()); | 189 DCHECK(!tile->required_for_activation()); |
| 190 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 190 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
| 191 | 191 |
| 192 tiles_[tile->id()] = tile; | 192 tiles_[tile->id()] = tile; |
| 193 used_layer_counts_[tile->layer_id()]++; | |
| 193 prioritized_tiles_dirty_ = true; | 194 prioritized_tiles_dirty_ = true; |
| 194 } | 195 } |
| 195 | 196 |
| 196 void TileManager::UnregisterTile(Tile* tile) { | 197 void TileManager::UnregisterTile(Tile* tile) { |
| 197 FreeResourcesForTile(tile); | 198 FreeResourcesForTile(tile); |
| 198 | 199 |
| 199 DCHECK(tiles_.find(tile->id()) != tiles_.end()); | 200 DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
| 200 tiles_.erase(tile->id()); | 201 tiles_.erase(tile->id()); |
| 202 | |
| 203 DCHECK_GT(used_layer_counts_[tile->layer_id()], 0); | |
| 204 used_layer_counts_[tile->layer_id()]--; | |
| 205 | |
| 201 prioritized_tiles_dirty_ = true; | 206 prioritized_tiles_dirty_ = true; |
| 202 } | 207 } |
| 203 | 208 |
| 204 void TileManager::DidChangeTilePriority(Tile* tile) { | 209 void TileManager::DidChangeTilePriority(Tile* tile) { |
| 205 prioritized_tiles_dirty_ = true; | 210 prioritized_tiles_dirty_ = true; |
| 206 } | 211 } |
| 207 | 212 |
| 208 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 213 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
| 209 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 214 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
| 210 } | 215 } |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 617 memory_stats_from_last_assign_.bytes_unreleasable = | 622 memory_stats_from_last_assign_.bytes_unreleasable = |
| 618 bytes_allocatable - bytes_releasable_; | 623 bytes_allocatable - bytes_releasable_; |
| 619 memory_stats_from_last_assign_.bytes_over = | 624 memory_stats_from_last_assign_.bytes_over = |
| 620 bytes_that_exceeded_memory_budget; | 625 bytes_that_exceeded_memory_budget; |
| 621 } | 626 } |
| 622 | 627 |
| 623 void TileManager::CleanUpUnusedImageDecodeTasks() { | 628 void TileManager::CleanUpUnusedImageDecodeTasks() { |
| 624 if (image_decode_tasks_.empty()) | 629 if (image_decode_tasks_.empty()) |
| 625 return; | 630 return; |
| 626 | 631 |
| 627 // Calculate a set of layers that are used by at least one tile. | 632 // Unused layers are layers whose use count is zero. |
| 628 base::hash_set<int> used_layers; | |
| 629 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) | |
| 630 used_layers.insert(it->second->layer_id()); | |
| 631 | |
| 632 // Now calculate the set of layers in |image_decode_tasks_| that are not used | |
| 633 // by any tile. | |
| 634 std::vector<int> unused_layers; | 633 std::vector<int> unused_layers; |
| 635 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); | 634 for (LayerCountMap::iterator it = used_layer_counts_.begin(); |
| 636 it != image_decode_tasks_.end(); | 635 it != used_layer_counts_.end(); |
| 637 ++it) { | 636 ++it) { |
| 638 if (used_layers.find(it->first) == used_layers.end()) | 637 if (it->second == 0) |
| 639 unused_layers.push_back(it->first); | 638 unused_layers.push_back(it->first); |
| 640 } | 639 } |
| 641 | 640 |
| 642 // Erase unused layers from |image_decode_tasks_|. | 641 // Erase unused layers from |image_decode_tasks_| and from |
| 642 // |used_layer_counts_|. | |
| 643 for (std::vector<int>::iterator it = unused_layers.begin(); | 643 for (std::vector<int>::iterator it = unused_layers.begin(); |
| 644 it != unused_layers.end(); | 644 it != unused_layers.end(); |
| 645 ++it) { | 645 ++it) { |
| 646 image_decode_tasks_.erase(*it); | 646 image_decode_tasks_.erase(*it); |
| 647 used_layer_counts_.erase(*it); | |
|
reveman
2013/09/04 21:25:17
can we move these two lines to UnregisterTile and
vmpstr
2013/09/04 22:03:49
Good idea. Done.
| |
| 647 } | 648 } |
| 648 } | 649 } |
| 649 | 650 |
| 650 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { | 651 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { |
| 651 ManagedTileState& mts = tile->managed_state(); | 652 ManagedTileState& mts = tile->managed_state(); |
| 652 if (mts.tile_versions[mode].resource_) { | 653 if (mts.tile_versions[mode].resource_) { |
| 653 resource_pool_->ReleaseResource( | 654 resource_pool_->ReleaseResource( |
| 654 mts.tile_versions[mode].resource_.Pass()); | 655 mts.tile_versions[mode].resource_.Pass()); |
| 655 | 656 |
| 656 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); | 657 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 735 ManagedTileState& mts = tile->managed_state(); | 736 ManagedTileState& mts = tile->managed_state(); |
| 736 | 737 |
| 737 scoped_ptr<ResourcePool::Resource> resource = | 738 scoped_ptr<ResourcePool::Resource> resource = |
| 738 resource_pool_->AcquireResource( | 739 resource_pool_->AcquireResource( |
| 739 tile->tile_size_.size(), | 740 tile->tile_size_.size(), |
| 740 raster_worker_pool_->GetResourceFormat()); | 741 raster_worker_pool_->GetResourceFormat()); |
| 741 const Resource* const_resource = resource.get(); | 742 const Resource* const_resource = resource.get(); |
| 742 | 743 |
| 743 // Create and queue all image decode tasks that this tile depends on. | 744 // Create and queue all image decode tasks that this tile depends on. |
| 744 RasterWorkerPool::Task::Set decode_tasks; | 745 RasterWorkerPool::Task::Set decode_tasks; |
| 745 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; | 746 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; |
|
vmpstr
2013/09/04 19:36:40
This is the line that prevents the early out from
| |
| 746 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), | 747 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), |
| 747 tile->contents_scale(), | 748 tile->contents_scale(), |
| 748 tile->picture_pile()); | 749 tile->picture_pile()); |
| 749 iter; ++iter) { | 750 iter; ++iter) { |
| 750 skia::LazyPixelRef* pixel_ref = *iter; | 751 skia::LazyPixelRef* pixel_ref = *iter; |
| 751 uint32_t id = pixel_ref->getGenerationID(); | 752 uint32_t id = pixel_ref->getGenerationID(); |
| 752 | 753 |
| 753 // Append existing image decode task if available. | 754 // Append existing image decode task if available. |
| 754 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); | 755 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); |
| 755 if (decode_task_it != existing_pixel_refs.end()) { | 756 if (decode_task_it != existing_pixel_refs.end()) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 bytes_releasable_ += tile->bytes_consumed_if_allocated(); | 847 bytes_releasable_ += tile->bytes_consumed_if_allocated(); |
| 847 ++resources_releasable_; | 848 ++resources_releasable_; |
| 848 } | 849 } |
| 849 | 850 |
| 850 FreeUnusedResourcesForTile(tile); | 851 FreeUnusedResourcesForTile(tile); |
| 851 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 852 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 852 did_initialize_visible_tile_ = true; | 853 did_initialize_visible_tile_ = true; |
| 853 } | 854 } |
| 854 | 855 |
| 855 } // namespace cc | 856 } // namespace cc |
| OLD | NEW |