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

Side by Side Diff: cc/resources/tile_manager_unittest.cc

Issue 246673005: cc: Start using raster/eviction iterators in tile manager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/tile.h" 5 #include "cc/resources/tile.h"
6 #include "cc/resources/tile_priority.h" 6 #include "cc/resources/tile_priority.h"
7 #include "cc/test/fake_impl_proxy.h" 7 #include "cc/test/fake_impl_proxy.h"
8 #include "cc/test/fake_layer_tree_host_impl.h" 8 #include "cc/test/fake_layer_tree_host_impl.h"
9 #include "cc/test/fake_output_surface.h" 9 #include "cc/test/fake_output_surface.h"
10 #include "cc/test/fake_output_surface_client.h" 10 #include "cc/test/fake_output_surface_client.h"
11 #include "cc/test/fake_picture_layer_impl.h" 11 #include "cc/test/fake_picture_layer_impl.h"
12 #include "cc/test/fake_picture_pile_impl.h" 12 #include "cc/test/fake_picture_pile_impl.h"
13 #include "cc/test/fake_tile_manager.h" 13 #include "cc/test/fake_tile_manager.h"
14 #include "cc/test/impl_side_painting_settings.h" 14 #include "cc/test/impl_side_painting_settings.h"
15 #include "cc/test/test_shared_bitmap_manager.h" 15 #include "cc/test/test_shared_bitmap_manager.h"
16 #include "cc/test/test_tile_priorities.h" 16 #include "cc/test/test_tile_priorities.h"
17 #include "cc/trees/layer_tree_impl.h" 17 #include "cc/trees/layer_tree_impl.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 namespace cc { 20 namespace cc {
21 namespace { 21 namespace {
22 22
23 class TileManagerTest : public testing::TestWithParam<bool>,
24 public TileManagerClient {
25 public:
26 typedef std::vector<scoped_refptr<Tile> > TileVector;
27
28 TileManagerTest()
29 : memory_limit_policy_(ALLOW_ANYTHING),
30 max_tiles_(0),
31 ready_to_activate_(false) {}
32
33 void Initialize(int max_tiles,
34 TileMemoryLimitPolicy memory_limit_policy,
35 TreePriority tree_priority) {
36 output_surface_ = FakeOutputSurface::Create3d();
37 CHECK(output_surface_->BindToClient(&output_surface_client_));
38
39 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
40 resource_provider_ = ResourceProvider::Create(
41 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1,
42 false);
43 resource_pool_ = ResourcePool::Create(
44 resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
45 tile_manager_ =
46 make_scoped_ptr(new FakeTileManager(this, resource_pool_.get()));
47
48 memory_limit_policy_ = memory_limit_policy;
49 max_tiles_ = max_tiles;
50 picture_pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
51
52 SetTreePriority(tree_priority);
53 }
54
55 void SetTreePriority(TreePriority tree_priority) {
56 GlobalStateThatImpactsTilePriority state;
57 gfx::Size tile_size = settings_.default_tile_size;
58
59 if (UsingMemoryLimit()) {
60 state.soft_memory_limit_in_bytes =
61 max_tiles_ * 4 * tile_size.width() * tile_size.height();
62 state.num_resources_limit = 100;
63 } else {
64 state.soft_memory_limit_in_bytes = 100 * 1000 * 1000;
65 state.num_resources_limit = max_tiles_;
66 }
67 state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes * 2;
68 state.memory_limit_policy = memory_limit_policy_;
69 state.tree_priority = tree_priority;
70
71 global_state_ = state;
72 resource_pool_->SetResourceUsageLimits(state.soft_memory_limit_in_bytes,
73 state.soft_memory_limit_in_bytes,
74 state.num_resources_limit);
75 tile_manager_->SetGlobalStateForTesting(state);
76 }
77
78 virtual void TearDown() OVERRIDE {
79 tile_manager_.reset(NULL);
80 picture_pile_ = NULL;
81
82 testing::Test::TearDown();
83 }
84
85 // TileManagerClient implementation.
86 virtual void NotifyReadyToActivate() OVERRIDE { ready_to_activate_ = true; }
87 virtual void NotifyTileStateChanged(const Tile* tile) OVERRIDE {}
88
89 TileVector CreateTilesWithSize(int count,
90 TilePriority active_priority,
91 TilePriority pending_priority,
92 const gfx::Size& tile_size) {
93 TileVector tiles;
94 for (int i = 0; i < count; ++i) {
95 scoped_refptr<Tile> tile = tile_manager_->CreateTile(picture_pile_.get(),
96 tile_size,
97 gfx::Rect(),
98 gfx::Rect(),
99 1.0,
100 0,
101 0,
102 Tile::USE_LCD_TEXT);
103 tile->SetPriority(ACTIVE_TREE, active_priority);
104 tile->SetPriority(PENDING_TREE, pending_priority);
105 tiles.push_back(tile);
106 }
107 return tiles;
108 }
109
110 TileVector CreateTiles(int count,
111 TilePriority active_priority,
112 TilePriority pending_priority) {
113 return CreateTilesWithSize(
114 count, active_priority, pending_priority, settings_.default_tile_size);
115 }
116
117 FakeTileManager* tile_manager() { return tile_manager_.get(); }
118
119 int AssignedMemoryCount(const TileVector& tiles) {
120 int has_memory_count = 0;
121 for (TileVector::const_iterator it = tiles.begin(); it != tiles.end();
122 ++it) {
123 if (tile_manager_->HasBeenAssignedMemory(*it))
124 ++has_memory_count;
125 }
126 return has_memory_count;
127 }
128
129 int TilesWithLCDCount(const TileVector& tiles) {
130 int has_lcd_count = 0;
131 for (TileVector::const_iterator it = tiles.begin(); it != tiles.end();
132 ++it) {
133 if ((*it)->GetRasterModeForTesting() == HIGH_QUALITY_RASTER_MODE)
134 ++has_lcd_count;
135 }
136 return has_lcd_count;
137 }
138
139 bool ready_to_activate() const { return ready_to_activate_; }
140
141 // The parametrization specifies whether the max tile limit should
142 // be applied to memory or resources.
143 bool UsingResourceLimit() { return !GetParam(); }
144 bool UsingMemoryLimit() { return GetParam(); }
145
146 protected:
147 GlobalStateThatImpactsTilePriority global_state_;
148
149 private:
150 LayerTreeSettings settings_;
151 scoped_ptr<FakeTileManager> tile_manager_;
152 scoped_refptr<FakePicturePileImpl> picture_pile_;
153 FakeOutputSurfaceClient output_surface_client_;
154 scoped_ptr<FakeOutputSurface> output_surface_;
155 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
156 scoped_ptr<ResourceProvider> resource_provider_;
157 scoped_ptr<ResourcePool> resource_pool_;
158 TileMemoryLimitPolicy memory_limit_policy_;
159 int max_tiles_;
160 bool ready_to_activate_;
161 };
162
163 TEST_P(TileManagerTest, EnoughMemoryAllowAnything) {
164 // A few tiles of each type of priority, with enough memory for all tiles.
165
166 Initialize(10, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
167 TileVector active_now =
168 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
169 TileVector pending_now =
170 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
171 TileVector active_pending_soon =
172 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
173 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
174
175 tile_manager()->AssignMemoryToTiles(global_state_);
176
177 EXPECT_EQ(3, AssignedMemoryCount(active_now));
178 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
179 EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
180 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
181 }
182
183 TEST_P(TileManagerTest, EnoughMemoryAllowPrepaintOnly) {
184 // A few tiles of each type of priority, with enough memory for all tiles,
185 // with the exception of never bin.
186
187 Initialize(10, ALLOW_PREPAINT_ONLY, SMOOTHNESS_TAKES_PRIORITY);
188 TileVector active_now =
189 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
190 TileVector pending_now =
191 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
192 TileVector active_pending_soon =
193 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
194 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
195
196 tile_manager()->AssignMemoryToTiles(global_state_);
197
198 EXPECT_EQ(3, AssignedMemoryCount(active_now));
199 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
200 EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
201 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
202 }
203
204 TEST_P(TileManagerTest, EnoughMemoryPendingLowResAllowAbsoluteMinimum) {
205 // A few low-res tiles required for activation, with enough memory for all
206 // tiles.
207
208 Initialize(5, ALLOW_ABSOLUTE_MINIMUM, SAME_PRIORITY_FOR_BOTH_TREES);
209 TileVector pending_low_res =
210 CreateTiles(5, TilePriority(), TilePriorityLowRes());
211
212 tile_manager()->AssignMemoryToTiles(global_state_);
213
214 EXPECT_EQ(5, AssignedMemoryCount(pending_low_res));
215 }
216
217 TEST_P(TileManagerTest, EnoughMemoryAllowAbsoluteMinimum) {
218 // A few tiles of each type of priority, with enough memory for all tiles,
219 // with the exception of never and soon bins.
220
221 Initialize(10, ALLOW_ABSOLUTE_MINIMUM, SMOOTHNESS_TAKES_PRIORITY);
222 TileVector active_now =
223 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
224 TileVector pending_now =
225 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
226 TileVector active_pending_soon =
227 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
228 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
229
230 tile_manager()->AssignMemoryToTiles(global_state_);
231
232 EXPECT_EQ(3, AssignedMemoryCount(active_now));
233 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
234 EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
235 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
236 }
237
238 TEST_P(TileManagerTest, EnoughMemoryAllowNothing) {
239 // A few tiles of each type of priority, with enough memory for all tiles,
240 // but allow nothing should not assign any memory.
241
242 Initialize(10, ALLOW_NOTHING, SMOOTHNESS_TAKES_PRIORITY);
243 TileVector active_now =
244 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
245 TileVector pending_now =
246 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
247 TileVector active_pending_soon =
248 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
249 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
250
251 tile_manager()->AssignMemoryToTiles(global_state_);
252
253 EXPECT_EQ(0, AssignedMemoryCount(active_now));
254 EXPECT_EQ(0, AssignedMemoryCount(pending_now));
255 EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
256 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
257 }
258
259 TEST_P(TileManagerTest, PartialOOMMemoryToPending) {
260 // 5 tiles on active tree eventually bin, 5 tiles on pending tree that are
261 // required for activation, but only enough memory for 8 tiles. The result
262 // is all pending tree tiles get memory, and 3 of the active tree tiles
263 // get memory. None of these tiles is needed to avoid calimity (flickering or
264 // raster-on-demand) so the soft memory limit is used.
265
266 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
267 TileVector active_tree_tiles =
268 CreateTiles(5, TilePriorityForEventualBin(), TilePriority());
269 TileVector pending_tree_tiles =
270 CreateTiles(5, TilePriority(), TilePriorityRequiredForActivation());
271 tile_manager()->AssignMemoryToTiles(global_state_);
272
273 EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
274 EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
275
276 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
277 tile_manager()->AssignMemoryToTiles(global_state_);
278
279 EXPECT_EQ(3, AssignedMemoryCount(active_tree_tiles));
280 EXPECT_EQ(5, AssignedMemoryCount(pending_tree_tiles));
281 }
282
283 TEST_P(TileManagerTest, PartialOOMMemoryToActive) {
284 // 5 tiles on active tree eventually bin, 5 tiles on pending tree now bin,
285 // but only enough memory for 8 tiles. The result is all active tree tiles
286 // get memory, and 3 of the pending tree tiles get memory.
287 // The pending tiles are not needed to avoid calimity (flickering or
288 // raster-on-demand) and the active tiles fit, so the soft limit is used.
289
290 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
291 TileVector active_tree_tiles =
292 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
293 TileVector pending_tree_tiles =
294 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
295
296 tile_manager()->AssignMemoryToTiles(global_state_);
297
298 EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
299 EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
300 }
301
302 TEST_P(TileManagerTest, TotalOOMMemoryToPending) {
303 // 10 tiles on active tree eventually bin, 10 tiles on pending tree that are
304 // required for activation, but only enough tiles for 4 tiles. The result
305 // is 4 pending tree tiles get memory, and none of the active tree tiles
306 // get memory.
307
308 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
309 TileVector active_tree_tiles =
310 CreateTiles(10, TilePriorityForEventualBin(), TilePriority());
311 TileVector pending_tree_tiles =
312 CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
313
314 tile_manager()->AssignMemoryToTiles(global_state_);
315
316 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
317 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
318
319 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
320 tile_manager()->AssignMemoryToTiles(global_state_);
321
322 if (UsingResourceLimit()) {
323 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
324 EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
325 } else {
326 // Pending tiles are now required to avoid calimity (flickering or
327 // raster-on-demand). Hard-limit is used and double the tiles fit.
328 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
329 EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
330 }
331 }
332
333 TEST_P(TileManagerTest, TotalOOMActiveSoonMemoryToPending) {
334 // 10 tiles on active tree soon bin, 10 tiles on pending tree that are
335 // required for activation, but only enough tiles for 4 tiles. The result
336 // is 4 pending tree tiles get memory, and none of the active tree tiles
337 // get memory.
338
339 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
340 TileVector active_tree_tiles =
341 CreateTiles(10, TilePriorityForSoonBin(), TilePriority());
342 TileVector pending_tree_tiles =
343 CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
344
345 tile_manager()->AssignMemoryToTiles(global_state_);
346
347 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
348 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
349
350 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
351 tile_manager()->AssignMemoryToTiles(global_state_);
352
353 if (UsingResourceLimit()) {
354 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
355 EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
356 } else {
357 // Pending tiles are now required to avoid calimity (flickering or
358 // raster-on-demand). Hard-limit is used and double the tiles fit.
359 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
360 EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
361 }
362 }
363
364 TEST_P(TileManagerTest, TotalOOMMemoryToActive) {
365 // 10 tiles on active tree eventually bin, 10 tiles on pending tree now bin,
366 // but only enough memory for 4 tiles. The result is 4 active tree tiles
367 // get memory, and none of the pending tree tiles get memory.
368
369 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
370 TileVector active_tree_tiles =
371 CreateTiles(10, TilePriorityForNowBin(), TilePriority());
372 TileVector pending_tree_tiles =
373 CreateTiles(10, TilePriority(), TilePriorityForNowBin());
374
375 tile_manager()->AssignMemoryToTiles(global_state_);
376
377 if (UsingResourceLimit()) {
378 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
379 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
380 } else {
381 // Active tiles are required to avoid calimity (flickering or
382 // raster-on-demand). Hard-limit is used and double the tiles fit.
383 EXPECT_EQ(8, AssignedMemoryCount(active_tree_tiles));
384 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
385 }
386 }
387
388 TEST_P(TileManagerTest, TotalOOMMemoryToNewContent) {
389 // 10 tiles on active tree now bin, 10 tiles on pending tree now bin,
390 // but only enough memory for 8 tiles. Any tile missing would cause
391 // a calamity (flickering or raster-on-demand). Depending on mode,
392 // we should use varying amounts of the higher hard memory limit.
393 if (UsingResourceLimit())
394 return;
395
396 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
397 TileVector active_tree_tiles =
398 CreateTiles(10, TilePriorityForNowBin(), TilePriority());
399 TileVector pending_tree_tiles =
400 CreateTiles(10, TilePriority(), TilePriorityForNowBin());
401
402 // Active tiles are required to avoid calimity. The hard-limit is used and all
403 // active-tiles fit. No pending tiles are needed to avoid calamity so only 10
404 // tiles total are used.
405 tile_manager()->AssignMemoryToTiles(global_state_);
406 EXPECT_EQ(10, AssignedMemoryCount(active_tree_tiles));
407 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
408
409 // Even the hard-limit won't save us now. All tiles are required to avoid
410 // a clamity but we only have 16. The tiles will be distribted randomly
411 // given they are identical, in practice depending on their screen location.
412 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
413 tile_manager()->AssignMemoryToTiles(global_state_);
414 EXPECT_EQ(16,
415 AssignedMemoryCount(active_tree_tiles) +
416 AssignedMemoryCount(pending_tree_tiles));
417
418 // The pending tree is now more important. Active tiles will take higher
419 // priority if they are ready-to-draw in practice. Importantly though,
420 // pending tiles also utilize the hard-limit.
421 SetTreePriority(NEW_CONTENT_TAKES_PRIORITY);
422 tile_manager()->AssignMemoryToTiles(global_state_);
423 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
424 EXPECT_EQ(10, AssignedMemoryCount(pending_tree_tiles));
425 }
426
427 TEST_P(TileManagerTest, RasterAsLCD) {
428 Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
429 TileVector active_tree_tiles =
430 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
431 TileVector pending_tree_tiles =
432 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
433
434 tile_manager()->AssignMemoryToTiles(global_state_);
435
436 EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
437 EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
438 }
439
440 TEST_P(TileManagerTest, RasterAsNoLCD) {
441 Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
442 TileVector active_tree_tiles =
443 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
444 TileVector pending_tree_tiles =
445 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
446
447 for (TileVector::iterator it = active_tree_tiles.begin();
448 it != active_tree_tiles.end();
449 ++it) {
450 (*it)->set_can_use_lcd_text(false);
451 }
452 for (TileVector::iterator it = pending_tree_tiles.begin();
453 it != pending_tree_tiles.end();
454 ++it) {
455 (*it)->set_can_use_lcd_text(false);
456 }
457
458 tile_manager()->AssignMemoryToTiles(global_state_);
459
460 EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
461 EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
462 }
463
464 TEST_P(TileManagerTest, ReRasterAsNoLCD) {
465 Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
466 TileVector active_tree_tiles =
467 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
468 TileVector pending_tree_tiles =
469 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
470
471 tile_manager()->AssignMemoryToTiles(global_state_);
472
473 EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
474 EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
475
476 for (TileVector::iterator it = active_tree_tiles.begin();
477 it != active_tree_tiles.end();
478 ++it) {
479 (*it)->set_can_use_lcd_text(false);
480 }
481 for (TileVector::iterator it = pending_tree_tiles.begin();
482 it != pending_tree_tiles.end();
483 ++it) {
484 (*it)->set_can_use_lcd_text(false);
485 }
486
487 tile_manager()->AssignMemoryToTiles(global_state_);
488
489 EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
490 EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
491 }
492
493 TEST_P(TileManagerTest, NoTextDontReRasterAsNoLCD) {
494 Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
495 TileVector active_tree_tiles =
496 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
497 TileVector pending_tree_tiles =
498 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
499
500 tile_manager()->AssignMemoryToTiles(global_state_);
501
502 EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
503 EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
504
505 for (TileVector::iterator it = active_tree_tiles.begin();
506 it != active_tree_tiles.end();
507 ++it) {
508 ManagedTileState::TileVersion& tile_version =
509 (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
510 tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
511 (*it)->set_can_use_lcd_text(false);
512 EXPECT_TRUE((*it)->IsReadyToDraw());
513 }
514 for (TileVector::iterator it = pending_tree_tiles.begin();
515 it != pending_tree_tiles.end();
516 ++it) {
517 ManagedTileState::TileVersion& tile_version =
518 (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
519 tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
520 (*it)->set_can_use_lcd_text(false);
521 EXPECT_TRUE((*it)->IsReadyToDraw());
522 }
523
524 tile_manager()->AssignMemoryToTiles(global_state_);
525
526 EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
527 EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
528 }
529
530 TEST_P(TileManagerTest, TextReRasterAsNoLCD) {
531 Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
532 TileVector active_tree_tiles =
533 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
534 TileVector pending_tree_tiles =
535 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
536
537 tile_manager()->AssignMemoryToTiles(global_state_);
538
539 EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
540 EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
541
542 for (TileVector::iterator it = active_tree_tiles.begin();
543 it != active_tree_tiles.end();
544 ++it) {
545 ManagedTileState::TileVersion& tile_version =
546 (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
547 tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
548 tile_version.SetHasTextForTesting(true);
549 (*it)->set_can_use_lcd_text(false);
550
551 EXPECT_TRUE((*it)->IsReadyToDraw());
552 }
553 for (TileVector::iterator it = pending_tree_tiles.begin();
554 it != pending_tree_tiles.end();
555 ++it) {
556 ManagedTileState::TileVersion& tile_version =
557 (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
558 tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
559 tile_version.SetHasTextForTesting(true);
560 (*it)->set_can_use_lcd_text(false);
561
562 EXPECT_TRUE((*it)->IsReadyToDraw());
563 }
564
565 tile_manager()->AssignMemoryToTiles(global_state_);
566
567 EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
568 EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
569 }
570
571 TEST_P(TileManagerTest, RespectMemoryLimit) {
572 if (UsingResourceLimit())
573 return;
574
575 Initialize(5, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
576
577 // We use double the tiles since the hard-limit is double.
578 TileVector large_tiles =
579 CreateTiles(10, TilePriorityForNowBin(), TilePriority());
580
581 size_t memory_required_bytes;
582 size_t memory_nice_to_have_bytes;
583 size_t memory_allocated_bytes;
584 size_t memory_used_bytes;
585
586 tile_manager()->AssignMemoryToTiles(global_state_);
587 tile_manager()->GetMemoryStats(&memory_required_bytes,
588 &memory_nice_to_have_bytes,
589 &memory_allocated_bytes,
590 &memory_used_bytes);
591 // Allocated bytes should never be more than the memory limit.
592 EXPECT_LE(memory_allocated_bytes, global_state_.hard_memory_limit_in_bytes);
593
594 // Finish raster of large tiles.
595 tile_manager()->UpdateVisibleTiles();
596
597 // Remove all large tiles. This will leave the memory currently
598 // used by these tiles as unused when AssignMemoryToTiles() is called.
599 large_tiles.clear();
600
601 // Create a new set of tiles using a different size. These tiles
602 // can use the memory currently assigned to the large tiles but
603 // they can't use the same resources as the size doesn't match.
604 TileVector small_tiles = CreateTilesWithSize(
605 10, TilePriorityForNowBin(), TilePriority(), gfx::Size(128, 128));
606
607 tile_manager()->AssignMemoryToTiles(global_state_);
608 tile_manager()->GetMemoryStats(&memory_required_bytes,
609 &memory_nice_to_have_bytes,
610 &memory_allocated_bytes,
611 &memory_used_bytes);
612 // Allocated bytes should never be more than the memory limit.
613 EXPECT_LE(memory_allocated_bytes, global_state_.hard_memory_limit_in_bytes);
614 }
615
616 // If true, the max tile limit should be applied as bytes; if false,
617 // as num_resources_limit.
618 INSTANTIATE_TEST_CASE_P(TileManagerTests,
619 TileManagerTest,
620 ::testing::Values(true, false));
621
622 class TileManagerTileIteratorTest : public testing::Test, 23 class TileManagerTileIteratorTest : public testing::Test,
623 public TileManagerClient { 24 public TileManagerClient {
624 public: 25 public:
625 TileManagerTileIteratorTest() 26 TileManagerTileIteratorTest()
626 : memory_limit_policy_(ALLOW_ANYTHING), 27 : memory_limit_policy_(ALLOW_ANYTHING),
627 max_tiles_(10000), 28 max_tiles_(10000),
628 ready_to_activate_(false), 29 ready_to_activate_(false),
629 id_(7), 30 id_(7),
630 proxy_(base::MessageLoopProxy::current()), 31 proxy_(base::MessageLoopProxy::current()),
631 host_impl_(ImplSidePaintingSettings(), 32 host_impl_(ImplSidePaintingSettings(),
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 152
752 scoped_ptr<FakePictureLayerImpl> active_layer = 153 scoped_ptr<FakePictureLayerImpl> active_layer =
753 FakePictureLayerImpl::Create(active_tree, 10); 154 FakePictureLayerImpl::Create(active_tree, 10);
754 scoped_ptr<FakePictureLayerImpl> pending_layer = 155 scoped_ptr<FakePictureLayerImpl> pending_layer =
755 FakePictureLayerImpl::Create(pending_tree, 10); 156 FakePictureLayerImpl::Create(pending_tree, 10);
756 157
757 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager(); 158 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
758 EXPECT_TRUE(tile_manager); 159 EXPECT_TRUE(tile_manager);
759 160
760 tile_manager->RegisterPictureLayerImpl(active_layer.get()); 161 tile_manager->RegisterPictureLayerImpl(active_layer.get());
162 active_layer->SetLayerNeedsToRegisterItselfForTesting(false);
761 tile_manager->RegisterPictureLayerImpl(pending_layer.get()); 163 tile_manager->RegisterPictureLayerImpl(pending_layer.get());
164 pending_layer->SetLayerNeedsToRegisterItselfForTesting(false);
762 165
763 std::vector<TileManager::PairedPictureLayer> paired_layers; 166 std::vector<TileManager::PairedPictureLayer> paired_layers;
764 tile_manager->GetPairedPictureLayers(&paired_layers); 167 tile_manager->GetPairedPictureLayers(&paired_layers);
765 168
766 EXPECT_EQ(2u, paired_layers.size()); 169 EXPECT_EQ(2u, paired_layers.size());
767 if (paired_layers[0].active_layer) { 170 if (paired_layers[0].active_layer) {
768 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer); 171 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
769 EXPECT_EQ(NULL, paired_layers[0].pending_layer); 172 EXPECT_EQ(NULL, paired_layers[0].pending_layer);
770 } else { 173 } else {
771 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer); 174 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
(...skipping 11 matching lines...) Expand all
783 active_layer->set_twin_layer(pending_layer.get()); 186 active_layer->set_twin_layer(pending_layer.get());
784 pending_layer->set_twin_layer(active_layer.get()); 187 pending_layer->set_twin_layer(active_layer.get());
785 188
786 tile_manager->GetPairedPictureLayers(&paired_layers); 189 tile_manager->GetPairedPictureLayers(&paired_layers);
787 EXPECT_EQ(1u, paired_layers.size()); 190 EXPECT_EQ(1u, paired_layers.size());
788 191
789 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer); 192 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
790 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer); 193 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
791 194
792 tile_manager->UnregisterPictureLayerImpl(active_layer.get()); 195 tile_manager->UnregisterPictureLayerImpl(active_layer.get());
196 active_layer->SetLayerNeedsToRegisterItselfForTesting(true);
793 tile_manager->UnregisterPictureLayerImpl(pending_layer.get()); 197 tile_manager->UnregisterPictureLayerImpl(pending_layer.get());
198 pending_layer->SetLayerNeedsToRegisterItselfForTesting(true);
794 } 199 }
795 200
796 TEST_F(TileManagerTileIteratorTest, RasterTileIterator) { 201 TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
797 SetupDefaultTrees(gfx::Size(1000, 1000)); 202 SetupDefaultTrees(gfx::Size(1000, 1000));
798 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager(); 203 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
799 EXPECT_TRUE(tile_manager); 204 EXPECT_TRUE(tile_manager);
800 205
801 active_layer_->CreateDefaultTilingsAndTiles(); 206 active_layer_->CreateDefaultTilingsAndTiles();
802 pending_layer_->CreateDefaultTilingsAndTiles(); 207 pending_layer_->CreateDefaultTilingsAndTiles();
803 208
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 516
1112 last_tile = tile; 517 last_tile = tile;
1113 new_content_tiles.insert(tile); 518 new_content_tiles.insert(tile);
1114 } 519 }
1115 520
1116 EXPECT_EQ(tile_count, new_content_tiles.size()); 521 EXPECT_EQ(tile_count, new_content_tiles.size());
1117 EXPECT_EQ(all_tiles, new_content_tiles); 522 EXPECT_EQ(all_tiles, new_content_tiles);
1118 } 523 }
1119 } // namespace 524 } // namespace
1120 } // namespace cc 525 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698