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

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

Issue 367833003: cc: Start using raster/eviction iterators. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: perf test fix Created 6 years, 5 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 const std::vector<PictureLayerImpl*>& GetPictureLayers() OVERRIDE {
87 return picture_layers_;
88 }
89 virtual void NotifyReadyToActivate() OVERRIDE { ready_to_activate_ = true; }
90 virtual void NotifyTileStateChanged(const Tile* tile) OVERRIDE {}
91
92 TileVector CreateTilesWithSize(int count,
93 TilePriority active_priority,
94 TilePriority pending_priority,
95 const gfx::Size& tile_size) {
96 TileVector tiles;
97 for (int i = 0; i < count; ++i) {
98 scoped_refptr<Tile> tile = tile_manager_->CreateTile(picture_pile_.get(),
99 tile_size,
100 gfx::Rect(),
101 gfx::Rect(),
102 1.0,
103 0,
104 0,
105 0);
106 tile->SetPriority(ACTIVE_TREE, active_priority);
107 tile->SetPriority(PENDING_TREE, pending_priority);
108 tiles.push_back(tile);
109 }
110 return tiles;
111 }
112
113 TileVector CreateTiles(int count,
114 TilePriority active_priority,
115 TilePriority pending_priority) {
116 return CreateTilesWithSize(
117 count, active_priority, pending_priority, settings_.default_tile_size);
118 }
119
120 FakeTileManager* tile_manager() { return tile_manager_.get(); }
121
122 int AssignedMemoryCount(const TileVector& tiles) {
123 int has_memory_count = 0;
124 for (TileVector::const_iterator it = tiles.begin(); it != tiles.end();
125 ++it) {
126 if (tile_manager_->HasBeenAssignedMemory(*it))
127 ++has_memory_count;
128 }
129 return has_memory_count;
130 }
131
132 bool ready_to_activate() const { return ready_to_activate_; }
133
134 // The parametrization specifies whether the max tile limit should
135 // be applied to memory or resources.
136 bool UsingResourceLimit() { return !GetParam(); }
137 bool UsingMemoryLimit() { return GetParam(); }
138
139 protected:
140 GlobalStateThatImpactsTilePriority global_state_;
141
142 private:
143 LayerTreeSettings settings_;
144 scoped_ptr<FakeTileManager> tile_manager_;
145 scoped_refptr<FakePicturePileImpl> picture_pile_;
146 FakeOutputSurfaceClient output_surface_client_;
147 scoped_ptr<FakeOutputSurface> output_surface_;
148 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
149 scoped_ptr<ResourceProvider> resource_provider_;
150 scoped_ptr<ResourcePool> resource_pool_;
151 TileMemoryLimitPolicy memory_limit_policy_;
152 int max_tiles_;
153 bool ready_to_activate_;
154 std::vector<PictureLayerImpl*> picture_layers_;
155 };
156
157 TEST_P(TileManagerTest, EnoughMemoryAllowAnything) {
158 // A few tiles of each type of priority, with enough memory for all tiles.
159
160 Initialize(10, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
161 TileVector active_now =
162 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
163 TileVector pending_now =
164 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
165 TileVector active_pending_soon =
166 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
167 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
168
169 tile_manager()->AssignMemoryToTiles(global_state_);
170
171 EXPECT_EQ(3, AssignedMemoryCount(active_now));
172 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
173 EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
174 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
175 }
176
177 TEST_P(TileManagerTest, EnoughMemoryAllowPrepaintOnly) {
178 // A few tiles of each type of priority, with enough memory for all tiles,
179 // with the exception of never bin.
180
181 Initialize(10, ALLOW_PREPAINT_ONLY, SMOOTHNESS_TAKES_PRIORITY);
182 TileVector active_now =
183 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
184 TileVector pending_now =
185 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
186 TileVector active_pending_soon =
187 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
188 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
189
190 tile_manager()->AssignMemoryToTiles(global_state_);
191
192 EXPECT_EQ(3, AssignedMemoryCount(active_now));
193 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
194 EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
195 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
196 }
197
198 TEST_P(TileManagerTest, EnoughMemoryPendingLowResAllowAbsoluteMinimum) {
199 // A few low-res tiles required for activation, with enough memory for all
200 // tiles.
201
202 Initialize(5, ALLOW_ABSOLUTE_MINIMUM, SAME_PRIORITY_FOR_BOTH_TREES);
203 TileVector pending_low_res =
204 CreateTiles(5, TilePriority(), TilePriorityLowRes());
205
206 tile_manager()->AssignMemoryToTiles(global_state_);
207
208 EXPECT_EQ(5, AssignedMemoryCount(pending_low_res));
209 }
210
211 TEST_P(TileManagerTest, EnoughMemoryAllowAbsoluteMinimum) {
212 // A few tiles of each type of priority, with enough memory for all tiles,
213 // with the exception of never and soon bins.
214
215 Initialize(10, ALLOW_ABSOLUTE_MINIMUM, SMOOTHNESS_TAKES_PRIORITY);
216 TileVector active_now =
217 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
218 TileVector pending_now =
219 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
220 TileVector active_pending_soon =
221 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
222 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
223
224 tile_manager()->AssignMemoryToTiles(global_state_);
225
226 EXPECT_EQ(3, AssignedMemoryCount(active_now));
227 EXPECT_EQ(3, AssignedMemoryCount(pending_now));
228 EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
229 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
230 }
231
232 TEST_P(TileManagerTest, EnoughMemoryAllowNothing) {
233 // A few tiles of each type of priority, with enough memory for all tiles,
234 // but allow nothing should not assign any memory.
235
236 Initialize(10, ALLOW_NOTHING, SMOOTHNESS_TAKES_PRIORITY);
237 TileVector active_now =
238 CreateTiles(3, TilePriorityForNowBin(), TilePriority());
239 TileVector pending_now =
240 CreateTiles(3, TilePriority(), TilePriorityForNowBin());
241 TileVector active_pending_soon =
242 CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
243 TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
244
245 tile_manager()->AssignMemoryToTiles(global_state_);
246
247 EXPECT_EQ(0, AssignedMemoryCount(active_now));
248 EXPECT_EQ(0, AssignedMemoryCount(pending_now));
249 EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
250 EXPECT_EQ(0, AssignedMemoryCount(never_bin));
251 }
252
253 TEST_P(TileManagerTest, PartialOOMMemoryToPending) {
254 // 5 tiles on active tree eventually bin, 5 tiles on pending tree that are
255 // required for activation, but only enough memory for 8 tiles. The result
256 // is all pending tree tiles get memory, and 3 of the active tree tiles
257 // get memory. None of these tiles is needed to avoid calimity (flickering or
258 // raster-on-demand) so the soft memory limit is used.
259
260 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
261 TileVector active_tree_tiles =
262 CreateTiles(5, TilePriorityForEventualBin(), TilePriority());
263 TileVector pending_tree_tiles =
264 CreateTiles(5, TilePriority(), TilePriorityRequiredForActivation());
265 tile_manager()->AssignMemoryToTiles(global_state_);
266
267 EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
268 EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
269
270 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
271 tile_manager()->AssignMemoryToTiles(global_state_);
272
273 EXPECT_EQ(3, AssignedMemoryCount(active_tree_tiles));
274 EXPECT_EQ(5, AssignedMemoryCount(pending_tree_tiles));
275 }
276
277 TEST_P(TileManagerTest, PartialOOMMemoryToActive) {
278 // 5 tiles on active tree eventually bin, 5 tiles on pending tree now bin,
279 // but only enough memory for 8 tiles. The result is all active tree tiles
280 // get memory, and 3 of the pending tree tiles get memory.
281 // The pending tiles are not needed to avoid calimity (flickering or
282 // raster-on-demand) and the active tiles fit, so the soft limit is used.
283
284 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
285 TileVector active_tree_tiles =
286 CreateTiles(5, TilePriorityForNowBin(), TilePriority());
287 TileVector pending_tree_tiles =
288 CreateTiles(5, TilePriority(), TilePriorityForNowBin());
289
290 tile_manager()->AssignMemoryToTiles(global_state_);
291
292 EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
293 EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
294 }
295
296 TEST_P(TileManagerTest, TotalOOMMemoryToPending) {
297 // 10 tiles on active tree eventually bin, 10 tiles on pending tree that are
298 // required for activation, but only enough tiles for 4 tiles. The result
299 // is 4 pending tree tiles get memory, and none of the active tree tiles
300 // get memory.
301
302 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
303 TileVector active_tree_tiles =
304 CreateTiles(10, TilePriorityForEventualBin(), TilePriority());
305 TileVector pending_tree_tiles =
306 CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
307
308 tile_manager()->AssignMemoryToTiles(global_state_);
309
310 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
311 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
312
313 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
314 tile_manager()->AssignMemoryToTiles(global_state_);
315
316 if (UsingResourceLimit()) {
317 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
318 EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
319 } else {
320 // Pending tiles are now required to avoid calimity (flickering or
321 // raster-on-demand). Hard-limit is used and double the tiles fit.
322 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
323 EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
324 }
325 }
326
327 TEST_P(TileManagerTest, TotalOOMActiveSoonMemoryToPending) {
328 // 10 tiles on active tree soon bin, 10 tiles on pending tree that are
329 // required for activation, but only enough tiles for 4 tiles. The result
330 // is 4 pending tree tiles get memory, and none of the active tree tiles
331 // get memory.
332
333 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
334 TileVector active_tree_tiles =
335 CreateTiles(10, TilePriorityForSoonBin(), TilePriority());
336 TileVector pending_tree_tiles =
337 CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
338
339 tile_manager()->AssignMemoryToTiles(global_state_);
340
341 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
342 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
343
344 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
345 tile_manager()->AssignMemoryToTiles(global_state_);
346
347 if (UsingResourceLimit()) {
348 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
349 EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
350 } else {
351 // Pending tiles are now required to avoid calimity (flickering or
352 // raster-on-demand). Hard-limit is used and double the tiles fit.
353 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
354 EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
355 }
356 }
357
358 TEST_P(TileManagerTest, TotalOOMMemoryToActive) {
359 // 10 tiles on active tree eventually bin, 10 tiles on pending tree now bin,
360 // but only enough memory for 4 tiles. The result is 4 active tree tiles
361 // get memory, and none of the pending tree tiles get memory.
362
363 Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
364 TileVector active_tree_tiles =
365 CreateTiles(10, TilePriorityForNowBin(), TilePriority());
366 TileVector pending_tree_tiles =
367 CreateTiles(10, TilePriority(), TilePriorityForNowBin());
368
369 tile_manager()->AssignMemoryToTiles(global_state_);
370
371 if (UsingResourceLimit()) {
372 EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
373 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
374 } else {
375 // Active tiles are required to avoid calimity (flickering or
376 // raster-on-demand). Hard-limit is used and double the tiles fit.
377 EXPECT_EQ(8, AssignedMemoryCount(active_tree_tiles));
378 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
379 }
380 }
381
382 TEST_P(TileManagerTest, TotalOOMMemoryToNewContent) {
383 // 10 tiles on active tree now bin, 10 tiles on pending tree now bin,
384 // but only enough memory for 8 tiles. Any tile missing would cause
385 // a calamity (flickering or raster-on-demand). Depending on mode,
386 // we should use varying amounts of the higher hard memory limit.
387 if (UsingResourceLimit())
388 return;
389
390 Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
391 TileVector active_tree_tiles =
392 CreateTiles(10, TilePriorityForNowBin(), TilePriority());
393 TileVector pending_tree_tiles =
394 CreateTiles(10, TilePriority(), TilePriorityForNowBin());
395
396 // Active tiles are required to avoid calimity. The hard-limit is used and all
397 // active-tiles fit. No pending tiles are needed to avoid calamity so only 10
398 // tiles total are used.
399 tile_manager()->AssignMemoryToTiles(global_state_);
400 EXPECT_EQ(10, AssignedMemoryCount(active_tree_tiles));
401 EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
402
403 // Even the hard-limit won't save us now. All tiles are required to avoid
404 // a clamity but we only have 16. The tiles will be distribted randomly
405 // given they are identical, in practice depending on their screen location.
406 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
407 tile_manager()->AssignMemoryToTiles(global_state_);
408 EXPECT_EQ(16,
409 AssignedMemoryCount(active_tree_tiles) +
410 AssignedMemoryCount(pending_tree_tiles));
411
412 // The pending tree is now more important. Active tiles will take higher
413 // priority if they are ready-to-draw in practice. Importantly though,
414 // pending tiles also utilize the hard-limit.
415 SetTreePriority(NEW_CONTENT_TAKES_PRIORITY);
416 tile_manager()->AssignMemoryToTiles(global_state_);
417 EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
418 EXPECT_EQ(10, AssignedMemoryCount(pending_tree_tiles));
419 }
420
421 // If true, the max tile limit should be applied as bytes; if false,
422 // as num_resources_limit.
423 INSTANTIATE_TEST_CASE_P(TileManagerTests,
424 TileManagerTest,
425 ::testing::Values(true, false));
426
427 class TileManagerTileIteratorTest : public testing::Test { 23 class TileManagerTileIteratorTest : public testing::Test {
428 public: 24 public:
429 TileManagerTileIteratorTest() 25 TileManagerTileIteratorTest()
430 : memory_limit_policy_(ALLOW_ANYTHING), 26 : memory_limit_policy_(ALLOW_ANYTHING),
431 max_tiles_(10000), 27 max_tiles_(10000),
432 ready_to_activate_(false), 28 ready_to_activate_(false),
433 id_(7), 29 id_(7),
434 proxy_(base::MessageLoopProxy::current()), 30 proxy_(base::MessageLoopProxy::current()),
435 host_impl_(ImplSidePaintingSettings(), 31 host_impl_(ImplSidePaintingSettings(),
436 &proxy_, 32 &proxy_,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 TileMemoryLimitPolicy memory_limit_policy_; 126 TileMemoryLimitPolicy memory_limit_policy_;
531 int max_tiles_; 127 int max_tiles_;
532 bool ready_to_activate_; 128 bool ready_to_activate_;
533 int id_; 129 int id_;
534 FakeImplProxy proxy_; 130 FakeImplProxy proxy_;
535 FakeLayerTreeHostImpl host_impl_; 131 FakeLayerTreeHostImpl host_impl_;
536 FakePictureLayerImpl* pending_layer_; 132 FakePictureLayerImpl* pending_layer_;
537 FakePictureLayerImpl* active_layer_; 133 FakePictureLayerImpl* active_layer_;
538 }; 134 };
539 135
540 TEST_F(TileManagerTileIteratorTest, PairedPictureLayers) { 136 TEST_F(TileManagerTileIteratorTest, RasterTilePriorityQueue) {
541 host_impl_.CreatePendingTree();
542 host_impl_.ActivateSyncTree();
543 host_impl_.CreatePendingTree();
544
545 LayerTreeImpl* active_tree = host_impl_.active_tree();
546 LayerTreeImpl* pending_tree = host_impl_.pending_tree();
547 EXPECT_NE(active_tree, pending_tree);
548
549 scoped_ptr<FakePictureLayerImpl> active_layer =
550 FakePictureLayerImpl::Create(active_tree, 10);
551 scoped_ptr<FakePictureLayerImpl> pending_layer =
552 FakePictureLayerImpl::Create(pending_tree, 10);
553
554 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
555 EXPECT_TRUE(tile_manager);
556
557 std::vector<TileManager::PairedPictureLayer> paired_layers;
558 tile_manager->GetPairedPictureLayers(&paired_layers);
559
560 EXPECT_EQ(2u, paired_layers.size());
561 if (paired_layers[0].active_layer) {
562 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
563 EXPECT_EQ(NULL, paired_layers[0].pending_layer);
564 } else {
565 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
566 EXPECT_EQ(NULL, paired_layers[0].active_layer);
567 }
568
569 if (paired_layers[1].active_layer) {
570 EXPECT_EQ(active_layer.get(), paired_layers[1].active_layer);
571 EXPECT_EQ(NULL, paired_layers[1].pending_layer);
572 } else {
573 EXPECT_EQ(pending_layer.get(), paired_layers[1].pending_layer);
574 EXPECT_EQ(NULL, paired_layers[1].active_layer);
575 }
576
577 active_layer->set_twin_layer(pending_layer.get());
578 pending_layer->set_twin_layer(active_layer.get());
579
580 tile_manager->GetPairedPictureLayers(&paired_layers);
581 EXPECT_EQ(1u, paired_layers.size());
582
583 EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
584 EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
585 }
586
587 TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
588 SetupDefaultTrees(gfx::Size(1000, 1000)); 137 SetupDefaultTrees(gfx::Size(1000, 1000));
589 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
590 EXPECT_TRUE(tile_manager);
591 138
592 active_layer_->CreateDefaultTilingsAndTiles(); 139 active_layer_->CreateDefaultTilingsAndTiles();
593 pending_layer_->CreateDefaultTilingsAndTiles(); 140 pending_layer_->CreateDefaultTilingsAndTiles();
594 141
595 std::vector<TileManager::PairedPictureLayer> paired_layers; 142 std::vector<PairedPictureLayer> paired_layers;
596 tile_manager->GetPairedPictureLayers(&paired_layers); 143 host_impl_.GetPairedPictureLayers(&paired_layers);
597 EXPECT_EQ(1u, paired_layers.size()); 144 EXPECT_EQ(1u, paired_layers.size());
598 145
599 TileManager::RasterTileIterator it(tile_manager, 146 TilePriorityQueue* queue =
600 SAME_PRIORITY_FOR_BOTH_TREES); 147 host_impl_.RebuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES);
601 EXPECT_TRUE(it); 148 EXPECT_FALSE(queue->IsEmpty());
602 149
603 size_t tile_count = 0; 150 size_t tile_count = 0;
604 std::set<Tile*> all_tiles; 151 std::set<Tile*> all_tiles;
605 for (; it; ++it) { 152 for (; !queue->IsEmpty(); queue->Pop()) {
606 EXPECT_TRUE(*it); 153 Tile* tile = queue->Top();
607 all_tiles.insert(*it); 154 EXPECT_TRUE(tile);
155 all_tiles.insert(tile);
608 ++tile_count; 156 ++tile_count;
609 } 157 }
610 158
611 EXPECT_EQ(tile_count, all_tiles.size()); 159 EXPECT_EQ(tile_count, all_tiles.size());
612 EXPECT_EQ(17u, tile_count); 160 EXPECT_EQ(17u, tile_count);
613 161
614 // Sanity check, all tiles should be visible. 162 // Sanity check, all tiles should be visible.
615 std::set<Tile*> smoothness_tiles; 163 std::set<Tile*> smoothness_tiles;
616 for (TileManager::RasterTileIterator it(tile_manager, 164 queue = host_impl_.RebuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY);
617 SMOOTHNESS_TAKES_PRIORITY); 165 for (; !queue->IsEmpty(); queue->Pop()) {
618 it; 166 Tile* tile = queue->Top();
619 ++it) {
620 Tile* tile = *it;
621 EXPECT_TRUE(tile); 167 EXPECT_TRUE(tile);
622 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); 168 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
623 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); 169 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
624 smoothness_tiles.insert(tile); 170 smoothness_tiles.insert(tile);
625 } 171 }
626 EXPECT_EQ(all_tiles, smoothness_tiles); 172 EXPECT_EQ(all_tiles, smoothness_tiles);
627 173
628 Region invalidation(gfx::Rect(0, 0, 500, 500)); 174 Region invalidation(gfx::Rect(0, 0, 500, 500));
629 175
630 // Invalidate the pending tree. 176 // Invalidate the pending tree.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 ACTIVE_TREE, 211 ACTIVE_TREE,
666 viewport, 212 viewport,
667 1.0f, 213 1.0f,
668 1.0, 214 1.0,
669 NULL, 215 NULL,
670 active_layer_->render_target(), 216 active_layer_->render_target(),
671 active_layer_->draw_transform()); 217 active_layer_->draw_transform());
672 218
673 // Populate all tiles directly from the tilings. 219 // Populate all tiles directly from the tilings.
674 all_tiles.clear(); 220 all_tiles.clear();
221 pending_layer_->HighResTiling()->CreateAllTilesForTesting();
675 std::vector<Tile*> pending_high_res_tiles = 222 std::vector<Tile*> pending_high_res_tiles =
676 pending_layer_->HighResTiling()->AllTilesForTesting(); 223 pending_layer_->HighResTiling()->AllTilesForTesting();
677 for (size_t i = 0; i < pending_high_res_tiles.size(); ++i) 224 for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
678 all_tiles.insert(pending_high_res_tiles[i]); 225 all_tiles.insert(pending_high_res_tiles[i]);
679 226
227 pending_layer_->LowResTiling()->CreateAllTilesForTesting();
680 std::vector<Tile*> pending_low_res_tiles = 228 std::vector<Tile*> pending_low_res_tiles =
681 pending_layer_->LowResTiling()->AllTilesForTesting(); 229 pending_layer_->LowResTiling()->AllTilesForTesting();
682 for (size_t i = 0; i < pending_low_res_tiles.size(); ++i) 230 for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
683 all_tiles.insert(pending_low_res_tiles[i]); 231 all_tiles.insert(pending_low_res_tiles[i]);
684 232
233 active_layer_->HighResTiling()->CreateAllTilesForTesting();
685 std::vector<Tile*> active_high_res_tiles = 234 std::vector<Tile*> active_high_res_tiles =
686 active_layer_->HighResTiling()->AllTilesForTesting(); 235 active_layer_->HighResTiling()->AllTilesForTesting();
687 for (size_t i = 0; i < active_high_res_tiles.size(); ++i) 236 for (size_t i = 0; i < active_high_res_tiles.size(); ++i)
688 all_tiles.insert(active_high_res_tiles[i]); 237 all_tiles.insert(active_high_res_tiles[i]);
689 238
239 active_layer_->LowResTiling()->CreateAllTilesForTesting();
690 std::vector<Tile*> active_low_res_tiles = 240 std::vector<Tile*> active_low_res_tiles =
691 active_layer_->LowResTiling()->AllTilesForTesting(); 241 active_layer_->LowResTiling()->AllTilesForTesting();
692 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) 242 for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
693 all_tiles.insert(active_low_res_tiles[i]); 243 all_tiles.insert(active_low_res_tiles[i]);
694 244
695 Tile* last_tile = NULL; 245 Tile* last_tile = NULL;
696 smoothness_tiles.clear(); 246 smoothness_tiles.clear();
697 tile_count = 0; 247 tile_count = 0;
698 size_t increasing_distance_tiles = 0u; 248 size_t increasing_distance_tiles = 0u;
699 // Here we expect to get increasing ACTIVE_TREE priority_bin. 249 // Here we expect to get increasing ACTIVE_TREE priority_bin.
700 for (TileManager::RasterTileIterator it(tile_manager, 250 queue = host_impl_.RebuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY);
701 SMOOTHNESS_TAKES_PRIORITY); 251 for (; !queue->IsEmpty(); queue->Pop()) {
702 it; 252 Tile* tile = queue->Top();
703 ++it) {
704 Tile* tile = *it;
705 EXPECT_TRUE(tile); 253 EXPECT_TRUE(tile);
706 254
707 if (!last_tile) 255 if (!last_tile)
708 last_tile = tile; 256 last_tile = tile;
709 257
710 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin, 258 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin,
711 tile->priority(ACTIVE_TREE).priority_bin); 259 tile->priority(ACTIVE_TREE).priority_bin);
712 if (last_tile->priority(ACTIVE_TREE).priority_bin == 260 if (last_tile->priority(ACTIVE_TREE).priority_bin ==
713 tile->priority(ACTIVE_TREE).priority_bin) { 261 tile->priority(ACTIVE_TREE).priority_bin) {
714 increasing_distance_tiles += 262 increasing_distance_tiles +=
(...skipping 16 matching lines...) Expand all
731 EXPECT_EQ(tile_count, smoothness_tiles.size()); 279 EXPECT_EQ(tile_count, smoothness_tiles.size());
732 EXPECT_EQ(all_tiles, smoothness_tiles); 280 EXPECT_EQ(all_tiles, smoothness_tiles);
733 // Since we don't guarantee increasing distance due to spiral iterator, we 281 // Since we don't guarantee increasing distance due to spiral iterator, we
734 // should check that we're _mostly_ right. 282 // should check that we're _mostly_ right.
735 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4); 283 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
736 284
737 std::set<Tile*> new_content_tiles; 285 std::set<Tile*> new_content_tiles;
738 last_tile = NULL; 286 last_tile = NULL;
739 increasing_distance_tiles = 0u; 287 increasing_distance_tiles = 0u;
740 // Here we expect to get increasing PENDING_TREE priority_bin. 288 // Here we expect to get increasing PENDING_TREE priority_bin.
741 for (TileManager::RasterTileIterator it(tile_manager, 289 queue = host_impl_.RebuildRasterQueue(NEW_CONTENT_TAKES_PRIORITY);
742 NEW_CONTENT_TAKES_PRIORITY); 290 for (; !queue->IsEmpty(); queue->Pop()) {
743 it; 291 Tile* tile = queue->Top();
744 ++it) {
745 Tile* tile = *it;
746 EXPECT_TRUE(tile); 292 EXPECT_TRUE(tile);
747 293
748 if (!last_tile) 294 if (!last_tile)
749 last_tile = tile; 295 last_tile = tile;
750 296
751 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin, 297 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin,
752 tile->priority(PENDING_TREE).priority_bin); 298 tile->priority(PENDING_TREE).priority_bin);
753 if (last_tile->priority(PENDING_TREE).priority_bin == 299 if (last_tile->priority(PENDING_TREE).priority_bin ==
754 tile->priority(PENDING_TREE).priority_bin) { 300 tile->priority(PENDING_TREE).priority_bin) {
755 increasing_distance_tiles += 301 increasing_distance_tiles +=
(...skipping 12 matching lines...) Expand all
768 new_content_tiles.insert(tile); 314 new_content_tiles.insert(tile);
769 } 315 }
770 316
771 EXPECT_EQ(tile_count, new_content_tiles.size()); 317 EXPECT_EQ(tile_count, new_content_tiles.size());
772 EXPECT_EQ(all_tiles, new_content_tiles); 318 EXPECT_EQ(all_tiles, new_content_tiles);
773 // Since we don't guarantee increasing distance due to spiral iterator, we 319 // Since we don't guarantee increasing distance due to spiral iterator, we
774 // should check that we're _mostly_ right. 320 // should check that we're _mostly_ right.
775 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4); 321 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
776 } 322 }
777 323
778 TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) { 324 TEST_F(TileManagerTileIteratorTest, EvictionTileQueue) {
779 SetupDefaultTrees(gfx::Size(1000, 1000)); 325 SetupDefaultTrees(gfx::Size(1000, 1000));
780 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
781 EXPECT_TRUE(tile_manager);
782 326
783 active_layer_->CreateDefaultTilingsAndTiles(); 327 active_layer_->CreateDefaultTilingsAndTiles();
784 pending_layer_->CreateDefaultTilingsAndTiles(); 328 pending_layer_->CreateDefaultTilingsAndTiles();
785 329
786 std::vector<TileManager::PairedPictureLayer> paired_layers; 330 std::vector<PairedPictureLayer> paired_layers;
787 tile_manager->GetPairedPictureLayers(&paired_layers); 331 host_impl_.GetPairedPictureLayers(&paired_layers);
788 EXPECT_EQ(1u, paired_layers.size()); 332 EXPECT_EQ(1u, paired_layers.size());
789 333
790 TileManager::EvictionTileIterator empty_it(tile_manager, 334 TilePriorityQueue* empty_queue =
791 SAME_PRIORITY_FOR_BOTH_TREES); 335 host_impl_.RebuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
792 EXPECT_FALSE(empty_it); 336 EXPECT_TRUE(empty_queue->IsEmpty());
793 std::set<Tile*> all_tiles; 337 std::set<Tile*> all_tiles;
794 size_t tile_count = 0; 338 size_t tile_count = 0;
795 339
796 for (TileManager::RasterTileIterator raster_it(tile_manager, 340 TilePriorityQueue* raster_queue =
797 SAME_PRIORITY_FOR_BOTH_TREES); 341 host_impl_.RebuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES);
798 raster_it; 342 for (; !raster_queue->IsEmpty(); raster_queue->Pop()) {
799 ++raster_it) { 343 Tile* tile = raster_queue->Top();
800 ++tile_count; 344 ++tile_count;
801 EXPECT_TRUE(*raster_it); 345 EXPECT_TRUE(tile);
802 all_tiles.insert(*raster_it); 346 all_tiles.insert(tile);
803 } 347 }
804 348
805 EXPECT_EQ(tile_count, all_tiles.size()); 349 EXPECT_EQ(tile_count, all_tiles.size());
806 EXPECT_EQ(17u, tile_count); 350 EXPECT_EQ(17u, tile_count);
807 351
352 TileManager* tile_manager = host_impl_.tile_manager();
353 ASSERT_TRUE(tile_manager);
354
808 tile_manager->InitializeTilesWithResourcesForTesting( 355 tile_manager->InitializeTilesWithResourcesForTesting(
809 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 356 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
810 357
811 TileManager::EvictionTileIterator it(tile_manager, SMOOTHNESS_TAKES_PRIORITY); 358 TilePriorityQueue* eviction_queue =
812 EXPECT_TRUE(it); 359 host_impl_.RebuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY);
360 EXPECT_FALSE(eviction_queue->IsEmpty());
813 361
814 // Sanity check, all tiles should be visible. 362 // Sanity check, all tiles should be visible.
815 std::set<Tile*> smoothness_tiles; 363 std::set<Tile*> smoothness_tiles;
816 for (; it; ++it) { 364 for (; !eviction_queue->IsEmpty(); eviction_queue->Pop()) {
817 Tile* tile = *it; 365 Tile* tile = eviction_queue->Top();
818 EXPECT_TRUE(tile); 366 EXPECT_TRUE(tile);
819 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); 367 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
820 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); 368 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
821 EXPECT_TRUE(tile->HasResources()); 369 EXPECT_TRUE(tile->HasResources());
822 smoothness_tiles.insert(tile); 370 smoothness_tiles.insert(tile);
823 } 371 }
824 EXPECT_EQ(all_tiles, smoothness_tiles); 372 EXPECT_EQ(all_tiles, smoothness_tiles);
825 373
826 tile_manager->ReleaseTileResourcesForTesting( 374 tile_manager->ReleaseTileResourcesForTesting(
827 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 375 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) 441 for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
894 all_tiles.insert(active_low_res_tiles[i]); 442 all_tiles.insert(active_low_res_tiles[i]);
895 443
896 tile_manager->InitializeTilesWithResourcesForTesting( 444 tile_manager->InitializeTilesWithResourcesForTesting(
897 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 445 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
898 446
899 Tile* last_tile = NULL; 447 Tile* last_tile = NULL;
900 smoothness_tiles.clear(); 448 smoothness_tiles.clear();
901 tile_count = 0; 449 tile_count = 0;
902 // Here we expect to get increasing ACTIVE_TREE priority_bin. 450 // Here we expect to get increasing ACTIVE_TREE priority_bin.
903 for (TileManager::EvictionTileIterator it(tile_manager, 451 eviction_queue = host_impl_.RebuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY);
904 SMOOTHNESS_TAKES_PRIORITY); 452 for (; !eviction_queue->IsEmpty(); eviction_queue->Pop()) {
905 it; 453 Tile* tile = eviction_queue->Top();
906 ++it) {
907 Tile* tile = *it;
908 EXPECT_TRUE(tile); 454 EXPECT_TRUE(tile);
909 EXPECT_TRUE(tile->HasResources()); 455 EXPECT_TRUE(tile->HasResources());
910 456
911 if (!last_tile) 457 if (!last_tile)
912 last_tile = tile; 458 last_tile = tile;
913 459
914 EXPECT_GE(last_tile->priority(ACTIVE_TREE).priority_bin, 460 EXPECT_GE(last_tile->priority(ACTIVE_TREE).priority_bin,
915 tile->priority(ACTIVE_TREE).priority_bin); 461 tile->priority(ACTIVE_TREE).priority_bin);
916 if (last_tile->priority(ACTIVE_TREE).priority_bin == 462 if (last_tile->priority(ACTIVE_TREE).priority_bin ==
917 tile->priority(ACTIVE_TREE).priority_bin) { 463 tile->priority(ACTIVE_TREE).priority_bin) {
918 EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible, 464 EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible,
919 tile->priority(ACTIVE_TREE).distance_to_visible); 465 tile->priority(ACTIVE_TREE).distance_to_visible);
920 } 466 }
921 467
922 last_tile = tile; 468 last_tile = tile;
923 ++tile_count; 469 ++tile_count;
924 smoothness_tiles.insert(tile); 470 smoothness_tiles.insert(tile);
925 } 471 }
926 472
927 EXPECT_EQ(tile_count, smoothness_tiles.size()); 473 EXPECT_EQ(tile_count, smoothness_tiles.size());
928 EXPECT_EQ(all_tiles, smoothness_tiles); 474 EXPECT_EQ(all_tiles, smoothness_tiles);
929 475
930 std::set<Tile*> new_content_tiles; 476 std::set<Tile*> new_content_tiles;
931 last_tile = NULL; 477 last_tile = NULL;
932 // Here we expect to get increasing PENDING_TREE priority_bin. 478 // Here we expect to get increasing PENDING_TREE priority_bin.
933 for (TileManager::EvictionTileIterator it(tile_manager, 479 eviction_queue = host_impl_.RebuildEvictionQueue(NEW_CONTENT_TAKES_PRIORITY);
934 NEW_CONTENT_TAKES_PRIORITY); 480 for (; !eviction_queue->IsEmpty(); eviction_queue->Pop()) {
935 it; 481 Tile* tile = eviction_queue->Top();
936 ++it) {
937 Tile* tile = *it;
938 EXPECT_TRUE(tile); 482 EXPECT_TRUE(tile);
939 483
940 if (!last_tile) 484 if (!last_tile)
941 last_tile = tile; 485 last_tile = tile;
942 486
943 EXPECT_GE(last_tile->priority(PENDING_TREE).priority_bin, 487 EXPECT_GE(last_tile->priority(PENDING_TREE).priority_bin,
944 tile->priority(PENDING_TREE).priority_bin); 488 tile->priority(PENDING_TREE).priority_bin);
945 if (last_tile->priority(PENDING_TREE).priority_bin == 489 if (last_tile->priority(PENDING_TREE).priority_bin ==
946 tile->priority(PENDING_TREE).priority_bin) { 490 tile->priority(PENDING_TREE).priority_bin) {
947 EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible, 491 EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible,
948 tile->priority(PENDING_TREE).distance_to_visible); 492 tile->priority(PENDING_TREE).distance_to_visible);
949 } 493 }
950 494
951 last_tile = tile; 495 last_tile = tile;
952 new_content_tiles.insert(tile); 496 new_content_tiles.insert(tile);
953 } 497 }
954 498
955 EXPECT_EQ(tile_count, new_content_tiles.size()); 499 EXPECT_EQ(tile_count, new_content_tiles.size());
956 EXPECT_EQ(all_tiles, new_content_tiles); 500 EXPECT_EQ(all_tiles, new_content_tiles);
957 } 501 }
958 } // namespace 502 } // namespace
959 } // namespace cc 503 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698