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

Unified Diff: cc/tiles/tile_manager.cc

Issue 2612413003: Clean up tile deletion (Closed)
Patch Set: "Fix Tile* comparison in tests" Created 3 years, 11 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/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/tile_manager.cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 425cfe8cc7f0d2bd7d89ab2ca66770083eca35b6..1e948f1e15f098b97008bc2921f7e2349864a37c 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -93,7 +93,7 @@ class RasterTaskImpl : public TileTask {
bool is_gpu_rasterization)
: TileTask(!is_gpu_rasterization, dependencies),
tile_manager_(tile_manager),
- tile_(tile),
+ tile_id_(tile->id()),
resource_(resource),
raster_source_(std::move(raster_source)),
content_rect_(tile->content_rect()),
@@ -138,7 +138,7 @@ class RasterTaskImpl : public TileTask {
// Here calling state().IsCanceled() is thread-safe, because this task is
// already concluded as FINISHED or CANCELLED and no longer will be worked
// upon by task graph runner.
- tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_,
+ tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_id_,
resource_, state().IsCanceled());
}
@@ -155,7 +155,7 @@ class RasterTaskImpl : public TileTask {
// origin thread. These are not thread-safe and should be accessed only in
// origin thread. Ensure their access by checking CalledOnValidThread().
TileManager* tile_manager_;
- Tile* tile_;
+ Tile::Id tile_id_;
Resource* resource_;
// The following members should be used for running the task.
@@ -388,9 +388,6 @@ void TileManager::FinishTasksAndCleanUp() {
tile_task_manager_->CheckForCompletedTasks();
- FreeResourcesForReleasedTiles();
- CleanUpReleasedTiles();
-
tile_task_manager_ = nullptr;
resource_pool_ = nullptr;
more_tiles_need_prepare_check_notifier_.Cancel();
@@ -420,29 +417,8 @@ void TileManager::SetResources(ResourcePool* resource_pool,
}
void TileManager::Release(Tile* tile) {
- released_tiles_.push_back(tile);
-}
-
-void TileManager::FreeResourcesForReleasedTiles() {
- for (auto* tile : released_tiles_)
- FreeResourcesForTile(tile);
-}
-
-void TileManager::CleanUpReleasedTiles() {
- std::vector<Tile*> tiles_to_retain;
- for (auto* tile : released_tiles_) {
- if (tile->HasRasterTask()) {
- tiles_to_retain.push_back(tile);
- continue;
- }
-
- DCHECK(!tile->draw_info().has_resource());
- DCHECK(tiles_.find(tile->id()) != tiles_.end());
- tiles_.erase(tile->id());
-
- delete tile;
- }
- released_tiles_.swap(tiles_to_retain);
+ FreeResourcesForTile(tile);
+ tiles_.erase(tile->id());
}
void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
@@ -512,9 +488,6 @@ bool TileManager::PrepareTiles(
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
}
- FreeResourcesForReleasedTiles();
- CleanUpReleasedTiles();
-
PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles();
// Inform the client that will likely require a draw if the highest priority
@@ -1049,19 +1022,21 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
void TileManager::OnRasterTaskCompleted(
std::unique_ptr<RasterBuffer> raster_buffer,
- Tile* tile,
+ Tile::Id tile_id,
Resource* resource,
bool was_canceled) {
- DCHECK(tile);
- DCHECK(tiles_.find(tile->id()) != tiles_.end());
raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
- TileDrawInfo& draw_info = tile->draw_info();
- DCHECK(tile->raster_task_.get());
- tile->raster_task_ = nullptr;
+ auto found = tiles_.find(tile_id);
+ Tile* tile = nullptr;
+ if (found != tiles_.end()) {
+ tile = found->second;
+ DCHECK(tile->raster_task_.get());
+ tile->raster_task_ = nullptr;
+ }
// Unref all the images.
- auto images_it = scheduled_draw_images_.find(tile->id());
+ auto images_it = scheduled_draw_images_.find(tile_id);
image_controller_.UnrefImages(images_it->second);
scheduled_draw_images_.erase(images_it);
@@ -1071,27 +1046,32 @@ void TileManager::OnRasterTaskCompleted(
return;
}
- resource_pool_->OnContentReplaced(resource->id(), tile->id());
+ resource_pool_->OnContentReplaced(resource->id(), tile_id);
++flush_stats_.completed_count;
+ if (!tile) {
+ resource_pool_->ReleaseResource(resource);
+ return;
+ }
+
+ TileDrawInfo& draw_info = tile->draw_info();
draw_info.set_use_resource();
draw_info.resource_ = resource;
draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
DCHECK(draw_info.IsReadyToDraw());
draw_info.set_was_ever_ready_to_draw();
-
client_->NotifyTileStateChanged(tile);
}
-ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info,
- int layer_id,
- int source_frame_number,
- int flags) {
+std::unique_ptr<Tile> TileManager::CreateTile(const Tile::CreateInfo& info,
+ int layer_id,
+ int source_frame_number,
+ int flags) {
// We need to have a tile task worker pool to do anything meaningful with
// tiles.
DCHECK(tile_task_manager_);
- ScopedTilePtr tile(
+ std::unique_ptr<Tile> tile(
new Tile(this, info, layer_id, source_frame_number, flags));
DCHECK(tiles_.find(tile->id()) == tiles_.end());
@@ -1210,8 +1190,6 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() {
locked_image_tasks_.clear();
}
- FreeResourcesForReleasedTiles();
-
resource_pool_->ReduceResourceUsage();
image_controller_.ReduceMemoryUsage();
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698