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

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: update 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 RasterTilePriorityQueue queue;
596 tile_manager->GetPairedPictureLayers(&paired_layers); 143 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
597 EXPECT_EQ(1u, paired_layers.size()); 144 EXPECT_FALSE(queue.IsEmpty());
598
599 TileManager::RasterTileIterator it(tile_manager,
600 SAME_PRIORITY_FOR_BOTH_TREES);
601 EXPECT_TRUE(it);
602 145
603 size_t tile_count = 0; 146 size_t tile_count = 0;
604 std::set<Tile*> all_tiles; 147 std::set<Tile*> all_tiles;
605 for (; it; ++it) { 148 for (; !queue.IsEmpty(); queue.Pop()) {
606 EXPECT_TRUE(*it); 149 Tile* tile = queue.Top();
607 all_tiles.insert(*it); 150 EXPECT_TRUE(tile);
151 all_tiles.insert(tile);
608 ++tile_count; 152 ++tile_count;
609 } 153 }
610 154
611 EXPECT_EQ(tile_count, all_tiles.size()); 155 EXPECT_EQ(tile_count, all_tiles.size());
612 EXPECT_EQ(17u, tile_count); 156 EXPECT_EQ(17u, tile_count);
613 157
614 // Sanity check, all tiles should be visible. 158 // Sanity check, all tiles should be visible.
615 std::set<Tile*> smoothness_tiles; 159 std::set<Tile*> smoothness_tiles;
616 for (TileManager::RasterTileIterator it(tile_manager, 160 queue.Reset();
617 SMOOTHNESS_TAKES_PRIORITY); 161 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
618 it; 162 for (; !queue.IsEmpty(); queue.Pop()) {
619 ++it) { 163 Tile* tile = queue.Top();
620 Tile* tile = *it;
621 EXPECT_TRUE(tile); 164 EXPECT_TRUE(tile);
622 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); 165 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
623 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); 166 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
624 smoothness_tiles.insert(tile); 167 smoothness_tiles.insert(tile);
625 } 168 }
626 EXPECT_EQ(all_tiles, smoothness_tiles); 169 EXPECT_EQ(all_tiles, smoothness_tiles);
627 170
628 Region invalidation(gfx::Rect(0, 0, 500, 500)); 171 Region invalidation(gfx::Rect(0, 0, 500, 500));
629 172
630 // Invalidate the pending tree. 173 // Invalidate the pending tree.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 ACTIVE_TREE, 210 ACTIVE_TREE,
668 viewport, 211 viewport,
669 1.0f, 212 1.0f,
670 1.0, 213 1.0,
671 NULL, 214 NULL,
672 active_layer_->render_target(), 215 active_layer_->render_target(),
673 active_layer_->draw_transform()); 216 active_layer_->draw_transform());
674 217
675 // Populate all tiles directly from the tilings. 218 // Populate all tiles directly from the tilings.
676 all_tiles.clear(); 219 all_tiles.clear();
220 pending_layer_->HighResTiling()->CreateAllTilesForTesting();
677 std::vector<Tile*> pending_high_res_tiles = 221 std::vector<Tile*> pending_high_res_tiles =
678 pending_layer_->HighResTiling()->AllTilesForTesting(); 222 pending_layer_->HighResTiling()->AllTilesForTesting();
679 for (size_t i = 0; i < pending_high_res_tiles.size(); ++i) 223 for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
680 all_tiles.insert(pending_high_res_tiles[i]); 224 all_tiles.insert(pending_high_res_tiles[i]);
681 225
226 pending_layer_->LowResTiling()->CreateAllTilesForTesting();
682 std::vector<Tile*> pending_low_res_tiles = 227 std::vector<Tile*> pending_low_res_tiles =
683 pending_layer_->LowResTiling()->AllTilesForTesting(); 228 pending_layer_->LowResTiling()->AllTilesForTesting();
684 for (size_t i = 0; i < pending_low_res_tiles.size(); ++i) 229 for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
685 all_tiles.insert(pending_low_res_tiles[i]); 230 all_tiles.insert(pending_low_res_tiles[i]);
686 231
232 active_layer_->HighResTiling()->CreateAllTilesForTesting();
687 std::vector<Tile*> active_high_res_tiles = 233 std::vector<Tile*> active_high_res_tiles =
688 active_layer_->HighResTiling()->AllTilesForTesting(); 234 active_layer_->HighResTiling()->AllTilesForTesting();
689 for (size_t i = 0; i < active_high_res_tiles.size(); ++i) 235 for (size_t i = 0; i < active_high_res_tiles.size(); ++i)
690 all_tiles.insert(active_high_res_tiles[i]); 236 all_tiles.insert(active_high_res_tiles[i]);
691 237
238 active_layer_->LowResTiling()->CreateAllTilesForTesting();
692 std::vector<Tile*> active_low_res_tiles = 239 std::vector<Tile*> active_low_res_tiles =
693 active_layer_->LowResTiling()->AllTilesForTesting(); 240 active_layer_->LowResTiling()->AllTilesForTesting();
694 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) 241 for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
695 all_tiles.insert(active_low_res_tiles[i]); 242 all_tiles.insert(active_low_res_tiles[i]);
696 243
697 Tile* last_tile = NULL; 244 Tile* last_tile = NULL;
698 smoothness_tiles.clear(); 245 smoothness_tiles.clear();
699 tile_count = 0; 246 tile_count = 0;
700 size_t increasing_distance_tiles = 0u; 247 size_t increasing_distance_tiles = 0u;
701 // Here we expect to get increasing ACTIVE_TREE priority_bin. 248 // Here we expect to get increasing ACTIVE_TREE priority_bin.
702 for (TileManager::RasterTileIterator it(tile_manager, 249 queue.Reset();
703 SMOOTHNESS_TAKES_PRIORITY); 250 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
704 it; 251 for (; !queue.IsEmpty(); queue.Pop()) {
705 ++it) { 252 Tile* tile = queue.Top();
706 Tile* tile = *it;
707 EXPECT_TRUE(tile); 253 EXPECT_TRUE(tile);
708 254
709 if (!last_tile) 255 if (!last_tile)
710 last_tile = tile; 256 last_tile = tile;
711 257
712 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin, 258 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin,
713 tile->priority(ACTIVE_TREE).priority_bin); 259 tile->priority(ACTIVE_TREE).priority_bin);
714 if (last_tile->priority(ACTIVE_TREE).priority_bin == 260 if (last_tile->priority(ACTIVE_TREE).priority_bin ==
715 tile->priority(ACTIVE_TREE).priority_bin) { 261 tile->priority(ACTIVE_TREE).priority_bin) {
716 increasing_distance_tiles += 262 increasing_distance_tiles +=
(...skipping 16 matching lines...) Expand all
733 EXPECT_EQ(tile_count, smoothness_tiles.size()); 279 EXPECT_EQ(tile_count, smoothness_tiles.size());
734 EXPECT_EQ(all_tiles, smoothness_tiles); 280 EXPECT_EQ(all_tiles, smoothness_tiles);
735 // 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
736 // should check that we're _mostly_ right. 282 // should check that we're _mostly_ right.
737 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4); 283 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
738 284
739 std::set<Tile*> new_content_tiles; 285 std::set<Tile*> new_content_tiles;
740 last_tile = NULL; 286 last_tile = NULL;
741 increasing_distance_tiles = 0u; 287 increasing_distance_tiles = 0u;
742 // Here we expect to get increasing PENDING_TREE priority_bin. 288 // Here we expect to get increasing PENDING_TREE priority_bin.
743 for (TileManager::RasterTileIterator it(tile_manager, 289 queue.Reset();
744 NEW_CONTENT_TAKES_PRIORITY); 290 host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY);
745 it; 291 for (; !queue.IsEmpty(); queue.Pop()) {
746 ++it) { 292 Tile* tile = queue.Top();
747 Tile* tile = *it;
748 EXPECT_TRUE(tile); 293 EXPECT_TRUE(tile);
749 294
750 if (!last_tile) 295 if (!last_tile)
751 last_tile = tile; 296 last_tile = tile;
752 297
753 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin, 298 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin,
754 tile->priority(PENDING_TREE).priority_bin); 299 tile->priority(PENDING_TREE).priority_bin);
755 if (last_tile->priority(PENDING_TREE).priority_bin == 300 if (last_tile->priority(PENDING_TREE).priority_bin ==
756 tile->priority(PENDING_TREE).priority_bin) { 301 tile->priority(PENDING_TREE).priority_bin) {
757 increasing_distance_tiles += 302 increasing_distance_tiles +=
(...skipping 12 matching lines...) Expand all
770 new_content_tiles.insert(tile); 315 new_content_tiles.insert(tile);
771 } 316 }
772 317
773 EXPECT_EQ(tile_count, new_content_tiles.size()); 318 EXPECT_EQ(tile_count, new_content_tiles.size());
774 EXPECT_EQ(all_tiles, new_content_tiles); 319 EXPECT_EQ(all_tiles, new_content_tiles);
775 // Since we don't guarantee increasing distance due to spiral iterator, we 320 // Since we don't guarantee increasing distance due to spiral iterator, we
776 // should check that we're _mostly_ right. 321 // should check that we're _mostly_ right.
777 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4); 322 EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
778 } 323 }
779 324
780 TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) { 325 TEST_F(TileManagerTileIteratorTest, EvictionTileQueue) {
781 SetupDefaultTrees(gfx::Size(1000, 1000)); 326 SetupDefaultTrees(gfx::Size(1000, 1000));
782 TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
783 EXPECT_TRUE(tile_manager);
784 327
785 active_layer_->CreateDefaultTilingsAndTiles(); 328 active_layer_->CreateDefaultTilingsAndTiles();
786 pending_layer_->CreateDefaultTilingsAndTiles(); 329 pending_layer_->CreateDefaultTilingsAndTiles();
787 330
788 std::vector<TileManager::PairedPictureLayer> paired_layers; 331 EvictionTilePriorityQueue empty_queue;
789 tile_manager->GetPairedPictureLayers(&paired_layers); 332 host_impl_.BuildEvictionQueue(&empty_queue, SAME_PRIORITY_FOR_BOTH_TREES);
790 EXPECT_EQ(1u, paired_layers.size()); 333 EXPECT_TRUE(empty_queue.IsEmpty());
791
792 TileManager::EvictionTileIterator empty_it(tile_manager,
793 SAME_PRIORITY_FOR_BOTH_TREES);
794 EXPECT_FALSE(empty_it);
795 std::set<Tile*> all_tiles; 334 std::set<Tile*> all_tiles;
796 size_t tile_count = 0; 335 size_t tile_count = 0;
797 336
798 for (TileManager::RasterTileIterator raster_it(tile_manager, 337 RasterTilePriorityQueue raster_queue;
799 SAME_PRIORITY_FOR_BOTH_TREES); 338 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
800 raster_it; 339 for (; !raster_queue.IsEmpty(); raster_queue.Pop()) {
801 ++raster_it) { 340 Tile* tile = raster_queue.Top();
802 ++tile_count; 341 ++tile_count;
803 EXPECT_TRUE(*raster_it); 342 EXPECT_TRUE(tile);
804 all_tiles.insert(*raster_it); 343 all_tiles.insert(tile);
805 } 344 }
806 345
807 EXPECT_EQ(tile_count, all_tiles.size()); 346 EXPECT_EQ(tile_count, all_tiles.size());
808 EXPECT_EQ(17u, tile_count); 347 EXPECT_EQ(17u, tile_count);
809 348
349 TileManager* tile_manager = host_impl_.tile_manager();
350 ASSERT_TRUE(tile_manager);
351
810 tile_manager->InitializeTilesWithResourcesForTesting( 352 tile_manager->InitializeTilesWithResourcesForTesting(
811 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 353 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
812 354
813 TileManager::EvictionTileIterator it(tile_manager, SMOOTHNESS_TAKES_PRIORITY); 355 EvictionTilePriorityQueue eviction_queue;
814 EXPECT_TRUE(it); 356 host_impl_.BuildEvictionQueue(&eviction_queue, SMOOTHNESS_TAKES_PRIORITY);
357 EXPECT_FALSE(eviction_queue.IsEmpty());
815 358
816 // Sanity check, all tiles should be visible. 359 // Sanity check, all tiles should be visible.
817 std::set<Tile*> smoothness_tiles; 360 std::set<Tile*> smoothness_tiles;
818 for (; it; ++it) { 361 for (; !eviction_queue.IsEmpty(); eviction_queue.Pop()) {
819 Tile* tile = *it; 362 Tile* tile = eviction_queue.Top();
820 EXPECT_TRUE(tile); 363 EXPECT_TRUE(tile);
821 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); 364 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
822 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); 365 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
823 EXPECT_TRUE(tile->HasResources()); 366 EXPECT_TRUE(tile->HasResources());
824 smoothness_tiles.insert(tile); 367 smoothness_tiles.insert(tile);
825 } 368 }
826 EXPECT_EQ(all_tiles, smoothness_tiles); 369 EXPECT_EQ(all_tiles, smoothness_tiles);
827 370
828 tile_manager->ReleaseTileResourcesForTesting( 371 tile_manager->ReleaseTileResourcesForTesting(
829 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 372 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) 440 for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
898 all_tiles.insert(active_low_res_tiles[i]); 441 all_tiles.insert(active_low_res_tiles[i]);
899 442
900 tile_manager->InitializeTilesWithResourcesForTesting( 443 tile_manager->InitializeTilesWithResourcesForTesting(
901 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); 444 std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
902 445
903 Tile* last_tile = NULL; 446 Tile* last_tile = NULL;
904 smoothness_tiles.clear(); 447 smoothness_tiles.clear();
905 tile_count = 0; 448 tile_count = 0;
906 // Here we expect to get increasing ACTIVE_TREE priority_bin. 449 // Here we expect to get increasing ACTIVE_TREE priority_bin.
907 for (TileManager::EvictionTileIterator it(tile_manager, 450 eviction_queue.Reset();
908 SMOOTHNESS_TAKES_PRIORITY); 451 host_impl_.BuildEvictionQueue(&eviction_queue, SMOOTHNESS_TAKES_PRIORITY);
909 it; 452 for (; !eviction_queue.IsEmpty(); eviction_queue.Pop()) {
910 ++it) { 453 Tile* tile = eviction_queue.Top();
911 Tile* tile = *it;
912 EXPECT_TRUE(tile); 454 EXPECT_TRUE(tile);
913 EXPECT_TRUE(tile->HasResources()); 455 EXPECT_TRUE(tile->HasResources());
914 456
915 if (!last_tile) 457 if (!last_tile)
916 last_tile = tile; 458 last_tile = tile;
917 459
918 EXPECT_GE(last_tile->priority(ACTIVE_TREE).priority_bin, 460 EXPECT_GE(last_tile->priority(ACTIVE_TREE).priority_bin,
919 tile->priority(ACTIVE_TREE).priority_bin); 461 tile->priority(ACTIVE_TREE).priority_bin);
920 if (last_tile->priority(ACTIVE_TREE).priority_bin == 462 if (last_tile->priority(ACTIVE_TREE).priority_bin ==
921 tile->priority(ACTIVE_TREE).priority_bin) { 463 tile->priority(ACTIVE_TREE).priority_bin) {
922 EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible, 464 EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible,
923 tile->priority(ACTIVE_TREE).distance_to_visible); 465 tile->priority(ACTIVE_TREE).distance_to_visible);
924 } 466 }
925 467
926 last_tile = tile; 468 last_tile = tile;
927 ++tile_count; 469 ++tile_count;
928 smoothness_tiles.insert(tile); 470 smoothness_tiles.insert(tile);
929 } 471 }
930 472
931 EXPECT_EQ(tile_count, smoothness_tiles.size()); 473 EXPECT_EQ(tile_count, smoothness_tiles.size());
932 EXPECT_EQ(all_tiles, smoothness_tiles); 474 EXPECT_EQ(all_tiles, smoothness_tiles);
933 475
934 std::set<Tile*> new_content_tiles; 476 std::set<Tile*> new_content_tiles;
935 last_tile = NULL; 477 last_tile = NULL;
936 // Here we expect to get increasing PENDING_TREE priority_bin. 478 // Here we expect to get increasing PENDING_TREE priority_bin.
937 for (TileManager::EvictionTileIterator it(tile_manager, 479 eviction_queue.Reset();
938 NEW_CONTENT_TAKES_PRIORITY); 480 host_impl_.BuildEvictionQueue(&eviction_queue, NEW_CONTENT_TAKES_PRIORITY);
939 it; 481 for (; !eviction_queue.IsEmpty(); eviction_queue.Pop()) {
940 ++it) { 482 Tile* tile = eviction_queue.Top();
941 Tile* tile = *it;
942 EXPECT_TRUE(tile); 483 EXPECT_TRUE(tile);
943 484
944 if (!last_tile) 485 if (!last_tile)
945 last_tile = tile; 486 last_tile = tile;
946 487
947 EXPECT_GE(last_tile->priority(PENDING_TREE).priority_bin, 488 EXPECT_GE(last_tile->priority(PENDING_TREE).priority_bin,
948 tile->priority(PENDING_TREE).priority_bin); 489 tile->priority(PENDING_TREE).priority_bin);
949 if (last_tile->priority(PENDING_TREE).priority_bin == 490 if (last_tile->priority(PENDING_TREE).priority_bin ==
950 tile->priority(PENDING_TREE).priority_bin) { 491 tile->priority(PENDING_TREE).priority_bin) {
951 EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible, 492 EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible,
952 tile->priority(PENDING_TREE).distance_to_visible); 493 tile->priority(PENDING_TREE).distance_to_visible);
953 } 494 }
954 495
955 last_tile = tile; 496 last_tile = tile;
956 new_content_tiles.insert(tile); 497 new_content_tiles.insert(tile);
957 } 498 }
958 499
959 EXPECT_EQ(tile_count, new_content_tiles.size()); 500 EXPECT_EQ(tile_count, new_content_tiles.size());
960 EXPECT_EQ(all_tiles, new_content_tiles); 501 EXPECT_EQ(all_tiles, new_content_tiles);
961 } 502 }
962 } // namespace 503 } // namespace
963 } // namespace cc 504 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698