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.required_for_activation != bms.required_for_activation)
29 return ams.required_for_activation;
31 if (ams.resolution != bms.resolution)
32 return ams.resolution < bms.resolution;
34 if (ams.time_to_needed_in_seconds != bms.time_to_needed_in_seconds)
35 return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds;
37 if (ams.distance_to_visible_in_pixels !=
38 bms.distance_to_visible_in_pixels) {
39 return ams.distance_to_visible_in_pixels <
40 bms.distance_to_visible_in_pixels;
43 gfx::Rect a_rect = a->content_rect();
44 gfx::Rect b_rect = b->content_rect();
45 if (a_rect.y() != b_rect.y())
46 return a_rect.y() < b_rect.y();
47 return a_rect.x() < b_rect.x();
53 class PrioritizedTileSetTest : public testing::Test {
55 PrioritizedTileSetTest() {
56 output_surface_ = FakeOutputSurface::Create3d().Pass();
57 CHECK(output_surface_->BindToClient(&output_surface_client_));
60 ResourceProvider::Create(output_surface_.get(),
66 new FakeTileManager(&tile_manager_client_, resource_provider_.get()));
67 picture_pile_ = FakePicturePileImpl::CreatePile();
70 scoped_refptr<Tile> CreateTile() {
71 return tile_manager_->CreateTile(picture_pile_.get(),
72 settings_.default_tile_size,
82 LayerTreeSettings settings_;
83 FakeOutputSurfaceClient output_surface_client_;
84 scoped_ptr<FakeOutputSurface> output_surface_;
85 scoped_ptr<ResourceProvider> resource_provider_;
86 FakeTileManagerClient tile_manager_client_;
87 scoped_ptr<FakeTileManager> tile_manager_;
88 scoped_refptr<FakePicturePileImpl> picture_pile_;
91 TEST_F(PrioritizedTileSetTest, EmptyIterator) {
92 // Creating an iterator to an empty set should work (but create iterator that
95 PrioritizedTileSet set;
97 PrioritizedTileSet::Iterator it(&set, true);
101 TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
102 PrioritizedTileSet set;
103 scoped_refptr<Tile> tile = CreateTile();
104 set.InsertTile(tile, NOW_BIN);
106 PrioritizedTileSet::Iterator it(&set, true);
108 EXPECT_TRUE(*it == tile.get());
113 TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
114 // Ensure that tiles in NOW_AND_READY_TO_DRAW_BIN aren't sorted.
116 PrioritizedTileSet set;
117 TilePriority priorities[4] = {
118 TilePriorityForEventualBin(),
119 TilePriorityForNowBin(),
121 TilePriorityForSoonBin()};
123 std::vector<scoped_refptr<Tile> > tiles;
124 for (int priority = 0; priority < 4; ++priority) {
125 for (int i = 0; i < 5; ++i) {
126 scoped_refptr<Tile> tile = CreateTile();
127 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
128 tile->SetPriority(PENDING_TREE, priorities[priority]);
129 tiles.push_back(tile);
130 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
134 // Tiles should appear in the same order as inserted.
136 for (PrioritizedTileSet::Iterator it(&set, true);
139 EXPECT_TRUE(*it == tiles[i].get());
145 TEST_F(PrioritizedTileSetTest, NowBin) {
146 // Ensure that tiles in NOW_BIN are sorted according to BinComparator.
148 PrioritizedTileSet set;
149 TilePriority priorities[4] = {
150 TilePriorityForEventualBin(),
151 TilePriorityForNowBin(),
153 TilePriorityForSoonBin()};
155 std::vector<scoped_refptr<Tile> > tiles;
156 for (int priority = 0; priority < 4; ++priority) {
157 for (int i = 0; i < 5; ++i) {
158 scoped_refptr<Tile> tile = CreateTile();
159 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
160 tile->SetPriority(PENDING_TREE, priorities[priority]);
161 tiles.push_back(tile);
162 set.InsertTile(tile, NOW_BIN);
166 // Tiles should appear in BinComparator order.
167 std::sort(tiles.begin(), tiles.end(), BinComparator());
170 for (PrioritizedTileSet::Iterator it(&set, true);
173 EXPECT_TRUE(*it == tiles[i].get());
179 TEST_F(PrioritizedTileSetTest, SoonBin) {
180 // Ensure that tiles in SOON_BIN are sorted according to BinComparator.
182 PrioritizedTileSet set;
183 TilePriority priorities[4] = {
184 TilePriorityForEventualBin(),
185 TilePriorityForNowBin(),
187 TilePriorityForSoonBin()};
189 std::vector<scoped_refptr<Tile> > tiles;
190 for (int priority = 0; priority < 4; ++priority) {
191 for (int i = 0; i < 5; ++i) {
192 scoped_refptr<Tile> tile = CreateTile();
193 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
194 tile->SetPriority(PENDING_TREE, priorities[priority]);
195 tiles.push_back(tile);
196 set.InsertTile(tile, SOON_BIN);
200 // Tiles should appear in BinComparator order.
201 std::sort(tiles.begin(), tiles.end(), BinComparator());
204 for (PrioritizedTileSet::Iterator it(&set, true);
207 EXPECT_TRUE(*it == tiles[i].get());
213 TEST_F(PrioritizedTileSetTest, SoonBinNoPriority) {
214 // Ensure that when not using priority iterator, SOON_BIN tiles
217 PrioritizedTileSet set;
218 TilePriority priorities[4] = {
219 TilePriorityForEventualBin(),
220 TilePriorityForNowBin(),
222 TilePriorityForSoonBin()};
224 std::vector<scoped_refptr<Tile> > tiles;
225 for (int priority = 0; priority < 4; ++priority) {
226 for (int i = 0; i < 5; ++i) {
227 scoped_refptr<Tile> tile = CreateTile();
228 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
229 tile->SetPriority(PENDING_TREE, priorities[priority]);
230 tiles.push_back(tile);
231 set.InsertTile(tile, SOON_BIN);
236 for (PrioritizedTileSet::Iterator it(&set, false);
239 EXPECT_TRUE(*it == tiles[i].get());
245 TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
246 // Ensure that EVENTUALLY_AND_ACTIVE_BIN tiles are sorted.
248 PrioritizedTileSet set;
249 TilePriority priorities[4] = {
250 TilePriorityForEventualBin(),
251 TilePriorityForNowBin(),
253 TilePriorityForSoonBin()};
255 std::vector<scoped_refptr<Tile> > tiles;
256 for (int priority = 0; priority < 4; ++priority) {
257 for (int i = 0; i < 5; ++i) {
258 scoped_refptr<Tile> tile = CreateTile();
259 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
260 tile->SetPriority(PENDING_TREE, priorities[priority]);
261 tiles.push_back(tile);
262 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
266 // Tiles should appear in BinComparator order.
267 std::sort(tiles.begin(), tiles.end(), BinComparator());
270 for (PrioritizedTileSet::Iterator it(&set, true);
273 EXPECT_TRUE(*it == tiles[i].get());
279 TEST_F(PrioritizedTileSetTest, EventuallyBin) {
280 // Ensure that EVENTUALLY_BIN tiles are sorted.
282 PrioritizedTileSet set;
283 TilePriority priorities[4] = {
284 TilePriorityForEventualBin(),
285 TilePriorityForNowBin(),
287 TilePriorityForSoonBin()};
289 std::vector<scoped_refptr<Tile> > tiles;
290 for (int priority = 0; priority < 4; ++priority) {
291 for (int i = 0; i < 5; ++i) {
292 scoped_refptr<Tile> tile = CreateTile();
293 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
294 tile->SetPriority(PENDING_TREE, priorities[priority]);
295 tiles.push_back(tile);
296 set.InsertTile(tile, EVENTUALLY_BIN);
300 // Tiles should appear in BinComparator order.
301 std::sort(tiles.begin(), tiles.end(), BinComparator());
304 for (PrioritizedTileSet::Iterator it(&set, true);
307 EXPECT_TRUE(*it == tiles[i].get());
313 TEST_F(PrioritizedTileSetTest, AtLastAndActiveBin) {
314 // Ensure that AT_LAST_AND_ACTIVE_BIN tiles are sorted.
316 PrioritizedTileSet set;
317 TilePriority priorities[4] = {
318 TilePriorityForEventualBin(),
319 TilePriorityForNowBin(),
321 TilePriorityForSoonBin()};
323 std::vector<scoped_refptr<Tile> > tiles;
324 for (int priority = 0; priority < 4; ++priority) {
325 for (int i = 0; i < 5; ++i) {
326 scoped_refptr<Tile> tile = CreateTile();
327 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
328 tile->SetPriority(PENDING_TREE, priorities[priority]);
329 tiles.push_back(tile);
330 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
334 // Tiles should appear in BinComparator order.
335 std::sort(tiles.begin(), tiles.end(), BinComparator());
338 for (PrioritizedTileSet::Iterator it(&set, true);
341 EXPECT_TRUE(*it == tiles[i].get());
347 TEST_F(PrioritizedTileSetTest, AtLastBin) {
348 // Ensure that AT_LAST_BIN tiles are sorted.
350 PrioritizedTileSet set;
351 TilePriority priorities[4] = {
352 TilePriorityForEventualBin(),
353 TilePriorityForNowBin(),
355 TilePriorityForSoonBin()};
357 std::vector<scoped_refptr<Tile> > tiles;
358 for (int priority = 0; priority < 4; ++priority) {
359 for (int i = 0; i < 5; ++i) {
360 scoped_refptr<Tile> tile = CreateTile();
361 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
362 tile->SetPriority(PENDING_TREE, priorities[priority]);
363 tiles.push_back(tile);
364 set.InsertTile(tile, AT_LAST_BIN);
368 // Tiles should appear in BinComparator order.
369 std::sort(tiles.begin(), tiles.end(), BinComparator());
372 for (PrioritizedTileSet::Iterator it(&set, true);
375 EXPECT_TRUE(*it == tiles[i].get());
381 TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
382 // Aggregate test with one tile for each of the bins, which
383 // should appear in order of the bins.
385 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
386 scoped_refptr<Tile> now_bin = CreateTile();
387 scoped_refptr<Tile> soon_bin = CreateTile();
388 scoped_refptr<Tile> eventually_and_active_bin = CreateTile();
389 scoped_refptr<Tile> eventually_bin = CreateTile();
390 scoped_refptr<Tile> at_last_bin = CreateTile();
391 scoped_refptr<Tile> at_last_and_active_bin = CreateTile();
393 PrioritizedTileSet set;
394 set.InsertTile(soon_bin, SOON_BIN);
395 set.InsertTile(at_last_and_active_bin, AT_LAST_AND_ACTIVE_BIN);
396 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
397 set.InsertTile(now_bin, NOW_BIN);
398 set.InsertTile(eventually_and_active_bin, EVENTUALLY_AND_ACTIVE_BIN);
399 set.InsertTile(at_last_bin, AT_LAST_BIN);
400 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
402 // Tiles should appear in order.
403 PrioritizedTileSet::Iterator it(&set, true);
404 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
406 EXPECT_TRUE(*it == now_bin.get());
408 EXPECT_TRUE(*it == soon_bin.get());
410 EXPECT_TRUE(*it == eventually_and_active_bin.get());
412 EXPECT_TRUE(*it == eventually_bin.get());
414 EXPECT_TRUE(*it == at_last_and_active_bin.get());
416 EXPECT_TRUE(*it == at_last_bin.get());
421 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBin) {
422 // Aggregate test with many tiles in each of the bins of various
423 // priorities. Ensure that they are all returned in a sorted order.
425 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
426 std::vector<scoped_refptr<Tile> > now_bins;
427 std::vector<scoped_refptr<Tile> > soon_bins;
428 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
429 std::vector<scoped_refptr<Tile> > eventually_bins;
430 std::vector<scoped_refptr<Tile> > at_last_bins;
431 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
433 TilePriority priorities[4] = {
434 TilePriorityForEventualBin(),
435 TilePriorityForNowBin(),
437 TilePriorityForSoonBin()};
439 PrioritizedTileSet set;
440 for (int priority = 0; priority < 4; ++priority) {
441 for (int i = 0; i < 5; ++i) {
442 scoped_refptr<Tile> tile = CreateTile();
443 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
444 tile->SetPriority(PENDING_TREE, priorities[priority]);
446 now_and_ready_to_draw_bins.push_back(tile);
447 now_bins.push_back(tile);
448 soon_bins.push_back(tile);
449 eventually_and_active_bins.push_back(tile);
450 eventually_bins.push_back(tile);
451 at_last_bins.push_back(tile);
452 at_last_and_active_bins.push_back(tile);
454 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
455 set.InsertTile(tile, NOW_BIN);
456 set.InsertTile(tile, SOON_BIN);
457 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
458 set.InsertTile(tile, EVENTUALLY_BIN);
459 set.InsertTile(tile, AT_LAST_BIN);
460 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
464 PrioritizedTileSet::Iterator it(&set, true);
465 std::vector<scoped_refptr<Tile> >::iterator vector_it;
467 // Now and ready are not sorted.
468 for (vector_it = now_and_ready_to_draw_bins.begin();
469 vector_it != now_and_ready_to_draw_bins.end();
471 EXPECT_TRUE(*vector_it == *it);
475 // Now bins are sorted.
476 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
477 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
478 EXPECT_TRUE(*vector_it == *it);
482 // Soon bins are sorted.
483 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
484 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
486 EXPECT_TRUE(*vector_it == *it);
490 // Eventually and active bins are sorted.
491 std::sort(eventually_and_active_bins.begin(),
492 eventually_and_active_bins.end(),
494 for (vector_it = eventually_and_active_bins.begin();
495 vector_it != eventually_and_active_bins.end();
497 EXPECT_TRUE(*vector_it == *it);
501 // Eventually bins are sorted.
502 std::sort(eventually_bins.begin(), eventually_bins.end(), BinComparator());
503 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
505 EXPECT_TRUE(*vector_it == *it);
509 // At last and active bins are sorted.
510 std::sort(at_last_and_active_bins.begin(),
511 at_last_and_active_bins.end(),
513 for (vector_it = at_last_and_active_bins.begin();
514 vector_it != at_last_and_active_bins.end();
516 EXPECT_TRUE(*vector_it == *it);
520 // At last bins are sorted.
521 std::sort(at_last_bins.begin(), at_last_bins.end(), BinComparator());
522 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
524 EXPECT_TRUE(*vector_it == *it);
531 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBinDisablePriority) {
532 // Aggregate test with many tiles for each of the bins. Tiles should
533 // appear in order, until DisablePriorityOrdering is called. After that
534 // tiles should appear in the order they were inserted.
536 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
537 std::vector<scoped_refptr<Tile> > now_bins;
538 std::vector<scoped_refptr<Tile> > soon_bins;
539 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
540 std::vector<scoped_refptr<Tile> > eventually_bins;
541 std::vector<scoped_refptr<Tile> > at_last_bins;
542 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
544 TilePriority priorities[4] = {
545 TilePriorityForEventualBin(),
546 TilePriorityForNowBin(),
548 TilePriorityForSoonBin()};
550 PrioritizedTileSet set;
551 for (int priority = 0; priority < 4; ++priority) {
552 for (int i = 0; i < 5; ++i) {
553 scoped_refptr<Tile> tile = CreateTile();
554 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
555 tile->SetPriority(PENDING_TREE, priorities[priority]);
557 now_and_ready_to_draw_bins.push_back(tile);
558 now_bins.push_back(tile);
559 soon_bins.push_back(tile);
560 eventually_and_active_bins.push_back(tile);
561 eventually_bins.push_back(tile);
562 at_last_bins.push_back(tile);
563 at_last_and_active_bins.push_back(tile);
565 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
566 set.InsertTile(tile, NOW_BIN);
567 set.InsertTile(tile, SOON_BIN);
568 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
569 set.InsertTile(tile, EVENTUALLY_BIN);
570 set.InsertTile(tile, AT_LAST_BIN);
571 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
575 PrioritizedTileSet::Iterator it(&set, true);
576 std::vector<scoped_refptr<Tile> >::iterator vector_it;
578 // Now and ready are not sorted.
579 for (vector_it = now_and_ready_to_draw_bins.begin();
580 vector_it != now_and_ready_to_draw_bins.end();
582 EXPECT_TRUE(*vector_it == *it);
586 // Now bins are sorted.
587 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
588 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
589 EXPECT_TRUE(*vector_it == *it);
593 // Soon bins are sorted.
594 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
595 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
597 EXPECT_TRUE(*vector_it == *it);
601 // After we disable priority ordering, we already have sorted the next vector.
602 it.DisablePriorityOrdering();
604 // Eventually and active bins are sorted.
605 std::sort(eventually_and_active_bins.begin(),
606 eventually_and_active_bins.end(),
608 for (vector_it = eventually_and_active_bins.begin();
609 vector_it != eventually_and_active_bins.end();
611 EXPECT_TRUE(*vector_it == *it);
615 // Eventually bins are not sorted.
616 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
618 EXPECT_TRUE(*vector_it == *it);
622 // At last and active bins are not sorted.
623 for (vector_it = at_last_and_active_bins.begin();
624 vector_it != at_last_and_active_bins.end();
626 EXPECT_TRUE(*vector_it == *it);
630 // At last bins are not sorted.
631 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
633 EXPECT_TRUE(*vector_it == *it);
640 TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
641 // Make sure that if we have empty lists between two non-empty lists,
642 // we just get two tiles from the iterator.
644 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
645 scoped_refptr<Tile> at_last_bin = CreateTile();
647 PrioritizedTileSet set;
648 set.InsertTile(at_last_bin, AT_LAST_BIN);
649 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
651 // Only two tiles should appear and they should appear in order.
652 PrioritizedTileSet::Iterator it(&set, true);
653 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
655 EXPECT_TRUE(*it == at_last_bin.get());
660 TEST_F(PrioritizedTileSetTest, MultipleIterators) {
661 // Ensure that multiple iterators don't interfere with each other.
663 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
664 scoped_refptr<Tile> now_bin = CreateTile();
665 scoped_refptr<Tile> soon_bin = CreateTile();
666 scoped_refptr<Tile> eventually_bin = CreateTile();
667 scoped_refptr<Tile> at_last_bin = CreateTile();
669 PrioritizedTileSet set;
670 set.InsertTile(soon_bin, SOON_BIN);
671 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
672 set.InsertTile(now_bin, NOW_BIN);
673 set.InsertTile(at_last_bin, AT_LAST_BIN);
674 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
676 // Tiles should appear in order.
677 PrioritizedTileSet::Iterator it(&set, true);
678 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
680 EXPECT_TRUE(*it == now_bin.get());
682 EXPECT_TRUE(*it == soon_bin.get());
684 EXPECT_TRUE(*it == eventually_bin.get());
686 EXPECT_TRUE(*it == at_last_bin.get());
690 // Creating multiple iterators shouldn't affect old iterators.
691 PrioritizedTileSet::Iterator second_it(&set, true);
692 EXPECT_TRUE(second_it);
696 EXPECT_TRUE(second_it);
698 EXPECT_TRUE(second_it);
701 PrioritizedTileSet::Iterator third_it(&set, true);
702 EXPECT_TRUE(third_it);
705 EXPECT_TRUE(second_it);
706 EXPECT_TRUE(third_it);
711 EXPECT_TRUE(third_it);
712 EXPECT_TRUE(*third_it == soon_bin.get());
713 EXPECT_TRUE(second_it);
714 EXPECT_TRUE(*second_it == at_last_bin.get());
718 EXPECT_TRUE(third_it);
719 EXPECT_FALSE(second_it);
724 PrioritizedTileSet::Iterator empty_it(&set, true);
725 EXPECT_FALSE(empty_it);