Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 81ae8b5c9ee656486454580dacd4e726a8c1a9c7..f0c8895a70f3141f790ff224864a58289df83bf1 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -240,7 +240,6 @@ TileManager::TileManager( |
task_runner_.get(), |
base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
base::Unretained(this))), |
- eviction_priority_queue_is_up_to_date_(false), |
did_notify_ready_to_activate_(false), |
did_notify_ready_to_draw_(false) { |
tile_task_runner_->SetClient(this); |
@@ -374,15 +373,12 @@ void TileManager::PrepareTiles( |
did_notify_ready_to_draw_ = false; |
} else { |
if (global_state_.hard_memory_limit_in_bytes == 0) { |
- // TODO(vmpstr): Add a function to unconditionally create an eviction |
- // queue and guard the rest of the calls sites with this flag, instead of |
- // clearing here and building, which is a bit awkward. |
- eviction_priority_queue_is_up_to_date_ = false; |
resource_pool_->CheckBusyResources(false); |
MemoryUsage memory_limit(0, 0); |
MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
resource_pool_->acquired_resource_count()); |
FreeTileResourcesUntilUsageIsWithinLimit(memory_limit, &memory_usage); |
+ eviction_priority_queue_.reset(); |
} |
did_notify_ready_to_activate_ = false; |
@@ -493,17 +489,12 @@ void TileManager::BasicStateAsValueInto(base::debug::TracedValue* state) const { |
} |
void TileManager::RebuildEvictionQueueIfNeeded() { |
- TRACE_EVENT1("cc", |
- "TileManager::RebuildEvictionQueueIfNeeded", |
- "eviction_priority_queue_is_up_to_date", |
- eviction_priority_queue_is_up_to_date_); |
- if (eviction_priority_queue_is_up_to_date_) |
+ TRACE_EVENT0("cc", "TileManager::RebuildEvictionQueueIfNeeded"); |
+ if (eviction_priority_queue_) |
return; |
- eviction_priority_queue_.Reset(); |
- client_->BuildEvictionQueue(&eviction_priority_queue_, |
- global_state_.tree_priority); |
- eviction_priority_queue_is_up_to_date_ = true; |
+ eviction_priority_queue_ = |
+ client_->BuildEvictionQueue(global_state_.tree_priority); |
} |
bool TileManager::FreeTileResourcesUntilUsageIsWithinLimit( |
@@ -511,13 +502,13 @@ bool TileManager::FreeTileResourcesUntilUsageIsWithinLimit( |
MemoryUsage* usage) { |
while (usage->Exceeds(limit)) { |
RebuildEvictionQueueIfNeeded(); |
- if (eviction_priority_queue_.IsEmpty()) |
+ if (eviction_priority_queue_->IsEmpty()) |
return false; |
- Tile* tile = eviction_priority_queue_.Top(); |
+ Tile* tile = eviction_priority_queue_->Top(); |
*usage -= MemoryUsage::FromTile(tile); |
FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); |
- eviction_priority_queue_.Pop(); |
+ eviction_priority_queue_->Pop(); |
} |
return true; |
} |
@@ -528,16 +519,16 @@ bool TileManager::FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
MemoryUsage* usage) { |
while (usage->Exceeds(limit)) { |
RebuildEvictionQueueIfNeeded(); |
- if (eviction_priority_queue_.IsEmpty()) |
+ if (eviction_priority_queue_->IsEmpty()) |
return false; |
- Tile* tile = eviction_priority_queue_.Top(); |
+ Tile* tile = eviction_priority_queue_->Top(); |
if (!other_priority.IsHigherPriorityThan(tile->combined_priority())) |
return false; |
*usage -= MemoryUsage::FromTile(tile); |
FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); |
- eviction_priority_queue_.Pop(); |
+ eviction_priority_queue_->Pop(); |
} |
return true; |
} |
@@ -584,7 +575,7 @@ void TileManager::AssignGpuMemoryToTiles( |
MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
resource_pool_->acquired_resource_count()); |
- eviction_priority_queue_is_up_to_date_ = false; |
+ DCHECK(!eviction_priority_queue_); |
for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { |
Tile* tile = raster_priority_queue->Top(); |
TilePriority priority = tile->combined_priority(); |
@@ -649,6 +640,8 @@ void TileManager::AssignGpuMemoryToTiles( |
// as possible to stay within the memory limit. |
FreeTileResourcesUntilUsageIsWithinLimit(hard_memory_limit, &memory_usage); |
+ eviction_priority_queue_.reset(); |
danakj
2015/01/22 23:12:23
Can you explain this? There's a DCHECK above that
vmpstr
2015/01/22 23:45:03
Since creating an eviction queue might be expensiv
|
+ |
UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
!had_enough_memory_to_schedule_tiles_needed_now); |
did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; |