Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / cc / resources / tile_manager_unittest.cc
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 "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/test/fake_impl_proxy.h"
10 #include "cc/test/fake_layer_tree_host_impl.h"
11 #include "cc/test/fake_output_surface.h"
12 #include "cc/test/fake_output_surface_client.h"
13 #include "cc/test/fake_picture_layer_impl.h"
14 #include "cc/test/fake_picture_pile_impl.h"
15 #include "cc/test/fake_tile_manager.h"
16 #include "cc/test/impl_side_painting_settings.h"
17 #include "cc/test/test_shared_bitmap_manager.h"
18 #include "cc/test/test_tile_priorities.h"
19 #include "cc/trees/layer_tree_impl.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21
22 namespace cc {
23 namespace {
24
25 class TileManagerTest : public testing::TestWithParam<bool>,
26                         public TileManagerClient {
27  public:
28   typedef std::vector<scoped_refptr<Tile> > TileVector;
29
30   TileManagerTest()
31       : memory_limit_policy_(ALLOW_ANYTHING),
32         max_tiles_(0),
33         ready_to_activate_(false) {}
34
35   void Initialize(int max_tiles,
36                   TileMemoryLimitPolicy memory_limit_policy,
37                   TreePriority tree_priority) {
38     output_surface_ = FakeOutputSurface::Create3d();
39     CHECK(output_surface_->BindToClient(&output_surface_client_));
40
41     shared_bitmap_manager_.reset(new TestSharedBitmapManager());
42     resource_provider_ = ResourceProvider::Create(output_surface_.get(),
43                                                   shared_bitmap_manager_.get(),
44                                                   NULL,
45                                                   0,
46                                                   false,
47                                                   1,
48                                                   false);
49     resource_pool_ = ResourcePool::Create(
50         resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
51     tile_manager_ =
52         make_scoped_ptr(new FakeTileManager(this, resource_pool_.get()));
53
54     memory_limit_policy_ = memory_limit_policy;
55     max_tiles_ = max_tiles;
56     picture_pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
57
58     SetTreePriority(tree_priority);
59   }
60
61   void SetTreePriority(TreePriority tree_priority) {
62     GlobalStateThatImpactsTilePriority state;
63     gfx::Size tile_size = settings_.default_tile_size;
64
65     if (UsingMemoryLimit()) {
66       state.soft_memory_limit_in_bytes =
67           max_tiles_ * 4 * tile_size.width() * tile_size.height();
68       state.num_resources_limit = 100;
69     } else {
70       state.soft_memory_limit_in_bytes = 100 * 1000 * 1000;
71       state.num_resources_limit = max_tiles_;
72     }
73     state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes * 2;
74     state.memory_limit_policy = memory_limit_policy_;
75     state.tree_priority = tree_priority;
76
77     global_state_ = state;
78     resource_pool_->SetResourceUsageLimits(state.soft_memory_limit_in_bytes,
79                                            state.soft_memory_limit_in_bytes,
80                                            state.num_resources_limit);
81     tile_manager_->SetGlobalStateForTesting(state);
82   }
83
84   virtual void TearDown() OVERRIDE {
85     tile_manager_.reset(NULL);
86     picture_pile_ = NULL;
87
88     testing::Test::TearDown();
89   }
90
91   // TileManagerClient implementation.
92   virtual const std::vector<PictureLayerImpl*>& GetPictureLayers()
93       const OVERRIDE {
94     return picture_layers_;
95   }
96   virtual void NotifyReadyToActivate() OVERRIDE { ready_to_activate_ = true; }
97   virtual void NotifyTileStateChanged(const Tile* tile) OVERRIDE {}
98   virtual void BuildRasterQueue(RasterTilePriorityQueue* queue,
99                                 TreePriority priority) OVERRIDE {}
100   virtual void BuildEvictionQueue(EvictionTilePriorityQueue* queue,
101                                   TreePriority priority) OVERRIDE {}
102
103   TileVector CreateTilesWithSize(int count,
104                                  TilePriority active_priority,
105                                  TilePriority pending_priority,
106                                  const gfx::Size& tile_size) {
107     TileVector tiles;
108     for (int i = 0; i < count; ++i) {
109       scoped_refptr<Tile> tile = tile_manager_->CreateTile(picture_pile_.get(),
110                                                            tile_size,
111                                                            gfx::Rect(),
112                                                            1.0,
113                                                            0,
114                                                            0,
115                                                            0);
116       tile->SetPriority(ACTIVE_TREE, active_priority);
117       tile->SetPriority(PENDING_TREE, pending_priority);
118       tiles.push_back(tile);
119     }
120     return tiles;
121   }
122
123   TileVector CreateTiles(int count,
124                          TilePriority active_priority,
125                          TilePriority pending_priority) {
126     return CreateTilesWithSize(
127         count, active_priority, pending_priority, settings_.default_tile_size);
128   }
129
130   void ReleaseTiles(TileVector* tiles) {
131     for (TileVector::iterator it = tiles->begin(); it != tiles->end(); it++) {
132       Tile* tile = it->get();
133       tile->SetPriority(ACTIVE_TREE, TilePriority());
134       tile->SetPriority(PENDING_TREE, TilePriority());
135     }
136   }
137
138   FakeTileManager* tile_manager() { return tile_manager_.get(); }
139
140   int AssignedMemoryCount(const TileVector& tiles) {
141     int has_memory_count = 0;
142     for (TileVector::const_iterator it = tiles.begin(); it != tiles.end();
143          ++it) {
144       if (tile_manager_->HasBeenAssignedMemory(it->get()))
145         ++has_memory_count;
146     }
147     return has_memory_count;
148   }
149
150   bool ready_to_activate() const { return ready_to_activate_; }
151
152   // The parametrization specifies whether the max tile limit should
153   // be applied to memory or resources.
154   bool UsingResourceLimit() { return !GetParam(); }
155   bool UsingMemoryLimit() { return GetParam(); }
156
157  protected:
158   GlobalStateThatImpactsTilePriority global_state_;
159
160  private:
161   LayerTreeSettings settings_;
162   scoped_ptr<FakeTileManager> tile_manager_;
163   scoped_refptr<FakePicturePileImpl> picture_pile_;
164   FakeOutputSurfaceClient output_surface_client_;
165   scoped_ptr<FakeOutputSurface> output_surface_;
166   scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
167   scoped_ptr<ResourceProvider> resource_provider_;
168   scoped_ptr<ResourcePool> resource_pool_;
169   TileMemoryLimitPolicy memory_limit_policy_;
170   int max_tiles_;
171   bool ready_to_activate_;
172   std::vector<PictureLayerImpl*> picture_layers_;
173 };
174
175 TEST_P(TileManagerTest, EnoughMemoryAllowAnything) {
176   // A few tiles of each type of priority, with enough memory for all tiles.
177
178   Initialize(10, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
179   TileVector active_now =
180       CreateTiles(3, TilePriorityForNowBin(), TilePriority());
181   TileVector pending_now =
182       CreateTiles(3, TilePriority(), TilePriorityForNowBin());
183   TileVector active_pending_soon =
184       CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
185   TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
186
187   tile_manager()->AssignMemoryToTiles(global_state_);
188
189   EXPECT_EQ(3, AssignedMemoryCount(active_now));
190   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
191   EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
192   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
193
194   ReleaseTiles(&active_now);
195   ReleaseTiles(&pending_now);
196   ReleaseTiles(&active_pending_soon);
197   ReleaseTiles(&never_bin);
198 }
199
200 TEST_P(TileManagerTest, EnoughMemoryAllowPrepaintOnly) {
201   // A few tiles of each type of priority, with enough memory for all tiles,
202   // with the exception of never bin.
203
204   Initialize(10, ALLOW_PREPAINT_ONLY, SMOOTHNESS_TAKES_PRIORITY);
205   TileVector active_now =
206       CreateTiles(3, TilePriorityForNowBin(), TilePriority());
207   TileVector pending_now =
208       CreateTiles(3, TilePriority(), TilePriorityForNowBin());
209   TileVector active_pending_soon =
210       CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
211   TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
212
213   tile_manager()->AssignMemoryToTiles(global_state_);
214
215   EXPECT_EQ(3, AssignedMemoryCount(active_now));
216   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
217   EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
218   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
219
220   ReleaseTiles(&active_now);
221   ReleaseTiles(&pending_now);
222   ReleaseTiles(&active_pending_soon);
223   ReleaseTiles(&never_bin);
224 }
225
226 TEST_P(TileManagerTest, EnoughMemoryPendingLowResAllowAbsoluteMinimum) {
227   // A few low-res tiles required for activation, with enough memory for all
228   // tiles.
229
230   Initialize(5, ALLOW_ABSOLUTE_MINIMUM, SAME_PRIORITY_FOR_BOTH_TREES);
231   TileVector pending_low_res =
232       CreateTiles(5, TilePriority(), TilePriorityLowRes());
233
234   tile_manager()->AssignMemoryToTiles(global_state_);
235
236   EXPECT_EQ(5, AssignedMemoryCount(pending_low_res));
237   ReleaseTiles(&pending_low_res);
238 }
239
240 TEST_P(TileManagerTest, EnoughMemoryAllowAbsoluteMinimum) {
241   // A few tiles of each type of priority, with enough memory for all tiles,
242   // with the exception of never and soon bins.
243
244   Initialize(10, ALLOW_ABSOLUTE_MINIMUM, SMOOTHNESS_TAKES_PRIORITY);
245   TileVector active_now =
246       CreateTiles(3, TilePriorityForNowBin(), TilePriority());
247   TileVector pending_now =
248       CreateTiles(3, TilePriority(), TilePriorityForNowBin());
249   TileVector active_pending_soon =
250       CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
251   TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
252
253   tile_manager()->AssignMemoryToTiles(global_state_);
254
255   EXPECT_EQ(3, AssignedMemoryCount(active_now));
256   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
257   EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
258   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
259
260   ReleaseTiles(&active_now);
261   ReleaseTiles(&pending_now);
262   ReleaseTiles(&active_pending_soon);
263   ReleaseTiles(&never_bin);
264 }
265
266 TEST_P(TileManagerTest, EnoughMemoryAllowNothing) {
267   // A few tiles of each type of priority, with enough memory for all tiles,
268   // but allow nothing should not assign any memory.
269
270   Initialize(10, ALLOW_NOTHING, SMOOTHNESS_TAKES_PRIORITY);
271   TileVector active_now =
272       CreateTiles(3, TilePriorityForNowBin(), TilePriority());
273   TileVector pending_now =
274       CreateTiles(3, TilePriority(), TilePriorityForNowBin());
275   TileVector active_pending_soon =
276       CreateTiles(3, TilePriorityForSoonBin(), TilePriorityForSoonBin());
277   TileVector never_bin = CreateTiles(1, TilePriority(), TilePriority());
278
279   tile_manager()->AssignMemoryToTiles(global_state_);
280
281   EXPECT_EQ(0, AssignedMemoryCount(active_now));
282   EXPECT_EQ(0, AssignedMemoryCount(pending_now));
283   EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
284   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
285
286   ReleaseTiles(&active_now);
287   ReleaseTiles(&pending_now);
288   ReleaseTiles(&active_pending_soon);
289   ReleaseTiles(&never_bin);
290 }
291
292 TEST_P(TileManagerTest, PartialOOMMemoryToPending) {
293   // 5 tiles on active tree eventually bin, 5 tiles on pending tree that are
294   // required for activation, but only enough memory for 8 tiles. The result
295   // is all pending tree tiles get memory, and 3 of the active tree tiles
296   // get memory. None of these tiles is needed to avoid calimity (flickering or
297   // raster-on-demand) so the soft memory limit is used.
298
299   Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
300   TileVector active_tree_tiles =
301       CreateTiles(5, TilePriorityForEventualBin(), TilePriority());
302   TileVector pending_tree_tiles =
303       CreateTiles(5, TilePriority(), TilePriorityRequiredForActivation());
304   tile_manager()->AssignMemoryToTiles(global_state_);
305
306   EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
307   EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
308
309   SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
310   tile_manager()->AssignMemoryToTiles(global_state_);
311
312   EXPECT_EQ(3, AssignedMemoryCount(active_tree_tiles));
313   EXPECT_EQ(5, AssignedMemoryCount(pending_tree_tiles));
314
315   ReleaseTiles(&active_tree_tiles);
316   ReleaseTiles(&pending_tree_tiles);
317 }
318
319 TEST_P(TileManagerTest, PartialOOMMemoryToActive) {
320   // 5 tiles on active tree eventually bin, 5 tiles on pending tree now bin,
321   // but only enough memory for 8 tiles. The result is all active tree tiles
322   // get memory, and 3 of the pending tree tiles get memory.
323   // The pending tiles are not needed to avoid calimity (flickering or
324   // raster-on-demand) and the active tiles fit, so the soft limit is used.
325
326   Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
327   TileVector active_tree_tiles =
328       CreateTiles(5, TilePriorityForNowBin(), TilePriority());
329   TileVector pending_tree_tiles =
330       CreateTiles(5, TilePriority(), TilePriorityForNowBin());
331
332   tile_manager()->AssignMemoryToTiles(global_state_);
333
334   EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
335   EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
336
337   ReleaseTiles(&active_tree_tiles);
338   ReleaseTiles(&pending_tree_tiles);
339 }
340
341 TEST_P(TileManagerTest, TotalOOMMemoryToPending) {
342   // 10 tiles on active tree eventually bin, 10 tiles on pending tree that are
343   // required for activation, but only enough tiles for 4 tiles. The result
344   // is 4 pending tree tiles get memory, and none of the active tree tiles
345   // get memory.
346
347   Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
348   TileVector active_tree_tiles =
349       CreateTiles(10, TilePriorityForEventualBin(), TilePriority());
350   TileVector pending_tree_tiles =
351       CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
352
353   tile_manager()->AssignMemoryToTiles(global_state_);
354
355   EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
356   EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
357
358   SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
359   tile_manager()->AssignMemoryToTiles(global_state_);
360
361   if (UsingResourceLimit()) {
362     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
363     EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
364   } else {
365     // Pending tiles are now required to avoid calimity (flickering or
366     // raster-on-demand). Hard-limit is used and double the tiles fit.
367     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
368     EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
369   }
370
371   ReleaseTiles(&active_tree_tiles);
372   ReleaseTiles(&pending_tree_tiles);
373 }
374
375 TEST_P(TileManagerTest, TotalOOMActiveSoonMemoryToPending) {
376   // 10 tiles on active tree soon bin, 10 tiles on pending tree that are
377   // required for activation, but only enough tiles for 4 tiles. The result
378   // is 4 pending tree tiles get memory, and none of the active tree tiles
379   // get memory.
380
381   Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
382   TileVector active_tree_tiles =
383       CreateTiles(10, TilePriorityForSoonBin(), TilePriority());
384   TileVector pending_tree_tiles =
385       CreateTiles(10, TilePriority(), TilePriorityRequiredForActivation());
386
387   tile_manager()->AssignMemoryToTiles(global_state_);
388
389   EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
390   EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
391
392   SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
393   tile_manager()->AssignMemoryToTiles(global_state_);
394
395   if (UsingResourceLimit()) {
396     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
397     EXPECT_EQ(4, AssignedMemoryCount(pending_tree_tiles));
398   } else {
399     // Pending tiles are now required to avoid calimity (flickering or
400     // raster-on-demand). Hard-limit is used and double the tiles fit.
401     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
402     EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
403   }
404
405   ReleaseTiles(&active_tree_tiles);
406   ReleaseTiles(&pending_tree_tiles);
407 }
408
409 TEST_P(TileManagerTest, TotalOOMMemoryToActive) {
410   // 10 tiles on active tree eventually bin, 10 tiles on pending tree now bin,
411   // but only enough memory for 4 tiles. The result is 4 active tree tiles
412   // get memory, and none of the pending tree tiles get memory.
413
414   Initialize(4, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
415   TileVector active_tree_tiles =
416       CreateTiles(10, TilePriorityForNowBin(), TilePriority());
417   TileVector pending_tree_tiles =
418       CreateTiles(10, TilePriority(), TilePriorityForNowBin());
419
420   tile_manager()->AssignMemoryToTiles(global_state_);
421
422   if (UsingResourceLimit()) {
423     EXPECT_EQ(4, AssignedMemoryCount(active_tree_tiles));
424     EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
425   } else {
426     // Active tiles are required to avoid calimity (flickering or
427     // raster-on-demand). Hard-limit is used and double the tiles fit.
428     EXPECT_EQ(8, AssignedMemoryCount(active_tree_tiles));
429     EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
430   }
431
432   ReleaseTiles(&active_tree_tiles);
433   ReleaseTiles(&pending_tree_tiles);
434 }
435
436 TEST_P(TileManagerTest, TotalOOMMemoryToNewContent) {
437   // 10 tiles on active tree now bin, 10 tiles on pending tree now bin,
438   // but only enough memory for 8 tiles. Any tile missing would cause
439   // a calamity (flickering or raster-on-demand). Depending on mode,
440   // we should use varying amounts of the higher hard memory limit.
441   if (UsingResourceLimit())
442     return;
443
444   Initialize(8, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
445   TileVector active_tree_tiles =
446       CreateTiles(10, TilePriorityForNowBin(), TilePriority());
447   TileVector pending_tree_tiles =
448       CreateTiles(10, TilePriority(), TilePriorityForNowBin());
449
450   // Active tiles are required to avoid calimity. The hard-limit is used and all
451   // active-tiles fit. No pending tiles are needed to avoid calamity so only 10
452   // tiles total are used.
453   tile_manager()->AssignMemoryToTiles(global_state_);
454   EXPECT_EQ(10, AssignedMemoryCount(active_tree_tiles));
455   EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
456
457   // Even the hard-limit won't save us now. All tiles are required to avoid
458   // a clamity but we only have 16. The tiles will be distribted randomly
459   // given they are identical, in practice depending on their screen location.
460   SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
461   tile_manager()->AssignMemoryToTiles(global_state_);
462   EXPECT_EQ(16,
463             AssignedMemoryCount(active_tree_tiles) +
464                 AssignedMemoryCount(pending_tree_tiles));
465
466   // The pending tree is now more important. Active tiles will take higher
467   // priority if they are ready-to-draw in practice. Importantly though,
468   // pending tiles also utilize the hard-limit.
469   SetTreePriority(NEW_CONTENT_TAKES_PRIORITY);
470   tile_manager()->AssignMemoryToTiles(global_state_);
471   EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
472   EXPECT_EQ(10, AssignedMemoryCount(pending_tree_tiles));
473
474   ReleaseTiles(&active_tree_tiles);
475   ReleaseTiles(&pending_tree_tiles);
476 }
477
478 // If true, the max tile limit should be applied as bytes; if false,
479 // as num_resources_limit.
480 INSTANTIATE_TEST_CASE_P(TileManagerTests,
481                         TileManagerTest,
482                         ::testing::Values(true, false));
483
484 class LowResTilingsSettings : public ImplSidePaintingSettings {
485  public:
486   LowResTilingsSettings() { create_low_res_tiling = true; }
487 };
488
489 class TileManagerTilePriorityQueueTest : public testing::Test {
490  public:
491   TileManagerTilePriorityQueueTest()
492       : memory_limit_policy_(ALLOW_ANYTHING),
493         max_tiles_(10000),
494         ready_to_activate_(false),
495         id_(7),
496         proxy_(base::MessageLoopProxy::current()),
497         host_impl_(LowResTilingsSettings(), &proxy_, &shared_bitmap_manager_) {}
498
499   void SetTreePriority(TreePriority tree_priority) {
500     GlobalStateThatImpactsTilePriority state;
501     gfx::Size tile_size(256, 256);
502
503     state.soft_memory_limit_in_bytes = 100 * 1000 * 1000;
504     state.num_resources_limit = max_tiles_;
505     state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes * 2;
506     state.memory_limit_policy = memory_limit_policy_;
507     state.tree_priority = tree_priority;
508
509     global_state_ = state;
510     host_impl_.resource_pool()->SetResourceUsageLimits(
511         state.soft_memory_limit_in_bytes,
512         state.soft_memory_limit_in_bytes,
513         state.num_resources_limit);
514     host_impl_.tile_manager()->SetGlobalStateForTesting(state);
515   }
516
517   virtual void SetUp() OVERRIDE {
518     InitializeRenderer();
519     SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
520   }
521
522   virtual void InitializeRenderer() {
523     host_impl_.InitializeRenderer(
524         FakeOutputSurface::Create3d().PassAs<OutputSurface>());
525   }
526
527   void SetupDefaultTrees(const gfx::Size& layer_bounds) {
528     gfx::Size tile_size(100, 100);
529
530     scoped_refptr<FakePicturePileImpl> pending_pile =
531         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
532     scoped_refptr<FakePicturePileImpl> active_pile =
533         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
534
535     SetupTrees(pending_pile, active_pile);
536   }
537
538   void ActivateTree() {
539     host_impl_.ActivateSyncTree();
540     CHECK(!host_impl_.pending_tree());
541     pending_layer_ = NULL;
542     active_layer_ = static_cast<FakePictureLayerImpl*>(
543         host_impl_.active_tree()->LayerById(id_));
544   }
545
546   void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
547                                           const gfx::Size& tile_size) {
548     SetupDefaultTrees(layer_bounds);
549     pending_layer_->set_fixed_tile_size(tile_size);
550     active_layer_->set_fixed_tile_size(tile_size);
551   }
552
553   void SetupTrees(scoped_refptr<PicturePileImpl> pending_pile,
554                   scoped_refptr<PicturePileImpl> active_pile) {
555     SetupPendingTree(active_pile);
556     ActivateTree();
557     SetupPendingTree(pending_pile);
558   }
559
560   void SetupPendingTree(scoped_refptr<PicturePileImpl> pile) {
561     host_impl_.CreatePendingTree();
562     LayerTreeImpl* pending_tree = host_impl_.pending_tree();
563     // Clear recycled tree.
564     pending_tree->DetachLayerTree();
565
566     scoped_ptr<FakePictureLayerImpl> pending_layer =
567         FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
568     pending_layer->SetDrawsContent(true);
569     pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
570
571     pending_layer_ = static_cast<FakePictureLayerImpl*>(
572         host_impl_.pending_tree()->LayerById(id_));
573     pending_layer_->DoPostCommitInitializationIfNeeded();
574   }
575
576   void CreateHighLowResAndSetAllTilesVisible() {
577     // Active layer must get updated first so pending layer can share from it.
578     active_layer_->CreateDefaultTilingsAndTiles();
579     active_layer_->SetAllTilesVisible();
580     pending_layer_->CreateDefaultTilingsAndTiles();
581     pending_layer_->SetAllTilesVisible();
582   }
583
584   TileManager* tile_manager() { return host_impl_.tile_manager(); }
585
586  protected:
587   GlobalStateThatImpactsTilePriority global_state_;
588
589   TestSharedBitmapManager shared_bitmap_manager_;
590   TileMemoryLimitPolicy memory_limit_policy_;
591   int max_tiles_;
592   bool ready_to_activate_;
593   int id_;
594   FakeImplProxy proxy_;
595   FakeLayerTreeHostImpl host_impl_;
596   FakePictureLayerImpl* pending_layer_;
597   FakePictureLayerImpl* active_layer_;
598 };
599
600 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) {
601   SetupDefaultTrees(gfx::Size(1000, 1000));
602
603   active_layer_->CreateDefaultTilingsAndTiles();
604   pending_layer_->CreateDefaultTilingsAndTiles();
605
606   RasterTilePriorityQueue queue;
607   host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
608   EXPECT_FALSE(queue.IsEmpty());
609
610   size_t tile_count = 0;
611   std::set<Tile*> all_tiles;
612   while (!queue.IsEmpty()) {
613     EXPECT_TRUE(queue.Top());
614     all_tiles.insert(queue.Top());
615     ++tile_count;
616     queue.Pop();
617   }
618
619   EXPECT_EQ(tile_count, all_tiles.size());
620   EXPECT_EQ(17u, tile_count);
621
622   // Sanity check, all tiles should be visible.
623   std::set<Tile*> smoothness_tiles;
624   queue.Reset();
625   host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
626   while (!queue.IsEmpty()) {
627     Tile* tile = queue.Top();
628     EXPECT_TRUE(tile);
629     EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
630     EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
631     smoothness_tiles.insert(tile);
632     queue.Pop();
633   }
634   EXPECT_EQ(all_tiles, smoothness_tiles);
635
636   Region invalidation(gfx::Rect(0, 0, 500, 500));
637
638   // Invalidate the pending tree.
639   pending_layer_->set_invalidation(invalidation);
640   pending_layer_->HighResTiling()->UpdateTilesToCurrentPile(
641       invalidation, gfx::Size(1000, 1000));
642   pending_layer_->LowResTiling()->UpdateTilesToCurrentPile(
643       invalidation, gfx::Size(1000, 1000));
644
645   active_layer_->ResetAllTilesPriorities();
646   pending_layer_->ResetAllTilesPriorities();
647
648   // Renew all of the tile priorities.
649   gfx::Rect viewport(50, 50, 100, 100);
650   pending_layer_->HighResTiling()->UpdateTilePriorities(
651       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
652   pending_layer_->LowResTiling()->UpdateTilePriorities(
653       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
654   active_layer_->HighResTiling()->UpdateTilePriorities(
655       ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
656   active_layer_->LowResTiling()->UpdateTilePriorities(
657       ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
658
659   // Populate all tiles directly from the tilings.
660   all_tiles.clear();
661   std::vector<Tile*> pending_high_res_tiles =
662       pending_layer_->HighResTiling()->AllTilesForTesting();
663   for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
664     all_tiles.insert(pending_high_res_tiles[i]);
665
666   std::vector<Tile*> pending_low_res_tiles =
667       pending_layer_->LowResTiling()->AllTilesForTesting();
668   for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
669     all_tiles.insert(pending_low_res_tiles[i]);
670
671   std::vector<Tile*> active_high_res_tiles =
672       active_layer_->HighResTiling()->AllTilesForTesting();
673   for (size_t i = 0; i < active_high_res_tiles.size(); ++i)
674     all_tiles.insert(active_high_res_tiles[i]);
675
676   std::vector<Tile*> active_low_res_tiles =
677       active_layer_->LowResTiling()->AllTilesForTesting();
678   for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
679     all_tiles.insert(active_low_res_tiles[i]);
680
681   Tile* last_tile = NULL;
682   smoothness_tiles.clear();
683   tile_count = 0;
684   size_t increasing_distance_tiles = 0u;
685   // Here we expect to get increasing ACTIVE_TREE priority_bin.
686   queue.Reset();
687   host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
688   while (!queue.IsEmpty()) {
689     Tile* tile = queue.Top();
690     EXPECT_TRUE(tile);
691
692     if (!last_tile)
693       last_tile = tile;
694
695     EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin,
696               tile->priority(ACTIVE_TREE).priority_bin);
697     if (last_tile->priority(ACTIVE_TREE).priority_bin ==
698         tile->priority(ACTIVE_TREE).priority_bin) {
699       increasing_distance_tiles +=
700           last_tile->priority(ACTIVE_TREE).distance_to_visible <=
701           tile->priority(ACTIVE_TREE).distance_to_visible;
702     }
703
704     if (tile->priority(ACTIVE_TREE).priority_bin == TilePriority::NOW &&
705         last_tile->priority(ACTIVE_TREE).resolution !=
706             tile->priority(ACTIVE_TREE).resolution) {
707       // Low resolution should come first.
708       EXPECT_EQ(LOW_RESOLUTION, last_tile->priority(ACTIVE_TREE).resolution);
709     }
710
711     last_tile = tile;
712     ++tile_count;
713     smoothness_tiles.insert(tile);
714     queue.Pop();
715   }
716
717   EXPECT_EQ(tile_count, smoothness_tiles.size());
718   EXPECT_EQ(all_tiles, smoothness_tiles);
719   // Since we don't guarantee increasing distance due to spiral iterator, we
720   // should check that we're _mostly_ right.
721   EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
722
723   std::set<Tile*> new_content_tiles;
724   last_tile = NULL;
725   increasing_distance_tiles = 0u;
726   // Here we expect to get increasing PENDING_TREE priority_bin.
727   queue.Reset();
728   host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY);
729   while (!queue.IsEmpty()) {
730     Tile* tile = queue.Top();
731     EXPECT_TRUE(tile);
732
733     if (!last_tile)
734       last_tile = tile;
735
736     EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin,
737               tile->priority(PENDING_TREE).priority_bin);
738     if (last_tile->priority(PENDING_TREE).priority_bin ==
739         tile->priority(PENDING_TREE).priority_bin) {
740       increasing_distance_tiles +=
741           last_tile->priority(PENDING_TREE).distance_to_visible <=
742           tile->priority(PENDING_TREE).distance_to_visible;
743     }
744
745     if (tile->priority(PENDING_TREE).priority_bin == TilePriority::NOW &&
746         last_tile->priority(PENDING_TREE).resolution !=
747             tile->priority(PENDING_TREE).resolution) {
748       // High resolution should come first.
749       EXPECT_EQ(HIGH_RESOLUTION, last_tile->priority(PENDING_TREE).resolution);
750     }
751
752     last_tile = tile;
753     new_content_tiles.insert(tile);
754     queue.Pop();
755   }
756
757   EXPECT_EQ(tile_count, new_content_tiles.size());
758   EXPECT_EQ(all_tiles, new_content_tiles);
759   // Since we don't guarantee increasing distance due to spiral iterator, we
760   // should check that we're _mostly_ right.
761   EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
762 }
763
764 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) {
765   SetupDefaultTrees(gfx::Size(1000, 1000));
766
767   active_layer_->CreateDefaultTilingsAndTiles();
768   pending_layer_->CreateDefaultTilingsAndTiles();
769
770   EvictionTilePriorityQueue empty_queue;
771   host_impl_.BuildEvictionQueue(&empty_queue, SAME_PRIORITY_FOR_BOTH_TREES);
772   EXPECT_TRUE(empty_queue.IsEmpty());
773   std::set<Tile*> all_tiles;
774   size_t tile_count = 0;
775
776   RasterTilePriorityQueue raster_queue;
777   host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
778   while (!raster_queue.IsEmpty()) {
779     ++tile_count;
780     EXPECT_TRUE(raster_queue.Top());
781     all_tiles.insert(raster_queue.Top());
782     raster_queue.Pop();
783   }
784
785   EXPECT_EQ(tile_count, all_tiles.size());
786   EXPECT_EQ(17u, tile_count);
787
788   tile_manager()->InitializeTilesWithResourcesForTesting(
789       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
790
791   EvictionTilePriorityQueue queue;
792   host_impl_.BuildEvictionQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
793   EXPECT_FALSE(queue.IsEmpty());
794
795   // Sanity check, all tiles should be visible.
796   std::set<Tile*> smoothness_tiles;
797   while (!queue.IsEmpty()) {
798     Tile* tile = queue.Top();
799     EXPECT_TRUE(tile);
800     EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
801     EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
802     EXPECT_TRUE(tile->HasResources());
803     smoothness_tiles.insert(tile);
804     queue.Pop();
805   }
806   EXPECT_EQ(all_tiles, smoothness_tiles);
807
808   tile_manager()->ReleaseTileResourcesForTesting(
809       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
810
811   Region invalidation(gfx::Rect(0, 0, 500, 500));
812
813   // Invalidate the pending tree.
814   pending_layer_->set_invalidation(invalidation);
815   pending_layer_->HighResTiling()->UpdateTilesToCurrentPile(
816       invalidation, gfx::Size(1000, 1000));
817   pending_layer_->LowResTiling()->UpdateTilesToCurrentPile(
818       invalidation, gfx::Size(1000, 1000));
819
820   active_layer_->ResetAllTilesPriorities();
821   pending_layer_->ResetAllTilesPriorities();
822
823   // Renew all of the tile priorities.
824   gfx::Rect viewport(50, 50, 100, 100);
825   pending_layer_->HighResTiling()->UpdateTilePriorities(
826       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
827   pending_layer_->LowResTiling()->UpdateTilePriorities(
828       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
829   active_layer_->HighResTiling()->UpdateTilePriorities(
830       ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
831   active_layer_->LowResTiling()->UpdateTilePriorities(
832       ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
833
834   // Populate all tiles directly from the tilings.
835   all_tiles.clear();
836   std::vector<Tile*> pending_high_res_tiles =
837       pending_layer_->HighResTiling()->AllTilesForTesting();
838   for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
839     all_tiles.insert(pending_high_res_tiles[i]);
840
841   std::vector<Tile*> pending_low_res_tiles =
842       pending_layer_->LowResTiling()->AllTilesForTesting();
843   for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
844     all_tiles.insert(pending_low_res_tiles[i]);
845
846   std::vector<Tile*> active_high_res_tiles =
847       active_layer_->HighResTiling()->AllTilesForTesting();
848   for (size_t i = 0; i < active_high_res_tiles.size(); ++i)
849     all_tiles.insert(active_high_res_tiles[i]);
850
851   std::vector<Tile*> active_low_res_tiles =
852       active_layer_->LowResTiling()->AllTilesForTesting();
853   for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
854     all_tiles.insert(active_low_res_tiles[i]);
855
856   tile_manager()->InitializeTilesWithResourcesForTesting(
857       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
858
859   pending_layer_->MarkVisibleResourcesAsRequired();
860
861   Tile* last_tile = NULL;
862   smoothness_tiles.clear();
863   tile_count = 0;
864   // Here we expect to get increasing ACTIVE_TREE priority_bin.
865   queue.Reset();
866   host_impl_.BuildEvictionQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
867   while (!queue.IsEmpty()) {
868     Tile* tile = queue.Top();
869     EXPECT_TRUE(tile);
870     EXPECT_TRUE(tile->HasResources());
871
872     if (!last_tile)
873       last_tile = tile;
874
875     EXPECT_GE(last_tile->priority(ACTIVE_TREE).priority_bin,
876               tile->priority(ACTIVE_TREE).priority_bin);
877     if (last_tile->priority(ACTIVE_TREE).priority_bin ==
878         tile->priority(ACTIVE_TREE).priority_bin) {
879       EXPECT_LE(last_tile->required_for_activation(),
880                 tile->required_for_activation());
881       if (last_tile->required_for_activation() ==
882           tile->required_for_activation()) {
883         EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible,
884                   tile->priority(ACTIVE_TREE).distance_to_visible);
885       }
886     }
887
888     last_tile = tile;
889     ++tile_count;
890     smoothness_tiles.insert(tile);
891     queue.Pop();
892   }
893
894   EXPECT_EQ(tile_count, smoothness_tiles.size());
895   EXPECT_EQ(all_tiles, smoothness_tiles);
896
897   std::set<Tile*> new_content_tiles;
898   last_tile = NULL;
899   // Here we expect to get increasing PENDING_TREE priority_bin.
900   queue.Reset();
901   host_impl_.BuildEvictionQueue(&queue, NEW_CONTENT_TAKES_PRIORITY);
902   while (!queue.IsEmpty()) {
903     Tile* tile = queue.Top();
904     EXPECT_TRUE(tile);
905
906     if (!last_tile)
907       last_tile = tile;
908
909     EXPECT_GE(last_tile->priority(PENDING_TREE).priority_bin,
910               tile->priority(PENDING_TREE).priority_bin);
911     if (last_tile->priority(PENDING_TREE).priority_bin ==
912         tile->priority(PENDING_TREE).priority_bin) {
913       EXPECT_LE(last_tile->required_for_activation(),
914                 tile->required_for_activation());
915       if (last_tile->required_for_activation() ==
916           tile->required_for_activation()) {
917         EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible,
918                   tile->priority(PENDING_TREE).distance_to_visible);
919       }
920     }
921
922     last_tile = tile;
923     new_content_tiles.insert(tile);
924     queue.Pop();
925   }
926
927   EXPECT_EQ(tile_count, new_content_tiles.size());
928   EXPECT_EQ(all_tiles, new_content_tiles);
929 }
930
931 TEST_F(TileManagerTilePriorityQueueTest,
932        EvictionTilePriorityQueueWithOcclusion) {
933   gfx::Size tile_size(102, 102);
934   gfx::Size layer_bounds(1000, 1000);
935
936   scoped_refptr<FakePicturePileImpl> pending_pile =
937       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
938   SetupPendingTree(pending_pile);
939   pending_layer_->CreateDefaultTilingsAndTiles();
940
941   scoped_ptr<FakePictureLayerImpl> pending_child =
942       FakePictureLayerImpl::CreateWithPile(
943           host_impl_.pending_tree(), 2, pending_pile);
944   pending_layer_->AddChild(pending_child.PassAs<LayerImpl>());
945
946   FakePictureLayerImpl* pending_child_layer =
947       static_cast<FakePictureLayerImpl*>(pending_layer_->children()[0]);
948   pending_child_layer->SetDrawsContent(true);
949   pending_child_layer->DoPostCommitInitializationIfNeeded();
950   pending_child_layer->CreateDefaultTilingsAndTiles();
951
952   std::set<Tile*> all_tiles;
953   size_t tile_count = 0;
954   RasterTilePriorityQueue raster_queue;
955   host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
956   while (!raster_queue.IsEmpty()) {
957     ++tile_count;
958     EXPECT_TRUE(raster_queue.Top());
959     all_tiles.insert(raster_queue.Top());
960     raster_queue.Pop();
961   }
962   EXPECT_EQ(tile_count, all_tiles.size());
963   EXPECT_EQ(34u, tile_count);
964
965   pending_layer_->ResetAllTilesPriorities();
966
967   // Renew all of the tile priorities.
968   gfx::Rect viewport(layer_bounds);
969   pending_layer_->HighResTiling()->UpdateTilePriorities(
970       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
971   pending_layer_->LowResTiling()->UpdateTilePriorities(
972       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
973   pending_child_layer->HighResTiling()->UpdateTilePriorities(
974       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
975   pending_child_layer->LowResTiling()->UpdateTilePriorities(
976       PENDING_TREE, viewport, 1.0f, 1.0, Occlusion());
977
978   // Populate all tiles directly from the tilings.
979   all_tiles.clear();
980   std::vector<Tile*> pending_high_res_tiles =
981       pending_layer_->HighResTiling()->AllTilesForTesting();
982   for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
983     all_tiles.insert(pending_high_res_tiles[i]);
984
985   std::vector<Tile*> pending_low_res_tiles =
986       pending_layer_->LowResTiling()->AllTilesForTesting();
987   for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
988     all_tiles.insert(pending_low_res_tiles[i]);
989
990   // Set all tiles on the pending_child_layer as occluded on the pending tree.
991   std::vector<Tile*> pending_child_high_res_tiles =
992       pending_child_layer->HighResTiling()->AllTilesForTesting();
993   for (size_t i = 0; i < pending_child_high_res_tiles.size(); ++i) {
994     pending_child_high_res_tiles[i]->set_is_occluded(PENDING_TREE, true);
995     all_tiles.insert(pending_child_high_res_tiles[i]);
996   }
997
998   std::vector<Tile*> pending_child_low_res_tiles =
999       pending_child_layer->LowResTiling()->AllTilesForTesting();
1000   for (size_t i = 0; i < pending_child_low_res_tiles.size(); ++i) {
1001     pending_child_low_res_tiles[i]->set_is_occluded(PENDING_TREE, true);
1002     all_tiles.insert(pending_child_low_res_tiles[i]);
1003   }
1004
1005   tile_manager()->InitializeTilesWithResourcesForTesting(
1006       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
1007
1008   // Verify occlusion is considered by EvictionTilePriorityQueue.
1009   TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY;
1010   size_t occluded_count = 0u;
1011   Tile* last_tile = NULL;
1012   EvictionTilePriorityQueue queue;
1013   host_impl_.BuildEvictionQueue(&queue, tree_priority);
1014   while (!queue.IsEmpty()) {
1015     Tile* tile = queue.Top();
1016     if (!last_tile)
1017       last_tile = tile;
1018
1019     bool tile_is_occluded = tile->is_occluded_for_tree_priority(tree_priority);
1020
1021     // The only way we will encounter an occluded tile after an unoccluded
1022     // tile is if the priorty bin decreased, the tile is required for
1023     // activation, or the scale changed.
1024     if (tile_is_occluded) {
1025       occluded_count++;
1026
1027       bool last_tile_is_occluded =
1028           last_tile->is_occluded_for_tree_priority(tree_priority);
1029       if (!last_tile_is_occluded) {
1030         TilePriority::PriorityBin tile_priority_bin =
1031             tile->priority_for_tree_priority(tree_priority).priority_bin;
1032         TilePriority::PriorityBin last_tile_priority_bin =
1033             last_tile->priority_for_tree_priority(tree_priority).priority_bin;
1034
1035         EXPECT_TRUE((tile_priority_bin < last_tile_priority_bin) ||
1036                     tile->required_for_activation() ||
1037                     (tile->contents_scale() != last_tile->contents_scale()));
1038       }
1039     }
1040     last_tile = tile;
1041     queue.Pop();
1042   }
1043   size_t expected_occluded_count =
1044       pending_child_high_res_tiles.size() + pending_child_low_res_tiles.size();
1045   EXPECT_EQ(expected_occluded_count, occluded_count);
1046 }
1047
1048 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) {
1049   SetupDefaultTrees(gfx::Size(1000, 1000));
1050
1051   active_layer_->CreateDefaultTilingsAndTiles();
1052   pending_layer_->CreateDefaultTilingsAndTiles();
1053
1054   RasterTilePriorityQueue queue;
1055   host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
1056   EXPECT_FALSE(queue.IsEmpty());
1057
1058   size_t tile_count = 0;
1059   std::set<Tile*> all_tiles;
1060   while (!queue.IsEmpty()) {
1061     EXPECT_TRUE(queue.Top());
1062     all_tiles.insert(queue.Top());
1063     ++tile_count;
1064     queue.Pop();
1065   }
1066
1067   EXPECT_EQ(tile_count, all_tiles.size());
1068   EXPECT_EQ(17u, tile_count);
1069
1070   queue.Reset();
1071   for (int i = 1; i < 10; ++i) {
1072     scoped_ptr<FakePictureLayerImpl> pending_layer =
1073         FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i);
1074     pending_layer->SetDrawsContent(true);
1075     pending_layer->DoPostCommitInitializationIfNeeded();
1076     pending_layer->set_has_valid_tile_priorities(true);
1077     pending_layer_->AddChild(pending_layer.PassAs<LayerImpl>());
1078   }
1079
1080   host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
1081   EXPECT_FALSE(queue.IsEmpty());
1082
1083   tile_count = 0;
1084   all_tiles.clear();
1085   while (!queue.IsEmpty()) {
1086     EXPECT_TRUE(queue.Top());
1087     all_tiles.insert(queue.Top());
1088     ++tile_count;
1089     queue.Pop();
1090   }
1091   EXPECT_EQ(tile_count, all_tiles.size());
1092   EXPECT_EQ(17u, tile_count);
1093 }
1094
1095 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) {
1096   SetupDefaultTrees(gfx::Size(1000, 1000));
1097
1098   active_layer_->CreateDefaultTilingsAndTiles();
1099   pending_layer_->CreateDefaultTilingsAndTiles();
1100
1101   RasterTilePriorityQueue raster_queue;
1102   host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
1103   EXPECT_FALSE(raster_queue.IsEmpty());
1104
1105   size_t tile_count = 0;
1106   std::set<Tile*> all_tiles;
1107   while (!raster_queue.IsEmpty()) {
1108     EXPECT_TRUE(raster_queue.Top());
1109     all_tiles.insert(raster_queue.Top());
1110     ++tile_count;
1111     raster_queue.Pop();
1112   }
1113   EXPECT_EQ(tile_count, all_tiles.size());
1114   EXPECT_EQ(17u, tile_count);
1115
1116   std::vector<Tile*> tiles(all_tiles.begin(), all_tiles.end());
1117   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
1118
1119   EvictionTilePriorityQueue queue;
1120   for (int i = 1; i < 10; ++i) {
1121     scoped_ptr<FakePictureLayerImpl> pending_layer =
1122         FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i);
1123     pending_layer->SetDrawsContent(true);
1124     pending_layer->DoPostCommitInitializationIfNeeded();
1125     pending_layer->set_has_valid_tile_priorities(true);
1126     pending_layer_->AddChild(pending_layer.PassAs<LayerImpl>());
1127   }
1128
1129   host_impl_.BuildEvictionQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
1130   EXPECT_FALSE(queue.IsEmpty());
1131
1132   tile_count = 0;
1133   all_tiles.clear();
1134   while (!queue.IsEmpty()) {
1135     EXPECT_TRUE(queue.Top());
1136     all_tiles.insert(queue.Top());
1137     ++tile_count;
1138     queue.Pop();
1139   }
1140   EXPECT_EQ(tile_count, all_tiles.size());
1141   EXPECT_EQ(17u, tile_count);
1142 }
1143
1144 }  // namespace
1145 }  // namespace cc