| Index: cc/resources/tile_manager.cc
|
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
|
| index b2e536fa8aaf87b9560e326a012890a7b2289004..61245c71ca5306e84fc61708955f4f24dc376923 100644
|
| --- a/cc/resources/tile_manager.cc
|
| +++ b/cc/resources/tile_manager.cc
|
| @@ -154,6 +154,7 @@ inline ManagedTileBin BinFromTilePriority(const TilePriority& prio) {
|
| // gives us an insurance that we're not spending a huge amount
|
| // of time scheduling one enormous set of tasks.
|
| const size_t kMaxRasterTasks = 256u;
|
| +const size_t kTilePoolSize = 256u;
|
|
|
| } // namespace
|
|
|
| @@ -213,6 +214,7 @@ TileManager::TileManager(
|
| did_initialize_visible_tile_(false),
|
| did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
|
| raster_worker_pool_->SetClient(this);
|
| + tile_pool_.reserve(kTilePoolSize);
|
| }
|
|
|
| TileManager::~TileManager() {
|
| @@ -223,6 +225,10 @@ TileManager::~TileManager() {
|
| CleanUpReleasedTiles();
|
| DCHECK_EQ(0u, tiles_.size());
|
|
|
| + for (size_t i = 0; i < tile_pool_.size(); ++i)
|
| + delete tile_pool_[i];
|
| + tile_pool_.clear();
|
| +
|
| RasterWorkerPool::RasterTask::Queue empty;
|
| raster_worker_pool_->ScheduleTasks(&empty);
|
|
|
| @@ -253,8 +259,14 @@ void TileManager::CleanUpReleasedTiles() {
|
| it != released_tiles_.end();
|
| ++it) {
|
| Tile* tile = *it;
|
| + ManagedTileState& mts = tile->managed_state();
|
|
|
| - FreeResourcesForTile(tile);
|
| + for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
|
| + FreeResourceForTile(tile, static_cast<RasterMode>(mode));
|
| + mts.tile_versions[mode].set_use_resource();
|
| + mts.tile_versions[mode].raster_task_.Reset();
|
| + }
|
| + tile->reset_picture_pile();
|
|
|
| DCHECK(tiles_.find(tile->id()) != tiles_.end());
|
| tiles_.erase(tile->id());
|
| @@ -267,7 +279,10 @@ void TileManager::CleanUpReleasedTiles() {
|
| image_decode_tasks_.erase(tile->layer_id());
|
| }
|
|
|
| - delete tile;
|
| + if (tile_pool_.size() < kTilePoolSize)
|
| + tile_pool_.push_back(tile);
|
| + else
|
| + delete tile;
|
| }
|
|
|
| released_tiles_.clear();
|
| @@ -816,7 +831,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
|
|
|
| scoped_ptr<ResourcePool::Resource> resource =
|
| resource_pool_->AcquireResource(
|
| - tile->tile_size_.size(),
|
| + tile->tile_size_,
|
| raster_worker_pool_->GetResourceFormat());
|
| const Resource* const_resource = resource.get();
|
|
|
| @@ -939,15 +954,23 @@ scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
|
| int layer_id,
|
| int source_frame_number,
|
| bool can_use_lcd_text) {
|
| - scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
|
| - picture_pile,
|
| - tile_size,
|
| - content_rect,
|
| - opaque_rect,
|
| - contents_scale,
|
| - layer_id,
|
| - source_frame_number,
|
| - can_use_lcd_text));
|
| + scoped_refptr<Tile> tile;
|
| + if (!tile_pool_.empty()) {
|
| + tile = make_scoped_refptr(tile_pool_.back());
|
| + tile_pool_.pop_back();
|
| + } else {
|
| + tile = make_scoped_refptr(new Tile(this));
|
| + }
|
| +
|
| + tile->Reset(picture_pile,
|
| + tile_size,
|
| + content_rect,
|
| + opaque_rect,
|
| + contents_scale,
|
| + layer_id,
|
| + source_frame_number,
|
| + can_use_lcd_text);
|
| +
|
| DCHECK(tiles_.find(tile->id()) == tiles_.end());
|
|
|
| tiles_[tile->id()] = tile;
|
|
|