Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index cd9adfaac1206a5b80d0f6ad18ae894beb086355..3cc53776de4f40467359e351711cc9b907782009 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -461,8 +461,10 @@ void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { |
if (state != global_state_) { |
global_state_ = state; |
prioritized_tiles_dirty_ = true; |
+ // Soft limit is used for resource pool such that |
+ // memory returns to soft limit after going over. |
resource_pool_->SetResourceUsageLimits( |
- global_state_.memory_limit_in_bytes, |
+ global_state_.soft_memory_limit_in_bytes, |
global_state_.unused_memory_limit_in_bytes, |
global_state_.num_resources_limit); |
} |
@@ -598,21 +600,30 @@ void TileManager::AssignGpuMemoryToTiles( |
all_tiles_required_for_activation_have_memory_ = true; |
// Cast to prevent overflow. |
- int64 bytes_available = |
+ int64 soft_bytes_available = |
static_cast<int64>(bytes_releasable_) + |
- static_cast<int64>(global_state_.memory_limit_in_bytes) - |
+ static_cast<int64>(global_state_.soft_memory_limit_in_bytes) - |
+ static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); |
+ int64 hard_bytes_available = |
+ static_cast<int64>(bytes_releasable_) + |
+ static_cast<int64>(global_state_.hard_memory_limit_in_bytes) - |
static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); |
int resources_available = resources_releasable_ + |
global_state_.num_resources_limit - |
resource_pool_->acquired_resource_count(); |
- |
- size_t bytes_allocatable = std::max(static_cast<int64>(0), bytes_available); |
+ size_t soft_bytes_allocatable = |
+ std::max(static_cast<int64>(0), soft_bytes_available); |
+ size_t hard_bytes_allocatable = |
+ std::max(static_cast<int64>(0), hard_bytes_available); |
size_t resources_allocatable = std::max(0, resources_available); |
size_t bytes_that_exceeded_memory_budget = 0; |
- size_t bytes_left = bytes_allocatable; |
+ size_t soft_bytes_left = soft_bytes_allocatable; |
+ size_t hard_bytes_left = hard_bytes_allocatable; |
+ |
size_t resources_left = resources_allocatable; |
- bool oomed = false; |
+ bool oomed_soft = false; |
+ bool oomed_hard = false; |
// Memory we assign to raster tasks now will be deducted from our memory |
// in future iterations if priorities change. By assigning at most half |
@@ -644,8 +655,11 @@ void TileManager::AssignGpuMemoryToTiles( |
continue; |
} |
- size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); |
- size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; |
+ const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; |
+ const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); |
+ const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; |
+ const size_t tile_bytes_left = |
+ (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; |
size_t tile_bytes = 0; |
size_t tile_resources = 0; |
@@ -671,7 +685,7 @@ void TileManager::AssignGpuMemoryToTiles( |
} |
// Tile is OOM. |
- if (tile_bytes > bytes_left || tile_resources > resources_left) { |
+ if (tile_bytes > tile_bytes_left || tile_resources > resources_left) { |
FreeResourcesForTile(tile); |
// This tile was already on screen and now its resources have been |
@@ -680,12 +694,16 @@ void TileManager::AssignGpuMemoryToTiles( |
if (mts.visible_and_ready_to_draw && use_rasterize_on_demand_) |
tile_version.set_rasterize_on_demand(); |
- oomed = true; |
- bytes_that_exceeded_memory_budget += tile_bytes; |
+ oomed_soft = true; |
+ if (tile_uses_hard_limit) { |
+ oomed_hard = true; |
+ bytes_that_exceeded_memory_budget += tile_bytes; |
+ } |
} else { |
- bytes_left -= tile_bytes; |
resources_left -= tile_resources; |
- |
+ hard_bytes_left -= tile_bytes; |
+ soft_bytes_left = |
+ (soft_bytes_left > tile_bytes) ? soft_bytes_left - tile_bytes : 0; |
if (tile_version.resource_) |
continue; |
} |
@@ -700,7 +718,7 @@ void TileManager::AssignGpuMemoryToTiles( |
// 1. Tile size should not impact raster priority. |
// 2. Tiles with existing raster task could otherwise incorrectly |
// be added as they are not affected by |bytes_allocatable|. |
- if (oomed || raster_bytes_if_rastered > max_raster_bytes) { |
+ if (oomed_soft || raster_bytes_if_rastered > max_raster_bytes) { |
all_tiles_that_need_to_be_rasterized_have_memory_ = false; |
if (tile->required_for_activation()) |
all_tiles_required_for_activation_have_memory_ = false; |
@@ -712,22 +730,23 @@ void TileManager::AssignGpuMemoryToTiles( |
tiles_that_need_to_be_rasterized->push_back(tile); |
} |
- ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; |
+ // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. |
+ ever_exceeded_memory_budget_ |= oomed_hard; |
if (ever_exceeded_memory_budget_) { |
TRACE_COUNTER_ID2("cc", |
"over_memory_budget", |
this, |
"budget", |
- global_state_.memory_limit_in_bytes, |
+ global_state_.hard_memory_limit_in_bytes, |
"over", |
bytes_that_exceeded_memory_budget); |
} |
memory_stats_from_last_assign_.total_budget_in_bytes = |
- global_state_.memory_limit_in_bytes; |
+ global_state_.hard_memory_limit_in_bytes; |
memory_stats_from_last_assign_.bytes_allocated = |
- bytes_allocatable - bytes_left; |
+ hard_bytes_allocatable - hard_bytes_left; |
memory_stats_from_last_assign_.bytes_unreleasable = |
- bytes_allocatable - bytes_releasable_; |
+ hard_bytes_allocatable - bytes_releasable_; |
memory_stats_from_last_assign_.bytes_over = bytes_that_exceeded_memory_budget; |
} |