Index: cc/tile_manager.cc |
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
index 83c0ab2b235d2f557631804d14967b174ae1e1bb..37c126a6f545a6536378eaa2d20595763359c270 100644 |
--- a/cc/tile_manager.cc |
+++ b/cc/tile_manager.cc |
@@ -142,8 +142,9 @@ TileManager::~TileManager() { |
// resources. |
raster_worker_pool_.reset(); |
CheckForCompletedTileUploads(); |
- DCHECK(tiles_with_pending_set_pixels_.size() == 0); |
- DCHECK(tiles_.size() == 0); |
+ DCHECK_EQ(tiles_with_pending_set_pixels_.size(), 0); |
+ DCHECK_EQ(all_tiles_.size(), 0); |
+ DCHECK_EQ(live_tiles_.size(), 0); |
} |
void TileManager::SetGlobalState( |
@@ -154,7 +155,7 @@ void TileManager::SetGlobalState( |
} |
void TileManager::RegisterTile(Tile* tile) { |
- tiles_.push_back(tile); |
+ all_tiles_.push_back(tile); |
const ManagedTileState& mts = tile->managed_state(); |
for (int i = 0; i < NUM_TREES; ++i) |
@@ -178,13 +179,21 @@ void TileManager::UnregisterTile(Tile* tile) { |
break; |
} |
} |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); it++) { |
+ for (TileVector::iterator it = live_tiles_.begin(); |
+ it != live_tiles_.end(); it++) { |
reveman
2013/02/06 03:20:24
nit: test statement should be vertically aligned w
|
+ if (*it == tile) { |
+ live_tiles_.erase(it); |
+ break; |
+ } |
+ } |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); it++) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment wrong here too
|
if (*it == tile) { |
const ManagedTileState& mts = tile->managed_state(); |
for (int i = 0; i < NUM_TREES; ++i) |
--raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; |
FreeResourcesForTile(tile); |
- tiles_.erase(it); |
+ all_tiles_.erase(it); |
return; |
} |
} |
@@ -220,7 +229,7 @@ void TileManager::SortTiles() { |
TRACE_EVENT0("cc", "TileManager::SortTiles"); |
// Sort by bin, resolution and time until needed. |
- std::sort(tiles_.begin(), tiles_.end(), BinComparator()); |
+ std::sort(live_tiles_.begin(), live_tiles_.end(), BinComparator()); |
} |
void TileManager::ManageTiles() { |
@@ -229,10 +238,21 @@ void TileManager::ManageTiles() { |
++manage_tiles_call_count_; |
const TreePriority tree_priority = global_state_.tree_priority; |
- TRACE_COUNTER_ID1("cc", "TileCount", this, tiles_.size()); |
+ TRACE_COUNTER_ID1("cc", "AllTileCount", this, all_tiles_.size()); |
+ |
+ live_tiles_.clear(); |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
+ if ((*it)->priority( ACTIVE_TREE).is_live || |
+ (*it)->priority(PENDING_TREE).is_live) |
+ live_tiles_.push_back(*it); |
+ } |
+ |
+ TRACE_COUNTER_ID1("cc", "LiveTileCount", this, live_tiles_.size()); |
// For each tree, bin into different categories of tiles. |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
+ for (TileVector::iterator it = live_tiles_.begin(); |
+ it != live_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
Tile* tile = *it; |
ManagedTileState& mts = tile->managed_state(); |
@@ -290,7 +310,8 @@ void TileManager::ManageTiles() { |
bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; |
bin_map[NEVER_BIN] = NEVER_BIN; |
} |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
+ for (TileVector::iterator it = live_tiles_.begin(); |
+ it != live_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
Tile* tile = *it; |
ManagedTileState& mts = tile->managed_state(); |
for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) |
@@ -347,8 +368,8 @@ void TileManager::GetMemoryStats( |
*memoryRequiredBytes = 0; |
*memoryNiceToHaveBytes = 0; |
*memoryUsedBytes = 0; |
- for(size_t i = 0; i < tiles_.size(); i++) { |
- const Tile* tile = tiles_[i]; |
+ for(size_t i = 0; i < all_tiles_.size(); i++) { |
reveman
2013/02/06 03:20:24
nit: missing space before ( in for(
|
+ const Tile* tile = all_tiles_[i]; |
const ManagedTileState& mts = tile->managed_state(); |
size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
if (mts.gpu_memmgr_stats_bin == NOW_BIN) |
@@ -362,7 +383,8 @@ void TileManager::GetMemoryStats( |
scoped_ptr<base::Value> TileManager::AsValue() const { |
scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
- state->SetInteger("tile_count", tiles_.size()); |
+ state->SetInteger("all_tile_count", all_tiles_.size()); |
+ state->SetInteger("live_tile_count", live_tiles_.size()); |
state->Set("global_state", global_state_.AsValue().release()); |
@@ -425,7 +447,8 @@ void TileManager::AssignGpuMemoryToTiles() { |
TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
// Some memory cannot be released. Figure out which. |
size_t unreleasable_bytes = 0; |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
Tile* tile = *it; |
if (!tile->managed_state().can_be_freed) |
unreleasable_bytes += tile->bytes_consumed_if_allocated(); |
@@ -433,9 +456,7 @@ void TileManager::AssignGpuMemoryToTiles() { |
// Now give memory out to the tiles until we're out, and build |
// the needs-to-be-rasterized queue. |
- tiles_that_need_to_be_rasterized_.erase( |
- tiles_that_need_to_be_rasterized_.begin(), |
- tiles_that_need_to_be_rasterized_.end()); |
+ tiles_that_need_to_be_rasterized_.clear(); |
// Reset the image decoding list so that we don't mess up with tile |
// priorities. Tiles will be added to the image decoding list again |
@@ -447,16 +468,27 @@ void TileManager::AssignGpuMemoryToTiles() { |
// currently waiting for raster to idle state. |
// Call DidTileRasterStateChange() for each of these tiles to |
// have this state change take effect. |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
Tile* tile = *it; |
if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) |
DidTileRasterStateChange(tile, IDLE_STATE); |
} |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
+ Tile* tile = *it; |
+ ManagedTileState& managed_tile_state = tile->managed_state(); |
+ if (!managed_tile_state.can_be_freed) |
+ continue; |
+ managed_tile_state.can_use_gpu_memory = false; |
+ } |
+ |
size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_bytes; |
size_t bytes_that_exceeded_memory_budget = 0; |
size_t bytes_left = bytes_allocatable; |
- for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
+ for (TileVector::iterator it = live_tiles_.begin(); |
+ it != live_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
Tile* tile = *it; |
size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
ManagedTileState& managed_tile_state = tile->managed_state(); |
@@ -464,14 +496,10 @@ void TileManager::AssignGpuMemoryToTiles() { |
continue; |
if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
- managed_tile_state.can_use_gpu_memory = false; |
- FreeResourcesForTile(tile); |
continue; |
} |
if (tile_bytes > bytes_left) { |
- managed_tile_state.can_use_gpu_memory = false; |
bytes_that_exceeded_memory_budget += tile_bytes; |
- FreeResourcesForTile(tile); |
continue; |
} |
bytes_left -= tile_bytes; |
@@ -483,6 +511,17 @@ void TileManager::AssignGpuMemoryToTiles() { |
} |
} |
+ for (TileVector::iterator it = all_tiles_.begin(); |
+ it != all_tiles_.end(); ++it) { |
reveman
2013/02/06 03:20:24
nit: vertical alignment
|
+ Tile* tile = *it; |
+ ManagedTileState& managed_tile_state = tile->managed_state(); |
+ if (!managed_tile_state.can_be_freed) |
+ continue; |
+ if (!managed_tile_state.can_use_gpu_memory) |
+ FreeResourcesForTile(tile); |
+ } |
+ |
+ |
reveman
2013/02/06 03:20:24
nit: extra blank line
|
ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; |
if (ever_exceeded_memory_budget_) { |
TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |