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
3 // found in the LICENSE file.
8 #include "cc/resources/managed_tile_state.h"
9 #include "cc/resources/prioritized_tile_set.h"
10 #include "cc/resources/tile.h"
11 #include "cc/test/fake_output_surface.h"
12 #include "cc/test/fake_output_surface_client.h"
13 #include "cc/test/fake_picture_pile_impl.h"
14 #include "cc/test/fake_tile_manager.h"
15 #include "cc/test/fake_tile_manager_client.h"
16 #include "cc/test/test_tile_priorities.h"
17 #include "testing/gtest/include/gtest/gtest.h"
23 bool operator()(const scoped_refptr<Tile>& a,
24 const scoped_refptr<Tile>& b) const {
25 const ManagedTileState& ams = a->managed_state();
26 const ManagedTileState& bms = b->managed_state();
28 if (ams.priority_bin != bms.priority_bin)
29 return ams.priority_bin < bms.priority_bin;
31 if (ams.required_for_activation != bms.required_for_activation)
32 return ams.required_for_activation;
34 if (ams.resolution != bms.resolution)
35 return ams.resolution < bms.resolution;
37 if (ams.distance_to_visible != bms.distance_to_visible)
38 return ams.distance_to_visible < bms.distance_to_visible;
40 gfx::Rect a_rect = a->content_rect();
41 gfx::Rect b_rect = b->content_rect();
42 if (a_rect.y() != b_rect.y())
43 return a_rect.y() < b_rect.y();
44 return a_rect.x() < b_rect.x();
50 class PrioritizedTileSetTest : public testing::Test {
52 PrioritizedTileSetTest() {
53 output_surface_ = FakeOutputSurface::Create3d().Pass();
54 CHECK(output_surface_->BindToClient(&output_surface_client_));
57 ResourceProvider::Create(output_surface_.get(),
63 new FakeTileManager(&tile_manager_client_, resource_provider_.get()));
64 picture_pile_ = FakePicturePileImpl::CreatePile();
67 scoped_refptr<Tile> CreateTile() {
68 return tile_manager_->CreateTile(picture_pile_.get(),
69 settings_.default_tile_size,
79 LayerTreeSettings settings_;
80 FakeOutputSurfaceClient output_surface_client_;
81 scoped_ptr<FakeOutputSurface> output_surface_;
82 scoped_ptr<ResourceProvider> resource_provider_;
83 FakeTileManagerClient tile_manager_client_;
84 scoped_ptr<FakeTileManager> tile_manager_;
85 scoped_refptr<FakePicturePileImpl> picture_pile_;
88 TEST_F(PrioritizedTileSetTest, EmptyIterator) {
89 // Creating an iterator to an empty set should work (but create iterator that
92 PrioritizedTileSet set;
94 PrioritizedTileSet::Iterator it(&set, true);
98 TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
99 PrioritizedTileSet set;
100 scoped_refptr<Tile> tile = CreateTile();
101 set.InsertTile(tile, NOW_BIN);
103 PrioritizedTileSet::Iterator it(&set, true);
105 EXPECT_TRUE(*it == tile.get());
110 TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
111 // Ensure that tiles in NOW_AND_READY_TO_DRAW_BIN aren't sorted.
113 PrioritizedTileSet set;
114 TilePriority priorities[4] = {
115 TilePriorityForEventualBin(),
116 TilePriorityForNowBin(),
118 TilePriorityForSoonBin()};
120 std::vector<scoped_refptr<Tile> > tiles;
121 for (int priority = 0; priority < 4; ++priority) {
122 for (int i = 0; i < 5; ++i) {
123 scoped_refptr<Tile> tile = CreateTile();
124 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
125 tile->SetPriority(PENDING_TREE, priorities[priority]);
126 tiles.push_back(tile);
127 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
131 // Tiles should appear in the same order as inserted.
133 for (PrioritizedTileSet::Iterator it(&set, true);
136 EXPECT_TRUE(*it == tiles[i].get());
142 TEST_F(PrioritizedTileSetTest, NowBin) {
143 // Ensure that tiles in NOW_BIN are sorted according to BinComparator.
145 PrioritizedTileSet set;
146 TilePriority priorities[4] = {
147 TilePriorityForEventualBin(),
148 TilePriorityForNowBin(),
150 TilePriorityForSoonBin()};
152 std::vector<scoped_refptr<Tile> > tiles;
153 for (int priority = 0; priority < 4; ++priority) {
154 for (int i = 0; i < 5; ++i) {
155 scoped_refptr<Tile> tile = CreateTile();
156 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
157 tile->SetPriority(PENDING_TREE, priorities[priority]);
158 tiles.push_back(tile);
159 set.InsertTile(tile, NOW_BIN);
163 // Tiles should appear in BinComparator order.
164 std::sort(tiles.begin(), tiles.end(), BinComparator());
167 for (PrioritizedTileSet::Iterator it(&set, true);
170 EXPECT_TRUE(*it == tiles[i].get());
176 TEST_F(PrioritizedTileSetTest, SoonBin) {
177 // Ensure that tiles in SOON_BIN are sorted according to BinComparator.
179 PrioritizedTileSet set;
180 TilePriority priorities[4] = {
181 TilePriorityForEventualBin(),
182 TilePriorityForNowBin(),
184 TilePriorityForSoonBin()};
186 std::vector<scoped_refptr<Tile> > tiles;
187 for (int priority = 0; priority < 4; ++priority) {
188 for (int i = 0; i < 5; ++i) {
189 scoped_refptr<Tile> tile = CreateTile();
190 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
191 tile->SetPriority(PENDING_TREE, priorities[priority]);
192 tiles.push_back(tile);
193 set.InsertTile(tile, SOON_BIN);
197 // Tiles should appear in BinComparator order.
198 std::sort(tiles.begin(), tiles.end(), BinComparator());
201 for (PrioritizedTileSet::Iterator it(&set, true);
204 EXPECT_TRUE(*it == tiles[i].get());
210 TEST_F(PrioritizedTileSetTest, SoonBinNoPriority) {
211 // Ensure that when not using priority iterator, SOON_BIN tiles
214 PrioritizedTileSet set;
215 TilePriority priorities[4] = {
216 TilePriorityForEventualBin(),
217 TilePriorityForNowBin(),
219 TilePriorityForSoonBin()};
221 std::vector<scoped_refptr<Tile> > tiles;
222 for (int priority = 0; priority < 4; ++priority) {
223 for (int i = 0; i < 5; ++i) {
224 scoped_refptr<Tile> tile = CreateTile();
225 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
226 tile->SetPriority(PENDING_TREE, priorities[priority]);
227 tiles.push_back(tile);
228 set.InsertTile(tile, SOON_BIN);
233 for (PrioritizedTileSet::Iterator it(&set, false);
236 EXPECT_TRUE(*it == tiles[i].get());
242 TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
243 // Ensure that EVENTUALLY_AND_ACTIVE_BIN tiles are sorted.
245 PrioritizedTileSet set;
246 TilePriority priorities[4] = {
247 TilePriorityForEventualBin(),
248 TilePriorityForNowBin(),
250 TilePriorityForSoonBin()};
252 std::vector<scoped_refptr<Tile> > tiles;
253 for (int priority = 0; priority < 4; ++priority) {
254 for (int i = 0; i < 5; ++i) {
255 scoped_refptr<Tile> tile = CreateTile();
256 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
257 tile->SetPriority(PENDING_TREE, priorities[priority]);
258 tiles.push_back(tile);
259 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
263 // Tiles should appear in BinComparator order.
264 std::sort(tiles.begin(), tiles.end(), BinComparator());
267 for (PrioritizedTileSet::Iterator it(&set, true);
270 EXPECT_TRUE(*it == tiles[i].get());
276 TEST_F(PrioritizedTileSetTest, EventuallyBin) {
277 // Ensure that EVENTUALLY_BIN tiles are sorted.
279 PrioritizedTileSet set;
280 TilePriority priorities[4] = {
281 TilePriorityForEventualBin(),
282 TilePriorityForNowBin(),
284 TilePriorityForSoonBin()};
286 std::vector<scoped_refptr<Tile> > tiles;
287 for (int priority = 0; priority < 4; ++priority) {
288 for (int i = 0; i < 5; ++i) {
289 scoped_refptr<Tile> tile = CreateTile();
290 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
291 tile->SetPriority(PENDING_TREE, priorities[priority]);
292 tiles.push_back(tile);
293 set.InsertTile(tile, EVENTUALLY_BIN);
297 // Tiles should appear in BinComparator order.
298 std::sort(tiles.begin(), tiles.end(), BinComparator());
301 for (PrioritizedTileSet::Iterator it(&set, true);
304 EXPECT_TRUE(*it == tiles[i].get());
310 TEST_F(PrioritizedTileSetTest, AtLastAndActiveBin) {
311 // Ensure that AT_LAST_AND_ACTIVE_BIN tiles are sorted.
313 PrioritizedTileSet set;
314 TilePriority priorities[4] = {
315 TilePriorityForEventualBin(),
316 TilePriorityForNowBin(),
318 TilePriorityForSoonBin()};
320 std::vector<scoped_refptr<Tile> > tiles;
321 for (int priority = 0; priority < 4; ++priority) {
322 for (int i = 0; i < 5; ++i) {
323 scoped_refptr<Tile> tile = CreateTile();
324 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
325 tile->SetPriority(PENDING_TREE, priorities[priority]);
326 tiles.push_back(tile);
327 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
331 // Tiles should appear in BinComparator order.
332 std::sort(tiles.begin(), tiles.end(), BinComparator());
335 for (PrioritizedTileSet::Iterator it(&set, true);
338 EXPECT_TRUE(*it == tiles[i].get());
344 TEST_F(PrioritizedTileSetTest, AtLastBin) {
345 // Ensure that AT_LAST_BIN tiles are sorted.
347 PrioritizedTileSet set;
348 TilePriority priorities[4] = {
349 TilePriorityForEventualBin(),
350 TilePriorityForNowBin(),
352 TilePriorityForSoonBin()};
354 std::vector<scoped_refptr<Tile> > tiles;
355 for (int priority = 0; priority < 4; ++priority) {
356 for (int i = 0; i < 5; ++i) {
357 scoped_refptr<Tile> tile = CreateTile();
358 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
359 tile->SetPriority(PENDING_TREE, priorities[priority]);
360 tiles.push_back(tile);
361 set.InsertTile(tile, AT_LAST_BIN);
365 // Tiles should appear in BinComparator order.
366 std::sort(tiles.begin(), tiles.end(), BinComparator());
369 for (PrioritizedTileSet::Iterator it(&set, true);
372 EXPECT_TRUE(*it == tiles[i].get());
378 TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
379 // Aggregate test with one tile for each of the bins, which
380 // should appear in order of the bins.
382 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
383 scoped_refptr<Tile> now_bin = CreateTile();
384 scoped_refptr<Tile> soon_bin = CreateTile();
385 scoped_refptr<Tile> eventually_and_active_bin = CreateTile();
386 scoped_refptr<Tile> eventually_bin = CreateTile();
387 scoped_refptr<Tile> at_last_bin = CreateTile();
388 scoped_refptr<Tile> at_last_and_active_bin = CreateTile();
390 PrioritizedTileSet set;
391 set.InsertTile(soon_bin, SOON_BIN);
392 set.InsertTile(at_last_and_active_bin, AT_LAST_AND_ACTIVE_BIN);
393 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
394 set.InsertTile(now_bin, NOW_BIN);
395 set.InsertTile(eventually_and_active_bin, EVENTUALLY_AND_ACTIVE_BIN);
396 set.InsertTile(at_last_bin, AT_LAST_BIN);
397 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
399 // Tiles should appear in order.
400 PrioritizedTileSet::Iterator it(&set, true);
401 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
403 EXPECT_TRUE(*it == now_bin.get());
405 EXPECT_TRUE(*it == soon_bin.get());
407 EXPECT_TRUE(*it == eventually_and_active_bin.get());
409 EXPECT_TRUE(*it == eventually_bin.get());
411 EXPECT_TRUE(*it == at_last_and_active_bin.get());
413 EXPECT_TRUE(*it == at_last_bin.get());
418 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBin) {
419 // Aggregate test with many tiles in each of the bins of various
420 // priorities. Ensure that they are all returned in a sorted order.
422 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
423 std::vector<scoped_refptr<Tile> > now_bins;
424 std::vector<scoped_refptr<Tile> > soon_bins;
425 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
426 std::vector<scoped_refptr<Tile> > eventually_bins;
427 std::vector<scoped_refptr<Tile> > at_last_bins;
428 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
430 TilePriority priorities[4] = {
431 TilePriorityForEventualBin(),
432 TilePriorityForNowBin(),
434 TilePriorityForSoonBin()};
436 PrioritizedTileSet set;
437 for (int priority = 0; priority < 4; ++priority) {
438 for (int i = 0; i < 5; ++i) {
439 scoped_refptr<Tile> tile = CreateTile();
440 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
441 tile->SetPriority(PENDING_TREE, priorities[priority]);
443 now_and_ready_to_draw_bins.push_back(tile);
444 now_bins.push_back(tile);
445 soon_bins.push_back(tile);
446 eventually_and_active_bins.push_back(tile);
447 eventually_bins.push_back(tile);
448 at_last_bins.push_back(tile);
449 at_last_and_active_bins.push_back(tile);
451 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
452 set.InsertTile(tile, NOW_BIN);
453 set.InsertTile(tile, SOON_BIN);
454 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
455 set.InsertTile(tile, EVENTUALLY_BIN);
456 set.InsertTile(tile, AT_LAST_BIN);
457 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
461 PrioritizedTileSet::Iterator it(&set, true);
462 std::vector<scoped_refptr<Tile> >::iterator vector_it;
464 // Now and ready are not sorted.
465 for (vector_it = now_and_ready_to_draw_bins.begin();
466 vector_it != now_and_ready_to_draw_bins.end();
468 EXPECT_TRUE(*vector_it == *it);
472 // Now bins are sorted.
473 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
474 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
475 EXPECT_TRUE(*vector_it == *it);
479 // Soon bins are sorted.
480 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
481 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
483 EXPECT_TRUE(*vector_it == *it);
487 // Eventually and active bins are sorted.
488 std::sort(eventually_and_active_bins.begin(),
489 eventually_and_active_bins.end(),
491 for (vector_it = eventually_and_active_bins.begin();
492 vector_it != eventually_and_active_bins.end();
494 EXPECT_TRUE(*vector_it == *it);
498 // Eventually bins are sorted.
499 std::sort(eventually_bins.begin(), eventually_bins.end(), BinComparator());
500 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
502 EXPECT_TRUE(*vector_it == *it);
506 // At last and active bins are sorted.
507 std::sort(at_last_and_active_bins.begin(),
508 at_last_and_active_bins.end(),
510 for (vector_it = at_last_and_active_bins.begin();
511 vector_it != at_last_and_active_bins.end();
513 EXPECT_TRUE(*vector_it == *it);
517 // At last bins are sorted.
518 std::sort(at_last_bins.begin(), at_last_bins.end(), BinComparator());
519 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
521 EXPECT_TRUE(*vector_it == *it);
528 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBinDisablePriority) {
529 // Aggregate test with many tiles for each of the bins. Tiles should
530 // appear in order, until DisablePriorityOrdering is called. After that
531 // tiles should appear in the order they were inserted.
533 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
534 std::vector<scoped_refptr<Tile> > now_bins;
535 std::vector<scoped_refptr<Tile> > soon_bins;
536 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
537 std::vector<scoped_refptr<Tile> > eventually_bins;
538 std::vector<scoped_refptr<Tile> > at_last_bins;
539 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
541 TilePriority priorities[4] = {
542 TilePriorityForEventualBin(),
543 TilePriorityForNowBin(),
545 TilePriorityForSoonBin()};
547 PrioritizedTileSet set;
548 for (int priority = 0; priority < 4; ++priority) {
549 for (int i = 0; i < 5; ++i) {
550 scoped_refptr<Tile> tile = CreateTile();
551 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
552 tile->SetPriority(PENDING_TREE, priorities[priority]);
554 now_and_ready_to_draw_bins.push_back(tile);
555 now_bins.push_back(tile);
556 soon_bins.push_back(tile);
557 eventually_and_active_bins.push_back(tile);
558 eventually_bins.push_back(tile);
559 at_last_bins.push_back(tile);
560 at_last_and_active_bins.push_back(tile);
562 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
563 set.InsertTile(tile, NOW_BIN);
564 set.InsertTile(tile, SOON_BIN);
565 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
566 set.InsertTile(tile, EVENTUALLY_BIN);
567 set.InsertTile(tile, AT_LAST_BIN);
568 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
572 PrioritizedTileSet::Iterator it(&set, true);
573 std::vector<scoped_refptr<Tile> >::iterator vector_it;
575 // Now and ready are not sorted.
576 for (vector_it = now_and_ready_to_draw_bins.begin();
577 vector_it != now_and_ready_to_draw_bins.end();
579 EXPECT_TRUE(*vector_it == *it);
583 // Now bins are sorted.
584 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
585 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
586 EXPECT_TRUE(*vector_it == *it);
590 // Soon bins are sorted.
591 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
592 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
594 EXPECT_TRUE(*vector_it == *it);
598 // After we disable priority ordering, we already have sorted the next vector.
599 it.DisablePriorityOrdering();
601 // Eventually and active bins are sorted.
602 std::sort(eventually_and_active_bins.begin(),
603 eventually_and_active_bins.end(),
605 for (vector_it = eventually_and_active_bins.begin();
606 vector_it != eventually_and_active_bins.end();
608 EXPECT_TRUE(*vector_it == *it);
612 // Eventually bins are not sorted.
613 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
615 EXPECT_TRUE(*vector_it == *it);
619 // At last and active bins are not sorted.
620 for (vector_it = at_last_and_active_bins.begin();
621 vector_it != at_last_and_active_bins.end();
623 EXPECT_TRUE(*vector_it == *it);
627 // At last bins are not sorted.
628 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
630 EXPECT_TRUE(*vector_it == *it);
637 TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
638 // Make sure that if we have empty lists between two non-empty lists,
639 // we just get two tiles from the iterator.
641 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
642 scoped_refptr<Tile> at_last_bin = CreateTile();
644 PrioritizedTileSet set;
645 set.InsertTile(at_last_bin, AT_LAST_BIN);
646 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
648 // Only two tiles should appear and they should appear in order.
649 PrioritizedTileSet::Iterator it(&set, true);
650 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
652 EXPECT_TRUE(*it == at_last_bin.get());
657 TEST_F(PrioritizedTileSetTest, MultipleIterators) {
658 // Ensure that multiple iterators don't interfere with each other.
660 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
661 scoped_refptr<Tile> now_bin = CreateTile();
662 scoped_refptr<Tile> soon_bin = CreateTile();
663 scoped_refptr<Tile> eventually_bin = CreateTile();
664 scoped_refptr<Tile> at_last_bin = CreateTile();
666 PrioritizedTileSet set;
667 set.InsertTile(soon_bin, SOON_BIN);
668 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
669 set.InsertTile(now_bin, NOW_BIN);
670 set.InsertTile(at_last_bin, AT_LAST_BIN);
671 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
673 // Tiles should appear in order.
674 PrioritizedTileSet::Iterator it(&set, true);
675 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
677 EXPECT_TRUE(*it == now_bin.get());
679 EXPECT_TRUE(*it == soon_bin.get());
681 EXPECT_TRUE(*it == eventually_bin.get());
683 EXPECT_TRUE(*it == at_last_bin.get());
687 // Creating multiple iterators shouldn't affect old iterators.
688 PrioritizedTileSet::Iterator second_it(&set, true);
689 EXPECT_TRUE(second_it);
693 EXPECT_TRUE(second_it);
695 EXPECT_TRUE(second_it);
698 PrioritizedTileSet::Iterator third_it(&set, true);
699 EXPECT_TRUE(third_it);
702 EXPECT_TRUE(second_it);
703 EXPECT_TRUE(third_it);
708 EXPECT_TRUE(third_it);
709 EXPECT_TRUE(*third_it == soon_bin.get());
710 EXPECT_TRUE(second_it);
711 EXPECT_TRUE(*second_it == at_last_bin.get());
715 EXPECT_TRUE(third_it);
716 EXPECT_FALSE(second_it);
721 PrioritizedTileSet::Iterator empty_it(&set, true);
722 EXPECT_FALSE(empty_it);