Chromium Code Reviews| 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; |