diff options
-rw-r--r-- | cc/resources/managed_tile_state.h | 6 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling_set_unittest.cc | 13 | ||||
-rw-r--r-- | cc/resources/tile_manager.cc | 35 | ||||
-rw-r--r-- | cc/resources/tile_manager.h | 21 | ||||
-rw-r--r-- | cc/test/fake_picture_layer_tiling_client.h | 4 |
5 files changed, 44 insertions, 35 deletions
diff --git a/cc/resources/managed_tile_state.h b/cc/resources/managed_tile_state.h index c6065f9..113c532 100644 --- a/cc/resources/managed_tile_state.h +++ b/cc/resources/managed_tile_state.h @@ -86,12 +86,6 @@ class CC_EXPORT ManagedTileState { size_t GPUMemoryUsageInBytes() const; - void SetResourceForTesting(scoped_ptr<ResourcePool::Resource> resource) { - resource_ = resource.Pass(); - } - const ResourcePool::Resource* GetResourceForTesting() const { - return resource_.get(); - } void SetSolidColorForTesting(SkColor color) { set_solid_color(color); } diff --git a/cc/resources/picture_layer_tiling_set_unittest.cc b/cc/resources/picture_layer_tiling_set_unittest.cc index c47cf4b..134b035 100644 --- a/cc/resources/picture_layer_tiling_set_unittest.cc +++ b/cc/resources/picture_layer_tiling_set_unittest.cc @@ -74,17 +74,8 @@ class PictureLayerTilingSetTestWithResources : public testing::Test { PictureLayerTiling* tiling = set.AddTiling(scale); tiling->CreateAllTilesForTesting(); std::vector<Tile*> tiles = tiling->AllTilesForTesting(); - for (size_t i = 0; i < tiles.size(); ++i) { - ManagedTileState::TileVersion& tile_version = - tiles[i]->GetTileVersionForTesting(HIGH_QUALITY_NO_LCD_RASTER_MODE); - EXPECT_FALSE(tile_version.GetResourceForTesting()); - - tile_version.SetResourceForTesting( - make_scoped_ptr(new ResourcePool::Resource( - resource_provider.get(), - gfx::Size(1, 1), - resource_provider->best_texture_format()))); - } + client.tile_manager()->InitializeTilesWithResourcesForTesting( + tiles, resource_provider.get()); } float max_contents_scale = scale; diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc index 7cf5096..86de610 100644 --- a/cc/resources/tile_manager.cc +++ b/cc/resources/tile_manager.cc @@ -147,6 +147,8 @@ TileManager::TileManager( all_tiles_that_need_to_be_rasterized_have_memory_(true), all_tiles_required_for_activation_have_memory_(true), all_tiles_required_for_activation_have_been_initialized_(true), + bytes_releasable_(0), + resources_releasable_(0), ever_exceeded_memory_budget_(false), rendering_stats_instrumentation_(rendering_stats_instrumentation), did_initialize_visible_tile_(false), @@ -170,6 +172,9 @@ TileManager::~TileManager() { // resources. raster_worker_pool_->Shutdown(); raster_worker_pool_->CheckForCompletedTasks(); + + DCHECK_EQ(0u, bytes_releasable_); + DCHECK_EQ(0u, resources_releasable_); } void TileManager::SetGlobalState( @@ -485,31 +490,16 @@ void TileManager::AssignGpuMemoryToTiles( // Now give memory out to the tiles until we're out, and build // the needs-to-be-rasterized queue. - size_t bytes_releasable = 0; - size_t resources_releasable = 0; - for (PrioritizedTileSet::Iterator it(tiles, false); - it; - ++it) { - const Tile* tile = *it; - const ManagedTileState& mts = tile->managed_state(); - for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { - if (mts.tile_versions[mode].resource_) { - bytes_releasable += tile->bytes_consumed_if_allocated(); - resources_releasable++; - } - } - } - all_tiles_that_need_to_be_rasterized_have_memory_ = true; all_tiles_required_for_activation_have_memory_ = true; all_tiles_required_for_activation_have_been_initialized_ = true; // Cast to prevent overflow. int64 bytes_available = - static_cast<int64>(bytes_releasable) + + static_cast<int64>(bytes_releasable_) + static_cast<int64>(global_state_.memory_limit_in_bytes) - static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); - int resources_available = resources_releasable + + int resources_available = resources_releasable_ + global_state_.num_resources_limit - resource_pool_->NumResources(); @@ -624,7 +614,7 @@ void TileManager::AssignGpuMemoryToTiles( memory_stats_from_last_assign_.bytes_allocated = bytes_allocatable - bytes_left; memory_stats_from_last_assign_.bytes_unreleasable = - bytes_allocatable - bytes_releasable; + bytes_allocatable - bytes_releasable_; memory_stats_from_last_assign_.bytes_over = bytes_that_exceeded_memory_budget; } @@ -658,6 +648,12 @@ void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { if (mts.tile_versions[mode].resource_) { resource_pool_->ReleaseResource( mts.tile_versions[mode].resource_.Pass()); + + DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); + DCHECK_GE(resources_releasable_, 1u); + + bytes_releasable_ -= tile->bytes_consumed_if_allocated(); + --resources_releasable_; } } @@ -837,6 +833,9 @@ void TileManager::OnRasterTaskCompleted( } else { tile_version.set_use_resource(); tile_version.resource_ = resource.Pass(); + + bytes_releasable_ += tile->bytes_consumed_if_allocated(); + ++resources_releasable_; } FreeUnusedResourcesForTile(tile); diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h index 7957fc8..97c4f08 100644 --- a/cc/resources/tile_manager.h +++ b/cc/resources/tile_manager.h @@ -80,6 +80,24 @@ class CC_EXPORT TileManager : public RasterWorkerPoolClient { return all_tiles_required_for_activation_have_been_initialized_; } + void InitializeTilesWithResourcesForTesting( + const std::vector<Tile*>& tiles, + ResourceProvider* resource_provider) { + for (size_t i = 0; i < tiles.size(); ++i) { + ManagedTileState& mts = tiles[i]->managed_state(); + ManagedTileState::TileVersion& tile_version = + mts.tile_versions[HIGH_QUALITY_NO_LCD_RASTER_MODE]; + + tile_version.resource_ = make_scoped_ptr( + new ResourcePool::Resource(resource_provider, + gfx::Size(1, 1), + resource_provider->best_texture_format())); + + bytes_releasable_ += tiles[i]->bytes_consumed_if_allocated(); + ++resources_releasable_; + } + } + protected: TileManager(TileManagerClient* client, ResourceProvider* resource_provider, @@ -148,6 +166,9 @@ class CC_EXPORT TileManager : public RasterWorkerPoolClient { bool all_tiles_required_for_activation_have_memory_; bool all_tiles_required_for_activation_have_been_initialized_; + size_t bytes_releasable_; + size_t resources_releasable_; + bool ever_exceeded_memory_budget_; MemoryHistory::Entry memory_stats_from_last_assign_; diff --git a/cc/test/fake_picture_layer_tiling_client.h b/cc/test/fake_picture_layer_tiling_client.h index cacfd66..0d0ab27 100644 --- a/cc/test/fake_picture_layer_tiling_client.h +++ b/cc/test/fake_picture_layer_tiling_client.h @@ -40,6 +40,10 @@ class FakePictureLayerTilingClient : public PictureLayerTilingClient { void set_allow_create_tile(bool allow) { allow_create_tile_ = allow; } void set_invalidation(const Region& region) { invalidation_ = region; } + TileManager* tile_manager() const { + return tile_manager_.get(); + } + protected: FakeTileManagerClient tile_manager_client_; scoped_ptr<TileManager> tile_manager_; |