Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4702)

Unified Diff: cc/resources/tile_manager.cc

Issue 15715031: cc: Remove memory state from tile management (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/tile.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/tile_manager.cc
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 14012a9838b472eb9328e3350401a03c2db676cf..8edacf6896dbeeefb13022df1f679404577f09f4 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -307,7 +307,6 @@ void TileManager::CheckForCompletedTileUploads() {
++it) {
Tile* tile = *it;
if (!tile->managed_state().raster_task.is_null() &&
- tile->tile_version().memory_state_ == USING_UNRELEASABLE_MEMORY &&
!tile->tile_version().forced_upload_) {
if (!raster_worker_pool_->ForceUploadToComplete(
tile->managed_state().raster_task))
@@ -334,7 +333,7 @@ void TileManager::GetMemoryStats(
size_t* memory_used_bytes) const {
*memory_required_bytes = 0;
*memory_nice_to_have_bytes = 0;
- *memory_used_bytes = 0;
+ *memory_used_bytes = resource_pool_->acquired_memory_usage_bytes();
for (TileVector::const_iterator it = tiles_.begin();
it != tiles_.end();
++it) {
@@ -348,8 +347,6 @@ void TileManager::GetMemoryStats(
*memory_required_bytes += tile_bytes;
if (mts.gpu_memmgr_stats_bin != NEVER_BIN)
*memory_nice_to_have_bytes += tile_bytes;
- if (tile->tile_version().memory_state_ != NOT_ALLOWED_TO_USE_MEMORY)
- *memory_used_bytes += tile_bytes;
}
}
@@ -398,31 +395,30 @@ void TileManager::AddRequiredTileForActivation(Tile* tile) {
void TileManager::AssignGpuMemoryToTiles() {
TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
- size_t unreleasable_bytes = 0;
// 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_.clear();
tiles_that_need_to_be_initialized_for_activation_.clear();
- // By clearing the tiles_that_need_to_be_rasterized_ vector list
- // above we move all tiles currently waiting for raster to idle state.
- // Some memory cannot be released. We figure out how much in this
- // loop.
+ size_t bytes_releasable = 0;
for (TileVector::const_iterator it = tiles_.begin();
it != tiles_.end();
++it) {
const Tile* tile = *it;
- if (tile->tile_version().memory_state_ == USING_UNRELEASABLE_MEMORY)
- unreleasable_bytes += tile->bytes_consumed_if_allocated();
+ if (tile->tile_version().resource_)
+ bytes_releasable += tile->bytes_consumed_if_allocated();
}
- // Global state's memory limit can decrease, causing
- // it to be less than unreleasable_bytes
+ // Cast to prevent overflow.
+ int64 bytes_available =
+ static_cast<int64>(bytes_releasable) +
+ static_cast<int64>(global_state_.memory_limit_in_bytes) -
+ static_cast<int64>(resource_pool_->acquired_memory_usage_bytes());
+
size_t bytes_allocatable =
- global_state_.memory_limit_in_bytes > unreleasable_bytes ?
- global_state_.memory_limit_in_bytes - unreleasable_bytes :
- 0;
+ std::max(static_cast<int64>(0), bytes_available);
+
size_t bytes_that_exceeded_memory_budget_in_now_bin = 0;
size_t bytes_left = bytes_allocatable;
size_t bytes_oom_in_now_bin_on_pending_tree = 0;
@@ -439,22 +435,24 @@ void TileManager::AssignGpuMemoryToTiles() {
if (!tile_version.requires_resource())
continue;
- size_t tile_bytes = tile->bytes_consumed_if_allocated();
- // Memory is already reserved for tile with unreleasable memory
- // so adding it to |tiles_that_need_to_be_rasterized_| doesn't
- // affect bytes_allocatable.
- if (tile_version.memory_state_ == USING_UNRELEASABLE_MEMORY)
- tile_bytes = 0;
-
// If the tile is not needed, free it up.
if (mts.is_in_never_bin_on_both_trees()) {
- if (tile_version.memory_state_ != USING_UNRELEASABLE_MEMORY) {
- FreeResourcesForTile(tile);
- tile_version.memory_state_ = NOT_ALLOWED_TO_USE_MEMORY;
- }
+ FreeResourcesForTile(tile);
continue;
}
+ size_t tile_bytes = 0;
+
+ // It costs to maintain a resource.
+ if (tile_version.resource_)
+ tile_bytes += tile->bytes_consumed_if_allocated();
+
+ // It will cost to allocate a resource.
+ // Note that this is separate from the above condition,
+ // so that it's clear why we're adding memory.
+ if (!tile_version.resource_ && mts.raster_task.is_null())
+ tile_bytes += tile->bytes_consumed_if_allocated();
+
// Tile is OOM.
if (tile_bytes > bytes_left) {
tile->tile_version().set_rasterize_on_demand();
@@ -494,8 +492,7 @@ void TileManager::AssignGpuMemoryToTiles() {
Tile* tile = *it;
ManagedTileState& mts = tile->managed_state();
ManagedTileState::TileVersion& tile_version = tile->tile_version();
- if ((tile_version.memory_state_ == CAN_USE_MEMORY ||
- tile_version.memory_state_ == USING_RELEASABLE_MEMORY) &&
+ if (tile_version.resource_ &&
mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
DCHECK(!tile->required_for_activation());
@@ -539,18 +536,17 @@ void TileManager::AssignGpuMemoryToTiles() {
global_state_.memory_limit_in_bytes;
memory_stats_from_last_assign_.bytes_allocated =
bytes_allocatable - bytes_left;
- memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes;
+ memory_stats_from_last_assign_.bytes_unreleasable =
+ bytes_allocatable - bytes_releasable;
memory_stats_from_last_assign_.bytes_over =
bytes_that_exceeded_memory_budget_in_now_bin;
}
void TileManager::FreeResourcesForTile(Tile* tile) {
- DCHECK_NE(USING_UNRELEASABLE_MEMORY, tile->tile_version().memory_state_);
if (tile->tile_version().resource_) {
resource_pool_->ReleaseResource(
tile->tile_version().resource_.Pass());
}
- tile->tile_version().memory_state_ = NOT_ALLOWED_TO_USE_MEMORY;
}
void TileManager::ScheduleTasks() {
@@ -627,8 +623,6 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
tile->tile_version().resource_format_);
const Resource* const_resource = resource.get();
- DCHECK_EQ(CAN_USE_MEMORY, tile->tile_version().memory_state_);
- tile->tile_version().memory_state_ = USING_UNRELEASABLE_MEMORY;
tile->tile_version().resource_id_ = resource->id();
PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis;
@@ -699,11 +693,7 @@ void TileManager::OnRasterTaskCompleted(
DCHECK(!mts.raster_task.is_null());
mts.raster_task.Reset();
- // Tile resources can't be freed until task has completed.
- DCHECK_EQ(USING_UNRELEASABLE_MEMORY, tile->tile_version().memory_state_);
-
if (was_canceled) {
- tile->tile_version().memory_state_ = CAN_USE_MEMORY;
resource_pool_->ReleaseResource(resource.Pass());
return;
}
@@ -715,7 +705,6 @@ void TileManager::OnRasterTaskCompleted(
tile->tile_version().set_solid_color(analysis->solid_color);
resource_pool_->ReleaseResource(resource.Pass());
} else {
- tile->tile_version().memory_state_ = USING_RELEASABLE_MEMORY;
tile->tile_version().resource_ = resource.Pass();
}
« no previous file with comments | « cc/resources/tile.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698