Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 4f9f0aed6545b1792c93111f34313194c1268288..08a1e22d7a6bbb139af41c5ec6cb5e9f984c44a0 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -477,12 +477,13 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { |
void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { |
TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
- // Update internal state. |
+ // Update internal state. We use the soft-limit for the resource-pool |
+ // such that we will reduce to that limit after going over. |
if (state != global_state_) { |
global_state_ = state; |
prioritized_tiles_dirty_ = true; |
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); |
} |
@@ -618,21 +619,30 @@ void TileManager::AssignGpuMemoryToTiles( |
all_tiles_required_for_activation_have_memory_ = true; |
// Cast to prevent overflow. |
- int64 bytes_available = |
+ int64 soft_bytes_available = |
vmpstr
2014/02/12 22:19:36
maybe visible_bytes_available and repaint_bytes_av
vmpstr
2014/02/12 22:20:20
s/repaint/prepaint/
epennerAtGoogle
2014/02/12 23:08:46
Arg! That's what I called it before! ;) I can cha
vmpstr
2014/02/12 23:21:04
Yeah, I see the problem. I guess soft/hard is OK,
|
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; |
+ int64 soft_bytes_left = soft_bytes_allocatable; |
+ int64 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 |
@@ -664,12 +674,15 @@ void TileManager::AssignGpuMemoryToTiles( |
continue; |
} |
- size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); |
- size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; |
+ 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 = |
+ (mts.bin == NOW_BIN) ? hard_bytes_left : soft_bytes_left; |
vmpstr
2014/02/12 22:19:36
So in SMOOTHNESS_TAKES_PRIORITY, we prioritize the
epennerAtGoogle
2014/02/12 23:08:46
I had to deal with this sticky case before when we
vmpstr
2014/02/12 23:21:04
I guess the exception is NEW_CONTENT_TAKES_PRIORIT
|
size_t tile_bytes = 0; |
size_t tile_resources = 0; |
+ |
reveman
2014/02/12 20:08:02
nit: no need for this line. I'm surprised the pres
epennerAtGoogle
2014/02/12 21:54:34
Sorry I didn't rerun git cl format. Done.
|
// It costs to maintain a resource. |
for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
if (mts.tile_versions[mode].resource_) { |
@@ -691,7 +704,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 |
@@ -700,10 +713,16 @@ void TileManager::AssignGpuMemoryToTiles( |
if (mts.visible_and_ready_to_draw) |
tile_version.set_rasterize_on_demand(); |
- oomed = true; |
- bytes_that_exceeded_memory_budget += tile_bytes; |
+ oomed_soft = true; |
+ if (mts.bin == NOW_BIN) { |
+ oomed_hard = true; |
+ bytes_that_exceeded_memory_budget += tile_bytes; |
+ } |
} else { |
- bytes_left -= tile_bytes; |
+ hard_bytes_left -= tile_bytes; |
+ soft_bytes_left -= tile_bytes; |
+ soft_bytes_left = std::max<int64>(0, soft_bytes_left); |
reveman
2014/02/12 20:08:02
does it hurt to let this go negative? in that case
epennerAtGoogle
2014/02/12 21:54:34
Do you mean make it unsigned and add a if-statemen
reveman
2014/02/12 22:14:52
I was thinking you'd keep this signed and just let
|
+ |
resources_left -= tile_resources; |
if (tile_version.resource_) |
@@ -720,7 +739,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; |
@@ -732,22 +751,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; |
} |