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.
5 #include "cc/resources/eviction_tile_priority_queue.h"
6 #include "cc/resources/raster_tile_priority_queue.h"
7 #include "cc/resources/tile.h"
8 #include "cc/resources/tile_priority.h"
9 #include "cc/resources/tiling_set_raster_queue_all.h"
10 #include "cc/test/begin_frame_args_test.h"
11 #include "cc/test/fake_impl_proxy.h"
12 #include "cc/test/fake_layer_tree_host_impl.h"
13 #include "cc/test/fake_output_surface.h"
14 #include "cc/test/fake_output_surface_client.h"
15 #include "cc/test/fake_picture_layer_impl.h"
16 #include "cc/test/fake_picture_layer_tiling_client.h"
17 #include "cc/test/fake_picture_pile_impl.h"
18 #include "cc/test/fake_tile_manager.h"
19 #include "cc/test/impl_side_painting_settings.h"
20 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "cc/test/test_tile_priorities.h"
22 #include "cc/trees/layer_tree_impl.h"
23 #include "testing/gtest/include/gtest/gtest.h"
28 class LowResTilingsSettings
: public ImplSidePaintingSettings
{
30 LowResTilingsSettings() { create_low_res_tiling
= true; }
33 class TileManagerTilePriorityQueueTest
: public testing::Test
{
35 TileManagerTilePriorityQueueTest()
36 : memory_limit_policy_(ALLOW_ANYTHING
),
38 ready_to_activate_(false),
40 proxy_(base::MessageLoopProxy::current()),
41 host_impl_(LowResTilingsSettings(), &proxy_
, &shared_bitmap_manager_
) {}
43 void SetTreePriority(TreePriority tree_priority
) {
44 GlobalStateThatImpactsTilePriority state
;
45 gfx::Size
tile_size(256, 256);
47 state
.soft_memory_limit_in_bytes
= 100 * 1000 * 1000;
48 state
.num_resources_limit
= max_tiles_
;
49 state
.hard_memory_limit_in_bytes
= state
.soft_memory_limit_in_bytes
* 2;
50 state
.memory_limit_policy
= memory_limit_policy_
;
51 state
.tree_priority
= tree_priority
;
53 global_state_
= state
;
54 host_impl_
.resource_pool()->SetResourceUsageLimits(
55 state
.soft_memory_limit_in_bytes
,
56 state
.soft_memory_limit_in_bytes
,
57 state
.num_resources_limit
);
58 host_impl_
.tile_manager()->SetGlobalStateForTesting(state
);
61 void SetUp() override
{
63 SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES
);
66 virtual void InitializeRenderer() {
67 host_impl_
.InitializeRenderer(FakeOutputSurface::Create3d());
70 void SetupDefaultTrees(const gfx::Size
& layer_bounds
) {
71 gfx::Size
tile_size(100, 100);
73 scoped_refptr
<FakePicturePileImpl
> pending_pile
=
74 FakePicturePileImpl::CreateFilledPile(tile_size
, layer_bounds
);
75 scoped_refptr
<FakePicturePileImpl
> active_pile
=
76 FakePicturePileImpl::CreateFilledPile(tile_size
, layer_bounds
);
78 SetupTrees(pending_pile
, active_pile
);
82 host_impl_
.ActivateSyncTree();
83 CHECK(!host_impl_
.pending_tree());
84 pending_layer_
= NULL
;
85 active_layer_
= static_cast<FakePictureLayerImpl
*>(
86 host_impl_
.active_tree()->LayerById(id_
));
89 void SetupDefaultTreesWithFixedTileSize(const gfx::Size
& layer_bounds
,
90 const gfx::Size
& tile_size
) {
91 SetupDefaultTrees(layer_bounds
);
92 pending_layer_
->set_fixed_tile_size(tile_size
);
93 active_layer_
->set_fixed_tile_size(tile_size
);
96 void SetupTrees(scoped_refptr
<PicturePileImpl
> pending_pile
,
97 scoped_refptr
<PicturePileImpl
> active_pile
) {
98 SetupPendingTree(active_pile
);
100 SetupPendingTree(pending_pile
);
103 void SetupPendingTree(scoped_refptr
<PicturePileImpl
> pile
) {
104 host_impl_
.CreatePendingTree();
105 LayerTreeImpl
* pending_tree
= host_impl_
.pending_tree();
107 // Steal from the recycled tree.
108 scoped_ptr
<LayerImpl
> old_pending_root
= pending_tree
->DetachLayerTree();
109 DCHECK_IMPLIES(old_pending_root
, old_pending_root
->id() == id_
);
111 scoped_ptr
<FakePictureLayerImpl
> pending_layer
;
112 if (old_pending_root
) {
114 static_cast<FakePictureLayerImpl
*>(old_pending_root
.release()));
115 pending_layer
->SetRasterSourceOnPending(pile
, Region());
118 FakePictureLayerImpl::CreateWithRasterSource(pending_tree
, id_
, pile
);
119 pending_layer
->SetDrawsContent(true);
120 pending_layer
->SetHasRenderSurface(true);
122 // The bounds() just mirror the pile size.
123 pending_layer
->SetBounds(pending_layer
->raster_source()->GetSize());
124 pending_tree
->SetRootLayer(pending_layer
.Pass());
126 pending_layer_
= static_cast<FakePictureLayerImpl
*>(
127 host_impl_
.pending_tree()->LayerById(id_
));
129 // Add tilings/tiles for the layer.
130 bool update_lcd_text
= false;
131 host_impl_
.pending_tree()->UpdateDrawProperties(update_lcd_text
);
134 TileManager
* tile_manager() { return host_impl_
.tile_manager(); }
137 GlobalStateThatImpactsTilePriority global_state_
;
139 TestSharedBitmapManager shared_bitmap_manager_
;
140 TileMemoryLimitPolicy memory_limit_policy_
;
142 bool ready_to_activate_
;
144 FakeImplProxy proxy_
;
145 FakeLayerTreeHostImpl host_impl_
;
146 FakePictureLayerImpl
* pending_layer_
;
147 FakePictureLayerImpl
* active_layer_
;
150 TEST_F(TileManagerTilePriorityQueueTest
, RasterTilePriorityQueue
) {
151 const gfx::Size
layer_bounds(1000, 1000);
152 host_impl_
.SetViewportSize(layer_bounds
);
153 SetupDefaultTrees(layer_bounds
);
155 scoped_ptr
<RasterTilePriorityQueue
> queue(host_impl_
.BuildRasterQueue(
156 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
157 EXPECT_FALSE(queue
->IsEmpty());
159 size_t tile_count
= 0;
160 std::set
<Tile
*> all_tiles
;
161 while (!queue
->IsEmpty()) {
162 EXPECT_TRUE(queue
->Top());
163 all_tiles
.insert(queue
->Top());
168 EXPECT_EQ(tile_count
, all_tiles
.size());
169 EXPECT_EQ(16u, tile_count
);
171 // Sanity check, all tiles should be visible.
172 std::set
<Tile
*> smoothness_tiles
;
173 queue
= host_impl_
.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY
,
174 RasterTilePriorityQueue::Type::ALL
);
175 bool had_low_res
= false;
176 while (!queue
->IsEmpty()) {
177 Tile
* tile
= queue
->Top();
179 EXPECT_EQ(TilePriority::NOW
, tile
->priority(ACTIVE_TREE
).priority_bin
);
180 EXPECT_EQ(TilePriority::NOW
, tile
->priority(PENDING_TREE
).priority_bin
);
181 if (tile
->priority(ACTIVE_TREE
).resolution
== LOW_RESOLUTION
)
184 smoothness_tiles
.insert(tile
);
187 EXPECT_EQ(all_tiles
, smoothness_tiles
);
188 EXPECT_TRUE(had_low_res
);
190 // Check that everything is required for activation.
191 queue
= host_impl_
.BuildRasterQueue(
192 SMOOTHNESS_TAKES_PRIORITY
,
193 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION
);
194 std::set
<Tile
*> required_for_activation_tiles
;
195 while (!queue
->IsEmpty()) {
196 Tile
* tile
= queue
->Top();
197 EXPECT_TRUE(tile
->required_for_activation());
198 required_for_activation_tiles
.insert(tile
);
201 EXPECT_EQ(all_tiles
, required_for_activation_tiles
);
203 // Check that everything is required for draw.
204 queue
= host_impl_
.BuildRasterQueue(
205 SMOOTHNESS_TAKES_PRIORITY
,
206 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW
);
207 std::set
<Tile
*> required_for_draw_tiles
;
208 while (!queue
->IsEmpty()) {
209 Tile
* tile
= queue
->Top();
210 EXPECT_TRUE(tile
->required_for_draw());
211 required_for_draw_tiles
.insert(tile
);
214 EXPECT_EQ(all_tiles
, required_for_draw_tiles
);
216 Region
invalidation(gfx::Rect(0, 0, 500, 500));
218 // Invalidate the pending tree.
219 pending_layer_
->set_invalidation(invalidation
);
220 pending_layer_
->HighResTiling()->Invalidate(invalidation
);
221 pending_layer_
->LowResTiling()->Invalidate(invalidation
);
223 active_layer_
->ResetAllTilesPriorities();
224 pending_layer_
->ResetAllTilesPriorities();
226 // Renew all of the tile priorities.
227 gfx::Rect
viewport(50, 50, 100, 100);
228 pending_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
230 pending_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
232 active_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
234 active_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
237 // Populate all tiles directly from the tilings.
239 std::set
<Tile
*> high_res_tiles
;
240 std::vector
<Tile
*> pending_high_res_tiles
=
241 pending_layer_
->HighResTiling()->AllTilesForTesting();
242 for (size_t i
= 0; i
< pending_high_res_tiles
.size(); ++i
) {
243 all_tiles
.insert(pending_high_res_tiles
[i
]);
244 high_res_tiles
.insert(pending_high_res_tiles
[i
]);
247 std::vector
<Tile
*> pending_low_res_tiles
=
248 pending_layer_
->LowResTiling()->AllTilesForTesting();
249 for (size_t i
= 0; i
< pending_low_res_tiles
.size(); ++i
)
250 all_tiles
.insert(pending_low_res_tiles
[i
]);
252 std::vector
<Tile
*> active_high_res_tiles
=
253 active_layer_
->HighResTiling()->AllTilesForTesting();
254 for (size_t i
= 0; i
< active_high_res_tiles
.size(); ++i
) {
255 all_tiles
.insert(active_high_res_tiles
[i
]);
256 high_res_tiles
.insert(active_high_res_tiles
[i
]);
259 std::vector
<Tile
*> active_low_res_tiles
=
260 active_layer_
->LowResTiling()->AllTilesForTesting();
261 for (size_t i
= 0; i
< active_low_res_tiles
.size(); ++i
)
262 all_tiles
.insert(active_low_res_tiles
[i
]);
264 Tile
* last_tile
= NULL
;
265 smoothness_tiles
.clear();
267 size_t correct_order_tiles
= 0u;
268 // Here we expect to get increasing ACTIVE_TREE priority_bin.
269 queue
= host_impl_
.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY
,
270 RasterTilePriorityQueue::Type::ALL
);
271 std::set
<Tile
*> expected_required_for_draw_tiles
;
272 std::set
<Tile
*> expected_required_for_activation_tiles
;
273 while (!queue
->IsEmpty()) {
274 Tile
* tile
= queue
->Top();
280 EXPECT_LE(last_tile
->priority(ACTIVE_TREE
).priority_bin
,
281 tile
->priority(ACTIVE_TREE
).priority_bin
);
282 bool skip_updating_last_tile
= false;
283 if (last_tile
->priority(ACTIVE_TREE
).priority_bin
==
284 tile
->priority(ACTIVE_TREE
).priority_bin
) {
285 correct_order_tiles
+=
286 last_tile
->priority(ACTIVE_TREE
).distance_to_visible
<=
287 tile
->priority(ACTIVE_TREE
).distance_to_visible
;
288 } else if (tile
->priority(ACTIVE_TREE
).priority_bin
==
289 TilePriority::EVENTUALLY
&&
290 tile
->priority(PENDING_TREE
).priority_bin
== TilePriority::NOW
) {
291 // Since we'd return pending tree now tiles before the eventually tiles on
292 // the active tree, update the value.
293 ++correct_order_tiles
;
294 skip_updating_last_tile
= true;
297 if (tile
->priority(ACTIVE_TREE
).priority_bin
== TilePriority::NOW
&&
298 last_tile
->priority(ACTIVE_TREE
).resolution
!=
299 tile
->priority(ACTIVE_TREE
).resolution
) {
300 // Low resolution should come first.
301 EXPECT_EQ(LOW_RESOLUTION
, last_tile
->priority(ACTIVE_TREE
).resolution
);
304 if (!skip_updating_last_tile
)
307 smoothness_tiles
.insert(tile
);
308 if (tile
->required_for_draw())
309 expected_required_for_draw_tiles
.insert(tile
);
310 if (tile
->required_for_activation())
311 expected_required_for_activation_tiles
.insert(tile
);
315 EXPECT_EQ(tile_count
, smoothness_tiles
.size());
316 EXPECT_EQ(all_tiles
, smoothness_tiles
);
317 // Since we don't guarantee increasing distance due to spiral iterator, we
318 // should check that we're _mostly_ right.
319 EXPECT_GT(correct_order_tiles
, 3 * tile_count
/ 4);
321 // Check that we have consistent required_for_activation tiles.
322 queue
= host_impl_
.BuildRasterQueue(
323 SMOOTHNESS_TAKES_PRIORITY
,
324 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION
);
325 required_for_activation_tiles
.clear();
326 while (!queue
->IsEmpty()) {
327 Tile
* tile
= queue
->Top();
328 EXPECT_TRUE(tile
->required_for_activation());
329 required_for_activation_tiles
.insert(tile
);
332 EXPECT_EQ(expected_required_for_activation_tiles
,
333 required_for_activation_tiles
);
334 EXPECT_NE(all_tiles
, required_for_activation_tiles
);
336 // Check that we have consistent required_for_draw tiles.
337 queue
= host_impl_
.BuildRasterQueue(
338 SMOOTHNESS_TAKES_PRIORITY
,
339 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW
);
340 required_for_draw_tiles
.clear();
341 while (!queue
->IsEmpty()) {
342 Tile
* tile
= queue
->Top();
343 EXPECT_TRUE(tile
->required_for_draw());
344 required_for_draw_tiles
.insert(tile
);
347 EXPECT_EQ(expected_required_for_draw_tiles
, required_for_draw_tiles
);
348 EXPECT_NE(all_tiles
, required_for_draw_tiles
);
350 std::set
<Tile
*> new_content_tiles
;
352 size_t increasing_distance_tiles
= 0u;
353 // Here we expect to get increasing PENDING_TREE priority_bin.
354 queue
= host_impl_
.BuildRasterQueue(NEW_CONTENT_TAKES_PRIORITY
,
355 RasterTilePriorityQueue::Type::ALL
);
357 while (!queue
->IsEmpty()) {
358 Tile
* tile
= queue
->Top();
364 EXPECT_LE(last_tile
->priority(PENDING_TREE
).priority_bin
,
365 tile
->priority(PENDING_TREE
).priority_bin
);
366 if (last_tile
->priority(PENDING_TREE
).priority_bin
==
367 tile
->priority(PENDING_TREE
).priority_bin
) {
368 increasing_distance_tiles
+=
369 last_tile
->priority(PENDING_TREE
).distance_to_visible
<=
370 tile
->priority(PENDING_TREE
).distance_to_visible
;
373 if (tile
->priority(PENDING_TREE
).priority_bin
== TilePriority::NOW
&&
374 last_tile
->priority(PENDING_TREE
).resolution
!=
375 tile
->priority(PENDING_TREE
).resolution
) {
376 // High resolution should come first.
377 EXPECT_EQ(HIGH_RESOLUTION
, last_tile
->priority(PENDING_TREE
).resolution
);
381 new_content_tiles
.insert(tile
);
386 EXPECT_EQ(tile_count
, new_content_tiles
.size());
387 EXPECT_EQ(high_res_tiles
, new_content_tiles
);
388 // Since we don't guarantee increasing distance due to spiral iterator, we
389 // should check that we're _mostly_ right.
390 EXPECT_GE(increasing_distance_tiles
, 3 * tile_count
/ 4);
392 // Check that we have consistent required_for_activation tiles.
393 queue
= host_impl_
.BuildRasterQueue(
394 NEW_CONTENT_TAKES_PRIORITY
,
395 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION
);
396 required_for_activation_tiles
.clear();
397 while (!queue
->IsEmpty()) {
398 Tile
* tile
= queue
->Top();
399 EXPECT_TRUE(tile
->required_for_activation());
400 required_for_activation_tiles
.insert(tile
);
403 EXPECT_EQ(expected_required_for_activation_tiles
,
404 required_for_activation_tiles
);
405 EXPECT_NE(new_content_tiles
, required_for_activation_tiles
);
407 // Check that we have consistent required_for_draw tiles.
408 queue
= host_impl_
.BuildRasterQueue(
409 NEW_CONTENT_TAKES_PRIORITY
,
410 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW
);
411 required_for_draw_tiles
.clear();
412 while (!queue
->IsEmpty()) {
413 Tile
* tile
= queue
->Top();
414 EXPECT_TRUE(tile
->required_for_draw());
415 required_for_draw_tiles
.insert(tile
);
418 EXPECT_EQ(expected_required_for_draw_tiles
, required_for_draw_tiles
);
419 EXPECT_NE(new_content_tiles
, required_for_draw_tiles
);
422 TEST_F(TileManagerTilePriorityQueueTest
, RasterTilePriorityQueueInvalidation
) {
423 const gfx::Size
layer_bounds(1000, 1000);
424 host_impl_
.SetViewportSize(gfx::Size(500, 500));
425 SetupDefaultTrees(layer_bounds
);
427 // Use a tile's content rect as an invalidation. We should inset it a bit to
428 // ensure that border math doesn't invalidate neighbouring tiles.
429 gfx::Rect invalidation
=
430 pending_layer_
->HighResTiling()->TileAt(1, 0)->content_rect();
431 invalidation
.Inset(2, 2);
433 pending_layer_
->set_invalidation(invalidation
);
434 pending_layer_
->HighResTiling()->Invalidate(invalidation
);
435 pending_layer_
->LowResTiling()->Invalidate(invalidation
);
437 // Sanity checks: Tile at 0, 0 should be the same on both trees, tile at 1, 0
438 // should be different.
439 EXPECT_TRUE(pending_layer_
->HighResTiling()->TileAt(0, 0));
440 EXPECT_TRUE(active_layer_
->HighResTiling()->TileAt(0, 0));
441 EXPECT_EQ(pending_layer_
->HighResTiling()->TileAt(0, 0),
442 active_layer_
->HighResTiling()->TileAt(0, 0));
443 EXPECT_TRUE(pending_layer_
->HighResTiling()->TileAt(1, 0));
444 EXPECT_TRUE(active_layer_
->HighResTiling()->TileAt(1, 0));
445 EXPECT_NE(pending_layer_
->HighResTiling()->TileAt(1, 0),
446 active_layer_
->HighResTiling()->TileAt(1, 0));
448 std::set
<Tile
*> expected_now_tiles
;
449 std::set
<Tile
*> expected_required_for_draw_tiles
;
450 std::set
<Tile
*> expected_required_for_activation_tiles
;
451 for (int i
= 0; i
<= 1; ++i
) {
452 for (int j
= 0; j
<= 1; ++j
) {
453 expected_now_tiles
.insert(pending_layer_
->HighResTiling()->TileAt(i
, j
));
454 expected_now_tiles
.insert(active_layer_
->HighResTiling()->TileAt(i
, j
));
456 expected_required_for_activation_tiles
.insert(
457 pending_layer_
->HighResTiling()->TileAt(i
, j
));
458 expected_required_for_draw_tiles
.insert(
459 active_layer_
->HighResTiling()->TileAt(i
, j
));
462 // Expect 3 shared tiles and 1 unshared tile in total.
463 EXPECT_EQ(5u, expected_now_tiles
.size());
464 // Expect 4 tiles for each draw and activation, but not all the same.
465 EXPECT_EQ(4u, expected_required_for_activation_tiles
.size());
466 EXPECT_EQ(4u, expected_required_for_draw_tiles
.size());
467 EXPECT_NE(expected_required_for_draw_tiles
,
468 expected_required_for_activation_tiles
);
470 std::set
<Tile
*> expected_all_tiles
;
471 for (int i
= 0; i
<= 3; ++i
) {
472 for (int j
= 0; j
<= 3; ++j
) {
473 expected_all_tiles
.insert(pending_layer_
->HighResTiling()->TileAt(i
, j
));
474 expected_all_tiles
.insert(active_layer_
->HighResTiling()->TileAt(i
, j
));
477 // Expect 15 shared tiles and 1 unshared tile.
478 EXPECT_EQ(17u, expected_all_tiles
.size());
480 // The actual test will now build different queues and verify that the queues
481 // return the same information as computed manually above.
482 scoped_ptr
<RasterTilePriorityQueue
> queue(host_impl_
.BuildRasterQueue(
483 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
484 std::set
<Tile
*> actual_now_tiles
;
485 std::set
<Tile
*> actual_all_tiles
;
486 while (!queue
->IsEmpty()) {
487 Tile
* tile
= queue
->Top();
489 if (tile
->combined_priority().priority_bin
== TilePriority::NOW
)
490 actual_now_tiles
.insert(tile
);
491 actual_all_tiles
.insert(tile
);
493 EXPECT_EQ(expected_now_tiles
, actual_now_tiles
);
494 EXPECT_EQ(expected_all_tiles
, actual_all_tiles
);
496 queue
= host_impl_
.BuildRasterQueue(
497 SAME_PRIORITY_FOR_BOTH_TREES
,
498 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW
);
499 std::set
<Tile
*> actual_required_for_draw_tiles
;
500 while (!queue
->IsEmpty()) {
501 Tile
* tile
= queue
->Top();
503 actual_required_for_draw_tiles
.insert(tile
);
505 EXPECT_EQ(expected_required_for_draw_tiles
, actual_required_for_draw_tiles
);
507 queue
= host_impl_
.BuildRasterQueue(
508 SAME_PRIORITY_FOR_BOTH_TREES
,
509 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION
);
510 std::set
<Tile
*> actual_required_for_activation_tiles
;
511 while (!queue
->IsEmpty()) {
512 Tile
* tile
= queue
->Top();
514 actual_required_for_activation_tiles
.insert(tile
);
516 EXPECT_EQ(expected_required_for_activation_tiles
,
517 actual_required_for_activation_tiles
);
520 TEST_F(TileManagerTilePriorityQueueTest
, ActivationComesBeforeEventually
) {
521 base::TimeTicks time_ticks
;
522 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
523 host_impl_
.SetCurrentBeginFrameArgs(
524 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
526 gfx::Size
layer_bounds(1000, 1000);
527 SetupDefaultTrees(layer_bounds
);
529 // Create a pending child layer.
530 gfx::Size
tile_size(256, 256);
531 scoped_refptr
<FakePicturePileImpl
> pending_pile
=
532 FakePicturePileImpl::CreateFilledPile(tile_size
, layer_bounds
);
533 scoped_ptr
<FakePictureLayerImpl
> pending_child
=
534 FakePictureLayerImpl::CreateWithRasterSource(host_impl_
.pending_tree(),
535 id_
+ 1, pending_pile
);
536 FakePictureLayerImpl
* pending_child_raw
= pending_child
.get();
537 pending_child_raw
->SetDrawsContent(true);
538 pending_layer_
->AddChild(pending_child
.Pass());
540 // Set a small viewport, so we have soon and eventually tiles.
541 host_impl_
.SetViewportSize(gfx::Size(200, 200));
542 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
543 host_impl_
.SetCurrentBeginFrameArgs(
544 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
545 bool update_lcd_text
= false;
546 host_impl_
.pending_tree()->UpdateDrawProperties(update_lcd_text
);
548 host_impl_
.SetRequiresHighResToDraw();
549 scoped_ptr
<RasterTilePriorityQueue
> queue(host_impl_
.BuildRasterQueue(
550 SMOOTHNESS_TAKES_PRIORITY
, RasterTilePriorityQueue::Type::ALL
));
551 EXPECT_FALSE(queue
->IsEmpty());
553 // Get all the tiles that are NOW or SOON and make sure they are ready to
555 std::vector
<Tile
*> all_tiles
;
556 while (!queue
->IsEmpty()) {
557 Tile
* tile
= queue
->Top();
558 if (tile
->combined_priority().priority_bin
>= TilePriority::EVENTUALLY
)
561 all_tiles
.push_back(tile
);
565 tile_manager()->InitializeTilesWithResourcesForTesting(
566 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
568 // Ensure we can activate.
569 EXPECT_TRUE(tile_manager()->IsReadyToActivate());
572 TEST_F(TileManagerTilePriorityQueueTest
, EvictionTilePriorityQueue
) {
573 const gfx::Size
layer_bounds(1000, 1000);
574 host_impl_
.SetViewportSize(layer_bounds
);
575 SetupDefaultTrees(layer_bounds
);
577 scoped_ptr
<EvictionTilePriorityQueue
> empty_queue(
578 host_impl_
.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES
));
579 EXPECT_TRUE(empty_queue
->IsEmpty());
580 std::set
<Tile
*> all_tiles
;
581 size_t tile_count
= 0;
583 scoped_ptr
<RasterTilePriorityQueue
> raster_queue(host_impl_
.BuildRasterQueue(
584 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
585 while (!raster_queue
->IsEmpty()) {
587 EXPECT_TRUE(raster_queue
->Top());
588 all_tiles
.insert(raster_queue
->Top());
592 EXPECT_EQ(tile_count
, all_tiles
.size());
593 EXPECT_EQ(16u, tile_count
);
595 tile_manager()->InitializeTilesWithResourcesForTesting(
596 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
598 scoped_ptr
<EvictionTilePriorityQueue
> queue(
599 host_impl_
.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY
));
600 EXPECT_FALSE(queue
->IsEmpty());
602 // Sanity check, all tiles should be visible.
603 std::set
<Tile
*> smoothness_tiles
;
604 while (!queue
->IsEmpty()) {
605 Tile
* tile
= queue
->Top();
607 EXPECT_EQ(TilePriority::NOW
, tile
->priority(ACTIVE_TREE
).priority_bin
);
608 EXPECT_EQ(TilePriority::NOW
, tile
->priority(PENDING_TREE
).priority_bin
);
609 EXPECT_TRUE(tile
->HasResource());
610 smoothness_tiles
.insert(tile
);
613 EXPECT_EQ(all_tiles
, smoothness_tiles
);
615 tile_manager()->ReleaseTileResourcesForTesting(
616 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
618 Region
invalidation(gfx::Rect(0, 0, 500, 500));
620 // Invalidate the pending tree.
621 pending_layer_
->set_invalidation(invalidation
);
622 pending_layer_
->HighResTiling()->Invalidate(invalidation
);
623 pending_layer_
->LowResTiling()->Invalidate(invalidation
);
625 active_layer_
->ResetAllTilesPriorities();
626 pending_layer_
->ResetAllTilesPriorities();
628 // Renew all of the tile priorities.
629 gfx::Rect
viewport(50, 50, 100, 100);
630 pending_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
632 pending_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
634 active_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
636 active_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
639 // Populate all tiles directly from the tilings.
641 std::vector
<Tile
*> pending_high_res_tiles
=
642 pending_layer_
->HighResTiling()->AllTilesForTesting();
643 for (size_t i
= 0; i
< pending_high_res_tiles
.size(); ++i
)
644 all_tiles
.insert(pending_high_res_tiles
[i
]);
646 std::vector
<Tile
*> pending_low_res_tiles
=
647 pending_layer_
->LowResTiling()->AllTilesForTesting();
648 for (size_t i
= 0; i
< pending_low_res_tiles
.size(); ++i
)
649 all_tiles
.insert(pending_low_res_tiles
[i
]);
651 std::vector
<Tile
*> active_high_res_tiles
=
652 active_layer_
->HighResTiling()->AllTilesForTesting();
653 for (size_t i
= 0; i
< active_high_res_tiles
.size(); ++i
)
654 all_tiles
.insert(active_high_res_tiles
[i
]);
656 std::vector
<Tile
*> active_low_res_tiles
=
657 active_layer_
->LowResTiling()->AllTilesForTesting();
658 for (size_t i
= 0; i
< active_low_res_tiles
.size(); ++i
)
659 all_tiles
.insert(active_low_res_tiles
[i
]);
661 tile_manager()->InitializeTilesWithResourcesForTesting(
662 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
664 Tile
* last_tile
= NULL
;
665 smoothness_tiles
.clear();
667 // Here we expect to get increasing combined priority_bin.
668 queue
= host_impl_
.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY
);
669 int distance_increasing
= 0;
670 int distance_decreasing
= 0;
671 while (!queue
->IsEmpty()) {
672 Tile
* tile
= queue
->Top();
674 EXPECT_TRUE(tile
->HasResource());
679 const TilePriority
& last_priority
= last_tile
->combined_priority();
680 const TilePriority
& priority
= tile
->combined_priority();
682 EXPECT_GE(last_priority
.priority_bin
, priority
.priority_bin
);
683 if (last_priority
.priority_bin
== priority
.priority_bin
) {
684 EXPECT_LE(last_tile
->required_for_activation(),
685 tile
->required_for_activation());
686 if (last_tile
->required_for_activation() ==
687 tile
->required_for_activation()) {
688 if (last_priority
.distance_to_visible
>= priority
.distance_to_visible
)
689 ++distance_decreasing
;
691 ++distance_increasing
;
697 smoothness_tiles
.insert(tile
);
701 // Ensure that the distance is decreasing many more times than increasing.
702 EXPECT_EQ(3, distance_increasing
);
703 EXPECT_EQ(17, distance_decreasing
);
704 EXPECT_EQ(tile_count
, smoothness_tiles
.size());
705 EXPECT_EQ(all_tiles
, smoothness_tiles
);
707 std::set
<Tile
*> new_content_tiles
;
709 // Again, we expect to get increasing combined priority_bin.
710 queue
= host_impl_
.BuildEvictionQueue(NEW_CONTENT_TAKES_PRIORITY
);
711 distance_decreasing
= 0;
712 distance_increasing
= 0;
713 while (!queue
->IsEmpty()) {
714 Tile
* tile
= queue
->Top();
720 const TilePriority
& last_priority
= last_tile
->combined_priority();
721 const TilePriority
& priority
= tile
->combined_priority();
723 EXPECT_GE(last_priority
.priority_bin
, priority
.priority_bin
);
724 if (last_priority
.priority_bin
== priority
.priority_bin
) {
725 EXPECT_LE(last_tile
->required_for_activation(),
726 tile
->required_for_activation());
727 if (last_tile
->required_for_activation() ==
728 tile
->required_for_activation()) {
729 if (last_priority
.distance_to_visible
>= priority
.distance_to_visible
)
730 ++distance_decreasing
;
732 ++distance_increasing
;
737 new_content_tiles
.insert(tile
);
741 // Ensure that the distance is decreasing many more times than increasing.
742 EXPECT_EQ(3, distance_increasing
);
743 EXPECT_EQ(17, distance_decreasing
);
744 EXPECT_EQ(tile_count
, new_content_tiles
.size());
745 EXPECT_EQ(all_tiles
, new_content_tiles
);
748 TEST_F(TileManagerTilePriorityQueueTest
,
749 EvictionTilePriorityQueueWithOcclusion
) {
750 base::TimeTicks time_ticks
;
751 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
752 host_impl_
.SetCurrentBeginFrameArgs(
753 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
755 gfx::Size
tile_size(102, 102);
756 gfx::Size
layer_bounds(1000, 1000);
758 host_impl_
.SetViewportSize(layer_bounds
);
760 scoped_refptr
<FakePicturePileImpl
> pending_pile
=
761 FakePicturePileImpl::CreateFilledPile(tile_size
, layer_bounds
);
762 SetupPendingTree(pending_pile
);
764 scoped_ptr
<FakePictureLayerImpl
> pending_child
=
765 FakePictureLayerImpl::CreateWithRasterSource(host_impl_
.pending_tree(), 2,
767 pending_layer_
->AddChild(pending_child
.Pass());
769 FakePictureLayerImpl
* pending_child_layer
=
770 static_cast<FakePictureLayerImpl
*>(pending_layer_
->children()[0]);
771 pending_child_layer
->SetDrawsContent(true);
773 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
774 host_impl_
.SetCurrentBeginFrameArgs(
775 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
776 bool update_lcd_text
= false;
777 host_impl_
.pending_tree()->UpdateDrawProperties(update_lcd_text
);
780 SetupPendingTree(pending_pile
);
782 FakePictureLayerImpl
* active_child_layer
=
783 static_cast<FakePictureLayerImpl
*>(active_layer_
->children()[0]);
785 std::set
<Tile
*> all_tiles
;
786 size_t tile_count
= 0;
787 scoped_ptr
<RasterTilePriorityQueue
> raster_queue(host_impl_
.BuildRasterQueue(
788 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
789 while (!raster_queue
->IsEmpty()) {
791 EXPECT_TRUE(raster_queue
->Top());
792 all_tiles
.insert(raster_queue
->Top());
795 EXPECT_EQ(tile_count
, all_tiles
.size());
796 EXPECT_EQ(32u, tile_count
);
798 pending_layer_
->ResetAllTilesPriorities();
800 // Renew all of the tile priorities.
801 gfx::Rect
viewport(layer_bounds
);
802 pending_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
804 pending_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
806 pending_child_layer
->HighResTiling()->ComputeTilePriorityRects(
807 viewport
, 1.0f
, 1.0, Occlusion());
808 pending_child_layer
->LowResTiling()->ComputeTilePriorityRects(
809 viewport
, 1.0f
, 1.0, Occlusion());
811 active_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
813 active_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
815 active_child_layer
->HighResTiling()->ComputeTilePriorityRects(
816 viewport
, 1.0f
, 1.0, Occlusion());
817 active_child_layer
->LowResTiling()->ComputeTilePriorityRects(
818 viewport
, 1.0f
, 1.0, Occlusion());
820 // Populate all tiles directly from the tilings.
822 std::vector
<Tile
*> pending_high_res_tiles
=
823 pending_layer_
->HighResTiling()->AllTilesForTesting();
824 all_tiles
.insert(pending_high_res_tiles
.begin(),
825 pending_high_res_tiles
.end());
827 std::vector
<Tile
*> pending_low_res_tiles
=
828 pending_layer_
->LowResTiling()->AllTilesForTesting();
829 all_tiles
.insert(pending_low_res_tiles
.begin(), pending_low_res_tiles
.end());
831 // Set all tiles on the pending_child_layer as occluded on the pending tree.
832 std::vector
<Tile
*> pending_child_high_res_tiles
=
833 pending_child_layer
->HighResTiling()->AllTilesForTesting();
834 pending_child_layer
->HighResTiling()->SetAllTilesOccludedForTesting();
835 active_child_layer
->HighResTiling()->SetAllTilesOccludedForTesting();
836 all_tiles
.insert(pending_child_high_res_tiles
.begin(),
837 pending_child_high_res_tiles
.end());
839 std::vector
<Tile
*> pending_child_low_res_tiles
=
840 pending_child_layer
->LowResTiling()->AllTilesForTesting();
841 pending_child_layer
->LowResTiling()->SetAllTilesOccludedForTesting();
842 active_child_layer
->LowResTiling()->SetAllTilesOccludedForTesting();
843 all_tiles
.insert(pending_child_low_res_tiles
.begin(),
844 pending_child_low_res_tiles
.end());
846 tile_manager()->InitializeTilesWithResourcesForTesting(
847 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
849 // Verify occlusion is considered by EvictionTilePriorityQueue.
850 TreePriority tree_priority
= NEW_CONTENT_TAKES_PRIORITY
;
851 size_t occluded_count
= 0u;
852 Tile
* last_tile
= NULL
;
853 scoped_ptr
<EvictionTilePriorityQueue
> queue(
854 host_impl_
.BuildEvictionQueue(tree_priority
));
855 while (!queue
->IsEmpty()) {
856 Tile
* tile
= queue
->Top();
860 bool tile_is_occluded
= tile
->is_occluded_combined();
862 // The only way we will encounter an occluded tile after an unoccluded
863 // tile is if the priorty bin decreased, the tile is required for
864 // activation, or the scale changed.
865 if (tile_is_occluded
) {
868 bool last_tile_is_occluded
= last_tile
->is_occluded_combined();
869 if (!last_tile_is_occluded
) {
870 TilePriority::PriorityBin tile_priority_bin
=
871 tile
->priority_for_tree_priority(tree_priority
).priority_bin
;
872 TilePriority::PriorityBin last_tile_priority_bin
=
873 last_tile
->priority_for_tree_priority(tree_priority
).priority_bin
;
875 EXPECT_TRUE((tile_priority_bin
< last_tile_priority_bin
) ||
876 tile
->required_for_activation() ||
877 (tile
->contents_scale() != last_tile
->contents_scale()));
883 size_t expected_occluded_count
=
884 pending_child_high_res_tiles
.size() + pending_child_low_res_tiles
.size();
885 EXPECT_EQ(expected_occluded_count
, occluded_count
);
888 TEST_F(TileManagerTilePriorityQueueTest
,
889 EvictionTilePriorityQueueWithTransparentLayer
) {
890 base::TimeTicks time_ticks
;
891 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
892 host_impl_
.SetCurrentBeginFrameArgs(
893 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
895 gfx::Size
tile_size(102, 102);
896 gfx::Size
layer_bounds(1000, 1000);
898 scoped_refptr
<FakePicturePileImpl
> pending_pile
=
899 FakePicturePileImpl::CreateFilledPile(tile_size
, layer_bounds
);
900 SetupPendingTree(pending_pile
);
902 scoped_ptr
<FakePictureLayerImpl
> pending_child
=
903 FakePictureLayerImpl::CreateWithRasterSource(host_impl_
.pending_tree(), 2,
905 FakePictureLayerImpl
* pending_child_layer
= pending_child
.get();
906 pending_layer_
->AddChild(pending_child
.Pass());
908 // Create a fully transparent child layer so that its tile priorities are not
909 // considered to be valid.
910 pending_child_layer
->SetDrawsContent(true);
912 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
913 host_impl_
.SetCurrentBeginFrameArgs(
914 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
915 bool update_lcd_text
= false;
916 host_impl_
.pending_tree()->UpdateDrawProperties(update_lcd_text
);
918 pending_child_layer
->SetOpacity(0.0);
920 time_ticks
+= base::TimeDelta::FromMilliseconds(1);
921 host_impl_
.SetCurrentBeginFrameArgs(
922 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, time_ticks
));
923 host_impl_
.pending_tree()->UpdateDrawProperties(update_lcd_text
);
925 // Renew all of the tile priorities.
926 gfx::Rect
viewport(layer_bounds
);
927 pending_layer_
->HighResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
929 pending_layer_
->LowResTiling()->ComputeTilePriorityRects(viewport
, 1.0f
, 1.0,
931 pending_child_layer
->HighResTiling()->ComputeTilePriorityRects(
932 viewport
, 1.0f
, 1.0, Occlusion());
933 pending_child_layer
->LowResTiling()->ComputeTilePriorityRects(
934 viewport
, 1.0f
, 1.0, Occlusion());
936 // Populate all tiles directly from the tilings.
937 std::set
<Tile
*> all_pending_tiles
;
938 std::vector
<Tile
*> pending_high_res_tiles
=
939 pending_layer_
->HighResTiling()->AllTilesForTesting();
940 all_pending_tiles
.insert(pending_high_res_tiles
.begin(),
941 pending_high_res_tiles
.end());
942 EXPECT_EQ(16u, pending_high_res_tiles
.size());
944 std::vector
<Tile
*> pending_low_res_tiles
=
945 pending_layer_
->LowResTiling()->AllTilesForTesting();
946 all_pending_tiles
.insert(pending_low_res_tiles
.begin(),
947 pending_low_res_tiles
.end());
948 EXPECT_EQ(1u, pending_low_res_tiles
.size());
950 std::set
<Tile
*> all_pending_child_tiles
;
951 std::vector
<Tile
*> pending_child_high_res_tiles
=
952 pending_child_layer
->HighResTiling()->AllTilesForTesting();
953 all_pending_child_tiles
.insert(pending_child_high_res_tiles
.begin(),
954 pending_child_high_res_tiles
.end());
955 EXPECT_EQ(16u, pending_child_high_res_tiles
.size());
957 std::vector
<Tile
*> pending_child_low_res_tiles
=
958 pending_child_layer
->LowResTiling()->AllTilesForTesting();
959 all_pending_child_tiles
.insert(pending_child_low_res_tiles
.begin(),
960 pending_child_low_res_tiles
.end());
961 EXPECT_EQ(1u, pending_child_low_res_tiles
.size());
963 std::set
<Tile
*> all_tiles
= all_pending_tiles
;
964 all_tiles
.insert(all_pending_child_tiles
.begin(),
965 all_pending_child_tiles
.end());
967 tile_manager()->InitializeTilesWithResourcesForTesting(
968 std::vector
<Tile
*>(all_tiles
.begin(), all_tiles
.end()));
970 EXPECT_TRUE(pending_layer_
->HasValidTilePriorities());
971 EXPECT_FALSE(pending_child_layer
->HasValidTilePriorities());
973 // Verify that eviction queue returns tiles also from layers without valid
974 // tile priorities and that the tile priority bin of those tiles is (at most)
976 TreePriority tree_priority
= NEW_CONTENT_TAKES_PRIORITY
;
977 std::set
<Tile
*> new_content_tiles
;
978 size_t tile_count
= 0;
979 scoped_ptr
<EvictionTilePriorityQueue
> queue(
980 host_impl_
.BuildEvictionQueue(tree_priority
));
981 while (!queue
->IsEmpty()) {
982 Tile
* tile
= queue
->Top();
983 const TilePriority
& pending_priority
= tile
->priority(PENDING_TREE
);
984 EXPECT_NE(std::numeric_limits
<float>::infinity(),
985 pending_priority
.distance_to_visible
);
986 if (all_pending_child_tiles
.find(tile
) != all_pending_child_tiles
.end())
987 EXPECT_EQ(TilePriority::EVENTUALLY
, pending_priority
.priority_bin
);
989 EXPECT_EQ(TilePriority::NOW
, pending_priority
.priority_bin
);
990 new_content_tiles
.insert(tile
);
994 EXPECT_EQ(tile_count
, new_content_tiles
.size());
995 EXPECT_EQ(all_tiles
, new_content_tiles
);
998 TEST_F(TileManagerTilePriorityQueueTest
, RasterTilePriorityQueueEmptyLayers
) {
999 const gfx::Size
layer_bounds(1000, 1000);
1000 host_impl_
.SetViewportSize(layer_bounds
);
1001 SetupDefaultTrees(layer_bounds
);
1003 scoped_ptr
<RasterTilePriorityQueue
> queue(host_impl_
.BuildRasterQueue(
1004 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
1005 EXPECT_FALSE(queue
->IsEmpty());
1007 size_t tile_count
= 0;
1008 std::set
<Tile
*> all_tiles
;
1009 while (!queue
->IsEmpty()) {
1010 EXPECT_TRUE(queue
->Top());
1011 all_tiles
.insert(queue
->Top());
1016 EXPECT_EQ(tile_count
, all_tiles
.size());
1017 EXPECT_EQ(16u, tile_count
);
1019 for (int i
= 1; i
< 10; ++i
) {
1020 scoped_ptr
<FakePictureLayerImpl
> pending_layer
=
1021 FakePictureLayerImpl::Create(host_impl_
.pending_tree(), id_
+ i
);
1022 pending_layer
->SetDrawsContent(true);
1023 pending_layer
->set_has_valid_tile_priorities(true);
1024 pending_layer_
->AddChild(pending_layer
.Pass());
1027 queue
= host_impl_
.BuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES
,
1028 RasterTilePriorityQueue::Type::ALL
);
1029 EXPECT_FALSE(queue
->IsEmpty());
1033 while (!queue
->IsEmpty()) {
1034 EXPECT_TRUE(queue
->Top());
1035 all_tiles
.insert(queue
->Top());
1039 EXPECT_EQ(tile_count
, all_tiles
.size());
1040 EXPECT_EQ(16u, tile_count
);
1043 TEST_F(TileManagerTilePriorityQueueTest
, EvictionTilePriorityQueueEmptyLayers
) {
1044 const gfx::Size
layer_bounds(1000, 1000);
1045 host_impl_
.SetViewportSize(layer_bounds
);
1046 SetupDefaultTrees(layer_bounds
);
1048 scoped_ptr
<RasterTilePriorityQueue
> raster_queue(host_impl_
.BuildRasterQueue(
1049 SAME_PRIORITY_FOR_BOTH_TREES
, RasterTilePriorityQueue::Type::ALL
));
1050 EXPECT_FALSE(raster_queue
->IsEmpty());
1052 size_t tile_count
= 0;
1053 std::set
<Tile
*> all_tiles
;
1054 while (!raster_queue
->IsEmpty()) {
1055 EXPECT_TRUE(raster_queue
->Top());
1056 all_tiles
.insert(raster_queue
->Top());
1058 raster_queue
->Pop();
1060 EXPECT_EQ(tile_count
, all_tiles
.size());
1061 EXPECT_EQ(16u, tile_count
);
1063 std::vector
<Tile
*> tiles(all_tiles
.begin(), all_tiles
.end());
1064 host_impl_
.tile_manager()->InitializeTilesWithResourcesForTesting(tiles
);
1066 for (int i
= 1; i
< 10; ++i
) {
1067 scoped_ptr
<FakePictureLayerImpl
> pending_layer
=
1068 FakePictureLayerImpl::Create(host_impl_
.pending_tree(), id_
+ i
);
1069 pending_layer
->SetDrawsContent(true);
1070 pending_layer
->set_has_valid_tile_priorities(true);
1071 pending_layer_
->AddChild(pending_layer
.Pass());
1074 scoped_ptr
<EvictionTilePriorityQueue
> queue(
1075 host_impl_
.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES
));
1076 EXPECT_FALSE(queue
->IsEmpty());
1080 while (!queue
->IsEmpty()) {
1081 EXPECT_TRUE(queue
->Top());
1082 all_tiles
.insert(queue
->Top());
1086 EXPECT_EQ(tile_count
, all_tiles
.size());
1087 EXPECT_EQ(16u, tile_count
);
1090 TEST_F(TileManagerTilePriorityQueueTest
,
1091 RasterTilePriorityQueueStaticViewport
) {
1092 FakePictureLayerTilingClient client
;
1094 gfx::Rect
viewport(50, 50, 500, 500);
1095 gfx::Size
layer_bounds(1600, 1600);
1097 float inset
= PictureLayerTiling::CalculateSoonBorderDistance(viewport
, 1.0f
);
1098 gfx::Rect soon_rect
= viewport
;
1099 soon_rect
.Inset(-inset
, -inset
);
1101 client
.SetTileSize(gfx::Size(30, 30));
1102 client
.set_tree(ACTIVE_TREE
);
1103 LayerTreeSettings settings
;
1104 settings
.max_tiles_for_interest_area
= 10000;
1106 scoped_ptr
<PictureLayerTilingSet
> tiling_set
= PictureLayerTilingSet::Create(
1107 &client
, settings
.max_tiles_for_interest_area
,
1108 settings
.skewport_target_time_in_seconds
,
1109 settings
.skewport_extrapolation_limit_in_content_pixels
);
1111 scoped_refptr
<FakePicturePileImpl
> pile
=
1112 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds
);
1113 PictureLayerTiling
* tiling
= tiling_set
->AddTiling(1.0f
, pile
);
1114 tiling
->set_resolution(HIGH_RESOLUTION
);
1116 tiling_set
->UpdateTilePriorities(viewport
, 1.0f
, 1.0, Occlusion(), true);
1117 std::vector
<Tile
*> all_tiles
= tiling
->AllTilesForTesting();
1119 EXPECT_EQ(3364u, all_tiles
.size());
1121 // The explanation of each iteration is as follows:
1122 // 1. First iteration tests that we can get all of the tiles correctly.
1123 // 2. Second iteration ensures that we can get all of the tiles again (first
1124 // iteration didn't change any tiles), as well set all tiles to be ready to
1126 // 3. Third iteration ensures that no tiles are returned, since they were all
1127 // marked as ready to draw.
1128 for (int i
= 0; i
< 3; ++i
) {
1129 scoped_ptr
<TilingSetRasterQueueAll
> queue(
1130 new TilingSetRasterQueueAll(tiling_set
.get(), false));
1132 // There are 3 bins in TilePriority.
1133 bool have_tiles
[3] = {};
1135 // On the third iteration, we should get no tiles since everything was
1136 // marked as ready to draw.
1138 EXPECT_TRUE(queue
->IsEmpty());
1142 EXPECT_FALSE(queue
->IsEmpty());
1143 std::set
<Tile
*> unique_tiles
;
1144 unique_tiles
.insert(queue
->Top());
1145 Tile
* last_tile
= queue
->Top();
1146 have_tiles
[last_tile
->priority(ACTIVE_TREE
).priority_bin
] = true;
1148 // On the second iteration, mark everything as ready to draw (solid color).
1150 TileDrawInfo
& draw_info
= last_tile
->draw_info();
1151 draw_info
.SetSolidColorForTesting(SK_ColorRED
);
1154 int eventually_bin_order_correct_count
= 0;
1155 int eventually_bin_order_incorrect_count
= 0;
1156 while (!queue
->IsEmpty()) {
1157 Tile
* new_tile
= queue
->Top();
1159 unique_tiles
.insert(new_tile
);
1161 TilePriority last_priority
= last_tile
->priority(ACTIVE_TREE
);
1162 TilePriority new_priority
= new_tile
->priority(ACTIVE_TREE
);
1163 EXPECT_LE(last_priority
.priority_bin
, new_priority
.priority_bin
);
1164 if (last_priority
.priority_bin
== new_priority
.priority_bin
) {
1165 if (last_priority
.priority_bin
== TilePriority::EVENTUALLY
) {
1166 bool order_correct
= last_priority
.distance_to_visible
<=
1167 new_priority
.distance_to_visible
;
1168 eventually_bin_order_correct_count
+= order_correct
;
1169 eventually_bin_order_incorrect_count
+= !order_correct
;
1170 } else if (!soon_rect
.Intersects(new_tile
->content_rect()) &&
1171 !soon_rect
.Intersects(last_tile
->content_rect())) {
1172 EXPECT_LE(last_priority
.distance_to_visible
,
1173 new_priority
.distance_to_visible
);
1174 EXPECT_EQ(TilePriority::NOW
, new_priority
.priority_bin
);
1175 } else if (new_priority
.distance_to_visible
> 0.f
) {
1176 EXPECT_EQ(TilePriority::SOON
, new_priority
.priority_bin
);
1179 have_tiles
[new_priority
.priority_bin
] = true;
1181 last_tile
= new_tile
;
1183 // On the second iteration, mark everything as ready to draw (solid
1186 TileDrawInfo
& draw_info
= last_tile
->draw_info();
1187 draw_info
.SetSolidColorForTesting(SK_ColorRED
);
1191 EXPECT_GT(eventually_bin_order_correct_count
,
1192 eventually_bin_order_incorrect_count
);
1194 // We should have now and eventually tiles, as well as soon tiles from
1195 // the border region.
1196 EXPECT_TRUE(have_tiles
[TilePriority::NOW
]);
1197 EXPECT_TRUE(have_tiles
[TilePriority::SOON
]);
1198 EXPECT_TRUE(have_tiles
[TilePriority::EVENTUALLY
]);
1200 EXPECT_EQ(unique_tiles
.size(), all_tiles
.size());
1204 TEST_F(TileManagerTilePriorityQueueTest
,
1205 RasterTilePriorityQueueMovingViewport
) {
1206 FakePictureLayerTilingClient client
;
1208 gfx::Rect
viewport(50, 0, 100, 100);
1209 gfx::Rect
moved_viewport(50, 0, 100, 500);
1210 gfx::Size
layer_bounds(1000, 1000);
1212 client
.SetTileSize(gfx::Size(30, 30));
1213 client
.set_tree(ACTIVE_TREE
);
1214 LayerTreeSettings settings
;
1215 settings
.max_tiles_for_interest_area
= 10000;
1217 scoped_ptr
<PictureLayerTilingSet
> tiling_set
= PictureLayerTilingSet::Create(
1218 &client
, settings
.max_tiles_for_interest_area
,
1219 settings
.skewport_target_time_in_seconds
,
1220 settings
.skewport_extrapolation_limit_in_content_pixels
);
1222 scoped_refptr
<FakePicturePileImpl
> pile
=
1223 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds
);
1224 PictureLayerTiling
* tiling
= tiling_set
->AddTiling(1.0f
, pile
);
1225 tiling
->set_resolution(HIGH_RESOLUTION
);
1227 tiling_set
->UpdateTilePriorities(viewport
, 1.0f
, 1.0, Occlusion(), true);
1228 tiling_set
->UpdateTilePriorities(moved_viewport
, 1.0f
, 2.0, Occlusion(),
1232 PictureLayerTiling::CalculateSoonBorderDistance(moved_viewport
, 1.0f
);
1233 gfx::Rect soon_rect
= moved_viewport
;
1234 soon_rect
.Inset(-inset
, -inset
);
1236 // There are 3 bins in TilePriority.
1237 bool have_tiles
[3] = {};
1238 Tile
* last_tile
= NULL
;
1239 int eventually_bin_order_correct_count
= 0;
1240 int eventually_bin_order_incorrect_count
= 0;
1241 scoped_ptr
<TilingSetRasterQueueAll
> queue(
1242 new TilingSetRasterQueueAll(tiling_set
.get(), false));
1243 for (; !queue
->IsEmpty(); queue
->Pop()) {
1245 last_tile
= queue
->Top();
1247 Tile
* new_tile
= queue
->Top();
1249 TilePriority last_priority
= last_tile
->priority(ACTIVE_TREE
);
1250 TilePriority new_priority
= new_tile
->priority(ACTIVE_TREE
);
1252 have_tiles
[new_priority
.priority_bin
] = true;
1254 EXPECT_LE(last_priority
.priority_bin
, new_priority
.priority_bin
);
1255 if (last_priority
.priority_bin
== new_priority
.priority_bin
) {
1256 if (last_priority
.priority_bin
== TilePriority::EVENTUALLY
) {
1257 bool order_correct
= last_priority
.distance_to_visible
<=
1258 new_priority
.distance_to_visible
;
1259 eventually_bin_order_correct_count
+= order_correct
;
1260 eventually_bin_order_incorrect_count
+= !order_correct
;
1261 } else if (!soon_rect
.Intersects(new_tile
->content_rect()) &&
1262 !soon_rect
.Intersects(last_tile
->content_rect())) {
1263 EXPECT_LE(last_priority
.distance_to_visible
,
1264 new_priority
.distance_to_visible
);
1265 } else if (new_priority
.distance_to_visible
> 0.f
) {
1266 EXPECT_EQ(TilePriority::SOON
, new_priority
.priority_bin
);
1269 last_tile
= new_tile
;
1272 EXPECT_GT(eventually_bin_order_correct_count
,
1273 eventually_bin_order_incorrect_count
);
1275 EXPECT_TRUE(have_tiles
[TilePriority::NOW
]);
1276 EXPECT_TRUE(have_tiles
[TilePriority::SOON
]);
1277 EXPECT_TRUE(have_tiles
[TilePriority::EVENTUALLY
]);