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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 const GlobalStateThatImpactsTilePriority& global_state) { | 147 const GlobalStateThatImpactsTilePriority& global_state) { |
| 148 global_state_ = global_state; | 148 global_state_ = global_state; |
| 149 resource_pool_->SetMaxMemoryUsageBytes( | 149 resource_pool_->SetMaxMemoryUsageBytes( |
| 150 global_state_.memory_limit_in_bytes, | 150 global_state_.memory_limit_in_bytes, |
| 151 global_state_.unused_memory_limit_in_bytes); | 151 global_state_.unused_memory_limit_in_bytes); |
| 152 } | 152 } |
| 153 | 153 |
| 154 void TileManager::RegisterTile(Tile* tile) { | 154 void TileManager::RegisterTile(Tile* tile) { |
| 155 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); | 155 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); |
| 156 DCHECK(!tile->required_for_activation()); | 156 DCHECK(!tile->required_for_activation()); |
| 157 DCHECK(managed_tile_map_.find(tile->id()) == managed_tile_map_.end()); | |
| 158 | |
| 157 tiles_.push_back(tile); | 159 tiles_.push_back(tile); |
| 160 managed_tile_map_[tile->id()] = tile; | |
| 158 } | 161 } |
| 159 | 162 |
| 160 void TileManager::UnregisterTile(Tile* tile) { | 163 void TileManager::UnregisterTile(Tile* tile) { |
| 161 TileVector::iterator raster_iter = | 164 TileVector::iterator raster_iter = |
| 162 std::find(tiles_that_need_to_be_rasterized_.begin(), | 165 std::find(tiles_that_need_to_be_rasterized_.begin(), |
| 163 tiles_that_need_to_be_rasterized_.end(), | 166 tiles_that_need_to_be_rasterized_.end(), |
| 164 tile); | 167 tile); |
| 165 if (raster_iter != tiles_that_need_to_be_rasterized_.end()) | 168 if (raster_iter != tiles_that_need_to_be_rasterized_.end()) |
| 166 tiles_that_need_to_be_rasterized_.erase(raster_iter); | 169 tiles_that_need_to_be_rasterized_.erase(raster_iter); |
| 167 | 170 |
| 168 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 171 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 169 | 172 |
| 170 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); | 173 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); |
| 171 FreeResourcesForTile(tile); | 174 FreeResourcesForTile(tile); |
| 172 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); | 175 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); |
| 176 | |
| 177 ManagedTileMap::iterator managed_iter = managed_tile_map_.find(tile->id()); | |
| 178 DCHECK(managed_iter != managed_tile_map_.end()); | |
| 179 managed_tile_map_.erase(managed_iter); | |
| 173 } | 180 } |
| 174 | 181 |
| 175 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 182 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
| 176 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 183 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
| 177 } | 184 } |
| 178 | 185 |
| 179 class BinComparator { | 186 class BinComparator { |
| 180 public: | 187 public: |
| 181 bool operator() (const Tile* a, const Tile* b) const { | 188 bool operator() (const Tile* a, const Tile* b) const { |
| 182 const ManagedTileState& ams = a->managed_state(); | 189 const ManagedTileState& ams = a->managed_state(); |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 729 return RasterWorkerPool::CreateRasterTask( | 736 return RasterWorkerPool::CreateRasterTask( |
| 730 const_resource, | 737 const_resource, |
| 731 tile->picture_pile(), | 738 tile->picture_pile(), |
| 732 tile->content_rect(), | 739 tile->content_rect(), |
| 733 tile->contents_scale(), | 740 tile->contents_scale(), |
| 734 mts.raster_mode, | 741 mts.raster_mode, |
| 735 metadata, | 742 metadata, |
| 736 rendering_stats_instrumentation_, | 743 rendering_stats_instrumentation_, |
| 737 base::Bind(&TileManager::OnRasterTaskCompleted, | 744 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 738 base::Unretained(this), | 745 base::Unretained(this), |
| 739 make_scoped_refptr(tile), | 746 tile->id(), |
| 740 base::Passed(&resource), | 747 base::Passed(&resource), |
| 741 mts.raster_mode), | 748 mts.raster_mode), |
| 742 &decode_tasks); | 749 &decode_tasks); |
| 743 } | 750 } |
| 744 | 751 |
| 745 void TileManager::OnImageDecodeTaskCompleted( | 752 void TileManager::OnImageDecodeTaskCompleted( |
| 746 int layer_id, | 753 int layer_id, |
| 747 skia::LazyPixelRef* pixel_ref, | 754 skia::LazyPixelRef* pixel_ref, |
| 748 bool was_canceled) { | 755 bool was_canceled) { |
| 749 // If the task was canceled, we need to clean it up | 756 // If the task was canceled, we need to clean it up |
| 750 // from |image_decode_tasks_|. | 757 // from |image_decode_tasks_|. |
| 751 if (!was_canceled) | 758 if (!was_canceled) |
| 752 return; | 759 return; |
| 753 | 760 |
| 754 LayerPixelRefTaskMap::iterator layer_it = | 761 LayerPixelRefTaskMap::iterator layer_it = |
| 755 image_decode_tasks_.find(layer_id); | 762 image_decode_tasks_.find(layer_id); |
| 756 | 763 |
| 757 if (layer_it == image_decode_tasks_.end()) | 764 if (layer_it == image_decode_tasks_.end()) |
| 758 return; | 765 return; |
| 759 | 766 |
| 760 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 767 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
| 761 PixelRefTaskMap::iterator task_it = | 768 PixelRefTaskMap::iterator task_it = |
| 762 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 769 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
| 763 | 770 |
| 764 if (task_it != pixel_ref_tasks.end()) | 771 if (task_it != pixel_ref_tasks.end()) |
| 765 pixel_ref_tasks.erase(task_it); | 772 pixel_ref_tasks.erase(task_it); |
| 766 } | 773 } |
| 767 | 774 |
| 768 void TileManager::OnRasterTaskCompleted( | 775 void TileManager::OnRasterTaskCompleted( |
| 769 scoped_refptr<Tile> tile, | 776 ManagedTileId managed_id, |
|
reveman
2013/07/03 00:32:47
Lets use the same type name for the Id everywhere.
| |
| 770 scoped_ptr<ResourcePool::Resource> resource, | 777 scoped_ptr<ResourcePool::Resource> resource, |
| 771 RasterMode raster_mode, | 778 RasterMode raster_mode, |
| 772 const PicturePileImpl::Analysis& analysis, | 779 const PicturePileImpl::Analysis& analysis, |
| 773 bool was_canceled) { | 780 bool was_canceled) { |
| 774 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", | 781 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| 775 "was_canceled", was_canceled); | 782 "was_canceled", was_canceled); |
| 776 | 783 |
| 784 ManagedTileMap::iterator managed_iter = managed_tile_map_.find(managed_id); | |
| 785 if (managed_iter == managed_tile_map_.end()) { | |
| 786 resource_pool_->ReleaseResource(resource.Pass()); | |
| 787 return; | |
| 788 } | |
| 789 | |
| 790 Tile* tile = managed_iter->second; | |
| 777 ManagedTileState& mts = tile->managed_state(); | 791 ManagedTileState& mts = tile->managed_state(); |
| 778 ManagedTileState::TileVersion& tile_version = | 792 ManagedTileState::TileVersion& tile_version = |
| 779 mts.tile_versions[raster_mode]; | 793 mts.tile_versions[raster_mode]; |
| 780 DCHECK(!tile_version.raster_task_.is_null()); | 794 DCHECK(!tile_version.raster_task_.is_null()); |
| 781 tile_version.raster_task_.Reset(); | 795 tile_version.raster_task_.Reset(); |
| 782 | 796 |
| 783 if (was_canceled) { | 797 if (was_canceled) { |
| 784 resource_pool_->ReleaseResource(resource.Pass()); | 798 resource_pool_->ReleaseResource(resource.Pass()); |
| 785 return; | 799 return; |
| 786 } | 800 } |
| 787 | 801 |
| 788 tile_version.set_has_text(analysis.has_text); | 802 tile_version.set_has_text(analysis.has_text); |
| 789 if (analysis.is_solid_color) { | 803 if (analysis.is_solid_color) { |
| 790 tile_version.set_solid_color(analysis.solid_color); | 804 tile_version.set_solid_color(analysis.solid_color); |
| 791 resource_pool_->ReleaseResource(resource.Pass()); | 805 resource_pool_->ReleaseResource(resource.Pass()); |
| 792 } else { | 806 } else { |
| 793 tile_version.resource_ = resource.Pass(); | 807 tile_version.resource_ = resource.Pass(); |
| 794 } | 808 } |
| 795 | 809 |
| 796 FreeUnusedResourcesForTile(tile.get()); | 810 FreeUnusedResourcesForTile(tile); |
| 797 | 811 |
| 798 DidFinishTileInitialization(tile.get()); | 812 DidFinishTileInitialization(tile); |
| 799 } | 813 } |
| 800 | 814 |
| 801 void TileManager::DidFinishTileInitialization(Tile* tile) { | 815 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 802 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 816 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 803 did_initialize_visible_tile_ = true; | 817 did_initialize_visible_tile_ = true; |
| 804 if (tile->required_for_activation()) { | 818 if (tile->required_for_activation()) { |
| 805 // It's possible that a tile required for activation is not in this list | 819 // It's possible that a tile required for activation is not in this list |
| 806 // if it was marked as being required after being dispatched for | 820 // if it was marked as being required after being dispatched for |
| 807 // rasterization but before AssignGPUMemory was called again. | 821 // rasterization but before AssignGPUMemory was called again. |
| 808 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 822 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 809 | 823 |
| 810 if (AreTilesRequiredForActivationReady()) | 824 if (AreTilesRequiredForActivationReady()) |
| 811 client_->NotifyReadyToActivate(); | 825 client_->NotifyReadyToActivate(); |
| 812 } | 826 } |
| 813 } | 827 } |
| 814 | 828 |
| 815 void TileManager::DidTileTreeBinChange(Tile* tile, | 829 void TileManager::DidTileTreeBinChange(Tile* tile, |
| 816 TileManagerBin new_tree_bin, | 830 TileManagerBin new_tree_bin, |
| 817 WhichTree tree) { | 831 WhichTree tree) { |
| 818 ManagedTileState& mts = tile->managed_state(); | 832 ManagedTileState& mts = tile->managed_state(); |
| 819 mts.tree_bin[tree] = new_tree_bin; | 833 mts.tree_bin[tree] = new_tree_bin; |
| 820 } | 834 } |
| 821 | 835 |
| 822 } // namespace cc | 836 } // namespace cc |
| OLD | NEW |