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

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

Issue 367833003: cc: Start using raster/eviction iterators. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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
(Empty)
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.
4
5 #include <algorithm>
6 #include <vector>
7
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_shared_bitmap_manager.h"
17 #include "cc/test/test_tile_priorities.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace cc {
21
22 class BinComparator {
23 public:
24 bool operator()(const scoped_refptr<Tile>& a,
25 const scoped_refptr<Tile>& b) const {
26 const ManagedTileState& ams = a->managed_state();
27 const ManagedTileState& bms = b->managed_state();
28
29 if (ams.priority_bin != bms.priority_bin)
30 return ams.priority_bin < bms.priority_bin;
31
32 if (ams.required_for_activation != bms.required_for_activation)
33 return ams.required_for_activation;
34
35 if (ams.resolution != bms.resolution)
36 return ams.resolution < bms.resolution;
37
38 if (ams.distance_to_visible != bms.distance_to_visible)
39 return ams.distance_to_visible < bms.distance_to_visible;
40
41 gfx::Rect a_rect = a->content_rect();
42 gfx::Rect b_rect = b->content_rect();
43 if (a_rect.y() != b_rect.y())
44 return a_rect.y() < b_rect.y();
45 return a_rect.x() < b_rect.x();
46 }
47 };
48
49 namespace {
50
51 class PrioritizedTileSetTest : public testing::Test {
52 public:
53 PrioritizedTileSetTest() {
54 output_surface_ = FakeOutputSurface::Create3d().Pass();
55 CHECK(output_surface_->BindToClient(&output_surface_client_));
56
57 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
58 resource_provider_ =
59 ResourceProvider::Create(
60 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1,
61 false)
62 .Pass();
63 resource_pool_ = ResourcePool::Create(
64 resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
65 tile_manager_.reset(
66 new FakeTileManager(&tile_manager_client_, resource_pool_.get()));
67 picture_pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
68 }
69
70 scoped_refptr<Tile> CreateTile() {
71 return tile_manager_->CreateTile(picture_pile_.get(),
72 settings_.default_tile_size,
73 gfx::Rect(),
74 gfx::Rect(),
75 1.0,
76 0,
77 0,
78 0);
79 }
80 void ReleaseTiles(std::vector<scoped_refptr<Tile> >* tiles) {
81 for (std::vector<scoped_refptr<Tile> >::iterator it = tiles->begin();
82 it != tiles->end();
83 it++) {
84 Tile* tile = *it;
85 tile->SetPriority(ACTIVE_TREE, TilePriority());
86 tile->SetPriority(PENDING_TREE, TilePriority());
87 }
88 }
89
90 private:
91 LayerTreeSettings settings_;
92 FakeOutputSurfaceClient output_surface_client_;
93 scoped_ptr<FakeOutputSurface> output_surface_;
94 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
95 scoped_ptr<ResourceProvider> resource_provider_;
96 scoped_ptr<ResourcePool> resource_pool_;
97 FakeTileManagerClient tile_manager_client_;
98 scoped_ptr<FakeTileManager> tile_manager_;
99 scoped_refptr<FakePicturePileImpl> picture_pile_;
100 };
101
102 TEST_F(PrioritizedTileSetTest, EmptyIterator) {
103 // Creating an iterator to an empty set should work (but create iterator that
104 // isn't valid).
105
106 PrioritizedTileSet set;
107
108 PrioritizedTileSet::Iterator it(&set, true);
109 EXPECT_FALSE(it);
110 }
111
112 TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
113 PrioritizedTileSet set;
114 scoped_refptr<Tile> tile = CreateTile();
115 set.InsertTile(tile, NOW_BIN);
116
117 PrioritizedTileSet::Iterator it(&set, true);
118 EXPECT_TRUE(it);
119 EXPECT_TRUE(*it == tile.get());
120 ++it;
121 EXPECT_FALSE(it);
122 }
123
124 TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
125 // Ensure that tiles in NOW_AND_READY_TO_DRAW_BIN aren't sorted.
126
127 PrioritizedTileSet set;
128 TilePriority priorities[4] = {
129 TilePriorityForEventualBin(),
130 TilePriorityForNowBin(),
131 TilePriority(),
132 TilePriorityForSoonBin()};
133
134 std::vector<scoped_refptr<Tile> > tiles;
135 for (int priority = 0; priority < 4; ++priority) {
136 for (int i = 0; i < 5; ++i) {
137 scoped_refptr<Tile> tile = CreateTile();
138 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
139 tile->SetPriority(PENDING_TREE, priorities[priority]);
140 tiles.push_back(tile);
141 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
142 }
143 }
144
145 // Tiles should appear in the same order as inserted.
146 int i = 0;
147 for (PrioritizedTileSet::Iterator it(&set, true);
148 it;
149 ++it) {
150 EXPECT_TRUE(*it == tiles[i].get());
151 ++i;
152 }
153 EXPECT_EQ(20, i);
154
155 ReleaseTiles(&tiles);
156 }
157
158 TEST_F(PrioritizedTileSetTest, NowBin) {
159 // Ensure that tiles in NOW_BIN are sorted according to BinComparator.
160
161 PrioritizedTileSet set;
162 TilePriority priorities[4] = {
163 TilePriorityForEventualBin(),
164 TilePriorityForNowBin(),
165 TilePriority(),
166 TilePriorityForSoonBin()};
167
168 std::vector<scoped_refptr<Tile> > tiles;
169 for (int priority = 0; priority < 4; ++priority) {
170 for (int i = 0; i < 5; ++i) {
171 scoped_refptr<Tile> tile = CreateTile();
172 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
173 tile->SetPriority(PENDING_TREE, priorities[priority]);
174 tiles.push_back(tile);
175 set.InsertTile(tile, NOW_BIN);
176 }
177 }
178
179 // Tiles should appear in BinComparator order.
180 std::sort(tiles.begin(), tiles.end(), BinComparator());
181
182 int i = 0;
183 for (PrioritizedTileSet::Iterator it(&set, true);
184 it;
185 ++it) {
186 EXPECT_TRUE(*it == tiles[i].get());
187 ++i;
188 }
189 EXPECT_EQ(20, i);
190
191 ReleaseTiles(&tiles);
192 }
193
194 TEST_F(PrioritizedTileSetTest, SoonBin) {
195 // Ensure that tiles in SOON_BIN are sorted according to BinComparator.
196
197 PrioritizedTileSet set;
198 TilePriority priorities[4] = {
199 TilePriorityForEventualBin(),
200 TilePriorityForNowBin(),
201 TilePriority(),
202 TilePriorityForSoonBin()};
203
204 std::vector<scoped_refptr<Tile> > tiles;
205 for (int priority = 0; priority < 4; ++priority) {
206 for (int i = 0; i < 5; ++i) {
207 scoped_refptr<Tile> tile = CreateTile();
208 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
209 tile->SetPriority(PENDING_TREE, priorities[priority]);
210 tiles.push_back(tile);
211 set.InsertTile(tile, SOON_BIN);
212 }
213 }
214
215 // Tiles should appear in BinComparator order.
216 std::sort(tiles.begin(), tiles.end(), BinComparator());
217
218 int i = 0;
219 for (PrioritizedTileSet::Iterator it(&set, true);
220 it;
221 ++it) {
222 EXPECT_TRUE(*it == tiles[i].get());
223 ++i;
224 }
225 EXPECT_EQ(20, i);
226
227 ReleaseTiles(&tiles);
228 }
229
230 TEST_F(PrioritizedTileSetTest, SoonBinNoPriority) {
231 // Ensure that when not using priority iterator, SOON_BIN tiles
232 // are not sorted.
233
234 PrioritizedTileSet set;
235 TilePriority priorities[4] = {
236 TilePriorityForEventualBin(),
237 TilePriorityForNowBin(),
238 TilePriority(),
239 TilePriorityForSoonBin()};
240
241 std::vector<scoped_refptr<Tile> > tiles;
242 for (int priority = 0; priority < 4; ++priority) {
243 for (int i = 0; i < 5; ++i) {
244 scoped_refptr<Tile> tile = CreateTile();
245 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
246 tile->SetPriority(PENDING_TREE, priorities[priority]);
247 tiles.push_back(tile);
248 set.InsertTile(tile, SOON_BIN);
249 }
250 }
251
252 int i = 0;
253 for (PrioritizedTileSet::Iterator it(&set, false);
254 it;
255 ++it) {
256 EXPECT_TRUE(*it == tiles[i].get());
257 ++i;
258 }
259 EXPECT_EQ(20, i);
260
261 ReleaseTiles(&tiles);
262 }
263
264 TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
265 // Ensure that EVENTUALLY_AND_ACTIVE_BIN tiles are sorted.
266
267 PrioritizedTileSet set;
268 TilePriority priorities[4] = {
269 TilePriorityForEventualBin(),
270 TilePriorityForNowBin(),
271 TilePriority(),
272 TilePriorityForSoonBin()};
273
274 std::vector<scoped_refptr<Tile> > tiles;
275 for (int priority = 0; priority < 4; ++priority) {
276 for (int i = 0; i < 5; ++i) {
277 scoped_refptr<Tile> tile = CreateTile();
278 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
279 tile->SetPriority(PENDING_TREE, priorities[priority]);
280 tiles.push_back(tile);
281 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
282 }
283 }
284
285 // Tiles should appear in BinComparator order.
286 std::sort(tiles.begin(), tiles.end(), BinComparator());
287
288 int i = 0;
289 for (PrioritizedTileSet::Iterator it(&set, true);
290 it;
291 ++it) {
292 EXPECT_TRUE(*it == tiles[i].get());
293 ++i;
294 }
295 EXPECT_EQ(20, i);
296
297 ReleaseTiles(&tiles);
298 }
299
300 TEST_F(PrioritizedTileSetTest, EventuallyBin) {
301 // Ensure that EVENTUALLY_BIN tiles are sorted.
302
303 PrioritizedTileSet set;
304 TilePriority priorities[4] = {
305 TilePriorityForEventualBin(),
306 TilePriorityForNowBin(),
307 TilePriority(),
308 TilePriorityForSoonBin()};
309
310 std::vector<scoped_refptr<Tile> > tiles;
311 for (int priority = 0; priority < 4; ++priority) {
312 for (int i = 0; i < 5; ++i) {
313 scoped_refptr<Tile> tile = CreateTile();
314 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
315 tile->SetPriority(PENDING_TREE, priorities[priority]);
316 tiles.push_back(tile);
317 set.InsertTile(tile, EVENTUALLY_BIN);
318 }
319 }
320
321 // Tiles should appear in BinComparator order.
322 std::sort(tiles.begin(), tiles.end(), BinComparator());
323
324 int i = 0;
325 for (PrioritizedTileSet::Iterator it(&set, true);
326 it;
327 ++it) {
328 EXPECT_TRUE(*it == tiles[i].get());
329 ++i;
330 }
331 EXPECT_EQ(20, i);
332
333 ReleaseTiles(&tiles);
334 }
335
336 TEST_F(PrioritizedTileSetTest, AtLastAndActiveBin) {
337 // Ensure that AT_LAST_AND_ACTIVE_BIN tiles are sorted.
338
339 PrioritizedTileSet set;
340 TilePriority priorities[4] = {
341 TilePriorityForEventualBin(),
342 TilePriorityForNowBin(),
343 TilePriority(),
344 TilePriorityForSoonBin()};
345
346 std::vector<scoped_refptr<Tile> > tiles;
347 for (int priority = 0; priority < 4; ++priority) {
348 for (int i = 0; i < 5; ++i) {
349 scoped_refptr<Tile> tile = CreateTile();
350 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
351 tile->SetPriority(PENDING_TREE, priorities[priority]);
352 tiles.push_back(tile);
353 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
354 }
355 }
356
357 // Tiles should appear in BinComparator order.
358 std::sort(tiles.begin(), tiles.end(), BinComparator());
359
360 int i = 0;
361 for (PrioritizedTileSet::Iterator it(&set, true);
362 it;
363 ++it) {
364 EXPECT_TRUE(*it == tiles[i].get());
365 ++i;
366 }
367 EXPECT_EQ(20, i);
368
369 ReleaseTiles(&tiles);
370 }
371
372 TEST_F(PrioritizedTileSetTest, AtLastBin) {
373 // Ensure that AT_LAST_BIN tiles are sorted.
374
375 PrioritizedTileSet set;
376 TilePriority priorities[4] = {
377 TilePriorityForEventualBin(),
378 TilePriorityForNowBin(),
379 TilePriority(),
380 TilePriorityForSoonBin()};
381
382 std::vector<scoped_refptr<Tile> > tiles;
383 for (int priority = 0; priority < 4; ++priority) {
384 for (int i = 0; i < 5; ++i) {
385 scoped_refptr<Tile> tile = CreateTile();
386 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
387 tile->SetPriority(PENDING_TREE, priorities[priority]);
388 tiles.push_back(tile);
389 set.InsertTile(tile, AT_LAST_BIN);
390 }
391 }
392
393 // Tiles should appear in BinComparator order.
394 std::sort(tiles.begin(), tiles.end(), BinComparator());
395
396 int i = 0;
397 for (PrioritizedTileSet::Iterator it(&set, true);
398 it;
399 ++it) {
400 EXPECT_TRUE(*it == tiles[i].get());
401 ++i;
402 }
403 EXPECT_EQ(20, i);
404
405 ReleaseTiles(&tiles);
406 }
407
408 TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
409 // Aggregate test with one tile for each of the bins, which
410 // should appear in order of the bins.
411
412 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
413 scoped_refptr<Tile> now_bin = CreateTile();
414 scoped_refptr<Tile> soon_bin = CreateTile();
415 scoped_refptr<Tile> eventually_and_active_bin = CreateTile();
416 scoped_refptr<Tile> eventually_bin = CreateTile();
417 scoped_refptr<Tile> at_last_bin = CreateTile();
418 scoped_refptr<Tile> at_last_and_active_bin = CreateTile();
419
420 PrioritizedTileSet set;
421 set.InsertTile(soon_bin, SOON_BIN);
422 set.InsertTile(at_last_and_active_bin, AT_LAST_AND_ACTIVE_BIN);
423 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
424 set.InsertTile(now_bin, NOW_BIN);
425 set.InsertTile(eventually_and_active_bin, EVENTUALLY_AND_ACTIVE_BIN);
426 set.InsertTile(at_last_bin, AT_LAST_BIN);
427 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
428
429 // Tiles should appear in order.
430 PrioritizedTileSet::Iterator it(&set, true);
431 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
432 ++it;
433 EXPECT_TRUE(*it == now_bin.get());
434 ++it;
435 EXPECT_TRUE(*it == soon_bin.get());
436 ++it;
437 EXPECT_TRUE(*it == eventually_and_active_bin.get());
438 ++it;
439 EXPECT_TRUE(*it == eventually_bin.get());
440 ++it;
441 EXPECT_TRUE(*it == at_last_and_active_bin.get());
442 ++it;
443 EXPECT_TRUE(*it == at_last_bin.get());
444 ++it;
445 EXPECT_FALSE(it);
446 }
447
448 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBin) {
449 // Aggregate test with many tiles in each of the bins of various
450 // priorities. Ensure that they are all returned in a sorted order.
451
452 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
453 std::vector<scoped_refptr<Tile> > now_bins;
454 std::vector<scoped_refptr<Tile> > soon_bins;
455 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
456 std::vector<scoped_refptr<Tile> > eventually_bins;
457 std::vector<scoped_refptr<Tile> > at_last_bins;
458 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
459
460 TilePriority priorities[4] = {
461 TilePriorityForEventualBin(),
462 TilePriorityForNowBin(),
463 TilePriority(),
464 TilePriorityForSoonBin()};
465
466 PrioritizedTileSet set;
467 for (int priority = 0; priority < 4; ++priority) {
468 for (int i = 0; i < 5; ++i) {
469 scoped_refptr<Tile> tile = CreateTile();
470 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
471 tile->SetPriority(PENDING_TREE, priorities[priority]);
472
473 now_and_ready_to_draw_bins.push_back(tile);
474 now_bins.push_back(tile);
475 soon_bins.push_back(tile);
476 eventually_and_active_bins.push_back(tile);
477 eventually_bins.push_back(tile);
478 at_last_bins.push_back(tile);
479 at_last_and_active_bins.push_back(tile);
480
481 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
482 set.InsertTile(tile, NOW_BIN);
483 set.InsertTile(tile, SOON_BIN);
484 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
485 set.InsertTile(tile, EVENTUALLY_BIN);
486 set.InsertTile(tile, AT_LAST_BIN);
487 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
488 }
489 }
490
491 PrioritizedTileSet::Iterator it(&set, true);
492 std::vector<scoped_refptr<Tile> >::iterator vector_it;
493
494 // Now and ready are not sorted.
495 for (vector_it = now_and_ready_to_draw_bins.begin();
496 vector_it != now_and_ready_to_draw_bins.end();
497 ++vector_it) {
498 EXPECT_TRUE(*vector_it == *it);
499 ++it;
500 }
501
502 // Now bins are sorted.
503 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
504 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
505 EXPECT_TRUE(*vector_it == *it);
506 ++it;
507 }
508
509 // Soon bins are sorted.
510 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
511 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
512 ++vector_it) {
513 EXPECT_TRUE(*vector_it == *it);
514 ++it;
515 }
516
517 // Eventually and active bins are sorted.
518 std::sort(eventually_and_active_bins.begin(),
519 eventually_and_active_bins.end(),
520 BinComparator());
521 for (vector_it = eventually_and_active_bins.begin();
522 vector_it != eventually_and_active_bins.end();
523 ++vector_it) {
524 EXPECT_TRUE(*vector_it == *it);
525 ++it;
526 }
527
528 // Eventually bins are sorted.
529 std::sort(eventually_bins.begin(), eventually_bins.end(), BinComparator());
530 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
531 ++vector_it) {
532 EXPECT_TRUE(*vector_it == *it);
533 ++it;
534 }
535
536 // At last and active bins are sorted.
537 std::sort(at_last_and_active_bins.begin(),
538 at_last_and_active_bins.end(),
539 BinComparator());
540 for (vector_it = at_last_and_active_bins.begin();
541 vector_it != at_last_and_active_bins.end();
542 ++vector_it) {
543 EXPECT_TRUE(*vector_it == *it);
544 ++it;
545 }
546
547 // At last bins are sorted.
548 std::sort(at_last_bins.begin(), at_last_bins.end(), BinComparator());
549 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
550 ++vector_it) {
551 EXPECT_TRUE(*vector_it == *it);
552 ++it;
553 }
554
555 EXPECT_FALSE(it);
556
557 ReleaseTiles(&now_and_ready_to_draw_bins);
558 ReleaseTiles(&now_bins);
559 ReleaseTiles(&soon_bins);
560 ReleaseTiles(&eventually_and_active_bins);
561 ReleaseTiles(&eventually_bins);
562 ReleaseTiles(&at_last_bins);
563 ReleaseTiles(&at_last_and_active_bins);
564 }
565
566 TEST_F(PrioritizedTileSetTest, ManyTilesForEachBinDisablePriority) {
567 // Aggregate test with many tiles for each of the bins. Tiles should
568 // appear in order, until DisablePriorityOrdering is called. After that
569 // tiles should appear in the order they were inserted.
570
571 std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
572 std::vector<scoped_refptr<Tile> > now_bins;
573 std::vector<scoped_refptr<Tile> > soon_bins;
574 std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
575 std::vector<scoped_refptr<Tile> > eventually_bins;
576 std::vector<scoped_refptr<Tile> > at_last_bins;
577 std::vector<scoped_refptr<Tile> > at_last_and_active_bins;
578
579 TilePriority priorities[4] = {
580 TilePriorityForEventualBin(),
581 TilePriorityForNowBin(),
582 TilePriority(),
583 TilePriorityForSoonBin()};
584
585 PrioritizedTileSet set;
586 for (int priority = 0; priority < 4; ++priority) {
587 for (int i = 0; i < 5; ++i) {
588 scoped_refptr<Tile> tile = CreateTile();
589 tile->SetPriority(ACTIVE_TREE, priorities[priority]);
590 tile->SetPriority(PENDING_TREE, priorities[priority]);
591
592 now_and_ready_to_draw_bins.push_back(tile);
593 now_bins.push_back(tile);
594 soon_bins.push_back(tile);
595 eventually_and_active_bins.push_back(tile);
596 eventually_bins.push_back(tile);
597 at_last_bins.push_back(tile);
598 at_last_and_active_bins.push_back(tile);
599
600 set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
601 set.InsertTile(tile, NOW_BIN);
602 set.InsertTile(tile, SOON_BIN);
603 set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
604 set.InsertTile(tile, EVENTUALLY_BIN);
605 set.InsertTile(tile, AT_LAST_BIN);
606 set.InsertTile(tile, AT_LAST_AND_ACTIVE_BIN);
607 }
608 }
609
610 PrioritizedTileSet::Iterator it(&set, true);
611 std::vector<scoped_refptr<Tile> >::iterator vector_it;
612
613 // Now and ready are not sorted.
614 for (vector_it = now_and_ready_to_draw_bins.begin();
615 vector_it != now_and_ready_to_draw_bins.end();
616 ++vector_it) {
617 EXPECT_TRUE(*vector_it == *it);
618 ++it;
619 }
620
621 // Now bins are sorted.
622 std::sort(now_bins.begin(), now_bins.end(), BinComparator());
623 for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
624 EXPECT_TRUE(*vector_it == *it);
625 ++it;
626 }
627
628 // Soon bins are sorted.
629 std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
630 for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
631 ++vector_it) {
632 EXPECT_TRUE(*vector_it == *it);
633 ++it;
634 }
635
636 // After we disable priority ordering, we already have sorted the next vector.
637 it.DisablePriorityOrdering();
638
639 // Eventually and active bins are sorted.
640 std::sort(eventually_and_active_bins.begin(),
641 eventually_and_active_bins.end(),
642 BinComparator());
643 for (vector_it = eventually_and_active_bins.begin();
644 vector_it != eventually_and_active_bins.end();
645 ++vector_it) {
646 EXPECT_TRUE(*vector_it == *it);
647 ++it;
648 }
649
650 // Eventually bins are not sorted.
651 for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
652 ++vector_it) {
653 EXPECT_TRUE(*vector_it == *it);
654 ++it;
655 }
656
657 // At last and active bins are not sorted.
658 for (vector_it = at_last_and_active_bins.begin();
659 vector_it != at_last_and_active_bins.end();
660 ++vector_it) {
661 EXPECT_TRUE(*vector_it == *it);
662 ++it;
663 }
664
665 // At last bins are not sorted.
666 for (vector_it = at_last_bins.begin(); vector_it != at_last_bins.end();
667 ++vector_it) {
668 EXPECT_TRUE(*vector_it == *it);
669 ++it;
670 }
671
672 EXPECT_FALSE(it);
673
674 ReleaseTiles(&now_and_ready_to_draw_bins);
675 ReleaseTiles(&now_bins);
676 ReleaseTiles(&soon_bins);
677 ReleaseTiles(&eventually_and_active_bins);
678 ReleaseTiles(&eventually_bins);
679 ReleaseTiles(&at_last_bins);
680 ReleaseTiles(&at_last_and_active_bins);
681 }
682
683 TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
684 // Make sure that if we have empty lists between two non-empty lists,
685 // we just get two tiles from the iterator.
686
687 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
688 scoped_refptr<Tile> at_last_bin = CreateTile();
689
690 PrioritizedTileSet set;
691 set.InsertTile(at_last_bin, AT_LAST_BIN);
692 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
693
694 // Only two tiles should appear and they should appear in order.
695 PrioritizedTileSet::Iterator it(&set, true);
696 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
697 ++it;
698 EXPECT_TRUE(*it == at_last_bin.get());
699 ++it;
700 EXPECT_FALSE(it);
701 }
702
703 TEST_F(PrioritizedTileSetTest, MultipleIterators) {
704 // Ensure that multiple iterators don't interfere with each other.
705
706 scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
707 scoped_refptr<Tile> now_bin = CreateTile();
708 scoped_refptr<Tile> soon_bin = CreateTile();
709 scoped_refptr<Tile> eventually_bin = CreateTile();
710 scoped_refptr<Tile> at_last_bin = CreateTile();
711
712 PrioritizedTileSet set;
713 set.InsertTile(soon_bin, SOON_BIN);
714 set.InsertTile(eventually_bin, EVENTUALLY_BIN);
715 set.InsertTile(now_bin, NOW_BIN);
716 set.InsertTile(at_last_bin, AT_LAST_BIN);
717 set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
718
719 // Tiles should appear in order.
720 PrioritizedTileSet::Iterator it(&set, true);
721 EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
722 ++it;
723 EXPECT_TRUE(*it == now_bin.get());
724 ++it;
725 EXPECT_TRUE(*it == soon_bin.get());
726 ++it;
727 EXPECT_TRUE(*it == eventually_bin.get());
728 ++it;
729 EXPECT_TRUE(*it == at_last_bin.get());
730 ++it;
731 EXPECT_FALSE(it);
732
733 // Creating multiple iterators shouldn't affect old iterators.
734 PrioritizedTileSet::Iterator second_it(&set, true);
735 EXPECT_TRUE(second_it);
736 EXPECT_FALSE(it);
737
738 ++second_it;
739 EXPECT_TRUE(second_it);
740 ++second_it;
741 EXPECT_TRUE(second_it);
742 EXPECT_FALSE(it);
743
744 PrioritizedTileSet::Iterator third_it(&set, true);
745 EXPECT_TRUE(third_it);
746 ++second_it;
747 ++second_it;
748 EXPECT_TRUE(second_it);
749 EXPECT_TRUE(third_it);
750 EXPECT_FALSE(it);
751
752 ++third_it;
753 ++third_it;
754 EXPECT_TRUE(third_it);
755 EXPECT_TRUE(*third_it == soon_bin.get());
756 EXPECT_TRUE(second_it);
757 EXPECT_TRUE(*second_it == at_last_bin.get());
758 EXPECT_FALSE(it);
759
760 ++second_it;
761 EXPECT_TRUE(third_it);
762 EXPECT_FALSE(second_it);
763 EXPECT_FALSE(it);
764
765 set.Clear();
766
767 PrioritizedTileSet::Iterator empty_it(&set, true);
768 EXPECT_FALSE(empty_it);
769 }
770
771 } // namespace
772 } // namespace cc
773
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698