Chromium Code Reviews| Index: cc/resources/tile_manager.cc |
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
| index 54e5ed9243db97963d72d2881b90ee2f036ed5b8..13bd9472b38fee73587905ec8d6bad5706f0a86d 100644 |
| --- a/cc/resources/tile_manager.cc |
| +++ b/cc/resources/tile_manager.cc |
| @@ -134,7 +134,8 @@ TileManager::~TileManager() { |
| // Reset global state and manage. This should cause |
| // our memory usage to drop to zero. |
| global_state_ = GlobalStateThatImpactsTilePriority(); |
| - AssignGpuMemoryToTiles(); |
| + TileVector tiles_that_need_to_be_rasterized; |
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); |
| CleanUpUnusedImageDecodeTasks(); |
| // This should finish all pending tasks and release any uninitialized |
| // resources. |
| @@ -154,23 +155,23 @@ void TileManager::SetGlobalState( |
| void TileManager::RegisterTile(Tile* tile) { |
| DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); |
| DCHECK(!tile->required_for_activation()); |
| + DCHECK(managed_tiles_.find(tile->id()) == managed_tiles_.end()); |
| + |
| tiles_.push_back(tile); |
|
reveman
2013/07/03 20:20:06
I prefer if this becomes |sorted_tiles_| as that b
vmpstr
2013/07/03 23:47:51
Done.
|
| + managed_tiles_[tile->id()] = tile; |
| } |
| void TileManager::UnregisterTile(Tile* tile) { |
| - TileVector::iterator raster_iter = |
| - std::find(tiles_that_need_to_be_rasterized_.begin(), |
| - tiles_that_need_to_be_rasterized_.end(), |
| - tile); |
| - if (raster_iter != tiles_that_need_to_be_rasterized_.end()) |
| - tiles_that_need_to_be_rasterized_.erase(raster_iter); |
| - |
| tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); |
| FreeResourcesForTile(tile); |
| tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); |
|
reveman
2013/07/03 20:20:06
"sorted_tiles_need_update_ = true" or whatever we
vmpstr
2013/07/03 23:47:51
Done.
|
| + |
| + TileMap::iterator managed_iter = managed_tiles_.find(tile->id()); |
| + DCHECK(managed_iter != managed_tiles_.end()); |
| + managed_tiles_.erase(managed_iter); |
|
reveman
2013/07/03 20:20:06
I prefer:
DCHECK(tiles_.find(tile->id()) != tiles_
vmpstr
2013/07/03 23:47:51
Done.
|
| } |
| bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
| @@ -185,15 +186,18 @@ void TileManager::DidFinishedRunningTasks() { |
| raster_worker_pool_->CheckForCompletedTasks(); |
| - AssignGpuMemoryToTiles(); |
| + TileVector tiles_that_need_to_be_rasterized; |
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); |
| - if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) |
| - ReassignGpuMemoryToOOMTilesRequiredForActivation(); |
| + if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) { |
| + ReassignGpuMemoryToOOMTilesRequiredForActivation( |
| + &tiles_that_need_to_be_rasterized); |
| + } |
| - // |tiles_that_need_to_be_rasterized_| will be empty when we reach a |
| + // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
| // steady memory state. Keep scheduling tasks until we reach this state. |
| - if (!tiles_that_need_to_be_rasterized_.empty()) { |
| - ScheduleTasks(); |
| + if (!tiles_that_need_to_be_rasterized.empty()) { |
| + ScheduleTasks(tiles_that_need_to_be_rasterized); |
| return; |
| } |
| @@ -348,7 +352,9 @@ void TileManager::ManageTiles() { |
| TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
| AssignBinsToTiles(); |
| SortTiles(); |
| - AssignGpuMemoryToTiles(); |
| + |
| + TileVector tiles_that_need_to_be_rasterized; |
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); |
| CleanUpUnusedImageDecodeTasks(); |
| TRACE_EVENT_INSTANT1( |
| @@ -356,7 +362,7 @@ void TileManager::ManageTiles() { |
| "state", TracedValue::FromValue(BasicStateAsValue().release())); |
| // Finally, schedule rasterizer tasks. |
| - ScheduleTasks(); |
| + ScheduleTasks(tiles_that_need_to_be_rasterized); |
| } |
| void TileManager::CheckForCompletedTileUploads() { |
| @@ -456,12 +462,12 @@ RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { |
| return std::min(raster_mode, current_mode); |
| } |
| -void TileManager::AssignGpuMemoryToTiles() { |
| +void TileManager::AssignGpuMemoryToTiles( |
| + TileVector* tiles_that_need_to_be_rasterized) { |
| TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| // 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(); |
| oom_tiles_that_need_to_be_initialized_for_activation_.clear(); |
| @@ -558,7 +564,7 @@ void TileManager::AssignGpuMemoryToTiles() { |
| continue; |
| if (!tile_version.resource_) |
| - tiles_that_need_to_be_rasterized_.push_back(tile); |
| + tiles_that_need_to_be_rasterized->push_back(tile); |
| if (!tile->IsReadyToDraw(NULL) && |
| tile->required_for_activation()) { |
| @@ -582,7 +588,8 @@ void TileManager::AssignGpuMemoryToTiles() { |
| bytes_that_exceeded_memory_budget; |
| } |
| -void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() { |
| +void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation( |
| + TileVector* tiles_that_need_to_be_rasterized) { |
| TRACE_EVENT0( |
| "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation"); |
| @@ -616,13 +623,13 @@ void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() { |
| // If the tile is in the to-rasterize list, but it has no task, |
| // then it means that we have assigned memory for it. |
| TileVector::iterator raster_it = |
| - std::find(tiles_that_need_to_be_rasterized_.begin(), |
| - tiles_that_need_to_be_rasterized_.end(), |
| + std::find(tiles_that_need_to_be_rasterized->begin(), |
| + tiles_that_need_to_be_rasterized->end(), |
| tile); |
| - if (raster_it != tiles_that_need_to_be_rasterized_.end() && |
| + if (raster_it != tiles_that_need_to_be_rasterized->end() && |
| tile_version.raster_task_.is_null()) { |
| bytes_freed += tile->bytes_consumed_if_allocated(); |
| - tiles_that_need_to_be_rasterized_.erase(raster_it); |
| + tiles_that_need_to_be_rasterized->erase(raster_it); |
| } |
| // Also consider all of the completed resources for freeing. |
| @@ -649,7 +656,7 @@ void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() { |
| continue; |
| mts.tile_versions[mts.raster_mode].set_use_resource(); |
| bytes_freed -= bytes_needed; |
| - tiles_that_need_to_be_rasterized_.push_back(tile); |
| + tiles_that_need_to_be_rasterized->push_back(tile); |
| DCHECK(tile->required_for_activation()); |
| AddRequiredTileForActivation(tile); |
| oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| @@ -703,15 +710,16 @@ void TileManager::FreeUnusedResourcesForTile(Tile* tile) { |
| } |
| } |
| -void TileManager::ScheduleTasks() { |
| +void TileManager::ScheduleTasks( |
| + const TileVector& tiles_that_need_to_be_rasterized) { |
| TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
| - "count", tiles_that_need_to_be_rasterized_.size()); |
| + "count", tiles_that_need_to_be_rasterized.size()); |
| RasterWorkerPool::RasterTask::Queue tasks; |
| // Build a new task queue containing all task currently needed. Tasks |
| // are added in order of priority, highest priority task first. |
| - for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); |
| - it != tiles_that_need_to_be_rasterized_.end(); |
| + for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
| + it != tiles_that_need_to_be_rasterized.end(); |
| ++it) { |
| Tile* tile = *it; |
| ManagedTileState& mts = tile->managed_state(); |
| @@ -801,7 +809,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| rendering_stats_instrumentation_, |
| base::Bind(&TileManager::OnRasterTaskCompleted, |
| base::Unretained(this), |
| - make_scoped_refptr(tile), |
| + tile->id(), |
| base::Passed(&resource), |
| mts.raster_mode), |
| &decode_tasks); |
| @@ -831,7 +839,7 @@ void TileManager::OnImageDecodeTaskCompleted( |
| } |
| void TileManager::OnRasterTaskCompleted( |
| - scoped_refptr<Tile> tile, |
| + ManagedTileId managed_id, |
| scoped_ptr<ResourcePool::Resource> resource, |
| RasterMode raster_mode, |
| const PicturePileImpl::Analysis& analysis, |
| @@ -839,6 +847,13 @@ void TileManager::OnRasterTaskCompleted( |
| TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| "was_canceled", was_canceled); |
| + TileMap::iterator managed_iter = managed_tiles_.find(managed_id); |
| + if (managed_iter == managed_tiles_.end()) { |
| + resource_pool_->ReleaseResource(resource.Pass()); |
| + return; |
| + } |
| + |
| + Tile* tile = managed_iter->second; |
| ManagedTileState& mts = tile->managed_state(); |
| ManagedTileState::TileVersion& tile_version = |
| mts.tile_versions[raster_mode]; |
| @@ -858,9 +873,9 @@ void TileManager::OnRasterTaskCompleted( |
| tile_version.resource_ = resource.Pass(); |
| } |
| - FreeUnusedResourcesForTile(tile.get()); |
| + FreeUnusedResourcesForTile(tile); |
| - DidFinishTileInitialization(tile.get()); |
| + DidFinishTileInitialization(tile); |
| } |
| void TileManager::DidFinishTileInitialization(Tile* tile) { |