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

Unified Diff: cc/resources/tile_manager_unittest.cc

Issue 23231002: cc: Prevent the tile manager from allocating more memory than allowed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: s/resources_/unused_resources_/ Created 7 years, 4 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
Index: cc/resources/tile_manager_unittest.cc
diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc
index 6fb069085686daf919a33546070e26b83b391e0a..8a88f805cb8afc1a8994a97dd569178b62c6528c 100644
--- a/cc/resources/tile_manager_unittest.cc
+++ b/cc/resources/tile_manager_unittest.cc
@@ -41,6 +41,7 @@ class TileManagerTest : public testing::TestWithParam<bool> {
state.memory_limit_in_bytes = 100 * 1000 * 1000;
state.num_resources_limit = max_tiles;
}
+ state.unused_memory_limit_in_bytes = state.memory_limit_in_bytes;
state.memory_limit_policy = memory_limit_policy;
state.tree_priority = tree_priority;
@@ -53,6 +54,7 @@ class TileManagerTest : public testing::TestWithParam<bool> {
gfx::Size tile_size = settings_.default_tile_size;
state.memory_limit_in_bytes =
max_memory_tiles_ * 4 * tile_size.width() * tile_size.height();
+ state.unused_memory_limit_in_bytes = state.memory_limit_in_bytes;
state.memory_limit_policy = memory_limit_policy_;
state.num_resources_limit = 100;
state.tree_priority = tree_priority;
@@ -66,15 +68,16 @@ class TileManagerTest : public testing::TestWithParam<bool> {
testing::Test::TearDown();
}
- TileVector CreateTiles(int count,
- TilePriority active_priority,
- TilePriority pending_priority) {
+ TileVector CreateTilesWithSize(int count,
+ TilePriority active_priority,
+ TilePriority pending_priority,
+ gfx::Size tile_size) {
TileVector tiles;
for (int i = 0; i < count; ++i) {
scoped_refptr<Tile> tile =
make_scoped_refptr(new Tile(tile_manager_.get(),
picture_pile_.get(),
- settings_.default_tile_size,
+ tile_size,
gfx::Rect(),
gfx::Rect(),
1.0,
@@ -88,6 +91,15 @@ class TileManagerTest : public testing::TestWithParam<bool> {
return tiles;
}
+ TileVector CreateTiles(int count,
+ TilePriority active_priority,
+ TilePriority pending_priority) {
+ return CreateTilesWithSize(count,
+ active_priority,
+ pending_priority,
+ settings_.default_tile_size);
+ }
+
FakeTileManager* tile_manager() {
return tile_manager_.get();
}
@@ -461,6 +473,48 @@ TEST_P(TileManagerTest, TextReRasterAsNoLCD) {
EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
}
+TEST_P(TileManagerTest, RespectMemoryLimit) {
+ Initialize(5, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
+ TileVector large_tiles = CreateTiles(
+ 5, TilePriorityForNowBin(), TilePriority());
+
+ size_t memory_required_bytes;
+ size_t memory_nice_to_have_bytes;
+ size_t memory_allocated_bytes;
+ size_t memory_used_bytes;
+
+ tile_manager()->ManageTiles();
+ tile_manager()->GetMemoryStats(&memory_required_bytes,
+ &memory_nice_to_have_bytes,
+ &memory_allocated_bytes,
+ &memory_used_bytes);
+ // Allocated bytes should never be more than the memory limit.
+ EXPECT_LE(memory_allocated_bytes,
+ tile_manager()->GlobalState().memory_limit_in_bytes);
+
+ // Finish raster of large tiles.
+ tile_manager()->UpdateVisibleTiles();
+
+ // Remove all large tiles. This will leave the memory currently
+ // used by these tiles as unused when ManageTiles() is called.
+ large_tiles.clear();
+
+ // Create a new set of tiles using a different size. These tiles
+ // can use the memory currently assigned to the lerge tiles but
+ // they can't use the same resources as the size doesn't match.
+ TileVector small_tiles = CreateTilesWithSize(
+ 5, TilePriorityForNowBin(), TilePriority(), gfx::Size(128, 128));
+
+ tile_manager()->ManageTiles();
+ tile_manager()->GetMemoryStats(&memory_required_bytes,
+ &memory_nice_to_have_bytes,
+ &memory_allocated_bytes,
+ &memory_used_bytes);
+ // Allocated bytes should never be more than the memory limit.
+ EXPECT_LE(memory_allocated_bytes,
+ tile_manager()->GlobalState().memory_limit_in_bytes);
+}
+
// If true, the max tile limit should be applied as bytes; if false,
// as num_resources_limit.
INSTANTIATE_TEST_CASE_P(TileManagerTests,

Powered by Google App Engine
This is Rietveld 408576698