46f0ef3d2169edb5ab61873ac840cc2516c9dc20
[platform/framework/web/crosswalk.git] / src / cc / layers / picture_layer_impl_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/layers/picture_layer_impl.h"
6
7 #include <algorithm>
8 #include <limits>
9 #include <set>
10 #include <utility>
11
12 #include "cc/base/math_util.h"
13 #include "cc/layers/append_quads_data.h"
14 #include "cc/layers/picture_layer.h"
15 #include "cc/quads/draw_quad.h"
16 #include "cc/quads/tile_draw_quad.h"
17 #include "cc/test/begin_frame_args_test.h"
18 #include "cc/test/fake_content_layer_client.h"
19 #include "cc/test/fake_impl_proxy.h"
20 #include "cc/test/fake_layer_tree_host_impl.h"
21 #include "cc/test/fake_output_surface.h"
22 #include "cc/test/fake_picture_layer_impl.h"
23 #include "cc/test/fake_picture_pile_impl.h"
24 #include "cc/test/geometry_test_utils.h"
25 #include "cc/test/impl_side_painting_settings.h"
26 #include "cc/test/layer_test_common.h"
27 #include "cc/test/test_shared_bitmap_manager.h"
28 #include "cc/test/test_web_graphics_context_3d.h"
29 #include "cc/trees/layer_tree_impl.h"
30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "ui/gfx/rect_conversions.h"
32 #include "ui/gfx/size_conversions.h"
33
34 namespace cc {
35 namespace {
36
37 class MockCanvas : public SkCanvas {
38  public:
39   explicit MockCanvas(int w, int h) : SkCanvas(w, h) {}
40
41   virtual void drawRect(const SkRect& rect, const SkPaint& paint) OVERRIDE {
42     // Capture calls before SkCanvas quickReject() kicks in.
43     rects_.push_back(rect);
44   }
45
46   std::vector<SkRect> rects_;
47 };
48
49 class NoLowResTilingsSettings : public ImplSidePaintingSettings {};
50
51 class LowResTilingsSettings : public ImplSidePaintingSettings {
52  public:
53   LowResTilingsSettings() { create_low_res_tiling = true; }
54 };
55
56 class PictureLayerImplTest : public testing::Test {
57  public:
58   PictureLayerImplTest()
59       : proxy_(base::MessageLoopProxy::current()),
60         host_impl_(LowResTilingsSettings(), &proxy_, &shared_bitmap_manager_),
61         id_(7),
62         pending_layer_(NULL),
63         old_pending_layer_(NULL),
64         active_layer_(NULL) {}
65
66   explicit PictureLayerImplTest(const LayerTreeSettings& settings)
67       : proxy_(base::MessageLoopProxy::current()),
68         host_impl_(settings, &proxy_, &shared_bitmap_manager_),
69         id_(7) {}
70
71   virtual ~PictureLayerImplTest() {
72   }
73
74   virtual void SetUp() OVERRIDE {
75     InitializeRenderer();
76   }
77
78   virtual void InitializeRenderer() {
79     host_impl_.InitializeRenderer(
80         FakeOutputSurface::Create3d().PassAs<OutputSurface>());
81   }
82
83   void SetupDefaultTrees(const gfx::Size& layer_bounds) {
84     gfx::Size tile_size(100, 100);
85
86     scoped_refptr<FakePicturePileImpl> pending_pile =
87         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
88     scoped_refptr<FakePicturePileImpl> active_pile =
89         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
90
91     SetupTrees(pending_pile, active_pile);
92   }
93
94   void ActivateTree() {
95     host_impl_.ActivateSyncTree();
96     CHECK(!host_impl_.pending_tree());
97     CHECK(host_impl_.recycle_tree());
98     old_pending_layer_ = pending_layer_;
99     pending_layer_ = NULL;
100     active_layer_ = static_cast<FakePictureLayerImpl*>(
101         host_impl_.active_tree()->LayerById(id_));
102   }
103
104   void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
105                                           const gfx::Size& tile_size) {
106     SetupDefaultTrees(layer_bounds);
107     pending_layer_->set_fixed_tile_size(tile_size);
108     active_layer_->set_fixed_tile_size(tile_size);
109   }
110
111   void SetupTrees(
112       scoped_refptr<PicturePileImpl> pending_pile,
113       scoped_refptr<PicturePileImpl> active_pile) {
114     SetupPendingTree(active_pile);
115     ActivateTree();
116     SetupPendingTree(pending_pile);
117   }
118
119   void CreateHighLowResAndSetAllTilesVisible() {
120     // Active layer must get updated first so pending layer can share from it.
121     active_layer_->CreateDefaultTilingsAndTiles();
122     active_layer_->SetAllTilesVisible();
123     pending_layer_->CreateDefaultTilingsAndTiles();
124     pending_layer_->SetAllTilesVisible();
125   }
126
127   void AddDefaultTilingsWithInvalidation(const Region& invalidation) {
128     active_layer_->AddTiling(2.3f);
129     active_layer_->AddTiling(1.0f);
130     active_layer_->AddTiling(0.5f);
131     for (size_t i = 0; i < active_layer_->tilings()->num_tilings(); ++i)
132       active_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
133     pending_layer_->set_invalidation(invalidation);
134     for (size_t i = 0; i < pending_layer_->tilings()->num_tilings(); ++i)
135       pending_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
136   }
137
138   void SetupPendingTree(scoped_refptr<PicturePileImpl> pile) {
139     host_impl_.CreatePendingTree();
140     host_impl_.pending_tree()->SetPageScaleFactorAndLimits(1.f, 0.25f, 100.f);
141     LayerTreeImpl* pending_tree = host_impl_.pending_tree();
142     // Clear recycled tree.
143     pending_tree->DetachLayerTree();
144
145     scoped_ptr<FakePictureLayerImpl> pending_layer =
146         FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
147     pending_layer->SetDrawsContent(true);
148     pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
149
150     pending_layer_ = static_cast<FakePictureLayerImpl*>(
151         host_impl_.pending_tree()->LayerById(id_));
152     pending_layer_->DoPostCommitInitializationIfNeeded();
153   }
154
155   void SetupDrawPropertiesAndUpdateTiles(FakePictureLayerImpl* layer,
156                                          float ideal_contents_scale,
157                                          float device_scale_factor,
158                                          float page_scale_factor,
159                                          float maximum_animation_contents_scale,
160                                          bool animating_transform_to_screen) {
161     layer->draw_properties().ideal_contents_scale = ideal_contents_scale;
162     layer->draw_properties().device_scale_factor = device_scale_factor;
163     layer->draw_properties().page_scale_factor = page_scale_factor;
164     layer->draw_properties().maximum_animation_contents_scale =
165         maximum_animation_contents_scale;
166     layer->draw_properties().screen_space_transform_is_animating =
167         animating_transform_to_screen;
168     bool resourceless_software_draw = false;
169     layer->UpdateTiles(Occlusion(), resourceless_software_draw);
170   }
171   static void VerifyAllTilesExistAndHavePile(
172       const PictureLayerTiling* tiling,
173       PicturePileImpl* pile) {
174     for (PictureLayerTiling::CoverageIterator iter(
175              tiling,
176              tiling->contents_scale(),
177              gfx::Rect(tiling->tiling_size()));
178          iter;
179          ++iter) {
180       EXPECT_TRUE(*iter);
181       EXPECT_EQ(pile, iter->picture_pile());
182     }
183   }
184
185   void SetContentsScaleOnBothLayers(float contents_scale,
186                                     float device_scale_factor,
187                                     float page_scale_factor,
188                                     float maximum_animation_contents_scale,
189                                     bool animating_transform) {
190     SetupDrawPropertiesAndUpdateTiles(pending_layer_,
191                                       contents_scale,
192                                       device_scale_factor,
193                                       page_scale_factor,
194                                       maximum_animation_contents_scale,
195                                       animating_transform);
196
197     SetupDrawPropertiesAndUpdateTiles(active_layer_,
198                                       contents_scale,
199                                       device_scale_factor,
200                                       page_scale_factor,
201                                       maximum_animation_contents_scale,
202                                       animating_transform);
203   }
204
205   void ResetTilingsAndRasterScales() {
206     pending_layer_->ReleaseResources();
207     active_layer_->ReleaseResources();
208   }
209
210   void AssertAllTilesRequired(PictureLayerTiling* tiling) {
211     std::vector<Tile*> tiles = tiling->AllTilesForTesting();
212     for (size_t i = 0; i < tiles.size(); ++i)
213       EXPECT_TRUE(tiles[i]->required_for_activation()) << "i: " << i;
214     EXPECT_GT(tiles.size(), 0u);
215   }
216
217   void AssertNoTilesRequired(PictureLayerTiling* tiling) {
218     std::vector<Tile*> tiles = tiling->AllTilesForTesting();
219     for (size_t i = 0; i < tiles.size(); ++i)
220       EXPECT_FALSE(tiles[i]->required_for_activation()) << "i: " << i;
221     EXPECT_GT(tiles.size(), 0u);
222   }
223
224  protected:
225   void TestTileGridAlignmentCommon() {
226     // Layer to span 4 raster tiles in x and in y
227     ImplSidePaintingSettings settings;
228     gfx::Size layer_size(
229         settings.default_tile_size.width() * 7 / 2,
230         settings.default_tile_size.height() * 7 / 2);
231
232     scoped_refptr<FakePicturePileImpl> pending_pile =
233         FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
234     scoped_refptr<FakePicturePileImpl> active_pile =
235         FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
236
237     SetupTrees(pending_pile, active_pile);
238
239     SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
240
241     // Add 1x1 rects at the centers of each tile, then re-record pile contents
242     active_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
243     std::vector<Tile*> tiles =
244         active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
245     EXPECT_EQ(16u, tiles.size());
246     std::vector<SkRect> rects;
247     std::vector<Tile*>::const_iterator tile_iter;
248     for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
249       gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint();
250       gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1);
251       active_pile->add_draw_rect(rect);
252       rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1));
253     }
254     // Force re-record with newly injected content
255     active_pile->RemoveRecordingAt(0, 0);
256     active_pile->AddRecordingAt(0, 0);
257
258     std::vector<SkRect>::const_iterator rect_iter = rects.begin();
259     for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
260       MockCanvas mock_canvas(1000, 1000);
261       active_pile->RasterDirect(
262           &mock_canvas, (*tile_iter)->content_rect(), 1.0f, NULL);
263
264       // This test verifies that when drawing the contents of a specific tile
265       // at content scale 1.0, the playback canvas never receives content from
266       // neighboring tiles which indicates that the tile grid embedded in
267       // SkPicture is perfectly aligned with the compositor's tiles.
268       EXPECT_EQ(1u, mock_canvas.rects_.size());
269       EXPECT_EQ(*rect_iter, mock_canvas.rects_[0]);
270       rect_iter++;
271     }
272   }
273
274   void TestQuadsForSolidColor(bool test_for_solid);
275
276   FakeImplProxy proxy_;
277   TestSharedBitmapManager shared_bitmap_manager_;
278   FakeLayerTreeHostImpl host_impl_;
279   int id_;
280   FakePictureLayerImpl* pending_layer_;
281   FakePictureLayerImpl* old_pending_layer_;
282   FakePictureLayerImpl* active_layer_;
283
284  private:
285   DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest);
286 };
287
288 TEST_F(PictureLayerImplTest, TileGridAlignment) {
289   host_impl_.SetDeviceScaleFactor(1.f);
290   TestTileGridAlignmentCommon();
291 }
292
293 TEST_F(PictureLayerImplTest, TileGridAlignmentHiDPI) {
294   host_impl_.SetDeviceScaleFactor(2.f);
295   TestTileGridAlignmentCommon();
296 }
297
298 TEST_F(PictureLayerImplTest, CloneNoInvalidation) {
299   gfx::Size tile_size(100, 100);
300   gfx::Size layer_bounds(400, 400);
301
302   scoped_refptr<FakePicturePileImpl> pending_pile =
303       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
304   scoped_refptr<FakePicturePileImpl> active_pile =
305       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
306
307   SetupTrees(pending_pile, active_pile);
308
309   Region invalidation;
310   AddDefaultTilingsWithInvalidation(invalidation);
311
312   EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
313             active_layer_->tilings()->num_tilings());
314
315   const PictureLayerTilingSet* tilings = pending_layer_->tilings();
316   EXPECT_GT(tilings->num_tilings(), 0u);
317   for (size_t i = 0; i < tilings->num_tilings(); ++i)
318     VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), active_pile.get());
319 }
320
321 TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
322   base::TimeTicks time_ticks;
323   time_ticks += base::TimeDelta::FromMilliseconds(1);
324   host_impl_.SetCurrentBeginFrameArgs(
325       CreateBeginFrameArgsForTesting(time_ticks));
326   gfx::Size tile_size(100, 100);
327   gfx::Size layer_bounds(400, 400);
328
329   scoped_refptr<FakePicturePileImpl> pending_pile =
330       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
331   scoped_refptr<FakePicturePileImpl> active_pile =
332       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
333
334   SetupTrees(pending_pile, active_pile);
335
336   Region invalidation;
337   AddDefaultTilingsWithInvalidation(invalidation);
338   SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
339
340   time_ticks += base::TimeDelta::FromMilliseconds(200);
341   host_impl_.SetCurrentBeginFrameArgs(
342       CreateBeginFrameArgsForTesting(time_ticks));
343
344   // Update tiles with viewport for tile priority as (0, 0, 100, 100) and the
345   // identify transform for tile priority.
346   bool resourceless_software_draw = false;
347   gfx::Rect viewport = gfx::Rect(layer_bounds),
348             viewport_rect_for_tile_priority = gfx::Rect(0, 0, 100, 100);
349   gfx::Transform transform, transform_for_tile_priority;
350
351   host_impl_.SetExternalDrawConstraints(transform,
352                                         viewport,
353                                         viewport,
354                                         viewport_rect_for_tile_priority,
355                                         transform_for_tile_priority,
356                                         resourceless_software_draw);
357   active_layer_->draw_properties().visible_content_rect = viewport;
358   active_layer_->draw_properties().screen_space_transform = transform;
359   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
360
361   gfx::Rect viewport_rect_for_tile_priority_in_view_space =
362       viewport_rect_for_tile_priority;
363
364   // Verify the viewport rect for tile priority is used in picture layer impl.
365   EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(),
366             viewport_rect_for_tile_priority_in_view_space);
367
368   // Verify the viewport rect for tile priority is used in picture layer tiling.
369   PictureLayerTilingSet* tilings = active_layer_->tilings();
370   for (size_t i = 0; i < tilings->num_tilings(); i++) {
371     PictureLayerTiling* tiling = tilings->tiling_at(i);
372     EXPECT_EQ(
373         tiling->GetCurrentVisibleRectForTesting(),
374         gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space,
375                                   tiling->contents_scale()));
376   }
377
378   // Update tiles with viewport for tile priority as (200, 200, 100, 100) in
379   // screen space and the transform for tile priority is translated and
380   // rotated. The actual viewport for tile priority used by PictureLayerImpl
381   // should be (200, 200, 100, 100) applied with the said transform.
382   time_ticks += base::TimeDelta::FromMilliseconds(200);
383   host_impl_.SetCurrentBeginFrameArgs(
384       CreateBeginFrameArgsForTesting(time_ticks));
385
386   viewport_rect_for_tile_priority = gfx::Rect(200, 200, 100, 100);
387   transform_for_tile_priority.Translate(100, 100);
388   transform_for_tile_priority.Rotate(45);
389   host_impl_.SetExternalDrawConstraints(transform,
390                                         viewport,
391                                         viewport,
392                                         viewport_rect_for_tile_priority,
393                                         transform_for_tile_priority,
394                                         resourceless_software_draw);
395   active_layer_->draw_properties().visible_content_rect = viewport;
396   active_layer_->draw_properties().screen_space_transform = transform;
397   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
398
399   gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization);
400   bool success = transform_for_tile_priority.GetInverse(&screen_to_view);
401   EXPECT_TRUE(success);
402
403   // Note that we don't clip this to the layer bounds, since it is expected that
404   // the rect will sometimes be outside of the layer bounds. If we clip to
405   // bounds, then tile priorities will end up being incorrect in cases of fully
406   // offscreen layer.
407   viewport_rect_for_tile_priority_in_view_space =
408       gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
409           screen_to_view, viewport_rect_for_tile_priority));
410
411   // Verify the viewport rect for tile priority is used in PictureLayerImpl.
412   EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(),
413             viewport_rect_for_tile_priority_in_view_space);
414
415   tilings = active_layer_->tilings();
416   for (size_t i = 0; i < tilings->num_tilings(); i++) {
417     PictureLayerTiling* tiling = tilings->tiling_at(i);
418     EXPECT_EQ(
419         tiling->GetCurrentVisibleRectForTesting(),
420         gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space,
421                                   tiling->contents_scale()));
422   }
423 }
424
425 TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
426   base::TimeTicks time_ticks;
427   time_ticks += base::TimeDelta::FromMilliseconds(1);
428   host_impl_.SetCurrentBeginFrameArgs(
429       CreateBeginFrameArgsForTesting(time_ticks));
430
431   gfx::Size tile_size(100, 100);
432   gfx::Size layer_bounds(400, 400);
433
434   scoped_refptr<FakePicturePileImpl> pending_pile =
435       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
436   scoped_refptr<FakePicturePileImpl> active_pile =
437       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
438
439   SetupTrees(pending_pile, active_pile);
440
441   Region invalidation;
442   AddDefaultTilingsWithInvalidation(invalidation);
443   SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
444
445   // UpdateTiles with valid viewport. Should update tile viewport.
446   // Note viewport is considered invalid if and only if in resourceless
447   // software draw.
448   bool resourceless_software_draw = false;
449   gfx::Rect viewport = gfx::Rect(layer_bounds);
450   gfx::Transform transform;
451   host_impl_.SetExternalDrawConstraints(transform,
452                                         viewport,
453                                         viewport,
454                                         viewport,
455                                         transform,
456                                         resourceless_software_draw);
457   active_layer_->draw_properties().visible_content_rect = viewport;
458   active_layer_->draw_properties().screen_space_transform = transform;
459   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
460
461   gfx::Rect visible_rect_for_tile_priority =
462       active_layer_->visible_rect_for_tile_priority();
463   EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty());
464   gfx::Rect viewport_rect_for_tile_priority =
465       active_layer_->viewport_rect_for_tile_priority();
466   EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty());
467   gfx::Transform screen_space_transform_for_tile_priority =
468       active_layer_->screen_space_transform_for_tile_priority();
469
470   // Expand viewport and set it as invalid for prioritizing tiles.
471   // Should update viewport and transform, but not update visible rect.
472   time_ticks += base::TimeDelta::FromMilliseconds(200);
473   host_impl_.SetCurrentBeginFrameArgs(
474       CreateBeginFrameArgsForTesting(time_ticks));
475   resourceless_software_draw = true;
476   viewport = gfx::ScaleToEnclosingRect(viewport, 2);
477   transform.Translate(1.f, 1.f);
478   active_layer_->draw_properties().visible_content_rect = viewport;
479   active_layer_->draw_properties().screen_space_transform = transform;
480   host_impl_.SetExternalDrawConstraints(transform,
481                                         viewport,
482                                         viewport,
483                                         viewport,
484                                         transform,
485                                         resourceless_software_draw);
486   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
487
488   // Viewport and transform for tile priority are updated.
489   EXPECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority());
490   EXPECT_TRANSFORMATION_MATRIX_EQ(
491       transform, active_layer_->screen_space_transform_for_tile_priority());
492   // Visible rect for tile priority retains old value.
493   EXPECT_EQ(visible_rect_for_tile_priority,
494             active_layer_->visible_rect_for_tile_priority());
495
496   // Keep expanded viewport but mark it valid. Should update tile viewport.
497   time_ticks += base::TimeDelta::FromMilliseconds(200);
498   host_impl_.SetCurrentBeginFrameArgs(
499       CreateBeginFrameArgsForTesting(time_ticks));
500   resourceless_software_draw = false;
501   host_impl_.SetExternalDrawConstraints(transform,
502                                         viewport,
503                                         viewport,
504                                         viewport,
505                                         transform,
506                                         resourceless_software_draw);
507   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
508
509   EXPECT_TRANSFORMATION_MATRIX_EQ(
510       transform, active_layer_->screen_space_transform_for_tile_priority());
511   EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority());
512
513   // Match the reverse translate in |transform|.
514   EXPECT_EQ(viewport - gfx::Vector2d(1, 1),
515             active_layer_->viewport_rect_for_tile_priority());
516 }
517
518 TEST_F(PictureLayerImplTest, ClonePartialInvalidation) {
519   gfx::Size tile_size(100, 100);
520   gfx::Size layer_bounds(400, 400);
521   gfx::Rect layer_invalidation(150, 200, 30, 180);
522
523   scoped_refptr<FakePicturePileImpl> pending_pile =
524       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
525   scoped_refptr<FakePicturePileImpl> active_pile =
526       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
527
528   SetupTrees(pending_pile, active_pile);
529
530   Region invalidation(layer_invalidation);
531   AddDefaultTilingsWithInvalidation(invalidation);
532
533   const PictureLayerTilingSet* tilings = pending_layer_->tilings();
534   EXPECT_GT(tilings->num_tilings(), 0u);
535   for (size_t i = 0; i < tilings->num_tilings(); ++i) {
536     const PictureLayerTiling* tiling = tilings->tiling_at(i);
537     gfx::Rect content_invalidation = gfx::ScaleToEnclosingRect(
538         layer_invalidation,
539         tiling->contents_scale());
540     for (PictureLayerTiling::CoverageIterator iter(
541              tiling,
542              tiling->contents_scale(),
543              gfx::Rect(tiling->tiling_size()));
544          iter;
545          ++iter) {
546       EXPECT_TRUE(*iter);
547       EXPECT_FALSE(iter.geometry_rect().IsEmpty());
548       if (iter.geometry_rect().Intersects(content_invalidation))
549         EXPECT_EQ(pending_pile.get(), iter->picture_pile());
550       else
551         EXPECT_EQ(active_pile.get(), iter->picture_pile());
552     }
553   }
554 }
555
556 TEST_F(PictureLayerImplTest, CloneFullInvalidation) {
557   gfx::Size tile_size(90, 80);
558   gfx::Size layer_bounds(300, 500);
559
560   scoped_refptr<FakePicturePileImpl> pending_pile =
561       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
562   scoped_refptr<FakePicturePileImpl> active_pile =
563       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
564
565   SetupTrees(pending_pile, active_pile);
566
567   Region invalidation((gfx::Rect(layer_bounds)));
568   AddDefaultTilingsWithInvalidation(invalidation);
569
570   EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
571             active_layer_->tilings()->num_tilings());
572
573   const PictureLayerTilingSet* tilings = pending_layer_->tilings();
574   EXPECT_GT(tilings->num_tilings(), 0u);
575   for (size_t i = 0; i < tilings->num_tilings(); ++i)
576     VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get());
577 }
578
579 TEST_F(PictureLayerImplTest, NoInvalidationBoundsChange) {
580   gfx::Size tile_size(90, 80);
581   gfx::Size active_layer_bounds(300, 500);
582   gfx::Size pending_layer_bounds(400, 800);
583
584   scoped_refptr<FakePicturePileImpl> pending_pile =
585       FakePicturePileImpl::CreateFilledPile(tile_size,
586                                                 pending_layer_bounds);
587   scoped_refptr<FakePicturePileImpl> active_pile =
588       FakePicturePileImpl::CreateFilledPile(tile_size, active_layer_bounds);
589
590   SetupTrees(pending_pile, active_pile);
591   pending_layer_->set_fixed_tile_size(gfx::Size(100, 100));
592
593   Region invalidation;
594   AddDefaultTilingsWithInvalidation(invalidation);
595
596   const PictureLayerTilingSet* tilings = pending_layer_->tilings();
597   EXPECT_GT(tilings->num_tilings(), 0u);
598   for (size_t i = 0; i < tilings->num_tilings(); ++i) {
599     const PictureLayerTiling* tiling = tilings->tiling_at(i);
600     gfx::Rect active_content_bounds = gfx::ScaleToEnclosingRect(
601         gfx::Rect(active_layer_bounds),
602         tiling->contents_scale());
603     for (PictureLayerTiling::CoverageIterator iter(
604              tiling,
605              tiling->contents_scale(),
606              gfx::Rect(tiling->tiling_size()));
607          iter;
608          ++iter) {
609       EXPECT_TRUE(*iter);
610       EXPECT_FALSE(iter.geometry_rect().IsEmpty());
611       std::vector<Tile*> active_tiles =
612           active_layer_->tilings()->tiling_at(i)->AllTilesForTesting();
613       std::vector<Tile*> pending_tiles = tiling->AllTilesForTesting();
614       if (iter.geometry_rect().right() >= active_content_bounds.width() ||
615           iter.geometry_rect().bottom() >= active_content_bounds.height() ||
616           active_tiles[0]->content_rect().size() !=
617               pending_tiles[0]->content_rect().size()) {
618         EXPECT_EQ(pending_pile.get(), iter->picture_pile());
619       } else {
620         EXPECT_EQ(active_pile.get(), iter->picture_pile());
621       }
622     }
623   }
624 }
625
626 TEST_F(PictureLayerImplTest, AddTilesFromNewRecording) {
627   gfx::Size tile_size(400, 400);
628   gfx::Size layer_bounds(1300, 1900);
629
630   scoped_refptr<FakePicturePileImpl> pending_pile =
631       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
632   scoped_refptr<FakePicturePileImpl> active_pile =
633       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
634
635   // Fill in some of active pile, but more of pending pile.
636   int hole_count = 0;
637   for (int x = 0; x < active_pile->tiling().num_tiles_x(); ++x) {
638     for (int y = 0; y < active_pile->tiling().num_tiles_y(); ++y) {
639       if ((x + y) % 2) {
640         pending_pile->AddRecordingAt(x, y);
641         active_pile->AddRecordingAt(x, y);
642       } else {
643         hole_count++;
644         if (hole_count % 2)
645           pending_pile->AddRecordingAt(x, y);
646       }
647     }
648   }
649
650   SetupTrees(pending_pile, active_pile);
651   Region invalidation;
652   AddDefaultTilingsWithInvalidation(invalidation);
653
654   const PictureLayerTilingSet* tilings = pending_layer_->tilings();
655   EXPECT_GT(tilings->num_tilings(), 0u);
656   for (size_t i = 0; i < tilings->num_tilings(); ++i) {
657     const PictureLayerTiling* tiling = tilings->tiling_at(i);
658
659     for (PictureLayerTiling::CoverageIterator iter(
660              tiling,
661              tiling->contents_scale(),
662              gfx::Rect(tiling->tiling_size()));
663          iter;
664          ++iter) {
665       EXPECT_FALSE(iter.full_tile_geometry_rect().IsEmpty());
666       // Ensure there is a recording for this tile.
667       bool in_pending = pending_pile->CanRaster(tiling->contents_scale(),
668                                                 iter.full_tile_geometry_rect());
669       bool in_active = active_pile->CanRaster(tiling->contents_scale(),
670                                               iter.full_tile_geometry_rect());
671
672       if (in_pending && !in_active)
673         EXPECT_EQ(pending_pile.get(), iter->picture_pile());
674       else if (in_active)
675         EXPECT_EQ(active_pile.get(), iter->picture_pile());
676       else
677         EXPECT_FALSE(*iter);
678     }
679   }
680 }
681
682 TEST_F(PictureLayerImplTest, ManageTilingsWithNoRecording) {
683   gfx::Size tile_size(400, 400);
684   gfx::Size layer_bounds(1300, 1900);
685
686   scoped_refptr<FakePicturePileImpl> pending_pile =
687       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
688   scoped_refptr<FakePicturePileImpl> active_pile =
689       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
690
691   SetupTrees(pending_pile, active_pile);
692
693   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
694
695   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
696 }
697
698 TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
699   gfx::Size tile_size(400, 400);
700   gfx::Size layer_bounds(1300, 1900);
701
702   scoped_refptr<FakePicturePileImpl> pending_pile =
703       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
704   scoped_refptr<FakePicturePileImpl> active_pile =
705       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
706
707   SetupTrees(pending_pile, active_pile);
708   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
709
710   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
711   EXPECT_LT(low_res_factor, 1.f);
712
713   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
714                                     6.f,  // ideal contents scale
715                                     3.f,  // device scale
716                                     2.f,  // page scale
717                                     1.f,  // maximum animation scale
718                                     false);
719   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
720   EXPECT_FLOAT_EQ(6.f,
721                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
722   EXPECT_FLOAT_EQ(6.f * low_res_factor,
723                   pending_layer_->tilings()->tiling_at(1)->contents_scale());
724
725   // If we change the page scale factor, then we should get new tilings.
726   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
727                                     6.6f,  // ideal contents scale
728                                     3.f,   // device scale
729                                     2.2f,  // page scale
730                                     1.f,   // maximum animation scale
731                                     false);
732   ASSERT_EQ(4u, pending_layer_->tilings()->num_tilings());
733   EXPECT_FLOAT_EQ(6.6f,
734                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
735   EXPECT_FLOAT_EQ(6.6f * low_res_factor,
736                   pending_layer_->tilings()->tiling_at(2)->contents_scale());
737
738   // If we change the device scale factor, then we should get new tilings.
739   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
740                                     7.26f,  // ideal contents scale
741                                     3.3f,   // device scale
742                                     2.2f,   // page scale
743                                     1.f,    // maximum animation scale
744                                     false);
745   ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
746   EXPECT_FLOAT_EQ(7.26f,
747                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
748   EXPECT_FLOAT_EQ(7.26f * low_res_factor,
749                   pending_layer_->tilings()->tiling_at(3)->contents_scale());
750
751   // If we change the device scale factor, but end up at the same total scale
752   // factor somehow, then we don't get new tilings.
753   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
754                                     7.26f,  // ideal contents scale
755                                     2.2f,   // device scale
756                                     3.3f,   // page scale
757                                     1.f,    // maximum animation scale
758                                     false);
759   ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
760   EXPECT_FLOAT_EQ(7.26f,
761                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
762   EXPECT_FLOAT_EQ(7.26f * low_res_factor,
763                   pending_layer_->tilings()->tiling_at(3)->contents_scale());
764 }
765
766 TEST_F(PictureLayerImplTest, CreateTilingsEvenIfTwinHasNone) {
767   // This test makes sure that if a layer can have tilings, then a commit makes
768   // it not able to have tilings (empty size), and then a future commit that
769   // makes it valid again should be able to create tilings.
770   gfx::Size tile_size(400, 400);
771   gfx::Size layer_bounds(1300, 1900);
772
773   scoped_refptr<FakePicturePileImpl> empty_pile =
774       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
775   scoped_refptr<FakePicturePileImpl> valid_pile =
776       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
777
778   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
779   EXPECT_LT(low_res_factor, 1.f);
780
781   float high_res_scale = 1.3f;
782   float low_res_scale = high_res_scale * low_res_factor;
783   float device_scale = 1.7f;
784   float page_scale = 3.2f;
785   float maximum_animation_scale = 1.f;
786
787   SetupPendingTree(valid_pile);
788   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
789                                     high_res_scale,
790                                     device_scale,
791                                     page_scale,
792                                     maximum_animation_scale,
793                                     false);
794   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
795   EXPECT_FLOAT_EQ(high_res_scale,
796                   pending_layer_->HighResTiling()->contents_scale());
797   EXPECT_FLOAT_EQ(low_res_scale,
798                   pending_layer_->LowResTiling()->contents_scale());
799
800   ActivateTree();
801   SetupPendingTree(empty_pile);
802   EXPECT_FALSE(pending_layer_->CanHaveTilings());
803   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
804                                     high_res_scale,
805                                     device_scale,
806                                     page_scale,
807                                     maximum_animation_scale,
808                                     false);
809   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
810   ASSERT_EQ(0u, pending_layer_->tilings()->num_tilings());
811
812   ActivateTree();
813   EXPECT_FALSE(active_layer_->CanHaveTilings());
814   SetupDrawPropertiesAndUpdateTiles(active_layer_,
815                                     high_res_scale,
816                                     device_scale,
817                                     page_scale,
818                                     maximum_animation_scale,
819                                     false);
820   ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
821
822   SetupPendingTree(valid_pile);
823   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
824                                     high_res_scale,
825                                     device_scale,
826                                     page_scale,
827                                     maximum_animation_scale,
828                                     false);
829   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
830   ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
831   EXPECT_FLOAT_EQ(high_res_scale,
832                   pending_layer_->HighResTiling()->contents_scale());
833   EXPECT_FLOAT_EQ(low_res_scale,
834                   pending_layer_->LowResTiling()->contents_scale());
835 }
836
837 TEST_F(PictureLayerImplTest, ZoomOutCrash) {
838   gfx::Size tile_size(400, 400);
839   gfx::Size layer_bounds(1300, 1900);
840
841   // Set up the high and low res tilings before pinch zoom.
842   scoped_refptr<FakePicturePileImpl> pending_pile =
843       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
844   scoped_refptr<FakePicturePileImpl> active_pile =
845       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
846
847   SetupTrees(pending_pile, active_pile);
848   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
849   SetContentsScaleOnBothLayers(32.0f, 1.0f, 32.0f, 1.0f, false);
850   host_impl_.PinchGestureBegin();
851   SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false);
852   SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false);
853   EXPECT_EQ(active_layer_->tilings()->NumHighResTilings(), 1);
854 }
855
856 TEST_F(PictureLayerImplTest, PinchGestureTilings) {
857   gfx::Size tile_size(400, 400);
858   gfx::Size layer_bounds(1300, 1900);
859
860   scoped_refptr<FakePicturePileImpl> pending_pile =
861       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
862   scoped_refptr<FakePicturePileImpl> active_pile =
863       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
864
865   // Set up the high and low res tilings before pinch zoom.
866   SetupTrees(pending_pile, active_pile);
867   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
868   SetContentsScaleOnBothLayers(2.0f, 1.0f, 1.0f, 1.0f, false);
869   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
870   EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
871   EXPECT_FLOAT_EQ(2.0f,
872                   active_layer_->tilings()->tiling_at(0)->contents_scale());
873   EXPECT_FLOAT_EQ(2.0f * low_res_factor,
874                   active_layer_->tilings()->tiling_at(1)->contents_scale());
875
876   // Start a pinch gesture.
877   host_impl_.PinchGestureBegin();
878
879   // Zoom out by a small amount. We should create a tiling at half
880   // the scale (2/kMaxScaleRatioDuringPinch).
881   SetContentsScaleOnBothLayers(1.8f, 1.0f, 0.9f, 1.0f, false);
882   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
883   EXPECT_FLOAT_EQ(2.0f,
884                   active_layer_->tilings()->tiling_at(0)->contents_scale());
885   EXPECT_FLOAT_EQ(1.0f,
886                   active_layer_->tilings()->tiling_at(1)->contents_scale());
887   EXPECT_FLOAT_EQ(2.0f * low_res_factor,
888                   active_layer_->tilings()->tiling_at(2)->contents_scale());
889
890   // Zoom out further, close to our low-res scale factor. We should
891   // use that tiling as high-res, and not create a new tiling.
892   SetContentsScaleOnBothLayers(
893       low_res_factor, 1.0f, low_res_factor / 2.0f, 1.0f, false);
894   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
895
896   // Zoom in a lot now. Since we increase by increments of
897   // kMaxScaleRatioDuringPinch, this will first use 1.0, then 2.0
898   // and then finally create a new tiling at 4.0.
899   SetContentsScaleOnBothLayers(4.2f, 1.0f, 2.1f, 1.f, false);
900   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
901   SetContentsScaleOnBothLayers(4.2f, 1.0f, 2.1f, 1.f, false);
902   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
903   SetContentsScaleOnBothLayers(4.2f, 1.0f, 2.1f, 1.f, false);
904   EXPECT_EQ(4u, active_layer_->tilings()->num_tilings());
905   EXPECT_FLOAT_EQ(4.0f,
906                   active_layer_->tilings()->tiling_at(0)->contents_scale());
907 }
908
909 TEST_F(PictureLayerImplTest, SnappedTilingDuringZoom) {
910   gfx::Size tile_size(300, 300);
911   gfx::Size layer_bounds(2600, 3800);
912
913   scoped_refptr<FakePicturePileImpl> pending_pile =
914       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
915   scoped_refptr<FakePicturePileImpl> active_pile =
916       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
917
918   // Set up the high and low res tilings before pinch zoom.
919   SetupTrees(pending_pile, active_pile);
920   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
921   SetContentsScaleOnBothLayers(0.24f, 1.0f, 0.24f, 1.0f, false);
922   EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
923   EXPECT_FLOAT_EQ(0.24f,
924                   active_layer_->tilings()->tiling_at(0)->contents_scale());
925   EXPECT_FLOAT_EQ(0.0625f,
926                   active_layer_->tilings()->tiling_at(1)->contents_scale());
927
928   // Start a pinch gesture.
929   host_impl_.PinchGestureBegin();
930
931   // Zoom out by a small amount. We should create a tiling at half
932   // the scale (1/kMaxScaleRatioDuringPinch).
933   SetContentsScaleOnBothLayers(0.2f, 1.0f, 0.2f, 1.0f, false);
934   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
935   EXPECT_FLOAT_EQ(0.24f,
936                   active_layer_->tilings()->tiling_at(0)->contents_scale());
937   EXPECT_FLOAT_EQ(0.12f,
938                   active_layer_->tilings()->tiling_at(1)->contents_scale());
939   EXPECT_FLOAT_EQ(0.0625,
940                   active_layer_->tilings()->tiling_at(2)->contents_scale());
941
942   // Zoom out further, close to our low-res scale factor. We should
943   // use that tiling as high-res, and not create a new tiling.
944   SetContentsScaleOnBothLayers(0.1f, 1.0f, 0.1f, 1.0f, false);
945   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
946
947   // Zoom in. 0.125(desired_scale) should be snapped to 0.12 during zoom-in
948   // because 0.125(desired_scale) is within the ratio(1.2)
949   SetContentsScaleOnBothLayers(0.5f, 1.0f, 0.5f, 1.0f, false);
950   EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
951 }
952
953 TEST_F(PictureLayerImplTest, CleanUpTilings) {
954   gfx::Size tile_size(400, 400);
955   gfx::Size layer_bounds(1300, 1900);
956
957   scoped_refptr<FakePicturePileImpl> pending_pile =
958       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
959   scoped_refptr<FakePicturePileImpl> active_pile =
960       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
961
962   std::vector<PictureLayerTiling*> used_tilings;
963
964   SetupTrees(pending_pile, active_pile);
965   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
966
967   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
968   EXPECT_LT(low_res_factor, 1.f);
969
970   float device_scale = 1.7f;
971   float page_scale = 3.2f;
972   float scale = 1.f;
973
974   SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
975   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
976
977   // We only have ideal tilings, so they aren't removed.
978   used_tilings.clear();
979   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
980   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
981
982   host_impl_.PinchGestureBegin();
983
984   // Changing the ideal but not creating new tilings.
985   scale *= 1.5f;
986   page_scale *= 1.5f;
987   SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
988   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
989
990   // The tilings are still our target scale, so they aren't removed.
991   used_tilings.clear();
992   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
993   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
994
995   host_impl_.PinchGestureEnd();
996
997   // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2.
998   scale /= 4.f;
999   page_scale /= 4.f;
1000   SetContentsScaleOnBothLayers(1.2f, device_scale, page_scale, 1.f, false);
1001   ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
1002   EXPECT_FLOAT_EQ(
1003       1.f,
1004       active_layer_->tilings()->tiling_at(1)->contents_scale());
1005   EXPECT_FLOAT_EQ(
1006       1.f * low_res_factor,
1007       active_layer_->tilings()->tiling_at(3)->contents_scale());
1008
1009   // Mark the non-ideal tilings as used. They won't be removed.
1010   used_tilings.clear();
1011   used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
1012   used_tilings.push_back(active_layer_->tilings()->tiling_at(3));
1013   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1014   ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
1015
1016   // Now move the ideal scale to 0.5. Our target stays 1.2.
1017   SetContentsScaleOnBothLayers(0.5f, device_scale, page_scale, 1.f, false);
1018
1019   // The high resolution tiling is between target and ideal, so is not
1020   // removed.  The low res tiling for the old ideal=1.0 scale is removed.
1021   used_tilings.clear();
1022   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1023   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
1024
1025   // Now move the ideal scale to 1.0. Our target stays 1.2.
1026   SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, 1.f, false);
1027
1028   // All the tilings are between are target and the ideal, so they are not
1029   // removed.
1030   used_tilings.clear();
1031   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1032   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
1033
1034   // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2.
1035   SetupDrawPropertiesAndUpdateTiles(
1036       active_layer_, 1.1f, device_scale, page_scale, 1.f, false);
1037
1038   // Because the pending layer's ideal scale is still 1.0, our tilings fall
1039   // in the range [1.0,1.2] and are kept.
1040   used_tilings.clear();
1041   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1042   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
1043
1044   // Move the ideal scale on the pending layer to 1.1 as well. Our target stays
1045   // 1.2 still.
1046   SetupDrawPropertiesAndUpdateTiles(
1047       pending_layer_, 1.1f, device_scale, page_scale, 1.f, false);
1048
1049   // Our 1.0 tiling now falls outside the range between our ideal scale and our
1050   // target raster scale. But it is in our used tilings set, so nothing is
1051   // deleted.
1052   used_tilings.clear();
1053   used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
1054   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1055   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
1056
1057   // If we remove it from our used tilings set, it is outside the range to keep
1058   // so it is deleted.
1059   used_tilings.clear();
1060   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
1061   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
1062 }
1063
1064 #define EXPECT_BOTH_EQ(expression, x)         \
1065   do {                                        \
1066     EXPECT_EQ(x, pending_layer_->expression); \
1067     EXPECT_EQ(x, active_layer_->expression);  \
1068   } while (false)
1069
1070 #define EXPECT_BOTH_NE(expression, x)         \
1071   do {                                        \
1072     EXPECT_NE(x, pending_layer_->expression); \
1073     EXPECT_NE(x, active_layer_->expression);  \
1074   } while (false)
1075
1076 TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
1077   // Make sure this layer covers multiple tiles, since otherwise low
1078   // res won't get created because it is too small.
1079   gfx::Size tile_size(host_impl_.settings().default_tile_size);
1080   SetupDefaultTrees(gfx::Size(tile_size.width() + 1, tile_size.height() + 1));
1081   // Avoid max untiled layer size heuristics via fixed tile size.
1082   pending_layer_->set_fixed_tile_size(tile_size);
1083   active_layer_->set_fixed_tile_size(tile_size);
1084
1085   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
1086   float contents_scale = 1.f;
1087   float device_scale = 1.f;
1088   float page_scale = 1.f;
1089   float maximum_animation_scale = 1.f;
1090   bool animating_transform = true;
1091
1092   // Animating, so don't create low res even if there isn't one already.
1093   SetContentsScaleOnBothLayers(contents_scale,
1094                                device_scale,
1095                                page_scale,
1096                                maximum_animation_scale,
1097                                animating_transform);
1098   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
1099   EXPECT_BOTH_EQ(num_tilings(), 1u);
1100
1101   // Stop animating, low res gets created.
1102   animating_transform = false;
1103   SetContentsScaleOnBothLayers(contents_scale,
1104                                device_scale,
1105                                page_scale,
1106                                maximum_animation_scale,
1107                                animating_transform);
1108   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
1109   EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), low_res_factor);
1110   EXPECT_BOTH_EQ(num_tilings(), 2u);
1111
1112   // Page scale animation, new high res, but not new low res because animating.
1113   contents_scale = 2.f;
1114   page_scale = 2.f;
1115   maximum_animation_scale = 2.f;
1116   animating_transform = true;
1117   SetContentsScaleOnBothLayers(contents_scale,
1118                                device_scale,
1119                                page_scale,
1120                                maximum_animation_scale,
1121                                animating_transform);
1122   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
1123   EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), low_res_factor);
1124   EXPECT_BOTH_EQ(num_tilings(), 3u);
1125
1126   // Stop animating, new low res gets created for final page scale.
1127   animating_transform = false;
1128   SetContentsScaleOnBothLayers(contents_scale,
1129                                device_scale,
1130                                page_scale,
1131                                maximum_animation_scale,
1132                                animating_transform);
1133   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
1134   EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), 2.f * low_res_factor);
1135   EXPECT_BOTH_EQ(num_tilings(), 4u);
1136 }
1137
1138 TEST_F(PictureLayerImplTest, DontAddLowResForSmallLayers) {
1139   gfx::Size tile_size(host_impl_.settings().default_tile_size);
1140   SetupDefaultTrees(tile_size);
1141
1142   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
1143   float device_scale = 1.f;
1144   float page_scale = 1.f;
1145   float maximum_animation_scale = 1.f;
1146   bool animating_transform = false;
1147
1148   // Contents exactly fit on one tile at scale 1, no low res.
1149   float contents_scale = 1.f;
1150   SetContentsScaleOnBothLayers(contents_scale,
1151                                device_scale,
1152                                page_scale,
1153                                maximum_animation_scale,
1154                                animating_transform);
1155   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
1156   EXPECT_BOTH_EQ(num_tilings(), 1u);
1157
1158   ResetTilingsAndRasterScales();
1159
1160   // Contents that are smaller than one tile, no low res.
1161   contents_scale = 0.123f;
1162   SetContentsScaleOnBothLayers(contents_scale,
1163                                device_scale,
1164                                page_scale,
1165                                maximum_animation_scale,
1166                                animating_transform);
1167   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
1168   EXPECT_BOTH_EQ(num_tilings(), 1u);
1169
1170   ResetTilingsAndRasterScales();
1171
1172   // Any content bounds that would create more than one tile will
1173   // generate a low res tiling.
1174   contents_scale = 2.5f;
1175   SetContentsScaleOnBothLayers(contents_scale,
1176                                device_scale,
1177                                page_scale,
1178                                maximum_animation_scale,
1179                                animating_transform);
1180   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
1181   EXPECT_BOTH_EQ(LowResTiling()->contents_scale(),
1182                  contents_scale * low_res_factor);
1183   EXPECT_BOTH_EQ(num_tilings(), 2u);
1184
1185   ResetTilingsAndRasterScales();
1186
1187   // Mask layers dont create low res since they always fit on one tile.
1188   pending_layer_->pile()->set_is_mask(true);
1189   active_layer_->pile()->set_is_mask(true);
1190   SetContentsScaleOnBothLayers(contents_scale,
1191                                device_scale,
1192                                page_scale,
1193                                maximum_animation_scale,
1194                                animating_transform);
1195   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
1196   EXPECT_BOTH_EQ(num_tilings(), 1u);
1197 }
1198
1199 TEST_F(PictureLayerImplTest, HugeMasksDontGetTiles) {
1200   gfx::Size tile_size(100, 100);
1201
1202   scoped_refptr<FakePicturePileImpl> valid_pile =
1203       FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1000, 1000));
1204   valid_pile->set_is_mask(true);
1205   SetupPendingTree(valid_pile);
1206
1207   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1208   EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
1209   EXPECT_EQ(1u, pending_layer_->num_tilings());
1210
1211   pending_layer_->HighResTiling()->CreateAllTilesForTesting();
1212   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
1213       pending_layer_->HighResTiling()->AllTilesForTesting());
1214
1215   ActivateTree();
1216
1217   // Mask layers have a tiling with a single tile in it.
1218   EXPECT_EQ(1u, active_layer_->HighResTiling()->AllTilesForTesting().size());
1219   // The mask resource exists.
1220   EXPECT_NE(0u, active_layer_->ContentsResourceId());
1221
1222   // Resize larger than the max texture size.
1223   int max_texture_size = host_impl_.GetRendererCapabilities().max_texture_size;
1224   scoped_refptr<FakePicturePileImpl> huge_pile =
1225       FakePicturePileImpl::CreateFilledPile(
1226           tile_size, gfx::Size(max_texture_size + 1, 10));
1227   huge_pile->set_is_mask(true);
1228   SetupPendingTree(huge_pile);
1229
1230   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1231   EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
1232   EXPECT_EQ(1u, pending_layer_->num_tilings());
1233
1234   pending_layer_->HighResTiling()->CreateAllTilesForTesting();
1235   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
1236       pending_layer_->HighResTiling()->AllTilesForTesting());
1237
1238   ActivateTree();
1239
1240   // Mask layers have a tiling, but there should be no tiles in it.
1241   EXPECT_EQ(0u, active_layer_->HighResTiling()->AllTilesForTesting().size());
1242   // The mask resource is empty.
1243   EXPECT_EQ(0u, active_layer_->ContentsResourceId());
1244 }
1245
1246 TEST_F(PictureLayerImplTest, ReleaseResources) {
1247   gfx::Size tile_size(400, 400);
1248   gfx::Size layer_bounds(1300, 1900);
1249
1250   scoped_refptr<FakePicturePileImpl> pending_pile =
1251       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1252   scoped_refptr<FakePicturePileImpl> active_pile =
1253       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1254
1255   SetupTrees(pending_pile, active_pile);
1256   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1257
1258   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
1259                                     1.3f,  // ideal contents scale
1260                                     2.7f,  // device scale
1261                                     3.2f,  // page scale
1262                                     1.f,   // maximum animation scale
1263                                     false);
1264   EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
1265
1266   // All tilings should be removed when losing output surface.
1267   active_layer_->ReleaseResources();
1268   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
1269   pending_layer_->ReleaseResources();
1270   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1271
1272   // This should create new tilings.
1273   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
1274                                     1.3f,  // ideal contents scale
1275                                     2.7f,  // device scale
1276                                     3.2f,  // page scale
1277                                     1.f,   // maximum animation scale
1278                                     false);
1279   EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
1280 }
1281
1282 TEST_F(PictureLayerImplTest, ClampTilesToToMaxTileSize) {
1283   // The default max tile size is larger than 400x400.
1284   gfx::Size tile_size(400, 400);
1285   gfx::Size layer_bounds(5000, 5000);
1286
1287   scoped_refptr<FakePicturePileImpl> pending_pile =
1288       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1289   scoped_refptr<FakePicturePileImpl> active_pile =
1290       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1291
1292   SetupTrees(pending_pile, active_pile);
1293   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1294
1295   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1296   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
1297
1298   pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1299
1300   // The default value.
1301   EXPECT_EQ(gfx::Size(256, 256).ToString(),
1302             host_impl_.settings().default_tile_size.ToString());
1303
1304   Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1305   EXPECT_EQ(gfx::Size(256, 256).ToString(),
1306             tile->content_rect().size().ToString());
1307
1308   pending_layer_->ReleaseResources();
1309
1310   // Change the max texture size on the output surface context.
1311   scoped_ptr<TestWebGraphicsContext3D> context =
1312       TestWebGraphicsContext3D::Create();
1313   context->set_max_texture_size(140);
1314   host_impl_.DidLoseOutputSurface();
1315   host_impl_.InitializeRenderer(FakeOutputSurface::Create3d(
1316       context.Pass()).PassAs<OutputSurface>());
1317
1318   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1319   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
1320
1321   pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1322
1323   // Verify the tiles are not larger than the context's max texture size.
1324   tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1325   EXPECT_GE(140, tile->content_rect().width());
1326   EXPECT_GE(140, tile->content_rect().height());
1327 }
1328
1329 TEST_F(PictureLayerImplTest, ClampSingleTileToToMaxTileSize) {
1330   // The default max tile size is larger than 400x400.
1331   gfx::Size tile_size(400, 400);
1332   gfx::Size layer_bounds(500, 500);
1333
1334   scoped_refptr<FakePicturePileImpl> pending_pile =
1335       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1336   scoped_refptr<FakePicturePileImpl> active_pile =
1337       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1338
1339   SetupTrees(pending_pile, active_pile);
1340   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1341
1342   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1343   ASSERT_LE(1u, pending_layer_->tilings()->num_tilings());
1344
1345   pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1346
1347   // The default value. The layer is smaller than this.
1348   EXPECT_EQ(gfx::Size(512, 512).ToString(),
1349             host_impl_.settings().max_untiled_layer_size.ToString());
1350
1351   // There should be a single tile since the layer is small.
1352   PictureLayerTiling* high_res_tiling = pending_layer_->tilings()->tiling_at(0);
1353   EXPECT_EQ(1u, high_res_tiling->AllTilesForTesting().size());
1354
1355   pending_layer_->ReleaseResources();
1356
1357   // Change the max texture size on the output surface context.
1358   scoped_ptr<TestWebGraphicsContext3D> context =
1359       TestWebGraphicsContext3D::Create();
1360   context->set_max_texture_size(140);
1361   host_impl_.DidLoseOutputSurface();
1362   host_impl_.InitializeRenderer(FakeOutputSurface::Create3d(
1363       context.Pass()).PassAs<OutputSurface>());
1364
1365   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
1366   ASSERT_LE(1u, pending_layer_->tilings()->num_tilings());
1367
1368   pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1369
1370   // There should be more than one tile since the max texture size won't cover
1371   // the layer.
1372   high_res_tiling = pending_layer_->tilings()->tiling_at(0);
1373   EXPECT_LT(1u, high_res_tiling->AllTilesForTesting().size());
1374
1375   // Verify the tiles are not larger than the context's max texture size.
1376   Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1377   EXPECT_GE(140, tile->content_rect().width());
1378   EXPECT_GE(140, tile->content_rect().height());
1379 }
1380
1381 TEST_F(PictureLayerImplTest, DisallowTileDrawQuads) {
1382   MockOcclusionTracker<LayerImpl> occlusion_tracker;
1383   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1384
1385   gfx::Size tile_size(400, 400);
1386   gfx::Size layer_bounds(1300, 1900);
1387
1388   scoped_refptr<FakePicturePileImpl> pending_pile =
1389       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1390   scoped_refptr<FakePicturePileImpl> active_pile =
1391       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1392
1393   SetupTrees(pending_pile, active_pile);
1394
1395   active_layer_->draw_properties().visible_content_rect =
1396       gfx::Rect(layer_bounds);
1397
1398   gfx::Rect layer_invalidation(150, 200, 30, 180);
1399   Region invalidation(layer_invalidation);
1400   AddDefaultTilingsWithInvalidation(invalidation);
1401
1402   AppendQuadsData data;
1403   active_layer_->WillDraw(DRAW_MODE_RESOURCELESS_SOFTWARE, NULL);
1404   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1405   active_layer_->DidDraw(NULL);
1406
1407   ASSERT_EQ(1U, render_pass->quad_list.size());
1408   EXPECT_EQ(DrawQuad::PICTURE_CONTENT,
1409             render_pass->quad_list.front()->material);
1410 }
1411
1412 TEST_F(PictureLayerImplTest, MarkRequiredNullTiles) {
1413   gfx::Size tile_size(100, 100);
1414   gfx::Size layer_bounds(1000, 1000);
1415
1416   scoped_refptr<FakePicturePileImpl> pending_pile =
1417       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
1418   // Layers with entirely empty piles can't get tilings.
1419   pending_pile->AddRecordingAt(0, 0);
1420
1421   SetupPendingTree(pending_pile);
1422
1423   ASSERT_TRUE(pending_layer_->CanHaveTilings());
1424   pending_layer_->AddTiling(1.0f);
1425   pending_layer_->AddTiling(2.0f);
1426
1427   // It should be safe to call this (and MarkVisibleResourcesAsRequired)
1428   // on a layer with no recordings.
1429   host_impl_.pending_tree()->UpdateDrawProperties();
1430   pending_layer_->MarkVisibleResourcesAsRequired();
1431 }
1432
1433 TEST_F(PictureLayerImplTest, TileScalesWithSolidColorPile) {
1434   gfx::Size layer_bounds(200, 200);
1435   gfx::Size tile_size(host_impl_.settings().default_tile_size);
1436   scoped_refptr<FakePicturePileImpl> pending_pile =
1437       FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
1438           tile_size, layer_bounds);
1439   scoped_refptr<FakePicturePileImpl> active_pile =
1440       FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
1441           tile_size, layer_bounds);
1442
1443   pending_pile->set_is_solid_color(false);
1444   active_pile->set_is_solid_color(true);
1445   SetupTrees(pending_pile, active_pile);
1446   // Solid color layer should not have tilings.
1447   ASSERT_FALSE(active_layer_->CanHaveTilings());
1448
1449   // Update properties with solid color pile should not allow tilings at any
1450   // scale.
1451   host_impl_.active_tree()->UpdateDrawProperties();
1452   EXPECT_FALSE(active_layer_->CanHaveTilings());
1453   EXPECT_EQ(0.f, active_layer_->ideal_contents_scale());
1454
1455   // Push non-solid-color pending pile makes active layer can have tilings.
1456   active_layer_->UpdatePile(pending_pile);
1457   ASSERT_TRUE(active_layer_->CanHaveTilings());
1458
1459   // Update properties with non-solid color pile should allow tilings.
1460   host_impl_.active_tree()->UpdateDrawProperties();
1461   EXPECT_TRUE(active_layer_->CanHaveTilings());
1462   EXPECT_GT(active_layer_->ideal_contents_scale(), 0.f);
1463 }
1464
1465 TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
1466   gfx::Size tile_size(100, 100);
1467   gfx::Size layer_bounds(200, 200);
1468
1469   scoped_refptr<FakePicturePileImpl> pending_pile =
1470       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1471   SetupPendingTree(pending_pile);
1472
1473   gfx::Transform transform;
1474   gfx::Transform transform_for_tile_priority;
1475   bool resourceless_software_draw = false;
1476   gfx::Rect viewport(0, 0, 100, 200);
1477   host_impl_.SetExternalDrawConstraints(transform,
1478                                         viewport,
1479                                         viewport,
1480                                         viewport,
1481                                         transform,
1482                                         resourceless_software_draw);
1483
1484   pending_layer_->set_fixed_tile_size(tile_size);
1485   ASSERT_TRUE(pending_layer_->CanHaveTilings());
1486   PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
1487   host_impl_.pending_tree()->UpdateDrawProperties();
1488   EXPECT_EQ(tiling->resolution(), HIGH_RESOLUTION);
1489   EXPECT_EQ(viewport, pending_layer_->visible_rect_for_tile_priority());
1490
1491   // Fake set priorities.
1492   for (PictureLayerTiling::CoverageIterator iter(
1493            tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
1494        iter;
1495        ++iter) {
1496     if (!*iter)
1497       continue;
1498     Tile* tile = *iter;
1499     TilePriority priority;
1500     priority.resolution = HIGH_RESOLUTION;
1501     gfx::Rect tile_bounds = iter.geometry_rect();
1502     if (pending_layer_->visible_rect_for_tile_priority().Intersects(
1503             tile_bounds)) {
1504       priority.priority_bin = TilePriority::NOW;
1505       priority.distance_to_visible = 0.f;
1506     } else {
1507       priority.priority_bin = TilePriority::SOON;
1508       priority.distance_to_visible = 1.f;
1509     }
1510     tile->SetPriority(PENDING_TREE, priority);
1511   }
1512
1513   pending_layer_->MarkVisibleResourcesAsRequired();
1514
1515   int num_visible = 0;
1516   int num_offscreen = 0;
1517
1518   for (PictureLayerTiling::CoverageIterator iter(
1519            tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
1520        iter;
1521        ++iter) {
1522     if (!*iter)
1523       continue;
1524     const Tile* tile = *iter;
1525     if (tile->priority(PENDING_TREE).distance_to_visible == 0.f) {
1526       EXPECT_TRUE(tile->required_for_activation());
1527       num_visible++;
1528     } else {
1529       EXPECT_FALSE(tile->required_for_activation());
1530       num_offscreen++;
1531     }
1532   }
1533
1534   EXPECT_GT(num_visible, 0);
1535   EXPECT_GT(num_offscreen, 0);
1536 }
1537
1538 TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
1539   base::TimeTicks time_ticks;
1540   time_ticks += base::TimeDelta::FromMilliseconds(1);
1541   host_impl_.SetCurrentBeginFrameArgs(
1542       CreateBeginFrameArgsForTesting(time_ticks));
1543
1544   gfx::Size tile_size(100, 100);
1545   gfx::Size layer_bounds(400, 400);
1546   gfx::Rect external_viewport_for_tile_priority(400, 200);
1547   gfx::Rect visible_content_rect(200, 400);
1548
1549   scoped_refptr<FakePicturePileImpl> active_pile =
1550       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1551   scoped_refptr<FakePicturePileImpl> pending_pile =
1552       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1553   SetupTrees(pending_pile, active_pile);
1554
1555   active_layer_->set_fixed_tile_size(tile_size);
1556   pending_layer_->set_fixed_tile_size(tile_size);
1557   ASSERT_TRUE(pending_layer_->CanHaveTilings());
1558   PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
1559
1560   // Set external viewport for tile priority.
1561   gfx::Rect viewport = gfx::Rect(layer_bounds);
1562   gfx::Transform transform;
1563   gfx::Transform transform_for_tile_priority;
1564   bool resourceless_software_draw = false;
1565   host_impl_.SetExternalDrawConstraints(transform,
1566                                         viewport,
1567                                         viewport,
1568                                         external_viewport_for_tile_priority,
1569                                         transform_for_tile_priority,
1570                                         resourceless_software_draw);
1571   host_impl_.pending_tree()->UpdateDrawProperties();
1572
1573   // Set visible content rect that is different from
1574   // external_viewport_for_tile_priority.
1575   pending_layer_->draw_properties().visible_content_rect = visible_content_rect;
1576   time_ticks += base::TimeDelta::FromMilliseconds(200);
1577   host_impl_.SetCurrentBeginFrameArgs(
1578       CreateBeginFrameArgsForTesting(time_ticks));
1579   pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
1580
1581   pending_layer_->MarkVisibleResourcesAsRequired();
1582
1583   // Intersect the two rects. Any tile outside should not be required for
1584   // activation.
1585   gfx::Rect viewport_for_tile_priority =
1586       pending_layer_->GetViewportForTilePriorityInContentSpace();
1587   viewport_for_tile_priority.Intersect(pending_layer_->visible_content_rect());
1588
1589   int num_inside = 0;
1590   int num_outside = 0;
1591   for (PictureLayerTiling::CoverageIterator iter(
1592            tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
1593        iter;
1594        ++iter) {
1595     if (!*iter)
1596       continue;
1597     Tile* tile = *iter;
1598     if (viewport_for_tile_priority.Intersects(iter.geometry_rect())) {
1599       num_inside++;
1600       // Mark everything in viewport for tile priority as ready to draw.
1601       ManagedTileState::TileVersion& tile_version =
1602           tile->GetTileVersionForTesting(
1603               tile->DetermineRasterModeForTree(PENDING_TREE));
1604       tile_version.SetSolidColorForTesting(SK_ColorRED);
1605     } else {
1606       num_outside++;
1607       EXPECT_FALSE(tile->required_for_activation());
1608     }
1609   }
1610
1611   EXPECT_GT(num_inside, 0);
1612   EXPECT_GT(num_outside, 0);
1613
1614   // Activate and draw active layer.
1615   host_impl_.ActivateSyncTree();
1616   host_impl_.active_tree()->UpdateDrawProperties();
1617   active_layer_->draw_properties().visible_content_rect = visible_content_rect;
1618
1619   MockOcclusionTracker<LayerImpl> occlusion_tracker;
1620   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1621   AppendQuadsData data;
1622   active_layer_->WillDraw(DRAW_MODE_SOFTWARE, NULL);
1623   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1624   active_layer_->DidDraw(NULL);
1625
1626   // All tiles in activation rect is ready to draw.
1627   EXPECT_EQ(0u, data.num_missing_tiles);
1628   EXPECT_EQ(0u, data.num_incomplete_tiles);
1629 }
1630
1631 TEST_F(PictureLayerImplTest, HighResTileIsComplete) {
1632   base::TimeTicks time_ticks;
1633   time_ticks += base::TimeDelta::FromMilliseconds(1);
1634   host_impl_.SetCurrentBeginFrameArgs(
1635       CreateBeginFrameArgsForTesting(time_ticks));
1636
1637   gfx::Size tile_size(100, 100);
1638   gfx::Size layer_bounds(200, 200);
1639
1640   host_impl_.SetViewportSize(layer_bounds);
1641
1642   scoped_refptr<FakePicturePileImpl> pending_pile =
1643       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1644   SetupPendingTree(pending_pile);
1645   ActivateTree();
1646
1647   // All high res tiles have resources.
1648   active_layer_->set_fixed_tile_size(tile_size);
1649   host_impl_.active_tree()->UpdateDrawProperties();
1650   std::vector<Tile*> tiles =
1651       active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
1652   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
1653
1654   MockOcclusionTracker<LayerImpl> occlusion_tracker;
1655   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1656   AppendQuadsData data;
1657   active_layer_->WillDraw(DRAW_MODE_SOFTWARE, NULL);
1658   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1659   active_layer_->DidDraw(NULL);
1660
1661   // All high res tiles drew, nothing was incomplete.
1662   EXPECT_EQ(9u, render_pass->quad_list.size());
1663   EXPECT_EQ(0u, data.num_missing_tiles);
1664   EXPECT_EQ(0u, data.num_incomplete_tiles);
1665 }
1666
1667 TEST_F(PictureLayerImplTest, LowResTileIsIncomplete) {
1668   base::TimeTicks time_ticks;
1669   time_ticks += base::TimeDelta::FromMilliseconds(1);
1670   host_impl_.SetCurrentBeginFrameArgs(
1671       CreateBeginFrameArgsForTesting(time_ticks));
1672
1673   gfx::Size tile_size(100, 100);
1674   gfx::Size layer_bounds(200, 200);
1675
1676   host_impl_.SetViewportSize(layer_bounds);
1677
1678   scoped_refptr<FakePicturePileImpl> pending_pile =
1679       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1680   SetupPendingTree(pending_pile);
1681   ActivateTree();
1682
1683   // All high res tiles have resources except one.
1684   active_layer_->set_fixed_tile_size(tile_size);
1685   host_impl_.active_tree()->UpdateDrawProperties();
1686   std::vector<Tile*> high_tiles =
1687       active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
1688   high_tiles.erase(high_tiles.begin());
1689   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(high_tiles);
1690
1691   // All low res tiles have resources.
1692   std::vector<Tile*> low_tiles =
1693       active_layer_->tilings()->tiling_at(1)->AllTilesForTesting();
1694   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(low_tiles);
1695
1696   MockOcclusionTracker<LayerImpl> occlusion_tracker;
1697   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1698   AppendQuadsData data;
1699   active_layer_->WillDraw(DRAW_MODE_SOFTWARE, NULL);
1700   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1701   active_layer_->DidDraw(NULL);
1702
1703   // The missing high res tile was replaced by a low res tile.
1704   EXPECT_EQ(9u, render_pass->quad_list.size());
1705   EXPECT_EQ(0u, data.num_missing_tiles);
1706   EXPECT_EQ(1u, data.num_incomplete_tiles);
1707 }
1708
1709 TEST_F(PictureLayerImplTest,
1710        HighResAndIdealResTileIsCompleteWhenRasterScaleIsNotIdeal) {
1711   base::TimeTicks time_ticks;
1712   time_ticks += base::TimeDelta::FromMilliseconds(1);
1713   host_impl_.SetCurrentBeginFrameArgs(
1714       CreateBeginFrameArgsForTesting(time_ticks));
1715
1716   gfx::Size tile_size(100, 100);
1717   gfx::Size layer_bounds(200, 200);
1718
1719   host_impl_.SetViewportSize(layer_bounds);
1720
1721   scoped_refptr<FakePicturePileImpl> pending_pile =
1722       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1723   scoped_refptr<FakePicturePileImpl> active_pile =
1724       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1725   SetupTrees(pending_pile, active_pile);
1726
1727   active_layer_->set_fixed_tile_size(tile_size);
1728
1729   active_layer_->draw_properties().visible_content_rect =
1730       gfx::Rect(layer_bounds);
1731   SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.f, 1.f, 1.f, 1.f, false);
1732
1733   // One ideal tile exists, this will get used when drawing.
1734   std::vector<Tile*> ideal_tiles;
1735   EXPECT_EQ(2.f, active_layer_->HighResTiling()->contents_scale());
1736   ideal_tiles.push_back(active_layer_->HighResTiling()->TileAt(0, 0));
1737   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
1738       ideal_tiles);
1739
1740   // Due to layer scale throttling, the raster contents scale is changed to 1,
1741   // while the ideal is still 2.
1742   SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
1743   SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.f, 1.f, 1.f, 1.f, false);
1744
1745   EXPECT_EQ(1.f, active_layer_->HighResTiling()->contents_scale());
1746   EXPECT_EQ(1.f, active_layer_->raster_contents_scale());
1747   EXPECT_EQ(2.f, active_layer_->ideal_contents_scale());
1748
1749   // Both tilings still exist.
1750   EXPECT_EQ(2.f, active_layer_->tilings()->tiling_at(0)->contents_scale());
1751   EXPECT_EQ(1.f, active_layer_->tilings()->tiling_at(1)->contents_scale());
1752
1753   // All high res tiles have resources.
1754   std::vector<Tile*> high_tiles =
1755       active_layer_->HighResTiling()->AllTilesForTesting();
1756   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(high_tiles);
1757
1758   MockOcclusionTracker<LayerImpl> occlusion_tracker;
1759   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1760   AppendQuadsData data;
1761   active_layer_->WillDraw(DRAW_MODE_SOFTWARE, NULL);
1762   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1763   active_layer_->DidDraw(NULL);
1764
1765   // All high res tiles drew, and the one ideal res tile drew.
1766   ASSERT_GT(render_pass->quad_list.size(), 9u);
1767   EXPECT_EQ(gfx::SizeF(99.f, 99.f),
1768             TileDrawQuad::MaterialCast(render_pass->quad_list.front())
1769                 ->tex_coord_rect.size());
1770   EXPECT_EQ(gfx::SizeF(49.5f, 49.5f),
1771             TileDrawQuad::MaterialCast(render_pass->quad_list.ElementAt(1))
1772                 ->tex_coord_rect.size());
1773
1774   // Neither the high res nor the ideal tiles were considered as incomplete.
1775   EXPECT_EQ(0u, data.num_missing_tiles);
1776   EXPECT_EQ(0u, data.num_incomplete_tiles);
1777 }
1778
1779 TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) {
1780   gfx::Size layer_bounds(400, 400);
1781   gfx::Size tile_size(100, 100);
1782   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1783
1784   // No tiles shared.
1785   pending_layer_->set_invalidation(gfx::Rect(layer_bounds));
1786
1787   CreateHighLowResAndSetAllTilesVisible();
1788
1789   active_layer_->SetAllTilesReady();
1790
1791   // No shared tiles and all active tiles ready, so pending can only
1792   // activate with all high res tiles.
1793   pending_layer_->MarkVisibleResourcesAsRequired();
1794   AssertAllTilesRequired(pending_layer_->HighResTiling());
1795   AssertNoTilesRequired(pending_layer_->LowResTiling());
1796 }
1797
1798 TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) {
1799   gfx::Size layer_bounds(400, 400);
1800   gfx::Size tile_size(100, 100);
1801   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1802
1803   // All tiles shared (no invalidation).
1804   CreateHighLowResAndSetAllTilesVisible();
1805
1806   // Verify active tree not ready.
1807   Tile* some_active_tile =
1808       active_layer_->HighResTiling()->AllTilesForTesting()[0];
1809   EXPECT_FALSE(some_active_tile->IsReadyToDraw());
1810
1811   // When high res are required, even if the active tree is not ready,
1812   // the high res tiles must be ready.
1813   host_impl_.active_tree()->SetRequiresHighResToDraw();
1814   pending_layer_->MarkVisibleResourcesAsRequired();
1815   AssertAllTilesRequired(pending_layer_->HighResTiling());
1816   AssertNoTilesRequired(pending_layer_->LowResTiling());
1817 }
1818
1819 TEST_F(PictureLayerImplTest, NothingRequiredIfAllHighResTilesShared) {
1820   gfx::Size layer_bounds(400, 400);
1821   gfx::Size tile_size(100, 100);
1822   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1823
1824   CreateHighLowResAndSetAllTilesVisible();
1825
1826   Tile* some_active_tile =
1827       active_layer_->HighResTiling()->AllTilesForTesting()[0];
1828   EXPECT_FALSE(some_active_tile->IsReadyToDraw());
1829
1830   // All tiles shared (no invalidation), so even though the active tree's
1831   // tiles aren't ready, there is nothing required.
1832   pending_layer_->MarkVisibleResourcesAsRequired();
1833   AssertNoTilesRequired(pending_layer_->HighResTiling());
1834   AssertNoTilesRequired(pending_layer_->LowResTiling());
1835 }
1836
1837 TEST_F(PictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
1838   gfx::Size layer_bounds(400, 400);
1839   gfx::Size tile_size(100, 100);
1840   scoped_refptr<FakePicturePileImpl> pending_pile =
1841       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1842   // This pile will create tilings, but has no recordings so will not create any
1843   // tiles.  This is attempting to simulate scrolling past the end of recorded
1844   // content on the active layer, where the recordings are so far away that
1845   // no tiles are created.
1846   scoped_refptr<FakePicturePileImpl> active_pile =
1847       FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
1848           tile_size, layer_bounds);
1849   SetupTrees(pending_pile, active_pile);
1850   pending_layer_->set_fixed_tile_size(tile_size);
1851   active_layer_->set_fixed_tile_size(tile_size);
1852
1853   CreateHighLowResAndSetAllTilesVisible();
1854
1855   // Active layer has tilings, but no tiles due to missing recordings.
1856   EXPECT_TRUE(active_layer_->CanHaveTilings());
1857   EXPECT_EQ(active_layer_->tilings()->num_tilings(), 2u);
1858   EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u);
1859
1860   // Since the active layer has no tiles at all, the pending layer doesn't
1861   // need content in order to activate.
1862   pending_layer_->MarkVisibleResourcesAsRequired();
1863   AssertNoTilesRequired(pending_layer_->HighResTiling());
1864   AssertNoTilesRequired(pending_layer_->LowResTiling());
1865 }
1866
1867 TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) {
1868   gfx::Size layer_bounds(400, 400);
1869   gfx::Size tile_size(100, 100);
1870   scoped_refptr<FakePicturePileImpl> pending_pile =
1871       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1872   scoped_refptr<FakePicturePileImpl> active_pile =
1873       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
1874   SetupTrees(pending_pile, active_pile);
1875   pending_layer_->set_fixed_tile_size(tile_size);
1876   active_layer_->set_fixed_tile_size(tile_size);
1877
1878   CreateHighLowResAndSetAllTilesVisible();
1879
1880   // Active layer can't have tiles.
1881   EXPECT_FALSE(active_layer_->CanHaveTilings());
1882
1883   // All high res tiles required.  This should be considered identical
1884   // to the case where there is no active layer, to avoid flashing content.
1885   // This can happen if a layer exists for a while and switches from
1886   // not being able to have content to having content.
1887   pending_layer_->MarkVisibleResourcesAsRequired();
1888   AssertAllTilesRequired(pending_layer_->HighResTiling());
1889   AssertNoTilesRequired(pending_layer_->LowResTiling());
1890 }
1891
1892 TEST_F(PictureLayerImplTest, HighResRequiredWhenActiveHasDifferentBounds) {
1893   gfx::Size layer_bounds(200, 200);
1894   gfx::Size tile_size(100, 100);
1895   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1896
1897   gfx::Size pending_layer_bounds(400, 400);
1898   pending_layer_->SetBounds(pending_layer_bounds);
1899
1900   CreateHighLowResAndSetAllTilesVisible();
1901
1902   active_layer_->SetAllTilesReady();
1903
1904   // Since the active layer has different bounds, the pending layer needs all
1905   // high res tiles in order to activate.
1906   pending_layer_->MarkVisibleResourcesAsRequired();
1907   AssertAllTilesRequired(pending_layer_->HighResTiling());
1908   AssertNoTilesRequired(pending_layer_->LowResTiling());
1909 }
1910
1911 TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) {
1912   gfx::Size tile_size(100, 100);
1913   gfx::Size layer_bounds(400, 400);
1914   scoped_refptr<FakePicturePileImpl> pending_pile =
1915       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1916
1917   host_impl_.CreatePendingTree();
1918   LayerTreeImpl* pending_tree = host_impl_.pending_tree();
1919
1920   scoped_ptr<FakePictureLayerImpl> pending_layer =
1921       FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pending_pile);
1922   pending_layer->SetDrawsContent(true);
1923   pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
1924
1925   pending_layer_ = static_cast<FakePictureLayerImpl*>(
1926       host_impl_.pending_tree()->LayerById(id_));
1927
1928   // Set some state on the pending layer, make sure it is not clobbered
1929   // by a sync from the active layer.  This could happen because if the
1930   // pending layer has not been post-commit initialized it will attempt
1931   // to sync from the active layer.
1932   float raster_page_scale = 10.f * pending_layer_->raster_page_scale();
1933   pending_layer_->set_raster_page_scale(raster_page_scale);
1934   EXPECT_TRUE(pending_layer_->needs_post_commit_initialization());
1935
1936   host_impl_.ActivateSyncTree();
1937
1938   active_layer_ = static_cast<FakePictureLayerImpl*>(
1939       host_impl_.active_tree()->LayerById(id_));
1940
1941   EXPECT_EQ(0u, active_layer_->num_tilings());
1942   EXPECT_EQ(raster_page_scale, active_layer_->raster_page_scale());
1943   EXPECT_FALSE(active_layer_->needs_post_commit_initialization());
1944 }
1945
1946 TEST_F(PictureLayerImplTest, ShareTilesOnSync) {
1947   SetupDefaultTrees(gfx::Size(1500, 1500));
1948   AddDefaultTilingsWithInvalidation(gfx::Rect());
1949
1950   host_impl_.ActivateSyncTree();
1951   host_impl_.CreatePendingTree();
1952   active_layer_ = static_cast<FakePictureLayerImpl*>(
1953       host_impl_.active_tree()->LayerById(id_));
1954
1955   // Force the active tree to sync to the pending tree "post-commit".
1956   pending_layer_->DoPostCommitInitializationIfNeeded();
1957
1958   // Both invalidations should drop tiles from the pending tree.
1959   EXPECT_EQ(3u, active_layer_->num_tilings());
1960   EXPECT_EQ(3u, pending_layer_->num_tilings());
1961   for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
1962     PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
1963     PictureLayerTiling* pending_tiling =
1964         pending_layer_->tilings()->tiling_at(i);
1965
1966     ASSERT_TRUE(active_tiling);
1967     ASSERT_TRUE(pending_tiling);
1968
1969     EXPECT_TRUE(active_tiling->TileAt(0, 0));
1970     EXPECT_TRUE(active_tiling->TileAt(1, 0));
1971     EXPECT_TRUE(active_tiling->TileAt(0, 1));
1972     EXPECT_TRUE(active_tiling->TileAt(1, 1));
1973
1974     EXPECT_TRUE(pending_tiling->TileAt(0, 0));
1975     EXPECT_TRUE(pending_tiling->TileAt(1, 0));
1976     EXPECT_TRUE(pending_tiling->TileAt(0, 1));
1977     EXPECT_TRUE(pending_tiling->TileAt(1, 1));
1978
1979     EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
1980     EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
1981     EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
1982     EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
1983     EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
1984     EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
1985     EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
1986     EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
1987   }
1988 }
1989
1990 TEST_F(PictureLayerImplTest, ShareInvalidActiveTreeTilesOnSync) {
1991   SetupDefaultTrees(gfx::Size(1500, 1500));
1992   AddDefaultTilingsWithInvalidation(gfx::Rect(0, 0, 1, 1));
1993
1994   // This activates the 0,0,1,1 invalidation.
1995   host_impl_.ActivateSyncTree();
1996   host_impl_.CreatePendingTree();
1997   active_layer_ = static_cast<FakePictureLayerImpl*>(
1998       host_impl_.active_tree()->LayerById(id_));
1999
2000   // Force the active tree to sync to the pending tree "post-commit".
2001   pending_layer_->DoPostCommitInitializationIfNeeded();
2002
2003   // The active tree invalidation was handled by the active tiles, so they
2004   // can be shared with the pending tree.
2005   EXPECT_EQ(3u, active_layer_->num_tilings());
2006   EXPECT_EQ(3u, pending_layer_->num_tilings());
2007   for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
2008     PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
2009     PictureLayerTiling* pending_tiling =
2010         pending_layer_->tilings()->tiling_at(i);
2011
2012     ASSERT_TRUE(active_tiling);
2013     ASSERT_TRUE(pending_tiling);
2014
2015     EXPECT_TRUE(active_tiling->TileAt(0, 0));
2016     EXPECT_TRUE(active_tiling->TileAt(1, 0));
2017     EXPECT_TRUE(active_tiling->TileAt(0, 1));
2018     EXPECT_TRUE(active_tiling->TileAt(1, 1));
2019
2020     EXPECT_TRUE(pending_tiling->TileAt(0, 0));
2021     EXPECT_TRUE(pending_tiling->TileAt(1, 0));
2022     EXPECT_TRUE(pending_tiling->TileAt(0, 1));
2023     EXPECT_TRUE(pending_tiling->TileAt(1, 1));
2024
2025     EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
2026     EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
2027     EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
2028     EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
2029     EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
2030     EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
2031     EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
2032     EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
2033   }
2034 }
2035
2036 TEST_F(PictureLayerImplTest, RemoveInvalidPendingTreeTilesOnSync) {
2037   SetupDefaultTrees(gfx::Size(1500, 1500));
2038   AddDefaultTilingsWithInvalidation(gfx::Rect());
2039
2040   host_impl_.ActivateSyncTree();
2041   host_impl_.CreatePendingTree();
2042   active_layer_ = static_cast<FakePictureLayerImpl*>(
2043       host_impl_.active_tree()->LayerById(id_));
2044
2045   // Set some invalidation on the pending tree "during commit". We should
2046   // replace raster tiles that touch this.
2047   pending_layer_->set_invalidation(gfx::Rect(1, 1));
2048
2049   // Force the active tree to sync to the pending tree "post-commit".
2050   pending_layer_->DoPostCommitInitializationIfNeeded();
2051
2052   // The pending tree invalidation means tiles can not be shared with the
2053   // active tree.
2054   EXPECT_EQ(3u, active_layer_->num_tilings());
2055   EXPECT_EQ(3u, pending_layer_->num_tilings());
2056   for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
2057     PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
2058     PictureLayerTiling* pending_tiling =
2059         pending_layer_->tilings()->tiling_at(i);
2060
2061     ASSERT_TRUE(active_tiling);
2062     ASSERT_TRUE(pending_tiling);
2063
2064     EXPECT_TRUE(active_tiling->TileAt(0, 0));
2065     EXPECT_TRUE(active_tiling->TileAt(1, 0));
2066     EXPECT_TRUE(active_tiling->TileAt(0, 1));
2067     EXPECT_TRUE(active_tiling->TileAt(1, 1));
2068
2069     EXPECT_TRUE(pending_tiling->TileAt(0, 0));
2070     EXPECT_TRUE(pending_tiling->TileAt(1, 0));
2071     EXPECT_TRUE(pending_tiling->TileAt(0, 1));
2072     EXPECT_TRUE(pending_tiling->TileAt(1, 1));
2073
2074     EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
2075     EXPECT_FALSE(active_tiling->TileAt(0, 0)->is_shared());
2076     EXPECT_FALSE(pending_tiling->TileAt(0, 0)->is_shared());
2077     EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
2078     EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
2079     EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
2080     EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
2081     EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
2082     EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
2083   }
2084 }
2085
2086 TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) {
2087   SetupDefaultTrees(gfx::Size(10, 10));
2088   host_impl_.active_tree()->UpdateDrawProperties();
2089   EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
2090
2091   // Contrived unit test of a real crash. A layer is transparent during a
2092   // context loss, and later becomes opaque, causing active layer SyncTiling to
2093   // be called.
2094   float new_scale = 1.f;
2095   active_layer_->ReleaseResources();
2096   pending_layer_->ReleaseResources();
2097   EXPECT_FALSE(active_layer_->tilings()->TilingAtScale(new_scale));
2098   pending_layer_->AddTiling(new_scale);
2099   EXPECT_TRUE(active_layer_->tilings()->TilingAtScale(new_scale));
2100
2101   // UpdateDrawProperties early-outs if the tree doesn't need it.  It is also
2102   // responsible for calling ManageTilings.  These checks verify that
2103   // ReleaseResources has set needs update draw properties so that the
2104   // new tiling gets the appropriate resolution set in ManageTilings.
2105   EXPECT_TRUE(host_impl_.active_tree()->needs_update_draw_properties());
2106   host_impl_.active_tree()->UpdateDrawProperties();
2107   PictureLayerTiling* high_res =
2108       active_layer_->tilings()->TilingAtScale(new_scale);
2109   ASSERT_TRUE(!!high_res);
2110   EXPECT_EQ(HIGH_RESOLUTION, high_res->resolution());
2111 }
2112
2113 TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) {
2114   SetupDefaultTrees(gfx::Size(10, 10));
2115
2116   const float kScale = 1.f;
2117   pending_layer_->AddTiling(kScale);
2118   EXPECT_TRUE(pending_layer_->tilings()->TilingAtScale(kScale));
2119   EXPECT_TRUE(active_layer_->tilings()->TilingAtScale(kScale));
2120
2121   // Gpu rasterization is disabled by default.
2122   EXPECT_FALSE(host_impl_.use_gpu_rasterization());
2123   // Toggling the gpu rasterization clears all tilings on both trees.
2124   host_impl_.SetUseGpuRasterization(true);
2125   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
2126   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
2127
2128   // Make sure that we can still add tiling to the pending layer,
2129   // that gets synced to the active layer.
2130   pending_layer_->AddTiling(kScale);
2131   EXPECT_TRUE(pending_layer_->tilings()->TilingAtScale(kScale));
2132   EXPECT_TRUE(active_layer_->tilings()->TilingAtScale(kScale));
2133
2134   // Toggling the gpu rasterization clears all tilings on both trees.
2135   EXPECT_TRUE(host_impl_.use_gpu_rasterization());
2136   host_impl_.SetUseGpuRasterization(false);
2137   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
2138   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
2139 }
2140
2141 TEST_F(PictureLayerImplTest, HighResCreatedWhenBoundsShrink) {
2142   SetupDefaultTrees(gfx::Size(10, 10));
2143   host_impl_.active_tree()->UpdateDrawProperties();
2144   EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
2145
2146   SetupDrawPropertiesAndUpdateTiles(
2147       active_layer_, 0.5f, 0.5f, 0.5f, 0.5f, false);
2148   active_layer_->tilings()->RemoveAllTilings();
2149   PictureLayerTiling* tiling = active_layer_->tilings()->AddTiling(0.5f);
2150   active_layer_->tilings()->AddTiling(1.5f);
2151   active_layer_->tilings()->AddTiling(0.25f);
2152   tiling->set_resolution(HIGH_RESOLUTION);
2153
2154   // Sanity checks.
2155   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
2156   ASSERT_EQ(tiling, active_layer_->tilings()->TilingAtScale(0.5f));
2157
2158   // Now, set the bounds to be 1x1 (so that minimum contents scale becomes
2159   // 1.0f). Note that we should also ensure that the pending layer needs post
2160   // commit initialization, since this is what would happen during commit. In
2161   // other words we want the pending layer to sync from the active layer.
2162   pending_layer_->SetBounds(gfx::Size(1, 1));
2163   pending_layer_->SetNeedsPostCommitInitialization();
2164   pending_layer_->set_twin_layer(NULL);
2165   active_layer_->set_twin_layer(NULL);
2166   EXPECT_TRUE(pending_layer_->needs_post_commit_initialization());
2167
2168   // Update the draw properties: sync from active tree should happen here.
2169   host_impl_.pending_tree()->UpdateDrawProperties();
2170
2171   // Another sanity check.
2172   ASSERT_EQ(1.f, pending_layer_->MinimumContentsScale());
2173
2174   // Now we should've synced 1.5f tiling, since that's the only one that doesn't
2175   // violate minimum contents scale. At the same time, we should've created a
2176   // new high res tiling at scale 1.0f.
2177   EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
2178   ASSERT_TRUE(pending_layer_->tilings()->TilingAtScale(1.0f));
2179   EXPECT_EQ(HIGH_RESOLUTION,
2180             pending_layer_->tilings()->TilingAtScale(1.0f)->resolution());
2181   ASSERT_TRUE(pending_layer_->tilings()->TilingAtScale(1.5f));
2182   EXPECT_EQ(NON_IDEAL_RESOLUTION,
2183             pending_layer_->tilings()->TilingAtScale(1.5f)->resolution());
2184 }
2185
2186 TEST_F(PictureLayerImplTest, NoLowResTilingWithGpuRasterization) {
2187   gfx::Size default_tile_size(host_impl_.settings().default_tile_size);
2188   gfx::Size layer_bounds(default_tile_size.width() * 4,
2189                          default_tile_size.height() * 4);
2190
2191   SetupDefaultTrees(layer_bounds);
2192   EXPECT_FALSE(host_impl_.use_gpu_rasterization());
2193   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
2194   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
2195   // Should have a low-res and a high-res tiling.
2196   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
2197
2198   ResetTilingsAndRasterScales();
2199
2200   host_impl_.SetUseGpuRasterization(true);
2201   EXPECT_TRUE(host_impl_.use_gpu_rasterization());
2202   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
2203
2204   // Should only have the high-res tiling.
2205   ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
2206 }
2207
2208 TEST_F(PictureLayerImplTest, NoTilingIfDoesNotDrawContent) {
2209   // Set up layers with tilings.
2210   SetupDefaultTrees(gfx::Size(10, 10));
2211   SetContentsScaleOnBothLayers(1.f, 1.f, 1.f, 1.f, false);
2212   pending_layer_->PushPropertiesTo(active_layer_);
2213   EXPECT_TRUE(pending_layer_->DrawsContent());
2214   EXPECT_TRUE(pending_layer_->CanHaveTilings());
2215   EXPECT_GE(pending_layer_->num_tilings(), 0u);
2216   EXPECT_GE(active_layer_->num_tilings(), 0u);
2217
2218   // Set content to false, which should make CanHaveTilings return false.
2219   pending_layer_->SetDrawsContent(false);
2220   EXPECT_FALSE(pending_layer_->DrawsContent());
2221   EXPECT_FALSE(pending_layer_->CanHaveTilings());
2222
2223   // No tilings should be pushed to active layer.
2224   pending_layer_->PushPropertiesTo(active_layer_);
2225   EXPECT_EQ(0u, active_layer_->num_tilings());
2226 }
2227
2228 TEST_F(PictureLayerImplTest, FirstTilingDuringPinch) {
2229   SetupDefaultTrees(gfx::Size(10, 10));
2230   host_impl_.PinchGestureBegin();
2231   float high_res_scale = 2.3f;
2232   SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, 1.f, false);
2233
2234   ASSERT_GE(pending_layer_->num_tilings(), 0u);
2235   EXPECT_FLOAT_EQ(high_res_scale,
2236                   pending_layer_->HighResTiling()->contents_scale());
2237 }
2238
2239 TEST_F(PictureLayerImplTest, FirstTilingTooSmall) {
2240   SetupDefaultTrees(gfx::Size(10, 10));
2241   host_impl_.PinchGestureBegin();
2242   float high_res_scale = 0.0001f;
2243   EXPECT_GT(pending_layer_->MinimumContentsScale(), high_res_scale);
2244
2245   SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, 1.f, false);
2246
2247   ASSERT_GE(pending_layer_->num_tilings(), 0u);
2248   EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(),
2249                   pending_layer_->HighResTiling()->contents_scale());
2250 }
2251
2252 TEST_F(PictureLayerImplTest, PinchingTooSmall) {
2253   SetupDefaultTrees(gfx::Size(10, 10));
2254
2255   float contents_scale = 0.15f;
2256   SetContentsScaleOnBothLayers(contents_scale, 1.f, 1.f, 1.f, false);
2257
2258   ASSERT_GE(pending_layer_->num_tilings(), 0u);
2259   EXPECT_FLOAT_EQ(contents_scale,
2260                   pending_layer_->HighResTiling()->contents_scale());
2261
2262   host_impl_.PinchGestureBegin();
2263
2264   float page_scale = 0.0001f;
2265   EXPECT_LT(page_scale * contents_scale,
2266             pending_layer_->MinimumContentsScale());
2267
2268   SetContentsScaleOnBothLayers(contents_scale, 1.f, page_scale, 1.f, false);
2269   ASSERT_GE(pending_layer_->num_tilings(), 0u);
2270   EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(),
2271                   pending_layer_->HighResTiling()->contents_scale());
2272 }
2273
2274 class DeferredInitPictureLayerImplTest : public PictureLayerImplTest {
2275  public:
2276   virtual void InitializeRenderer() OVERRIDE {
2277     bool delegated_rendering = false;
2278     host_impl_.InitializeRenderer(
2279         FakeOutputSurface::CreateDeferredGL(
2280             scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice),
2281             delegated_rendering).PassAs<OutputSurface>());
2282   }
2283
2284   virtual void SetUp() OVERRIDE {
2285     PictureLayerImplTest::SetUp();
2286
2287     // Create some default active and pending trees.
2288     gfx::Size tile_size(100, 100);
2289     gfx::Size layer_bounds(400, 400);
2290
2291     scoped_refptr<FakePicturePileImpl> pending_pile =
2292         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
2293     scoped_refptr<FakePicturePileImpl> active_pile =
2294         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
2295
2296     SetupTrees(pending_pile, active_pile);
2297   }
2298 };
2299
2300 // This test is really a LayerTreeHostImpl test, in that it makes sure
2301 // that trees need update draw properties after deferred initialization.
2302 // However, this is also a regression test for PictureLayerImpl in that
2303 // not having this update will cause a crash.
2304 TEST_F(DeferredInitPictureLayerImplTest, PreventUpdateTilesDuringLostContext) {
2305   host_impl_.pending_tree()->UpdateDrawProperties();
2306   host_impl_.active_tree()->UpdateDrawProperties();
2307   EXPECT_FALSE(host_impl_.pending_tree()->needs_update_draw_properties());
2308   EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
2309
2310   FakeOutputSurface* fake_output_surface =
2311       static_cast<FakeOutputSurface*>(host_impl_.output_surface());
2312   ASSERT_TRUE(fake_output_surface->InitializeAndSetContext3d(
2313       TestContextProvider::Create()));
2314
2315   // These will crash PictureLayerImpl if this is not true.
2316   ASSERT_TRUE(host_impl_.pending_tree()->needs_update_draw_properties());
2317   ASSERT_TRUE(host_impl_.active_tree()->needs_update_draw_properties());
2318   host_impl_.active_tree()->UpdateDrawProperties();
2319 }
2320
2321 TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
2322   gfx::Size layer_bounds(100, 100);
2323   gfx::Size viewport_size(1000, 1000);
2324   SetupDefaultTrees(layer_bounds);
2325   host_impl_.SetViewportSize(viewport_size);
2326
2327   float contents_scale = 1.f;
2328   float device_scale = 1.3f;
2329   float page_scale = 1.4f;
2330   float maximum_animation_scale = 1.f;
2331   bool animating_transform = false;
2332
2333   SetContentsScaleOnBothLayers(contents_scale,
2334                                device_scale,
2335                                page_scale,
2336                                maximum_animation_scale,
2337                                animating_transform);
2338   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
2339
2340   // Since we're CPU-rasterizing, starting an animation should cause tiling
2341   // resolution to get set to the maximum animation scale factor.
2342   animating_transform = true;
2343   maximum_animation_scale = 3.f;
2344   contents_scale = 2.f;
2345
2346   SetContentsScaleOnBothLayers(contents_scale,
2347                                device_scale,
2348                                page_scale,
2349                                maximum_animation_scale,
2350                                animating_transform);
2351   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f);
2352
2353   // Further changes to scale during the animation should not cause a new
2354   // high-res tiling to get created.
2355   contents_scale = 4.f;
2356   maximum_animation_scale = 5.f;
2357
2358   SetContentsScaleOnBothLayers(contents_scale,
2359                                device_scale,
2360                                page_scale,
2361                                maximum_animation_scale,
2362                                animating_transform);
2363   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f);
2364
2365   // Once we stop animating, a new high-res tiling should be created.
2366   animating_transform = false;
2367
2368   SetContentsScaleOnBothLayers(contents_scale,
2369                                device_scale,
2370                                page_scale,
2371                                maximum_animation_scale,
2372                                animating_transform);
2373   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
2374
2375   // When animating with an unknown maximum animation scale factor, a new
2376   // high-res tiling should be created at a source scale of 1.
2377   animating_transform = true;
2378   contents_scale = 2.f;
2379   maximum_animation_scale = 0.f;
2380
2381   SetContentsScaleOnBothLayers(contents_scale,
2382                                device_scale,
2383                                page_scale,
2384                                maximum_animation_scale,
2385                                animating_transform);
2386   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale);
2387
2388   // Further changes to scale during the animation should not cause a new
2389   // high-res tiling to get created.
2390   contents_scale = 3.f;
2391
2392   SetContentsScaleOnBothLayers(contents_scale,
2393                                device_scale,
2394                                page_scale,
2395                                maximum_animation_scale,
2396                                animating_transform);
2397   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale);
2398
2399   // Once we stop animating, a new high-res tiling should be created.
2400   animating_transform = false;
2401   contents_scale = 4.f;
2402
2403   SetContentsScaleOnBothLayers(contents_scale,
2404                                device_scale,
2405                                page_scale,
2406                                maximum_animation_scale,
2407                                animating_transform);
2408   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
2409
2410   // When animating with a maxmium animation scale factor that is so large
2411   // that the layer grows larger than the viewport at this scale, a new
2412   // high-res tiling should get created at a source scale of 1, not at its
2413   // maximum scale.
2414   animating_transform = true;
2415   contents_scale = 2.f;
2416   maximum_animation_scale = 11.f;
2417
2418   SetContentsScaleOnBothLayers(contents_scale,
2419                                device_scale,
2420                                page_scale,
2421                                maximum_animation_scale,
2422                                animating_transform);
2423   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale);
2424
2425   // Once we stop animating, a new high-res tiling should be created.
2426   animating_transform = false;
2427   contents_scale = 11.f;
2428
2429   SetContentsScaleOnBothLayers(contents_scale,
2430                                device_scale,
2431                                page_scale,
2432                                maximum_animation_scale,
2433                                animating_transform);
2434   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f);
2435
2436   // When animating with a maxmium animation scale factor that is so large
2437   // that the layer grows larger than the viewport at this scale, and where
2438   // the intial source scale is < 1, a new high-res tiling should get created
2439   // at source scale 1.
2440   animating_transform = true;
2441   contents_scale = 0.1f;
2442   maximum_animation_scale = 11.f;
2443
2444   SetContentsScaleOnBothLayers(contents_scale,
2445                                device_scale,
2446                                page_scale,
2447                                maximum_animation_scale,
2448                                animating_transform);
2449   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), device_scale * page_scale);
2450
2451   // Once we stop animating, a new high-res tiling should be created.
2452   animating_transform = false;
2453   contents_scale = 12.f;
2454
2455   SetContentsScaleOnBothLayers(contents_scale,
2456                                device_scale,
2457                                page_scale,
2458                                maximum_animation_scale,
2459                                animating_transform);
2460   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 12.f);
2461
2462   // When animating toward a smaller scale, but that is still so large that the
2463   // layer grows larger than the viewport at this scale, a new high-res tiling
2464   // should get created at source scale 1.
2465   animating_transform = true;
2466   contents_scale = 11.f;
2467   maximum_animation_scale = 11.f;
2468
2469   SetContentsScaleOnBothLayers(contents_scale,
2470                                device_scale,
2471                                page_scale,
2472                                maximum_animation_scale,
2473                                animating_transform);
2474   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), device_scale * page_scale);
2475
2476   // Once we stop animating, a new high-res tiling should be created.
2477   animating_transform = false;
2478   contents_scale = 11.f;
2479
2480   SetContentsScaleOnBothLayers(contents_scale,
2481                                device_scale,
2482                                page_scale,
2483                                maximum_animation_scale,
2484                                animating_transform);
2485   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f);
2486 }
2487
2488 TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForGpuRasterization) {
2489   gfx::Size layer_bounds(100, 100);
2490   gfx::Size viewport_size(1000, 1000);
2491   SetupDefaultTrees(layer_bounds);
2492   host_impl_.SetViewportSize(viewport_size);
2493   host_impl_.SetUseGpuRasterization(true);
2494
2495   float contents_scale = 1.f;
2496   float device_scale = 1.3f;
2497   float page_scale = 1.4f;
2498   float maximum_animation_scale = 1.f;
2499   bool animating_transform = false;
2500
2501   SetContentsScaleOnBothLayers(contents_scale,
2502                                device_scale,
2503                                page_scale,
2504                                maximum_animation_scale,
2505                                animating_transform);
2506   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
2507
2508   // Since we're GPU-rasterizing, starting an animation should cause tiling
2509   // resolution to get set to the current contents scale.
2510   animating_transform = true;
2511   contents_scale = 2.f;
2512   maximum_animation_scale = 4.f;
2513
2514   SetContentsScaleOnBothLayers(contents_scale,
2515                                device_scale,
2516                                page_scale,
2517                                maximum_animation_scale,
2518                                animating_transform);
2519   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
2520
2521   // Further changes to scale during the animation should cause a new high-res
2522   // tiling to get created.
2523   contents_scale = 3.f;
2524
2525   SetContentsScaleOnBothLayers(contents_scale,
2526                                device_scale,
2527                                page_scale,
2528                                maximum_animation_scale,
2529                                animating_transform);
2530   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f);
2531
2532   // Since we're re-rasterizing during the animation, scales smaller than 1
2533   // should be respected.
2534   contents_scale = 0.25f;
2535
2536   SetContentsScaleOnBothLayers(contents_scale,
2537                                device_scale,
2538                                page_scale,
2539                                maximum_animation_scale,
2540                                animating_transform);
2541   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 0.25f);
2542
2543   // Once we stop animating, a new high-res tiling should be created.
2544   contents_scale = 4.f;
2545   animating_transform = false;
2546
2547   SetContentsScaleOnBothLayers(contents_scale,
2548                                device_scale,
2549                                page_scale,
2550                                maximum_animation_scale,
2551                                animating_transform);
2552   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
2553
2554   static_cast<FakePicturePileImpl*>(pending_layer_->pile())->set_has_text(true);
2555   static_cast<FakePicturePileImpl*>(active_layer_->pile())->set_has_text(true);
2556
2557   // Since we're GPU-rasterizing but have text, starting an animation should
2558   // cause tiling resolution to get set to the maximum animation scale.
2559   animating_transform = true;
2560   contents_scale = 2.f;
2561   maximum_animation_scale = 3.f;
2562
2563   SetContentsScaleOnBothLayers(contents_scale,
2564                                device_scale,
2565                                page_scale,
2566                                maximum_animation_scale,
2567                                animating_transform);
2568   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f);
2569
2570   // Further changes to scale during the animation should not cause a new
2571   // high-res tiling to get created.
2572   contents_scale = 4.f;
2573   maximum_animation_scale = 5.f;
2574
2575   SetContentsScaleOnBothLayers(contents_scale,
2576                                device_scale,
2577                                page_scale,
2578                                maximum_animation_scale,
2579                                animating_transform);
2580   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f);
2581
2582   // Once we stop animating, a new high-res tiling should be created.
2583   animating_transform = false;
2584
2585   SetContentsScaleOnBothLayers(contents_scale,
2586                                device_scale,
2587                                page_scale,
2588                                maximum_animation_scale,
2589                                animating_transform);
2590   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
2591 }
2592
2593 TEST_F(PictureLayerImplTest, LayerRasterTileIterator) {
2594   base::TimeTicks time_ticks;
2595   time_ticks += base::TimeDelta::FromMilliseconds(1);
2596   host_impl_.SetCurrentBeginFrameArgs(
2597       CreateBeginFrameArgsForTesting(time_ticks));
2598
2599   gfx::Size tile_size(100, 100);
2600   gfx::Size layer_bounds(1000, 1000);
2601
2602   scoped_refptr<FakePicturePileImpl> pending_pile =
2603       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
2604
2605   SetupPendingTree(pending_pile);
2606
2607   ASSERT_TRUE(pending_layer_->CanHaveTilings());
2608
2609   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
2610
2611   // Empty iterator
2612   PictureLayerImpl::LayerRasterTileIterator it;
2613   EXPECT_FALSE(it);
2614
2615   // No tilings.
2616   it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
2617   EXPECT_FALSE(it);
2618
2619   pending_layer_->AddTiling(low_res_factor);
2620   pending_layer_->AddTiling(0.3f);
2621   pending_layer_->AddTiling(0.7f);
2622   PictureLayerTiling* high_res_tiling = pending_layer_->AddTiling(1.0f);
2623   pending_layer_->AddTiling(2.0f);
2624
2625   host_impl_.SetViewportSize(gfx::Size(500, 500));
2626   host_impl_.pending_tree()->UpdateDrawProperties();
2627
2628   std::set<Tile*> unique_tiles;
2629   bool reached_prepaint = false;
2630   size_t non_ideal_tile_count = 0u;
2631   size_t low_res_tile_count = 0u;
2632   size_t high_res_tile_count = 0u;
2633   for (it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
2634        it;
2635        ++it) {
2636     Tile* tile = *it;
2637     TilePriority priority = tile->priority(PENDING_TREE);
2638
2639     EXPECT_TRUE(tile);
2640
2641     // Non-high res tiles only get visible tiles. Also, prepaint should only
2642     // come at the end of the iteration.
2643     if (priority.resolution != HIGH_RESOLUTION)
2644       EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
2645     else if (reached_prepaint)
2646       EXPECT_NE(TilePriority::NOW, priority.priority_bin);
2647     else
2648       reached_prepaint = priority.priority_bin != TilePriority::NOW;
2649
2650     non_ideal_tile_count += priority.resolution == NON_IDEAL_RESOLUTION;
2651     low_res_tile_count += priority.resolution == LOW_RESOLUTION;
2652     high_res_tile_count += priority.resolution == HIGH_RESOLUTION;
2653
2654     unique_tiles.insert(tile);
2655   }
2656
2657   EXPECT_TRUE(reached_prepaint);
2658   EXPECT_EQ(0u, non_ideal_tile_count);
2659   EXPECT_EQ(1u, low_res_tile_count);
2660   EXPECT_EQ(16u, high_res_tile_count);
2661   EXPECT_EQ(low_res_tile_count + high_res_tile_count + non_ideal_tile_count,
2662             unique_tiles.size());
2663
2664   // No NOW tiles.
2665   time_ticks += base::TimeDelta::FromMilliseconds(200);
2666   host_impl_.SetCurrentBeginFrameArgs(
2667       CreateBeginFrameArgsForTesting(time_ticks));
2668
2669   pending_layer_->draw_properties().visible_content_rect =
2670       gfx::Rect(1100, 1100, 500, 500);
2671   bool resourceless_software_draw = false;
2672   pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
2673
2674   unique_tiles.clear();
2675   high_res_tile_count = 0u;
2676   for (it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
2677        it;
2678        ++it) {
2679     Tile* tile = *it;
2680     TilePriority priority = tile->priority(PENDING_TREE);
2681
2682     EXPECT_TRUE(tile);
2683
2684     // Non-high res tiles only get visible tiles.
2685     EXPECT_EQ(HIGH_RESOLUTION, priority.resolution);
2686     EXPECT_NE(TilePriority::NOW, priority.priority_bin);
2687
2688     high_res_tile_count += priority.resolution == HIGH_RESOLUTION;
2689
2690     unique_tiles.insert(tile);
2691   }
2692
2693   EXPECT_EQ(16u, high_res_tile_count);
2694   EXPECT_EQ(high_res_tile_count, unique_tiles.size());
2695
2696   time_ticks += base::TimeDelta::FromMilliseconds(200);
2697   host_impl_.SetCurrentBeginFrameArgs(
2698       CreateBeginFrameArgsForTesting(time_ticks));
2699
2700   pending_layer_->draw_properties().visible_content_rect =
2701       gfx::Rect(0, 0, 500, 500);
2702   pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
2703
2704   std::vector<Tile*> high_res_tiles = high_res_tiling->AllTilesForTesting();
2705   for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin();
2706        tile_it != high_res_tiles.end();
2707        ++tile_it) {
2708     Tile* tile = *tile_it;
2709     ManagedTileState::TileVersion& tile_version =
2710         tile->GetTileVersionForTesting(
2711             tile->DetermineRasterModeForTree(ACTIVE_TREE));
2712     tile_version.SetSolidColorForTesting(SK_ColorRED);
2713   }
2714
2715   non_ideal_tile_count = 0;
2716   low_res_tile_count = 0;
2717   high_res_tile_count = 0;
2718   for (it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
2719        it;
2720        ++it) {
2721     Tile* tile = *it;
2722     TilePriority priority = tile->priority(PENDING_TREE);
2723
2724     EXPECT_TRUE(tile);
2725
2726     non_ideal_tile_count += priority.resolution == NON_IDEAL_RESOLUTION;
2727     low_res_tile_count += priority.resolution == LOW_RESOLUTION;
2728     high_res_tile_count += priority.resolution == HIGH_RESOLUTION;
2729   }
2730
2731   EXPECT_EQ(0u, non_ideal_tile_count);
2732   EXPECT_EQ(1u, low_res_tile_count);
2733   EXPECT_EQ(0u, high_res_tile_count);
2734 }
2735
2736 TEST_F(PictureLayerImplTest, LayerEvictionTileIterator) {
2737   gfx::Size tile_size(100, 100);
2738   gfx::Size layer_bounds(1000, 1000);
2739
2740   scoped_refptr<FakePicturePileImpl> pending_pile =
2741       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
2742
2743   SetupPendingTree(pending_pile);
2744
2745   ASSERT_TRUE(pending_layer_->CanHaveTilings());
2746
2747   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
2748
2749   std::vector<PictureLayerTiling*> tilings;
2750   tilings.push_back(pending_layer_->AddTiling(low_res_factor));
2751   tilings.push_back(pending_layer_->AddTiling(0.3f));
2752   tilings.push_back(pending_layer_->AddTiling(0.7f));
2753   tilings.push_back(pending_layer_->AddTiling(1.0f));
2754   tilings.push_back(pending_layer_->AddTiling(2.0f));
2755
2756   host_impl_.SetViewportSize(gfx::Size(500, 500));
2757   host_impl_.pending_tree()->UpdateDrawProperties();
2758
2759   std::vector<Tile*> all_tiles;
2760   for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
2761            tilings.begin();
2762        tiling_iterator != tilings.end();
2763        ++tiling_iterator) {
2764     std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
2765     std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
2766   }
2767
2768   std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end());
2769
2770   bool mark_required = false;
2771   size_t number_of_marked_tiles = 0u;
2772   size_t number_of_unmarked_tiles = 0u;
2773   for (size_t i = 0; i < tilings.size(); ++i) {
2774     PictureLayerTiling* tiling = tilings.at(i);
2775     for (PictureLayerTiling::CoverageIterator iter(
2776              tiling,
2777              pending_layer_->contents_scale_x(),
2778              pending_layer_->visible_content_rect());
2779          iter;
2780          ++iter) {
2781       if (mark_required) {
2782         number_of_marked_tiles++;
2783         iter->MarkRequiredForActivation();
2784       } else {
2785         number_of_unmarked_tiles++;
2786       }
2787       mark_required = !mark_required;
2788     }
2789   }
2790
2791   // Sanity checks.
2792   EXPECT_EQ(91u, all_tiles.size());
2793   EXPECT_EQ(91u, all_tiles_set.size());
2794   EXPECT_GT(number_of_marked_tiles, 1u);
2795   EXPECT_GT(number_of_unmarked_tiles, 1u);
2796
2797   // Empty iterator.
2798   PictureLayerImpl::LayerEvictionTileIterator it;
2799   EXPECT_FALSE(it);
2800
2801   // Tiles don't have resources yet.
2802   it = PictureLayerImpl::LayerEvictionTileIterator(
2803       pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES);
2804   EXPECT_FALSE(it);
2805
2806   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
2807
2808   std::set<Tile*> unique_tiles;
2809   float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f};
2810   size_t scale_index = 0;
2811   bool reached_visible = false;
2812   Tile* last_tile = NULL;
2813   for (it = PictureLayerImpl::LayerEvictionTileIterator(
2814            pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES);
2815        it;
2816        ++it) {
2817     Tile* tile = *it;
2818     if (!last_tile)
2819       last_tile = tile;
2820
2821     EXPECT_TRUE(tile);
2822
2823     TilePriority priority = tile->priority(PENDING_TREE);
2824
2825     if (priority.priority_bin == TilePriority::NOW) {
2826       reached_visible = true;
2827       last_tile = tile;
2828       break;
2829     }
2830
2831     EXPECT_FALSE(tile->required_for_activation());
2832
2833     while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
2834            std::numeric_limits<float>::epsilon()) {
2835       ++scale_index;
2836       ASSERT_LT(scale_index, arraysize(expected_scales));
2837     }
2838
2839     EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
2840     unique_tiles.insert(tile);
2841
2842     // If the tile is the same rough bin as last tile (same activation, bin, and
2843     // scale), then distance should be decreasing.
2844     if (tile->required_for_activation() ==
2845             last_tile->required_for_activation() &&
2846         priority.priority_bin ==
2847             last_tile->priority(PENDING_TREE).priority_bin &&
2848         std::abs(tile->contents_scale() - last_tile->contents_scale()) <
2849             std::numeric_limits<float>::epsilon()) {
2850       EXPECT_LE(priority.distance_to_visible,
2851                 last_tile->priority(PENDING_TREE).distance_to_visible);
2852     }
2853
2854     last_tile = tile;
2855   }
2856
2857   EXPECT_TRUE(reached_visible);
2858   EXPECT_EQ(65u, unique_tiles.size());
2859
2860   scale_index = 0;
2861   bool reached_required = false;
2862   for (; it; ++it) {
2863     Tile* tile = *it;
2864     EXPECT_TRUE(tile);
2865
2866     TilePriority priority = tile->priority(PENDING_TREE);
2867     EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
2868
2869     if (reached_required) {
2870       EXPECT_TRUE(tile->required_for_activation());
2871     } else if (tile->required_for_activation()) {
2872       reached_required = true;
2873       scale_index = 0;
2874     }
2875
2876     while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
2877            std::numeric_limits<float>::epsilon()) {
2878       ++scale_index;
2879       ASSERT_LT(scale_index, arraysize(expected_scales));
2880     }
2881
2882     EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
2883     unique_tiles.insert(tile);
2884   }
2885
2886   EXPECT_TRUE(reached_required);
2887   EXPECT_EQ(all_tiles_set.size(), unique_tiles.size());
2888 }
2889
2890 TEST_F(PictureLayerImplTest, Occlusion) {
2891   gfx::Size tile_size(102, 102);
2892   gfx::Size layer_bounds(1000, 1000);
2893   gfx::Size viewport_size(1000, 1000);
2894
2895   LayerTestCommon::LayerImplTest impl;
2896
2897   scoped_refptr<FakePicturePileImpl> pending_pile =
2898       FakePicturePileImpl::CreateFilledPile(layer_bounds, layer_bounds);
2899   SetupPendingTree(pending_pile);
2900   pending_layer_->SetBounds(layer_bounds);
2901   ActivateTree();
2902   active_layer_->set_fixed_tile_size(tile_size);
2903
2904   host_impl_.SetViewportSize(viewport_size);
2905   host_impl_.active_tree()->UpdateDrawProperties();
2906
2907   std::vector<Tile*> tiles =
2908       active_layer_->HighResTiling()->AllTilesForTesting();
2909   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
2910
2911   {
2912     SCOPED_TRACE("No occlusion");
2913     gfx::Rect occluded;
2914     impl.AppendQuadsWithOcclusion(active_layer_, occluded);
2915
2916     LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
2917                                                  gfx::Rect(layer_bounds));
2918     EXPECT_EQ(100u, impl.quad_list().size());
2919   }
2920
2921   {
2922     SCOPED_TRACE("Full occlusion");
2923     gfx::Rect occluded(active_layer_->visible_content_rect());
2924     impl.AppendQuadsWithOcclusion(active_layer_, occluded);
2925
2926     LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
2927     EXPECT_EQ(impl.quad_list().size(), 0u);
2928   }
2929
2930   {
2931     SCOPED_TRACE("Partial occlusion");
2932     gfx::Rect occluded(150, 0, 200, 1000);
2933     impl.AppendQuadsWithOcclusion(active_layer_, occluded);
2934
2935     size_t partially_occluded_count = 0;
2936     LayerTestCommon::VerifyQuadsAreOccluded(
2937         impl.quad_list(), occluded, &partially_occluded_count);
2938     // The layer outputs one quad, which is partially occluded.
2939     EXPECT_EQ(100u - 10u, impl.quad_list().size());
2940     EXPECT_EQ(10u + 10u, partially_occluded_count);
2941   }
2942 }
2943
2944 TEST_F(PictureLayerImplTest, RasterScaleChangeWithoutAnimation) {
2945   gfx::Size tile_size(host_impl_.settings().default_tile_size);
2946   SetupDefaultTrees(tile_size);
2947
2948   float contents_scale = 2.f;
2949   float device_scale = 1.f;
2950   float page_scale = 1.f;
2951   float maximum_animation_scale = 1.f;
2952   bool animating_transform = false;
2953
2954   SetContentsScaleOnBothLayers(contents_scale,
2955                                device_scale,
2956                                page_scale,
2957                                maximum_animation_scale,
2958                                animating_transform);
2959   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
2960
2961   // Changing the source scale without being in an animation will cause
2962   // the layer to reset its source scale to 1.f.
2963   contents_scale = 3.f;
2964
2965   SetContentsScaleOnBothLayers(contents_scale,
2966                                device_scale,
2967                                page_scale,
2968                                maximum_animation_scale,
2969                                animating_transform);
2970   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
2971
2972   // Further changes to the source scale will no longer be reflected in the
2973   // contents scale.
2974   contents_scale = 0.5f;
2975
2976   SetContentsScaleOnBothLayers(contents_scale,
2977                                device_scale,
2978                                page_scale,
2979                                maximum_animation_scale,
2980                                animating_transform);
2981   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
2982 }
2983
2984 TEST_F(PictureLayerImplTest, LowResReadyToDrawNotEnoughToActivate) {
2985   gfx::Size tile_size(100, 100);
2986   gfx::Size layer_bounds(1000, 1000);
2987
2988   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
2989
2990   // Make sure some tiles are not shared.
2991   pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
2992
2993   CreateHighLowResAndSetAllTilesVisible();
2994   active_layer_->SetAllTilesReady();
2995   pending_layer_->MarkVisibleResourcesAsRequired();
2996
2997   // All pending layer tiles required are not ready.
2998   EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
2999
3000   // Initialize all low-res tiles.
3001   pending_layer_->SetAllTilesReadyInTiling(pending_layer_->LowResTiling());
3002
3003   // Low-res tiles should not be enough.
3004   EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3005
3006   // Initialize remaining tiles.
3007   pending_layer_->SetAllTilesReady();
3008
3009   EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3010 }
3011
3012 TEST_F(PictureLayerImplTest, HighResReadyToDrawEnoughToActivate) {
3013   gfx::Size tile_size(100, 100);
3014   gfx::Size layer_bounds(1000, 1000);
3015
3016   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
3017
3018   // Make sure some tiles are not shared.
3019   pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
3020
3021   CreateHighLowResAndSetAllTilesVisible();
3022   active_layer_->SetAllTilesReady();
3023   pending_layer_->MarkVisibleResourcesAsRequired();
3024
3025   // All pending layer tiles required are not ready.
3026   EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3027
3028   // Initialize all high-res tiles.
3029   pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling());
3030
3031   // High-res tiles should be enough, since they cover everything visible.
3032   EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3033 }
3034
3035 TEST_F(PictureLayerImplTest,
3036        SharedActiveHighResReadyAndPendingLowResReadyNotEnoughToActivate) {
3037   gfx::Size tile_size(100, 100);
3038   gfx::Size layer_bounds(1000, 1000);
3039
3040   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
3041
3042   // Make sure some tiles are not shared.
3043   pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
3044
3045   CreateHighLowResAndSetAllTilesVisible();
3046
3047   // Initialize all high-res tiles in the active layer.
3048   active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling());
3049   // And all the low-res tiles in the pending layer.
3050   pending_layer_->SetAllTilesReadyInTiling(pending_layer_->LowResTiling());
3051
3052   pending_layer_->MarkVisibleResourcesAsRequired();
3053
3054   // The unshared high-res tiles are not ready, so we cannot activate.
3055   EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3056
3057   // When the unshared pending high-res tiles are ready, we can activate.
3058   pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling());
3059   EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3060 }
3061
3062 TEST_F(PictureLayerImplTest, SharedActiveHighResReadyNotEnoughToActivate) {
3063   gfx::Size tile_size(100, 100);
3064   gfx::Size layer_bounds(1000, 1000);
3065
3066   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
3067
3068   // Make sure some tiles are not shared.
3069   pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
3070
3071   CreateHighLowResAndSetAllTilesVisible();
3072
3073   // Initialize all high-res tiles in the active layer.
3074   active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling());
3075
3076   pending_layer_->MarkVisibleResourcesAsRequired();
3077
3078   // The unshared high-res tiles are not ready, so we cannot activate.
3079   EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3080
3081   // When the unshared pending high-res tiles are ready, we can activate.
3082   pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling());
3083   EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
3084 }
3085
3086 class NoLowResPictureLayerImplTest : public PictureLayerImplTest {
3087  public:
3088   NoLowResPictureLayerImplTest()
3089       : PictureLayerImplTest(NoLowResTilingsSettings()) {}
3090 };
3091
3092 TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
3093   gfx::Size tile_size(400, 400);
3094   gfx::Size layer_bounds(1300, 1900);
3095
3096   scoped_refptr<FakePicturePileImpl> pending_pile =
3097       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3098   scoped_refptr<FakePicturePileImpl> active_pile =
3099       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3100
3101   SetupTrees(pending_pile, active_pile);
3102   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
3103
3104   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
3105   EXPECT_LT(low_res_factor, 1.f);
3106
3107   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3108                                     6.f,  // ideal contents scale
3109                                     3.f,  // device scale
3110                                     2.f,  // page scale
3111                                     1.f,  // maximum animation scale
3112                                     false);
3113   ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
3114   EXPECT_FLOAT_EQ(6.f,
3115                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
3116
3117   // If we change the page scale factor, then we should get new tilings.
3118   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3119                                     6.6f,  // ideal contents scale
3120                                     3.f,   // device scale
3121                                     2.2f,  // page scale
3122                                     1.f,   // maximum animation scale
3123                                     false);
3124   ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
3125   EXPECT_FLOAT_EQ(6.6f,
3126                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
3127
3128   // If we change the device scale factor, then we should get new tilings.
3129   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3130                                     7.26f,  // ideal contents scale
3131                                     3.3f,   // device scale
3132                                     2.2f,   // page scale
3133                                     1.f,    // maximum animation scale
3134                                     false);
3135   ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings());
3136   EXPECT_FLOAT_EQ(7.26f,
3137                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
3138
3139   // If we change the device scale factor, but end up at the same total scale
3140   // factor somehow, then we don't get new tilings.
3141   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3142                                     7.26f,  // ideal contents scale
3143                                     2.2f,   // device scale
3144                                     3.3f,   // page scale
3145                                     1.f,    // maximum animation scale
3146                                     false);
3147   ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings());
3148   EXPECT_FLOAT_EQ(7.26f,
3149                   pending_layer_->tilings()->tiling_at(0)->contents_scale());
3150 }
3151
3152 TEST_F(NoLowResPictureLayerImplTest, MarkRequiredNullTiles) {
3153   gfx::Size tile_size(100, 100);
3154   gfx::Size layer_bounds(1000, 1000);
3155
3156   scoped_refptr<FakePicturePileImpl> pending_pile =
3157       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
3158   // Layers with entirely empty piles can't get tilings.
3159   pending_pile->AddRecordingAt(0, 0);
3160
3161   SetupPendingTree(pending_pile);
3162
3163   ASSERT_TRUE(pending_layer_->CanHaveTilings());
3164   pending_layer_->AddTiling(1.0f);
3165   pending_layer_->AddTiling(2.0f);
3166
3167   // It should be safe to call this (and MarkVisibleResourcesAsRequired)
3168   // on a layer with no recordings.
3169   host_impl_.pending_tree()->UpdateDrawProperties();
3170   pending_layer_->MarkVisibleResourcesAsRequired();
3171 }
3172
3173 TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfAllHighResTilesShared) {
3174   gfx::Size layer_bounds(400, 400);
3175   gfx::Size tile_size(100, 100);
3176   SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
3177
3178   CreateHighLowResAndSetAllTilesVisible();
3179
3180   Tile* some_active_tile =
3181       active_layer_->HighResTiling()->AllTilesForTesting()[0];
3182   EXPECT_FALSE(some_active_tile->IsReadyToDraw());
3183
3184   // All tiles shared (no invalidation), so even though the active tree's
3185   // tiles aren't ready, there is nothing required.
3186   pending_layer_->MarkVisibleResourcesAsRequired();
3187   AssertNoTilesRequired(pending_layer_->HighResTiling());
3188   if (host_impl_.settings().create_low_res_tiling) {
3189     AssertNoTilesRequired(pending_layer_->LowResTiling());
3190   }
3191 }
3192
3193 TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
3194   gfx::Size layer_bounds(400, 400);
3195   gfx::Size tile_size(100, 100);
3196   scoped_refptr<FakePicturePileImpl> pending_pile =
3197       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3198   // This pile will create tilings, but has no recordings so will not create any
3199   // tiles.  This is attempting to simulate scrolling past the end of recorded
3200   // content on the active layer, where the recordings are so far away that
3201   // no tiles are created.
3202   scoped_refptr<FakePicturePileImpl> active_pile =
3203       FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
3204           tile_size, layer_bounds);
3205   SetupTrees(pending_pile, active_pile);
3206   pending_layer_->set_fixed_tile_size(tile_size);
3207   active_layer_->set_fixed_tile_size(tile_size);
3208
3209   CreateHighLowResAndSetAllTilesVisible();
3210
3211   // Active layer has tilings, but no tiles due to missing recordings.
3212   EXPECT_TRUE(active_layer_->CanHaveTilings());
3213   EXPECT_EQ(active_layer_->tilings()->num_tilings(),
3214             host_impl_.settings().create_low_res_tiling ? 2u : 1u);
3215   EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u);
3216
3217   // Since the active layer has no tiles at all, the pending layer doesn't
3218   // need content in order to activate.
3219   pending_layer_->MarkVisibleResourcesAsRequired();
3220   AssertNoTilesRequired(pending_layer_->HighResTiling());
3221   if (host_impl_.settings().create_low_res_tiling)
3222     AssertNoTilesRequired(pending_layer_->LowResTiling());
3223 }
3224
3225 TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
3226   base::TimeTicks time_ticks;
3227   time_ticks += base::TimeDelta::FromMilliseconds(1);
3228   host_impl_.SetCurrentBeginFrameArgs(
3229       CreateBeginFrameArgsForTesting(time_ticks));
3230
3231   gfx::Size tile_size(100, 100);
3232   gfx::Size layer_bounds(400, 400);
3233
3234   scoped_refptr<FakePicturePileImpl> pending_pile =
3235       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3236   scoped_refptr<FakePicturePileImpl> active_pile =
3237       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3238
3239   SetupTrees(pending_pile, active_pile);
3240
3241   Region invalidation;
3242   AddDefaultTilingsWithInvalidation(invalidation);
3243   SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
3244
3245   // UpdateTiles with valid viewport. Should update tile viewport.
3246   // Note viewport is considered invalid if and only if in resourceless
3247   // software draw.
3248   bool resourceless_software_draw = false;
3249   gfx::Rect viewport = gfx::Rect(layer_bounds);
3250   gfx::Transform transform;
3251   host_impl_.SetExternalDrawConstraints(transform,
3252                                         viewport,
3253                                         viewport,
3254                                         viewport,
3255                                         transform,
3256                                         resourceless_software_draw);
3257   active_layer_->draw_properties().visible_content_rect = viewport;
3258   active_layer_->draw_properties().screen_space_transform = transform;
3259   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
3260
3261   gfx::Rect visible_rect_for_tile_priority =
3262       active_layer_->visible_rect_for_tile_priority();
3263   EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty());
3264   gfx::Rect viewport_rect_for_tile_priority =
3265       active_layer_->viewport_rect_for_tile_priority();
3266   EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty());
3267   gfx::Transform screen_space_transform_for_tile_priority =
3268       active_layer_->screen_space_transform_for_tile_priority();
3269
3270   // Expand viewport and set it as invalid for prioritizing tiles.
3271   // Should update viewport and transform, but not update visible rect.
3272   time_ticks += base::TimeDelta::FromMilliseconds(200);
3273   host_impl_.SetCurrentBeginFrameArgs(
3274       CreateBeginFrameArgsForTesting(time_ticks));
3275   resourceless_software_draw = true;
3276   viewport = gfx::ScaleToEnclosingRect(viewport, 2);
3277   transform.Translate(1.f, 1.f);
3278   active_layer_->draw_properties().visible_content_rect = viewport;
3279   active_layer_->draw_properties().screen_space_transform = transform;
3280   host_impl_.SetExternalDrawConstraints(transform,
3281                                         viewport,
3282                                         viewport,
3283                                         viewport,
3284                                         transform,
3285                                         resourceless_software_draw);
3286   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
3287
3288   // Viewport and transform for tile priority are updated.
3289   EXPECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority());
3290   EXPECT_TRANSFORMATION_MATRIX_EQ(
3291       transform, active_layer_->screen_space_transform_for_tile_priority());
3292   // Visible rect for tile priority retains old value.
3293   EXPECT_EQ(visible_rect_for_tile_priority,
3294             active_layer_->visible_rect_for_tile_priority());
3295
3296   // Keep expanded viewport but mark it valid. Should update tile viewport.
3297   time_ticks += base::TimeDelta::FromMilliseconds(200);
3298   host_impl_.SetCurrentBeginFrameArgs(
3299       CreateBeginFrameArgsForTesting(time_ticks));
3300   resourceless_software_draw = false;
3301   host_impl_.SetExternalDrawConstraints(transform,
3302                                         viewport,
3303                                         viewport,
3304                                         viewport,
3305                                         transform,
3306                                         resourceless_software_draw);
3307   active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
3308
3309   EXPECT_TRANSFORMATION_MATRIX_EQ(
3310       transform, active_layer_->screen_space_transform_for_tile_priority());
3311   EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority());
3312
3313   // Match the reverse translate in |transform|.
3314   EXPECT_EQ(viewport - gfx::Vector2d(1, 1),
3315             active_layer_->viewport_rect_for_tile_priority());
3316 }
3317
3318 TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) {
3319   gfx::Size tile_size(400, 400);
3320   gfx::Size layer_bounds(1300, 1900);
3321
3322   scoped_refptr<FakePicturePileImpl> pending_pile =
3323       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3324   scoped_refptr<FakePicturePileImpl> active_pile =
3325       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3326
3327   std::vector<PictureLayerTiling*> used_tilings;
3328
3329   SetupTrees(pending_pile, active_pile);
3330   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
3331
3332   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
3333   EXPECT_LT(low_res_factor, 1.f);
3334
3335   float device_scale = 1.7f;
3336   float page_scale = 3.2f;
3337   float scale = 1.f;
3338
3339   SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
3340   ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
3341
3342   // We only have ideal tilings, so they aren't removed.
3343   used_tilings.clear();
3344   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3345   ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
3346
3347   host_impl_.PinchGestureBegin();
3348
3349   // Changing the ideal but not creating new tilings.
3350   scale *= 1.5f;
3351   page_scale *= 1.5f;
3352   SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
3353   ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
3354
3355   // The tilings are still our target scale, so they aren't removed.
3356   used_tilings.clear();
3357   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3358   ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
3359
3360   host_impl_.PinchGestureEnd();
3361
3362   // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2.
3363   scale /= 4.f;
3364   page_scale /= 4.f;
3365   SetContentsScaleOnBothLayers(1.2f, device_scale, page_scale, 1.f, false);
3366   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3367   EXPECT_FLOAT_EQ(1.f,
3368                   active_layer_->tilings()->tiling_at(1)->contents_scale());
3369
3370   // Mark the non-ideal tilings as used. They won't be removed.
3371   used_tilings.clear();
3372   used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
3373   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3374   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3375
3376   // Now move the ideal scale to 0.5. Our target stays 1.2.
3377   SetContentsScaleOnBothLayers(0.5f, device_scale, page_scale, 1.f, false);
3378
3379   // The high resolution tiling is between target and ideal, so is not
3380   // removed.  The low res tiling for the old ideal=1.0 scale is removed.
3381   used_tilings.clear();
3382   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3383   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3384
3385   // Now move the ideal scale to 1.0. Our target stays 1.2.
3386   SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, 1.f, false);
3387
3388   // All the tilings are between are target and the ideal, so they are not
3389   // removed.
3390   used_tilings.clear();
3391   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3392   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3393
3394   // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2.
3395   SetupDrawPropertiesAndUpdateTiles(
3396       active_layer_, 1.1f, device_scale, page_scale, 1.f, false);
3397
3398   // Because the pending layer's ideal scale is still 1.0, our tilings fall
3399   // in the range [1.0,1.2] and are kept.
3400   used_tilings.clear();
3401   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3402   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3403
3404   // Move the ideal scale on the pending layer to 1.1 as well. Our target stays
3405   // 1.2 still.
3406   SetupDrawPropertiesAndUpdateTiles(
3407       pending_layer_, 1.1f, device_scale, page_scale, 1.f, false);
3408
3409   // Our 1.0 tiling now falls outside the range between our ideal scale and our
3410   // target raster scale. But it is in our used tilings set, so nothing is
3411   // deleted.
3412   used_tilings.clear();
3413   used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
3414   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3415   ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
3416
3417   // If we remove it from our used tilings set, it is outside the range to keep
3418   // so it is deleted.
3419   used_tilings.clear();
3420   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3421   ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
3422 }
3423
3424 TEST_F(PictureLayerImplTest, ScaleCollision) {
3425   gfx::Size tile_size(400, 400);
3426   gfx::Size layer_bounds(1300, 1900);
3427
3428   scoped_refptr<FakePicturePileImpl> pending_pile =
3429       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3430   scoped_refptr<FakePicturePileImpl> active_pile =
3431       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3432
3433   std::vector<PictureLayerTiling*> used_tilings;
3434
3435   SetupTrees(pending_pile, active_pile);
3436
3437   float pending_contents_scale = 1.f;
3438   float active_contents_scale = 2.f;
3439   float device_scale_factor = 1.f;
3440   float page_scale_factor = 1.f;
3441   float maximum_animation_contents_scale = 1.f;
3442   bool animating_transform = false;
3443
3444   EXPECT_TRUE(host_impl_.settings().create_low_res_tiling);
3445   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
3446   EXPECT_LT(low_res_factor, 1.f);
3447
3448   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3449                                     pending_contents_scale,
3450                                     device_scale_factor,
3451                                     page_scale_factor,
3452                                     maximum_animation_contents_scale,
3453                                     animating_transform);
3454   SetupDrawPropertiesAndUpdateTiles(active_layer_,
3455                                     active_contents_scale,
3456                                     device_scale_factor,
3457                                     page_scale_factor,
3458                                     maximum_animation_contents_scale,
3459                                     animating_transform);
3460
3461   ASSERT_EQ(4u, pending_layer_->tilings()->num_tilings());
3462   ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
3463
3464   EXPECT_EQ(active_contents_scale,
3465             pending_layer_->tilings()->tiling_at(0)->contents_scale());
3466   EXPECT_EQ(pending_contents_scale,
3467             pending_layer_->tilings()->tiling_at(1)->contents_scale());
3468   EXPECT_EQ(active_contents_scale * low_res_factor,
3469             pending_layer_->tilings()->tiling_at(2)->contents_scale());
3470   EXPECT_EQ(pending_contents_scale * low_res_factor,
3471             pending_layer_->tilings()->tiling_at(3)->contents_scale());
3472
3473   EXPECT_EQ(active_contents_scale,
3474             active_layer_->tilings()->tiling_at(0)->contents_scale());
3475   EXPECT_EQ(pending_contents_scale,
3476             active_layer_->tilings()->tiling_at(1)->contents_scale());
3477   EXPECT_EQ(active_contents_scale * low_res_factor,
3478             active_layer_->tilings()->tiling_at(2)->contents_scale());
3479   EXPECT_EQ(pending_contents_scale * low_res_factor,
3480             active_layer_->tilings()->tiling_at(3)->contents_scale());
3481
3482   // The unused low res tiling from the pending tree must be kept or we may add
3483   // it again on the active tree and collide with the pending tree.
3484   used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
3485   active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
3486   ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
3487
3488   EXPECT_EQ(active_contents_scale,
3489             active_layer_->tilings()->tiling_at(0)->contents_scale());
3490   EXPECT_EQ(pending_contents_scale,
3491             active_layer_->tilings()->tiling_at(1)->contents_scale());
3492   EXPECT_EQ(active_contents_scale * low_res_factor,
3493             active_layer_->tilings()->tiling_at(2)->contents_scale());
3494   EXPECT_EQ(pending_contents_scale * low_res_factor,
3495             active_layer_->tilings()->tiling_at(3)->contents_scale());
3496 }
3497
3498 TEST_F(NoLowResPictureLayerImplTest, ReleaseResources) {
3499   gfx::Size tile_size(400, 400);
3500   gfx::Size layer_bounds(1300, 1900);
3501
3502   scoped_refptr<FakePicturePileImpl> pending_pile =
3503       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3504   scoped_refptr<FakePicturePileImpl> active_pile =
3505       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3506
3507   SetupTrees(pending_pile, active_pile);
3508   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
3509
3510   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3511                                     1.3f,  // ideal contents scale
3512                                     2.7f,  // device scale
3513                                     3.2f,  // page scale
3514                                     1.f,   // maximum animation scale
3515                                     false);
3516   EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
3517
3518   // All tilings should be removed when losing output surface.
3519   active_layer_->ReleaseResources();
3520   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
3521   pending_layer_->ReleaseResources();
3522   EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
3523
3524   // This should create new tilings.
3525   SetupDrawPropertiesAndUpdateTiles(pending_layer_,
3526                                     1.3f,  // ideal contents scale
3527                                     2.7f,  // device scale
3528                                     3.2f,  // page scale
3529                                     1.f,   // maximum animation scale
3530                                     false);
3531   EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
3532 }
3533
3534 TEST_F(PictureLayerImplTest, SharedQuadStateContainsMaxTilingScale) {
3535   MockOcclusionTracker<LayerImpl> occlusion_tracker;
3536   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
3537
3538   gfx::Size tile_size(400, 400);
3539   gfx::Size layer_bounds(1000, 2000);
3540
3541   scoped_refptr<FakePicturePileImpl> pending_pile =
3542       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3543   scoped_refptr<FakePicturePileImpl> active_pile =
3544       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3545
3546   SetupTrees(pending_pile, active_pile);
3547
3548   SetupDrawPropertiesAndUpdateTiles(pending_layer_, 2.5f, 1.f, 1.f, 1.f, false);
3549   host_impl_.pending_tree()->UpdateDrawProperties();
3550
3551   active_layer_->draw_properties().visible_content_rect =
3552       gfx::Rect(layer_bounds);
3553   host_impl_.active_tree()->UpdateDrawProperties();
3554
3555   float max_contents_scale = active_layer_->MaximumTilingContentsScale();
3556   gfx::Transform scaled_draw_transform = active_layer_->draw_transform();
3557   scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale,
3558                               SK_MScalar1 / max_contents_scale);
3559
3560   AppendQuadsData data;
3561   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
3562
3563   // SharedQuadState should have be of size 1, as we are doing AppenQuad once.
3564   EXPECT_EQ(1u, render_pass->shared_quad_state_list.size());
3565   // The content_to_target_transform should be scaled by the
3566   // MaximumTilingContentsScale on the layer.
3567   EXPECT_EQ(scaled_draw_transform.ToString(),
3568             render_pass->shared_quad_state_list[0]
3569                 ->content_to_target_transform.ToString());
3570   // The content_bounds should be scaled by the
3571   // MaximumTilingContentsScale on the layer.
3572   EXPECT_EQ(gfx::Size(2500u, 5000u).ToString(),
3573             render_pass->shared_quad_state_list[0]->content_bounds.ToString());
3574   // The visible_content_rect should be scaled by the
3575   // MaximumTilingContentsScale on the layer.
3576   EXPECT_EQ(
3577       gfx::Rect(0u, 0u, 2500u, 5000u).ToString(),
3578       render_pass->shared_quad_state_list[0]->visible_content_rect.ToString());
3579 }
3580
3581 TEST_F(PictureLayerImplTest, UpdateTilesForMasksWithNoVisibleContent) {
3582   gfx::Size tile_size(400, 400);
3583   gfx::Size bounds(100000, 100);
3584
3585   host_impl_.CreatePendingTree();
3586
3587   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_.pending_tree(), 1);
3588
3589   scoped_ptr<FakePictureLayerImpl> layer_with_mask =
3590       FakePictureLayerImpl::Create(host_impl_.pending_tree(), 2);
3591
3592   layer_with_mask->SetBounds(bounds);
3593   layer_with_mask->SetContentBounds(bounds);
3594
3595   scoped_refptr<FakePicturePileImpl> pending_pile =
3596       FakePicturePileImpl::CreateFilledPile(tile_size, bounds);
3597   pending_pile->set_is_mask(true);
3598   scoped_ptr<FakePictureLayerImpl> mask = FakePictureLayerImpl::CreateWithPile(
3599       host_impl_.pending_tree(), 3, pending_pile);
3600
3601   mask->SetBounds(bounds);
3602   mask->SetContentBounds(bounds);
3603   mask->SetDrawsContent(true);
3604
3605   FakePictureLayerImpl* pending_mask_content = mask.get();
3606   layer_with_mask->SetMaskLayer(mask.PassAs<LayerImpl>());
3607
3608   scoped_ptr<FakePictureLayerImpl> child_of_layer_with_mask =
3609       FakePictureLayerImpl::Create(host_impl_.pending_tree(), 4);
3610
3611   child_of_layer_with_mask->SetBounds(bounds);
3612   child_of_layer_with_mask->SetContentBounds(bounds);
3613   child_of_layer_with_mask->SetDrawsContent(true);
3614
3615   layer_with_mask->AddChild(child_of_layer_with_mask.PassAs<LayerImpl>());
3616
3617   root->AddChild(layer_with_mask.PassAs<LayerImpl>());
3618
3619   host_impl_.pending_tree()->SetRootLayer(root.Pass());
3620
3621   EXPECT_FALSE(pending_mask_content->tilings());
3622   host_impl_.pending_tree()->UpdateDrawProperties();
3623   EXPECT_NE(0u, pending_mask_content->num_tilings());
3624 }
3625
3626 class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest {
3627  public:
3628   PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {}
3629
3630   virtual void InitializeRenderer() OVERRIDE {
3631     host_impl_.InitializeRenderer(
3632         FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>());
3633   }
3634 };
3635
3636 TEST_F(PictureLayerImplTestWithDelegatingRenderer,
3637        DelegatingRendererWithTileOOM) {
3638   // This test is added for crbug.com/402321, where quad should be produced when
3639   // raster on demand is not allowed and tile is OOM.
3640   gfx::Size tile_size = host_impl_.settings().default_tile_size;
3641   gfx::Size layer_bounds(1000, 1000);
3642
3643   // Create tiles.
3644   scoped_refptr<FakePicturePileImpl> pending_pile =
3645       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3646   SetupPendingTree(pending_pile);
3647   pending_layer_->SetBounds(layer_bounds);
3648   host_impl_.SetViewportSize(layer_bounds);
3649   ActivateTree();
3650   host_impl_.active_tree()->UpdateDrawProperties();
3651   std::vector<Tile*> tiles =
3652       active_layer_->HighResTiling()->AllTilesForTesting();
3653   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
3654
3655   // Force tiles after max_tiles to be OOM. TileManager uses
3656   // GlobalStateThatImpactsTilesPriority from LayerTreeHostImpl, and we cannot
3657   // directly set state to host_impl_, so we set policy that would change the
3658   // state. We also need to update tree priority separately.
3659   GlobalStateThatImpactsTilePriority state;
3660   size_t max_tiles = 1;
3661   size_t memory_limit = max_tiles * 4 * tile_size.width() * tile_size.height();
3662   size_t resource_limit = max_tiles;
3663   ManagedMemoryPolicy policy(memory_limit,
3664                              gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
3665                              resource_limit);
3666   host_impl_.SetMemoryPolicy(policy);
3667   host_impl_.SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
3668   host_impl_.ManageTiles();
3669
3670   MockOcclusionTracker<LayerImpl> occlusion_tracker;
3671   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
3672   AppendQuadsData data;
3673   active_layer_->WillDraw(DRAW_MODE_HARDWARE, NULL);
3674   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
3675   active_layer_->DidDraw(NULL);
3676
3677   // Even when OOM, quads should be produced, and should be different material
3678   // from quads with resource.
3679   EXPECT_LT(max_tiles, render_pass->quad_list.size());
3680   EXPECT_EQ(DrawQuad::Material::TILED_CONTENT,
3681             render_pass->quad_list.front()->material);
3682   EXPECT_EQ(DrawQuad::Material::SOLID_COLOR,
3683             render_pass->quad_list.back()->material);
3684 }
3685
3686 class OcclusionTrackingSettings : public LowResTilingsSettings {
3687  public:
3688   OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3689 };
3690
3691 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3692  public:
3693   OcclusionTrackingPictureLayerImplTest()
3694       : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3695
3696   void VerifyEvictionConsidersOcclusion(
3697       PictureLayerImpl* layer,
3698       size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) {
3699     for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES;
3700          ++priority_count) {
3701       TreePriority tree_priority = static_cast<TreePriority>(priority_count);
3702       size_t occluded_tile_count = 0u;
3703       Tile* last_tile = NULL;
3704
3705       for (PictureLayerImpl::LayerEvictionTileIterator it =
3706                PictureLayerImpl::LayerEvictionTileIterator(layer,
3707                                                            tree_priority);
3708            it;
3709            ++it) {
3710         Tile* tile = *it;
3711         if (!last_tile)
3712           last_tile = tile;
3713
3714         // The only way we will encounter an occluded tile after an unoccluded
3715         // tile is if the priorty bin decreased, the tile is required for
3716         // activation, or the scale changed.
3717         bool tile_is_occluded =
3718             tile->is_occluded_for_tree_priority(tree_priority);
3719         if (tile_is_occluded) {
3720           occluded_tile_count++;
3721
3722           bool last_tile_is_occluded =
3723               last_tile->is_occluded_for_tree_priority(tree_priority);
3724           if (!last_tile_is_occluded) {
3725             TilePriority::PriorityBin tile_priority_bin =
3726                 tile->priority_for_tree_priority(tree_priority).priority_bin;
3727             TilePriority::PriorityBin last_tile_priority_bin =
3728                 last_tile->priority_for_tree_priority(tree_priority)
3729                     .priority_bin;
3730
3731             EXPECT_TRUE(
3732                 (tile_priority_bin < last_tile_priority_bin) ||
3733                 tile->required_for_activation() ||
3734                 (tile->contents_scale() != last_tile->contents_scale()));
3735           }
3736         }
3737         last_tile = tile;
3738       }
3739       EXPECT_EQ(expected_occluded_tile_count[priority_count],
3740                 occluded_tile_count);
3741     }
3742   }
3743 };
3744
3745 TEST_F(OcclusionTrackingPictureLayerImplTest,
3746        OccludedTilesSkippedDuringRasterization) {
3747   base::TimeTicks time_ticks;
3748   time_ticks += base::TimeDelta::FromMilliseconds(1);
3749   host_impl_.SetCurrentBeginFrameArgs(
3750       CreateBeginFrameArgsForTesting(time_ticks));
3751
3752   gfx::Size tile_size(102, 102);
3753   gfx::Size layer_bounds(1000, 1000);
3754   gfx::Size viewport_size(500, 500);
3755   gfx::Point occluding_layer_position(310, 0);
3756
3757   scoped_refptr<FakePicturePileImpl> pending_pile =
3758       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3759   SetupPendingTree(pending_pile);
3760   pending_layer_->set_fixed_tile_size(tile_size);
3761
3762   host_impl_.SetViewportSize(viewport_size);
3763   host_impl_.pending_tree()->UpdateDrawProperties();
3764
3765   // No occlusion.
3766   int unoccluded_tile_count = 0;
3767   for (PictureLayerImpl::LayerRasterTileIterator it =
3768            PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
3769        it;
3770        ++it) {
3771     Tile* tile = *it;
3772
3773     // Occluded tiles should not be iterated over.
3774     EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
3775
3776     // Some tiles may not be visible (i.e. outside the viewport). The rest are
3777     // visible and at least partially unoccluded, verified by the above expect.
3778     bool tile_is_visible =
3779         tile->content_rect().Intersects(pending_layer_->visible_content_rect());
3780     if (tile_is_visible)
3781       unoccluded_tile_count++;
3782   }
3783   EXPECT_EQ(unoccluded_tile_count, 25 + 4);
3784
3785   // Partial occlusion.
3786   pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
3787   LayerImpl* layer1 = pending_layer_->children()[0];
3788   layer1->SetBounds(layer_bounds);
3789   layer1->SetContentBounds(layer_bounds);
3790   layer1->SetDrawsContent(true);
3791   layer1->SetContentsOpaque(true);
3792   layer1->SetPosition(occluding_layer_position);
3793
3794   time_ticks += base::TimeDelta::FromMilliseconds(200);
3795   host_impl_.SetCurrentBeginFrameArgs(
3796       CreateBeginFrameArgsForTesting(time_ticks));
3797   host_impl_.pending_tree()->UpdateDrawProperties();
3798
3799   unoccluded_tile_count = 0;
3800   for (PictureLayerImpl::LayerRasterTileIterator it =
3801            PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
3802        it;
3803        ++it) {
3804     Tile* tile = *it;
3805
3806     EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
3807
3808     bool tile_is_visible =
3809         tile->content_rect().Intersects(pending_layer_->visible_content_rect());
3810     if (tile_is_visible)
3811       unoccluded_tile_count++;
3812   }
3813   EXPECT_EQ(unoccluded_tile_count, 20 + 2);
3814
3815   // Full occlusion.
3816   layer1->SetPosition(gfx::Point(0, 0));
3817
3818   time_ticks += base::TimeDelta::FromMilliseconds(200);
3819   host_impl_.SetCurrentBeginFrameArgs(
3820       CreateBeginFrameArgsForTesting(time_ticks));
3821   host_impl_.pending_tree()->UpdateDrawProperties();
3822
3823   unoccluded_tile_count = 0;
3824   for (PictureLayerImpl::LayerRasterTileIterator it =
3825            PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false);
3826        it;
3827        ++it) {
3828     Tile* tile = *it;
3829
3830     EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
3831
3832     bool tile_is_visible =
3833         tile->content_rect().Intersects(pending_layer_->visible_content_rect());
3834     if (tile_is_visible)
3835       unoccluded_tile_count++;
3836   }
3837   EXPECT_EQ(unoccluded_tile_count, 0);
3838 }
3839
3840 TEST_F(OcclusionTrackingPictureLayerImplTest,
3841        OccludedTilesNotMarkedAsRequired) {
3842   base::TimeTicks time_ticks;
3843   time_ticks += base::TimeDelta::FromMilliseconds(1);
3844   host_impl_.SetCurrentBeginFrameArgs(
3845       CreateBeginFrameArgsForTesting(time_ticks));
3846
3847   gfx::Size tile_size(102, 102);
3848   gfx::Size layer_bounds(1000, 1000);
3849   gfx::Size viewport_size(500, 500);
3850   gfx::Point occluding_layer_position(310, 0);
3851
3852   scoped_refptr<FakePicturePileImpl> pending_pile =
3853       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3854   SetupPendingTree(pending_pile);
3855   pending_layer_->set_fixed_tile_size(tile_size);
3856
3857   host_impl_.SetViewportSize(viewport_size);
3858   host_impl_.pending_tree()->UpdateDrawProperties();
3859
3860   // No occlusion.
3861   int occluded_tile_count = 0;
3862   for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
3863     PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
3864
3865     occluded_tile_count = 0;
3866     for (PictureLayerTiling::CoverageIterator iter(
3867              tiling,
3868              pending_layer_->contents_scale_x(),
3869              gfx::Rect(layer_bounds));
3870          iter;
3871          ++iter) {
3872       if (!*iter)
3873         continue;
3874       const Tile* tile = *iter;
3875
3876       // Fully occluded tiles are not required for activation.
3877       if (tile->is_occluded(PENDING_TREE)) {
3878         EXPECT_FALSE(tile->required_for_activation());
3879         occluded_tile_count++;
3880       }
3881     }
3882     EXPECT_EQ(occluded_tile_count, 0);
3883   }
3884
3885   // Partial occlusion.
3886   pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
3887   LayerImpl* layer1 = pending_layer_->children()[0];
3888   layer1->SetBounds(layer_bounds);
3889   layer1->SetContentBounds(layer_bounds);
3890   layer1->SetDrawsContent(true);
3891   layer1->SetContentsOpaque(true);
3892   layer1->SetPosition(occluding_layer_position);
3893
3894   time_ticks += base::TimeDelta::FromMilliseconds(200);
3895   host_impl_.SetCurrentBeginFrameArgs(
3896       CreateBeginFrameArgsForTesting(time_ticks));
3897   host_impl_.pending_tree()->UpdateDrawProperties();
3898
3899   for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
3900     PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
3901
3902     occluded_tile_count = 0;
3903     for (PictureLayerTiling::CoverageIterator iter(
3904              tiling,
3905              pending_layer_->contents_scale_x(),
3906              gfx::Rect(layer_bounds));
3907          iter;
3908          ++iter) {
3909       if (!*iter)
3910         continue;
3911       const Tile* tile = *iter;
3912
3913       if (tile->is_occluded(PENDING_TREE)) {
3914         EXPECT_FALSE(tile->required_for_activation());
3915         occluded_tile_count++;
3916       }
3917     }
3918     switch (i) {
3919       case 0:
3920         EXPECT_EQ(occluded_tile_count, 5);
3921         break;
3922       case 1:
3923         EXPECT_EQ(occluded_tile_count, 2);
3924         break;
3925       default:
3926         NOTREACHED();
3927     }
3928   }
3929
3930   // Full occlusion.
3931   layer1->SetPosition(gfx::PointF(0, 0));
3932
3933   time_ticks += base::TimeDelta::FromMilliseconds(200);
3934   host_impl_.SetCurrentBeginFrameArgs(
3935       CreateBeginFrameArgsForTesting(time_ticks));
3936   host_impl_.pending_tree()->UpdateDrawProperties();
3937
3938   for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
3939     PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
3940
3941     occluded_tile_count = 0;
3942     for (PictureLayerTiling::CoverageIterator iter(
3943              tiling,
3944              pending_layer_->contents_scale_x(),
3945              gfx::Rect(layer_bounds));
3946          iter;
3947          ++iter) {
3948       if (!*iter)
3949         continue;
3950       const Tile* tile = *iter;
3951
3952       if (tile->is_occluded(PENDING_TREE)) {
3953         EXPECT_FALSE(tile->required_for_activation());
3954         occluded_tile_count++;
3955       }
3956     }
3957     switch (i) {
3958       case 0:
3959         EXPECT_EQ(occluded_tile_count, 25);
3960         break;
3961       case 1:
3962         EXPECT_EQ(occluded_tile_count, 4);
3963         break;
3964       default:
3965         NOTREACHED();
3966     }
3967   }
3968 }
3969
3970 TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) {
3971   gfx::Size tile_size(102, 102);
3972   gfx::Size layer_bounds(1000, 1000);
3973   gfx::Size viewport_size(500, 500);
3974   gfx::Point occluding_layer_position(310, 0);
3975
3976   scoped_refptr<FakePicturePileImpl> pending_pile =
3977       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
3978   SetupPendingTree(pending_pile);
3979   pending_layer_->set_fixed_tile_size(tile_size);
3980
3981   ASSERT_TRUE(pending_layer_->CanHaveTilings());
3982
3983   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
3984
3985   std::vector<PictureLayerTiling*> tilings;
3986   tilings.push_back(pending_layer_->AddTiling(low_res_factor));
3987   tilings.push_back(pending_layer_->AddTiling(0.3f));
3988   tilings.push_back(pending_layer_->AddTiling(0.7f));
3989   tilings.push_back(pending_layer_->AddTiling(1.0f));
3990   tilings.push_back(pending_layer_->AddTiling(2.0f));
3991
3992   pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
3993   LayerImpl* layer1 = pending_layer_->children()[0];
3994   layer1->SetBounds(layer_bounds);
3995   layer1->SetContentBounds(layer_bounds);
3996   layer1->SetDrawsContent(true);
3997   layer1->SetContentsOpaque(true);
3998   layer1->SetPosition(occluding_layer_position);
3999
4000   host_impl_.SetViewportSize(viewport_size);
4001   host_impl_.pending_tree()->UpdateDrawProperties();
4002
4003   int tiling_count = 0;
4004   int occluded_tile_count = 0;
4005   for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
4006            tilings.begin();
4007        tiling_iterator != tilings.end();
4008        ++tiling_iterator) {
4009     std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
4010
4011     occluded_tile_count = 0;
4012     for (size_t i = 0; i < tiles.size(); ++i) {
4013       if (tiles[i]->is_occluded(PENDING_TREE)) {
4014         gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
4015             tiles[i]->content_rect(), 1.0f / tiles[i]->contents_scale());
4016         EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x());
4017         occluded_tile_count++;
4018       }
4019     }
4020     switch (tiling_count) {
4021       case 0:
4022       case 1:
4023         EXPECT_EQ(occluded_tile_count, 2);
4024         break;
4025       case 2:
4026         EXPECT_EQ(occluded_tile_count, 4);
4027         break;
4028       case 3:
4029         EXPECT_EQ(occluded_tile_count, 5);
4030         break;
4031       case 4:
4032         EXPECT_EQ(occluded_tile_count, 30);
4033         break;
4034       default:
4035         NOTREACHED();
4036     }
4037
4038     tiling_count++;
4039   }
4040
4041   EXPECT_EQ(tiling_count, 5);
4042 }
4043
4044 TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) {
4045   gfx::Size tile_size(102, 102);
4046   gfx::Size layer_bounds(1000, 1000);
4047   gfx::Size viewport_size(1000, 1000);
4048   gfx::Point occluding_layer_position(310, 0);
4049   gfx::Rect invalidation_rect(230, 230, 102, 102);
4050
4051   scoped_refptr<FakePicturePileImpl> pending_pile =
4052       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4053   scoped_refptr<FakePicturePileImpl> active_pile =
4054       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4055   SetupTrees(pending_pile, active_pile);
4056
4057   // Partially occlude the active layer.
4058   active_layer_->AddChild(LayerImpl::Create(host_impl_.active_tree(), 2));
4059   LayerImpl* layer1 = active_layer_->children()[0];
4060   layer1->SetBounds(layer_bounds);
4061   layer1->SetContentBounds(layer_bounds);
4062   layer1->SetDrawsContent(true);
4063   layer1->SetContentsOpaque(true);
4064   layer1->SetPosition(occluding_layer_position);
4065
4066   // Partially invalidate the pending layer.
4067   pending_layer_->set_invalidation(invalidation_rect);
4068
4069   host_impl_.SetViewportSize(viewport_size);
4070
4071   active_layer_->CreateDefaultTilingsAndTiles();
4072   pending_layer_->CreateDefaultTilingsAndTiles();
4073
4074   for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4075     PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4076
4077     for (PictureLayerTiling::CoverageIterator iter(
4078              tiling,
4079              pending_layer_->contents_scale_x(),
4080              gfx::Rect(layer_bounds));
4081          iter;
4082          ++iter) {
4083       if (!*iter)
4084         continue;
4085       const Tile* tile = *iter;
4086
4087       // All tiles are unoccluded on the pending tree.
4088       EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
4089
4090       Tile* twin_tile =
4091           pending_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j());
4092       gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
4093           tile->content_rect(), 1.0f / tile->contents_scale());
4094
4095       if (scaled_content_rect.Intersects(invalidation_rect)) {
4096         // Tiles inside the invalidation rect are only on the pending tree.
4097         EXPECT_NE(tile, twin_tile);
4098
4099         // Unshared tiles should be unoccluded on the active tree by default.
4100         EXPECT_FALSE(tile->is_occluded(ACTIVE_TREE));
4101       } else {
4102         // Tiles outside the invalidation rect are shared between both trees.
4103         EXPECT_EQ(tile, twin_tile);
4104         // Shared tiles are occluded on the active tree iff they lie beneath the
4105         // occluding layer.
4106         EXPECT_EQ(tile->is_occluded(ACTIVE_TREE),
4107                   scaled_content_rect.x() >= occluding_layer_position.x());
4108       }
4109     }
4110   }
4111
4112   for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
4113     PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i);
4114
4115     for (PictureLayerTiling::CoverageIterator iter(
4116              tiling,
4117              active_layer_->contents_scale_x(),
4118              gfx::Rect(layer_bounds));
4119          iter;
4120          ++iter) {
4121       if (!*iter)
4122         continue;
4123       const Tile* tile = *iter;
4124
4125       Tile* twin_tile =
4126           active_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j());
4127       gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
4128           tile->content_rect(), 1.0f / tile->contents_scale());
4129
4130       // Since we've already checked the shared tiles, only consider tiles in
4131       // the invalidation rect.
4132       if (scaled_content_rect.Intersects(invalidation_rect)) {
4133         // Tiles inside the invalidation rect are only on the active tree.
4134         EXPECT_NE(tile, twin_tile);
4135
4136         // Unshared tiles should be unoccluded on the pending tree by default.
4137         EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
4138
4139         // Unshared tiles are occluded on the active tree iff they lie beneath
4140         // the occluding layer.
4141         EXPECT_EQ(tile->is_occluded(ACTIVE_TREE),
4142                   scaled_content_rect.x() >= occluding_layer_position.x());
4143       }
4144     }
4145   }
4146 }
4147
4148 TEST_F(OcclusionTrackingPictureLayerImplTest,
4149        OccludedTilesConsideredDuringEviction) {
4150   gfx::Size tile_size(102, 102);
4151   gfx::Size layer_bounds(1000, 1000);
4152   gfx::Size viewport_size(500, 500);
4153   gfx::Point pending_occluding_layer_position(310, 0);
4154   gfx::Point active_occluding_layer_position(0, 310);
4155   gfx::Rect invalidation_rect(230, 230, 102, 102);
4156
4157   scoped_refptr<FakePicturePileImpl> pending_pile =
4158       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4159   scoped_refptr<FakePicturePileImpl> active_pile =
4160       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4161   SetupTrees(pending_pile, active_pile);
4162
4163   pending_layer_->set_fixed_tile_size(tile_size);
4164   active_layer_->set_fixed_tile_size(tile_size);
4165
4166   float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
4167
4168   std::vector<PictureLayerTiling*> tilings;
4169   tilings.push_back(pending_layer_->AddTiling(low_res_factor));
4170   tilings.push_back(pending_layer_->AddTiling(0.3f));
4171   tilings.push_back(pending_layer_->AddTiling(0.7f));
4172   tilings.push_back(pending_layer_->AddTiling(1.0f));
4173   tilings.push_back(pending_layer_->AddTiling(2.0f));
4174
4175   EXPECT_EQ(5u, pending_layer_->num_tilings());
4176   EXPECT_EQ(5u, active_layer_->num_tilings());
4177
4178   // Partially occlude the pending layer.
4179   pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
4180   LayerImpl* pending_occluding_layer = pending_layer_->children()[0];
4181   pending_occluding_layer->SetBounds(layer_bounds);
4182   pending_occluding_layer->SetContentBounds(layer_bounds);
4183   pending_occluding_layer->SetDrawsContent(true);
4184   pending_occluding_layer->SetContentsOpaque(true);
4185   pending_occluding_layer->SetPosition(pending_occluding_layer_position);
4186
4187   // Partially occlude the active layer.
4188   active_layer_->AddChild(LayerImpl::Create(host_impl_.active_tree(), 2));
4189   LayerImpl* active_occluding_layer = active_layer_->children()[0];
4190   active_occluding_layer->SetBounds(layer_bounds);
4191   active_occluding_layer->SetContentBounds(layer_bounds);
4192   active_occluding_layer->SetDrawsContent(true);
4193   active_occluding_layer->SetContentsOpaque(true);
4194   active_occluding_layer->SetPosition(active_occluding_layer_position);
4195
4196   // Partially invalidate the pending layer. Tiles inside the invalidation rect
4197   // are not shared between trees.
4198   pending_layer_->set_invalidation(invalidation_rect);
4199
4200   host_impl_.SetViewportSize(viewport_size);
4201   host_impl_.active_tree()->UpdateDrawProperties();
4202   host_impl_.pending_tree()->UpdateDrawProperties();
4203
4204   // The expected number of occluded tiles on each of the 5 tilings for each of
4205   // the 3 tree priorities.
4206   size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u};
4207   size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u};
4208   size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u};
4209
4210   // The total expected number of occluded tiles on all tilings for each of the
4211   // 3 tree priorities.
4212   size_t total_expected_occluded_tile_count[] = {13u, 43u, 43u};
4213
4214   ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
4215
4216   // Verify number of occluded tiles on the pending layer for each tiling.
4217   for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4218     PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4219     tiling->CreateAllTilesForTesting();
4220
4221     size_t occluded_tile_count_on_pending = 0u;
4222     size_t occluded_tile_count_on_active = 0u;
4223     size_t occluded_tile_count_on_both = 0u;
4224     for (PictureLayerTiling::CoverageIterator iter(
4225              tiling,
4226              pending_layer_->contents_scale_x(),
4227              gfx::Rect(layer_bounds));
4228          iter;
4229          ++iter) {
4230       Tile* tile = *iter;
4231
4232       if (tile->is_occluded(PENDING_TREE))
4233         occluded_tile_count_on_pending++;
4234       if (tile->is_occluded(ACTIVE_TREE))
4235         occluded_tile_count_on_active++;
4236       if (tile->is_occluded(PENDING_TREE) && tile->is_occluded(ACTIVE_TREE))
4237         occluded_tile_count_on_both++;
4238     }
4239     EXPECT_EQ(expected_occluded_tile_count_on_pending[i],
4240               occluded_tile_count_on_pending)
4241         << i;
4242     EXPECT_EQ(expected_occluded_tile_count_on_active[i],
4243               occluded_tile_count_on_active)
4244         << i;
4245     EXPECT_EQ(expected_occluded_tile_count_on_both[i],
4246               occluded_tile_count_on_both)
4247         << i;
4248   }
4249
4250   // Verify number of occluded tiles on the active layer for each tiling.
4251   for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
4252     PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i);
4253     tiling->CreateAllTilesForTesting();
4254
4255     size_t occluded_tile_count_on_pending = 0u;
4256     size_t occluded_tile_count_on_active = 0u;
4257     size_t occluded_tile_count_on_both = 0u;
4258     for (PictureLayerTiling::CoverageIterator iter(
4259              tiling,
4260              pending_layer_->contents_scale_x(),
4261              gfx::Rect(layer_bounds));
4262          iter;
4263          ++iter) {
4264       Tile* tile = *iter;
4265
4266       if (tile->is_occluded(PENDING_TREE))
4267         occluded_tile_count_on_pending++;
4268       if (tile->is_occluded(ACTIVE_TREE))
4269         occluded_tile_count_on_active++;
4270       if (tile->is_occluded(PENDING_TREE) && tile->is_occluded(ACTIVE_TREE))
4271         occluded_tile_count_on_both++;
4272     }
4273     EXPECT_EQ(expected_occluded_tile_count_on_pending[i],
4274               occluded_tile_count_on_pending)
4275         << i;
4276     EXPECT_EQ(expected_occluded_tile_count_on_active[i],
4277               occluded_tile_count_on_active)
4278         << i;
4279     EXPECT_EQ(expected_occluded_tile_count_on_both[i],
4280               occluded_tile_count_on_both)
4281         << i;
4282   }
4283
4284   std::vector<Tile*> all_tiles;
4285   for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
4286            tilings.begin();
4287        tiling_iterator != tilings.end();
4288        ++tiling_iterator) {
4289     std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
4290     std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
4291   }
4292
4293   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
4294
4295   VerifyEvictionConsidersOcclusion(pending_layer_,
4296                                    total_expected_occluded_tile_count);
4297   VerifyEvictionConsidersOcclusion(active_layer_,
4298                                    total_expected_occluded_tile_count);
4299 }
4300
4301 TEST_F(PictureLayerImplTest, RecycledTwinLayer) {
4302   gfx::Size tile_size(102, 102);
4303   gfx::Size layer_bounds(1000, 1000);
4304
4305   scoped_refptr<FakePicturePileImpl> pile =
4306       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4307   SetupPendingTree(pile);
4308   EXPECT_FALSE(pending_layer_->GetRecycledTwinLayer());
4309
4310   ActivateTree();
4311   EXPECT_TRUE(active_layer_->GetRecycledTwinLayer());
4312   EXPECT_EQ(old_pending_layer_, active_layer_->GetRecycledTwinLayer());
4313
4314   SetupPendingTree(pile);
4315   EXPECT_FALSE(pending_layer_->GetRecycledTwinLayer());
4316   EXPECT_FALSE(active_layer_->GetRecycledTwinLayer());
4317
4318   ActivateTree();
4319   EXPECT_TRUE(active_layer_->GetRecycledTwinLayer());
4320   EXPECT_EQ(old_pending_layer_, active_layer_->GetRecycledTwinLayer());
4321
4322   host_impl_.ResetRecycleTreeForTesting();
4323   EXPECT_FALSE(active_layer_->GetRecycledTwinLayer());
4324 }
4325
4326 void PictureLayerImplTest::TestQuadsForSolidColor(bool test_for_solid) {
4327   base::TimeTicks time_ticks;
4328   time_ticks += base::TimeDelta::FromMilliseconds(1);
4329   host_impl_.SetCurrentBeginFrameArgs(
4330       CreateBeginFrameArgsForTesting(time_ticks));
4331
4332   gfx::Size tile_size(100, 100);
4333   gfx::Size layer_bounds(200, 200);
4334   gfx::Rect layer_rect(layer_bounds);
4335
4336   FakeContentLayerClient client;
4337   scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client);
4338   FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
4339   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&host_client);
4340   host->SetRootLayer(layer);
4341   PicturePile* pile = layer->GetPicturePileForTesting();
4342
4343   host_impl_.SetViewportSize(layer_bounds);
4344
4345   int frame_number = 0;
4346   FakeRenderingStatsInstrumentation stats_instrumentation;
4347
4348   client.set_fill_with_nonsolid_color(!test_for_solid);
4349
4350   Region invalidation(layer_rect);
4351   pile->UpdateAndExpandInvalidation(&client,
4352                                     &invalidation,
4353                                     SK_ColorWHITE,
4354                                     false,
4355                                     false,
4356                                     layer_bounds,
4357                                     layer_rect,
4358                                     frame_number++,
4359                                     Picture::RECORD_NORMALLY,
4360                                     &stats_instrumentation);
4361
4362   scoped_refptr<PicturePileImpl> pending_pile =
4363       PicturePileImpl::CreateFromOther(pile);
4364
4365   SetupPendingTree(pending_pile);
4366   ActivateTree();
4367
4368   active_layer_->set_fixed_tile_size(tile_size);
4369   host_impl_.active_tree()->UpdateDrawProperties();
4370   if (test_for_solid) {
4371     EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
4372   } else {
4373     ASSERT_TRUE(active_layer_->tilings());
4374     ASSERT_GT(active_layer_->tilings()->num_tilings(), 0u);
4375     std::vector<Tile*> tiles =
4376         active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
4377     EXPECT_FALSE(tiles.empty());
4378     host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
4379   }
4380
4381   MockOcclusionTracker<LayerImpl> occlusion_tracker;
4382   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
4383   AppendQuadsData data;
4384   active_layer_->WillDraw(DRAW_MODE_SOFTWARE, NULL);
4385   active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
4386   active_layer_->DidDraw(NULL);
4387
4388   DrawQuad::Material expected = test_for_solid
4389                                     ? DrawQuad::Material::SOLID_COLOR
4390                                     : DrawQuad::Material::TILED_CONTENT;
4391   EXPECT_EQ(expected, render_pass->quad_list.front()->material);
4392 }
4393
4394 TEST_F(PictureLayerImplTest, DrawSolidQuads) {
4395   TestQuadsForSolidColor(true);
4396 }
4397
4398 TEST_F(PictureLayerImplTest, DrawNonSolidQuads) {
4399   TestQuadsForSolidColor(false);
4400 }
4401
4402 TEST_F(PictureLayerImplTest, NonSolidToSolidNoTilings) {
4403   base::TimeTicks time_ticks;
4404   time_ticks += base::TimeDelta::FromMilliseconds(1);
4405   host_impl_.SetCurrentBeginFrameArgs(
4406       CreateBeginFrameArgsForTesting(time_ticks));
4407
4408   gfx::Size tile_size(100, 100);
4409   gfx::Size layer_bounds(200, 200);
4410   gfx::Rect layer_rect(layer_bounds);
4411
4412   FakeContentLayerClient client;
4413   scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client);
4414   FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
4415   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&host_client);
4416   host->SetRootLayer(layer);
4417   PicturePile* pile = layer->GetPicturePileForTesting();
4418
4419   host_impl_.SetViewportSize(layer_bounds);
4420
4421   int frame_number = 0;
4422   FakeRenderingStatsInstrumentation stats_instrumentation;
4423
4424   client.set_fill_with_nonsolid_color(true);
4425
4426   Region invalidation1(layer_rect);
4427   pile->UpdateAndExpandInvalidation(&client,
4428                                     &invalidation1,
4429                                     SK_ColorWHITE,
4430                                     false,
4431                                     false,
4432                                     layer_bounds,
4433                                     layer_rect,
4434                                     frame_number++,
4435                                     Picture::RECORD_NORMALLY,
4436                                     &stats_instrumentation);
4437
4438   scoped_refptr<PicturePileImpl> pending_pile1 =
4439       PicturePileImpl::CreateFromOther(pile);
4440
4441   SetupPendingTree(pending_pile1);
4442   ActivateTree();
4443   host_impl_.active_tree()->UpdateDrawProperties();
4444
4445   // We've started with a solid layer that contains some tilings.
4446   ASSERT_TRUE(active_layer_->tilings());
4447   EXPECT_NE(0u, active_layer_->tilings()->num_tilings());
4448
4449   client.set_fill_with_nonsolid_color(false);
4450
4451   Region invalidation2(layer_rect);
4452   pile->UpdateAndExpandInvalidation(&client,
4453                                     &invalidation2,
4454                                     SK_ColorWHITE,
4455                                     false,
4456                                     false,
4457                                     layer_bounds,
4458                                     layer_rect,
4459                                     frame_number++,
4460                                     Picture::RECORD_NORMALLY,
4461                                     &stats_instrumentation);
4462
4463   scoped_refptr<PicturePileImpl> pending_pile2 =
4464       PicturePileImpl::CreateFromOther(pile);
4465
4466   SetupPendingTree(pending_pile2);
4467   ActivateTree();
4468
4469   // We've switched to a solid color, so we should end up with no tilings.
4470   ASSERT_TRUE(active_layer_->tilings());
4471   EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
4472 }
4473
4474 }  // namespace
4475 }  // namespace cc