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 | |
205 int& count = used_layer_counts_[tile->layer_id()]; | |
reveman
2013/09/05 00:29:27
I think it would be more efficient and a bit clean
tomhudson
2013/09/05 07:32:23
At first I didn't understand why, but your point i
| |
206 if (--count == 0) { | |
207 used_layer_counts_.erase(tile->layer_id()); | |
208 image_decode_tasks_.erase(tile->layer_id()); | |
209 } | |
210 | |
201 prioritized_tiles_dirty_ = true; | 211 prioritized_tiles_dirty_ = true; |
202 } | 212 } |
203 | 213 |
204 void TileManager::DidChangeTilePriority(Tile* tile) { | 214 void TileManager::DidChangeTilePriority(Tile* tile) { |
205 prioritized_tiles_dirty_ = true; | 215 prioritized_tiles_dirty_ = true; |
206 } | 216 } |
207 | 217 |
208 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 218 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
209 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 219 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
210 } | 220 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
362 tiles->InsertTile(tile, priority_bin); | 372 tiles->InsertTile(tile, priority_bin); |
363 } | 373 } |
364 } | 374 } |
365 | 375 |
366 void TileManager::ManageTiles() { | 376 void TileManager::ManageTiles() { |
367 TRACE_EVENT0("cc", "TileManager::ManageTiles"); | 377 TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
368 | 378 |
369 TileVector tiles_that_need_to_be_rasterized; | 379 TileVector tiles_that_need_to_be_rasterized; |
370 AssignGpuMemoryToTiles(GetPrioritizedTileSet(), | 380 AssignGpuMemoryToTiles(GetPrioritizedTileSet(), |
371 &tiles_that_need_to_be_rasterized); | 381 &tiles_that_need_to_be_rasterized); |
372 CleanUpUnusedImageDecodeTasks(); | |
373 | 382 |
374 // Finally, schedule rasterizer tasks. | 383 // Finally, schedule rasterizer tasks. |
375 ScheduleTasks(tiles_that_need_to_be_rasterized); | 384 ScheduleTasks(tiles_that_need_to_be_rasterized); |
376 | 385 |
377 TRACE_EVENT_INSTANT1( | 386 TRACE_EVENT_INSTANT1( |
378 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, | 387 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, |
379 "state", TracedValue::FromValue(BasicStateAsValue().release())); | 388 "state", TracedValue::FromValue(BasicStateAsValue().release())); |
380 | 389 |
381 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, | 390 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
382 resource_pool_->total_memory_usage_bytes() - | 391 resource_pool_->total_memory_usage_bytes() - |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
613 memory_stats_from_last_assign_.total_budget_in_bytes = | 622 memory_stats_from_last_assign_.total_budget_in_bytes = |
614 global_state_.memory_limit_in_bytes; | 623 global_state_.memory_limit_in_bytes; |
615 memory_stats_from_last_assign_.bytes_allocated = | 624 memory_stats_from_last_assign_.bytes_allocated = |
616 bytes_allocatable - bytes_left; | 625 bytes_allocatable - bytes_left; |
617 memory_stats_from_last_assign_.bytes_unreleasable = | 626 memory_stats_from_last_assign_.bytes_unreleasable = |
618 bytes_allocatable - bytes_releasable_; | 627 bytes_allocatable - bytes_releasable_; |
619 memory_stats_from_last_assign_.bytes_over = | 628 memory_stats_from_last_assign_.bytes_over = |
620 bytes_that_exceeded_memory_budget; | 629 bytes_that_exceeded_memory_budget; |
621 } | 630 } |
622 | 631 |
623 void TileManager::CleanUpUnusedImageDecodeTasks() { | |
624 if (image_decode_tasks_.empty()) | |
625 return; | |
626 | |
627 // Calculate a set of layers that are used by at least one tile. | |
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; | |
635 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); | |
636 it != image_decode_tasks_.end(); | |
637 ++it) { | |
638 if (used_layers.find(it->first) == used_layers.end()) | |
639 unused_layers.push_back(it->first); | |
640 } | |
641 | |
642 // Erase unused layers from |image_decode_tasks_|. | |
643 for (std::vector<int>::iterator it = unused_layers.begin(); | |
644 it != unused_layers.end(); | |
645 ++it) { | |
646 image_decode_tasks_.erase(*it); | |
647 } | |
648 } | |
649 | |
650 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { | 632 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { |
651 ManagedTileState& mts = tile->managed_state(); | 633 ManagedTileState& mts = tile->managed_state(); |
652 if (mts.tile_versions[mode].resource_) { | 634 if (mts.tile_versions[mode].resource_) { |
653 resource_pool_->ReleaseResource( | 635 resource_pool_->ReleaseResource( |
654 mts.tile_versions[mode].resource_.Pass()); | 636 mts.tile_versions[mode].resource_.Pass()); |
655 | 637 |
656 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); | 638 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); |
657 DCHECK_GE(resources_releasable_, 1u); | 639 DCHECK_GE(resources_releasable_, 1u); |
658 | 640 |
659 bytes_releasable_ -= tile->bytes_consumed_if_allocated(); | 641 bytes_releasable_ -= tile->bytes_consumed_if_allocated(); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
846 bytes_releasable_ += tile->bytes_consumed_if_allocated(); | 828 bytes_releasable_ += tile->bytes_consumed_if_allocated(); |
847 ++resources_releasable_; | 829 ++resources_releasable_; |
848 } | 830 } |
849 | 831 |
850 FreeUnusedResourcesForTile(tile); | 832 FreeUnusedResourcesForTile(tile); |
851 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 833 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
852 did_initialize_visible_tile_ = true; | 834 did_initialize_visible_tile_ = true; |
853 } | 835 } |
854 | 836 |
855 } // namespace cc | 837 } // namespace cc |
OLD | NEW |