1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/layers/picture_layer_impl.h"
9 #include "cc/layers/append_quads_data.h"
10 #include "cc/layers/picture_layer.h"
11 #include "cc/test/fake_content_layer_client.h"
12 #include "cc/test/fake_impl_proxy.h"
13 #include "cc/test/fake_layer_tree_host_impl.h"
14 #include "cc/test/fake_output_surface.h"
15 #include "cc/test/fake_picture_layer_impl.h"
16 #include "cc/test/fake_picture_pile_impl.h"
17 #include "cc/test/geometry_test_utils.h"
18 #include "cc/test/impl_side_painting_settings.h"
19 #include "cc/test/mock_quad_culler.h"
20 #include "cc/test/test_web_graphics_context_3d.h"
21 #include "cc/trees/layer_tree_impl.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "third_party/skia/include/core/SkBitmapDevice.h"
24 #include "ui/gfx/rect_conversions.h"
29 class MockCanvas : public SkCanvas {
31 explicit MockCanvas(SkBaseDevice* device) : SkCanvas(device) {}
33 virtual void drawRect(const SkRect& rect, const SkPaint& paint) OVERRIDE {
34 // Capture calls before SkCanvas quickReject() kicks in.
35 rects_.push_back(rect);
38 std::vector<SkRect> rects_;
41 class PictureLayerImplTest : public testing::Test {
43 PictureLayerImplTest()
44 : host_impl_(ImplSidePaintingSettings(), &proxy_), id_(7) {}
46 explicit PictureLayerImplTest(const LayerTreeSettings& settings)
47 : host_impl_(settings, &proxy_), id_(7) {}
49 virtual ~PictureLayerImplTest() {
52 virtual void SetUp() OVERRIDE {
56 virtual void InitializeRenderer() {
57 host_impl_.InitializeRenderer(
58 FakeOutputSurface::Create3d().PassAs<OutputSurface>());
61 void SetupDefaultTrees(const gfx::Size& layer_bounds) {
62 gfx::Size tile_size(100, 100);
64 scoped_refptr<FakePicturePileImpl> pending_pile =
65 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
66 scoped_refptr<FakePicturePileImpl> active_pile =
67 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
69 SetupTrees(pending_pile, active_pile);
73 host_impl_.ActivatePendingTree();
74 CHECK(!host_impl_.pending_tree());
75 pending_layer_ = NULL;
76 active_layer_ = static_cast<FakePictureLayerImpl*>(
77 host_impl_.active_tree()->LayerById(id_));
80 void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
81 const gfx::Size& tile_size) {
82 SetupDefaultTrees(layer_bounds);
83 pending_layer_->set_fixed_tile_size(tile_size);
84 active_layer_->set_fixed_tile_size(tile_size);
88 scoped_refptr<PicturePileImpl> pending_pile,
89 scoped_refptr<PicturePileImpl> active_pile) {
90 SetupPendingTree(active_pile);
92 SetupPendingTree(pending_pile);
95 void CreateHighLowResAndSetAllTilesVisible() {
96 // Active layer must get updated first so pending layer can share from it.
97 active_layer_->CreateDefaultTilingsAndTiles();
98 active_layer_->SetAllTilesVisible();
99 pending_layer_->CreateDefaultTilingsAndTiles();
100 pending_layer_->SetAllTilesVisible();
103 void AddDefaultTilingsWithInvalidation(const Region& invalidation) {
104 active_layer_->AddTiling(2.3f);
105 active_layer_->AddTiling(1.0f);
106 active_layer_->AddTiling(0.5f);
107 for (size_t i = 0; i < active_layer_->tilings()->num_tilings(); ++i)
108 active_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
109 pending_layer_->set_invalidation(invalidation);
110 for (size_t i = 0; i < pending_layer_->tilings()->num_tilings(); ++i)
111 pending_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
114 void SetupPendingTree(
115 scoped_refptr<PicturePileImpl> pile) {
116 host_impl_.CreatePendingTree();
117 LayerTreeImpl* pending_tree = host_impl_.pending_tree();
118 // Clear recycled tree.
119 pending_tree->DetachLayerTree();
121 scoped_ptr<FakePictureLayerImpl> pending_layer =
122 FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
123 pending_layer->SetDrawsContent(true);
124 pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
126 pending_layer_ = static_cast<FakePictureLayerImpl*>(
127 host_impl_.pending_tree()->LayerById(id_));
128 pending_layer_->DoPostCommitInitializationIfNeeded();
131 static void VerifyAllTilesExistAndHavePile(
132 const PictureLayerTiling* tiling,
133 PicturePileImpl* pile) {
134 for (PictureLayerTiling::CoverageIterator
135 iter(tiling, tiling->contents_scale(), tiling->ContentRect());
139 EXPECT_EQ(pile, iter->picture_pile());
143 void SetContentsScaleOnBothLayers(float contents_scale,
144 float device_scale_factor,
145 float page_scale_factor,
146 bool animating_transform) {
147 float result_scale_x, result_scale_y;
148 gfx::Size result_bounds;
149 pending_layer_->CalculateContentsScale(
157 active_layer_->CalculateContentsScale(
167 void ResetTilingsAndRasterScales() {
168 pending_layer_->ReleaseResources();
169 active_layer_->ReleaseResources();
172 void AssertAllTilesRequired(PictureLayerTiling* tiling) {
173 std::vector<Tile*> tiles = tiling->AllTilesForTesting();
174 for (size_t i = 0; i < tiles.size(); ++i)
175 EXPECT_TRUE(tiles[i]->required_for_activation()) << "i: " << i;
176 EXPECT_GT(tiles.size(), 0u);
179 void AssertNoTilesRequired(PictureLayerTiling* tiling) {
180 std::vector<Tile*> tiles = tiling->AllTilesForTesting();
181 for (size_t i = 0; i < tiles.size(); ++i)
182 EXPECT_FALSE(tiles[i]->required_for_activation()) << "i: " << i;
183 EXPECT_GT(tiles.size(), 0u);
187 void TestTileGridAlignmentCommon() {
188 // Layer to span 4 raster tiles in x and in y
189 ImplSidePaintingSettings settings;
190 gfx::Size layer_size(
191 settings.default_tile_size.width() * 7 / 2,
192 settings.default_tile_size.height() * 7 / 2);
194 scoped_refptr<FakePicturePileImpl> pending_pile =
195 FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
196 scoped_refptr<FakePicturePileImpl> active_pile =
197 FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
199 SetupTrees(pending_pile, active_pile);
201 float result_scale_x, result_scale_y;
202 gfx::Size result_bounds;
203 active_layer_->CalculateContentsScale(
204 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
206 // Add 1x1 rects at the centers of each tile, then re-record pile contents
207 active_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
208 std::vector<Tile*> tiles =
209 active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
210 EXPECT_EQ(16u, tiles.size());
211 std::vector<SkRect> rects;
212 std::vector<Tile*>::const_iterator tile_iter;
213 for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
214 gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint();
215 gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1);
216 active_pile->add_draw_rect(rect);
217 rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1));
219 // Force re-record with newly injected content
220 active_pile->RemoveRecordingAt(0, 0);
221 active_pile->AddRecordingAt(0, 0);
224 store.setConfig(SkBitmap::kNo_Config, 1000, 1000);
225 SkBitmapDevice device(store);
227 std::vector<SkRect>::const_iterator rect_iter = rects.begin();
228 for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
229 MockCanvas mock_canvas(&device);
230 active_pile->RasterDirect(
231 &mock_canvas, (*tile_iter)->content_rect(), 1.0f, NULL);
233 // This test verifies that when drawing the contents of a specific tile
234 // at content scale 1.0, the playback canvas never receives content from
235 // neighboring tiles which indicates that the tile grid embedded in
236 // SkPicture is perfectly aligned with the compositor's tiles.
237 EXPECT_EQ(1u, mock_canvas.rects_.size());
238 EXPECT_RECT_EQ(*rect_iter, mock_canvas.rects_[0]);
243 FakeImplProxy proxy_;
244 FakeLayerTreeHostImpl host_impl_;
246 FakePictureLayerImpl* pending_layer_;
247 FakePictureLayerImpl* active_layer_;
250 DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest);
253 TEST_F(PictureLayerImplTest, TileGridAlignment) {
254 host_impl_.SetDeviceScaleFactor(1.f);
255 TestTileGridAlignmentCommon();
258 TEST_F(PictureLayerImplTest, TileGridAlignmentHiDPI) {
259 host_impl_.SetDeviceScaleFactor(2.f);
260 TestTileGridAlignmentCommon();
263 TEST_F(PictureLayerImplTest, CloneNoInvalidation) {
264 gfx::Size tile_size(100, 100);
265 gfx::Size layer_bounds(400, 400);
267 scoped_refptr<FakePicturePileImpl> pending_pile =
268 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
269 scoped_refptr<FakePicturePileImpl> active_pile =
270 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
272 SetupTrees(pending_pile, active_pile);
275 AddDefaultTilingsWithInvalidation(invalidation);
277 EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
278 active_layer_->tilings()->num_tilings());
280 const PictureLayerTilingSet* tilings = pending_layer_->tilings();
281 EXPECT_GT(tilings->num_tilings(), 0u);
282 for (size_t i = 0; i < tilings->num_tilings(); ++i)
283 VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), active_pile.get());
286 TEST_F(PictureLayerImplTest, SuppressUpdateTilePriorities) {
287 base::TimeTicks time_ticks;
288 host_impl_.SetCurrentFrameTimeTicks(time_ticks);
290 gfx::Size tile_size(100, 100);
291 gfx::Size layer_bounds(400, 400);
293 scoped_refptr<FakePicturePileImpl> pending_pile =
294 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
295 scoped_refptr<FakePicturePileImpl> active_pile =
296 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
298 SetupTrees(pending_pile, active_pile);
301 AddDefaultTilingsWithInvalidation(invalidation);
302 float dummy_contents_scale_x;
303 float dummy_contents_scale_y;
304 gfx::Size dummy_content_bounds;
305 active_layer_->CalculateContentsScale(1.f,
309 &dummy_contents_scale_x,
310 &dummy_contents_scale_y,
311 &dummy_content_bounds);
313 EXPECT_TRUE(host_impl_.manage_tiles_needed());
314 active_layer_->UpdateTilePriorities();
315 host_impl_.ManageTiles();
316 EXPECT_FALSE(host_impl_.manage_tiles_needed());
318 time_ticks += base::TimeDelta::FromMilliseconds(200);
319 host_impl_.SetCurrentFrameTimeTicks(time_ticks);
321 // Setting this boolean should cause an early out in UpdateTilePriorities.
322 bool valid_for_tile_management = false;
323 host_impl_.SetExternalDrawConstraints(gfx::Transform(),
324 gfx::Rect(layer_bounds),
325 gfx::Rect(layer_bounds),
326 valid_for_tile_management);
327 active_layer_->UpdateTilePriorities();
328 EXPECT_FALSE(host_impl_.manage_tiles_needed());
330 time_ticks += base::TimeDelta::FromMilliseconds(200);
331 host_impl_.SetCurrentFrameTimeTicks(time_ticks);
333 valid_for_tile_management = true;
334 host_impl_.SetExternalDrawConstraints(gfx::Transform(),
335 gfx::Rect(layer_bounds),
336 gfx::Rect(layer_bounds),
337 valid_for_tile_management);
338 active_layer_->UpdateTilePriorities();
339 EXPECT_TRUE(host_impl_.manage_tiles_needed());
342 TEST_F(PictureLayerImplTest, ClonePartialInvalidation) {
343 gfx::Size tile_size(100, 100);
344 gfx::Size layer_bounds(400, 400);
345 gfx::Rect layer_invalidation(150, 200, 30, 180);
347 scoped_refptr<FakePicturePileImpl> pending_pile =
348 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
349 scoped_refptr<FakePicturePileImpl> active_pile =
350 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
352 SetupTrees(pending_pile, active_pile);
354 Region invalidation(layer_invalidation);
355 AddDefaultTilingsWithInvalidation(invalidation);
357 const PictureLayerTilingSet* tilings = pending_layer_->tilings();
358 EXPECT_GT(tilings->num_tilings(), 0u);
359 for (size_t i = 0; i < tilings->num_tilings(); ++i) {
360 const PictureLayerTiling* tiling = tilings->tiling_at(i);
361 gfx::Rect content_invalidation = gfx::ScaleToEnclosingRect(
363 tiling->contents_scale());
364 for (PictureLayerTiling::CoverageIterator
366 tiling->contents_scale(),
367 tiling->ContentRect());
371 EXPECT_FALSE(iter.geometry_rect().IsEmpty());
372 if (iter.geometry_rect().Intersects(content_invalidation))
373 EXPECT_EQ(pending_pile, iter->picture_pile());
375 EXPECT_EQ(active_pile, iter->picture_pile());
380 TEST_F(PictureLayerImplTest, CloneFullInvalidation) {
381 gfx::Size tile_size(90, 80);
382 gfx::Size layer_bounds(300, 500);
384 scoped_refptr<FakePicturePileImpl> pending_pile =
385 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
386 scoped_refptr<FakePicturePileImpl> active_pile =
387 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
389 SetupTrees(pending_pile, active_pile);
391 Region invalidation((gfx::Rect(layer_bounds)));
392 AddDefaultTilingsWithInvalidation(invalidation);
394 EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
395 active_layer_->tilings()->num_tilings());
397 const PictureLayerTilingSet* tilings = pending_layer_->tilings();
398 EXPECT_GT(tilings->num_tilings(), 0u);
399 for (size_t i = 0; i < tilings->num_tilings(); ++i)
400 VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get());
403 TEST_F(PictureLayerImplTest, NoInvalidationBoundsChange) {
404 gfx::Size tile_size(90, 80);
405 gfx::Size active_layer_bounds(300, 500);
406 gfx::Size pending_layer_bounds(400, 800);
408 scoped_refptr<FakePicturePileImpl> pending_pile =
409 FakePicturePileImpl::CreateFilledPile(tile_size,
410 pending_layer_bounds);
411 scoped_refptr<FakePicturePileImpl> active_pile =
412 FakePicturePileImpl::CreateFilledPile(tile_size, active_layer_bounds);
414 SetupTrees(pending_pile, active_pile);
415 pending_layer_->set_fixed_tile_size(gfx::Size(100, 100));
418 AddDefaultTilingsWithInvalidation(invalidation);
420 const PictureLayerTilingSet* tilings = pending_layer_->tilings();
421 EXPECT_GT(tilings->num_tilings(), 0u);
422 for (size_t i = 0; i < tilings->num_tilings(); ++i) {
423 const PictureLayerTiling* tiling = tilings->tiling_at(i);
424 gfx::Rect active_content_bounds = gfx::ScaleToEnclosingRect(
425 gfx::Rect(active_layer_bounds),
426 tiling->contents_scale());
427 for (PictureLayerTiling::CoverageIterator
429 tiling->contents_scale(),
430 tiling->ContentRect());
434 EXPECT_FALSE(iter.geometry_rect().IsEmpty());
435 std::vector<Tile*> active_tiles =
436 active_layer_->tilings()->tiling_at(i)->AllTilesForTesting();
437 std::vector<Tile*> pending_tiles = tiling->AllTilesForTesting();
438 if (iter.geometry_rect().right() >= active_content_bounds.width() ||
439 iter.geometry_rect().bottom() >= active_content_bounds.height() ||
440 active_tiles[0]->content_rect().size() !=
441 pending_tiles[0]->content_rect().size()) {
442 EXPECT_EQ(pending_pile, iter->picture_pile());
444 EXPECT_EQ(active_pile, iter->picture_pile());
450 TEST_F(PictureLayerImplTest, AddTilesFromNewRecording) {
451 gfx::Size tile_size(400, 400);
452 gfx::Size layer_bounds(1300, 1900);
454 scoped_refptr<FakePicturePileImpl> pending_pile =
455 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
456 scoped_refptr<FakePicturePileImpl> active_pile =
457 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
459 // Fill in some of active pile, but more of pending pile.
461 for (int x = 0; x < active_pile->tiling().num_tiles_x(); ++x) {
462 for (int y = 0; y < active_pile->tiling().num_tiles_y(); ++y) {
464 pending_pile->AddRecordingAt(x, y);
465 active_pile->AddRecordingAt(x, y);
469 pending_pile->AddRecordingAt(x, y);
474 SetupTrees(pending_pile, active_pile);
476 AddDefaultTilingsWithInvalidation(invalidation);
478 const PictureLayerTilingSet* tilings = pending_layer_->tilings();
479 EXPECT_GT(tilings->num_tilings(), 0u);
480 for (size_t i = 0; i < tilings->num_tilings(); ++i) {
481 const PictureLayerTiling* tiling = tilings->tiling_at(i);
483 for (PictureLayerTiling::CoverageIterator
485 tiling->contents_scale(),
486 tiling->ContentRect());
489 EXPECT_FALSE(iter.full_tile_geometry_rect().IsEmpty());
490 // Ensure there is a recording for this tile.
491 gfx::Rect layer_rect = gfx::ScaleToEnclosingRect(
492 iter.full_tile_geometry_rect(), 1.f / tiling->contents_scale());
493 layer_rect.Intersect(gfx::Rect(layer_bounds));
495 bool in_pending = pending_pile->recorded_region().Contains(layer_rect);
496 bool in_active = active_pile->recorded_region().Contains(layer_rect);
498 if (in_pending && !in_active)
499 EXPECT_EQ(pending_pile, iter->picture_pile());
501 EXPECT_EQ(active_pile, iter->picture_pile());
508 TEST_F(PictureLayerImplTest, ManageTilingsWithNoRecording) {
509 gfx::Size tile_size(400, 400);
510 gfx::Size layer_bounds(1300, 1900);
512 scoped_refptr<FakePicturePileImpl> pending_pile =
513 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
514 scoped_refptr<FakePicturePileImpl> active_pile =
515 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
517 float result_scale_x, result_scale_y;
518 gfx::Size result_bounds;
520 SetupTrees(pending_pile, active_pile);
522 pending_layer_->CalculateContentsScale(
523 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
525 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
528 TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
529 gfx::Size tile_size(400, 400);
530 gfx::Size layer_bounds(1300, 1900);
532 scoped_refptr<FakePicturePileImpl> pending_pile =
533 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
534 scoped_refptr<FakePicturePileImpl> active_pile =
535 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
537 float result_scale_x, result_scale_y;
538 gfx::Size result_bounds;
540 SetupTrees(pending_pile, active_pile);
541 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
543 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
544 EXPECT_LT(low_res_factor, 1.f);
546 pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale
547 1.7f, // device scale
553 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
556 pending_layer_->tilings()->tiling_at(0)->contents_scale());
558 1.3f * low_res_factor,
559 pending_layer_->tilings()->tiling_at(1)->contents_scale());
561 // If we change the layer's CSS scale factor, then we should not get new
563 pending_layer_->CalculateContentsScale(1.8f, // ideal contents scale
564 1.7f, // device scale
570 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
573 pending_layer_->tilings()->tiling_at(0)->contents_scale());
575 1.3f * low_res_factor,
576 pending_layer_->tilings()->tiling_at(1)->contents_scale());
578 // If we change the page scale factor, then we should get new tilings.
579 pending_layer_->CalculateContentsScale(1.8f, // ideal contents scale
580 1.7f, // device scale
586 ASSERT_EQ(4u, pending_layer_->tilings()->num_tilings());
589 pending_layer_->tilings()->tiling_at(0)->contents_scale());
591 1.8f * low_res_factor,
592 pending_layer_->tilings()->tiling_at(2)->contents_scale());
594 // If we change the device scale factor, then we should get new tilings.
595 pending_layer_->CalculateContentsScale(1.9f, // ideal contents scale
596 1.4f, // device scale
602 ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
605 pending_layer_->tilings()->tiling_at(0)->contents_scale());
607 1.9f * low_res_factor,
608 pending_layer_->tilings()->tiling_at(3)->contents_scale());
610 // If we change the device scale factor, but end up at the same total scale
611 // factor somehow, then we don't get new tilings.
612 pending_layer_->CalculateContentsScale(1.9f, // ideal contents scale
613 2.2f, // device scale
619 ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
622 pending_layer_->tilings()->tiling_at(0)->contents_scale());
624 1.9f * low_res_factor,
625 pending_layer_->tilings()->tiling_at(3)->contents_scale());
628 TEST_F(PictureLayerImplTest, CreateTilingsEvenIfTwinHasNone) {
629 // This test makes sure that if a layer can have tilings, then a commit makes
630 // it not able to have tilings (empty size), and then a future commit that
631 // makes it valid again should be able to create tilings.
632 gfx::Size tile_size(400, 400);
633 gfx::Size layer_bounds(1300, 1900);
635 scoped_refptr<FakePicturePileImpl> empty_pile =
636 FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1000, 0));
637 scoped_refptr<FakePicturePileImpl> valid_pile =
638 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
640 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
641 EXPECT_LT(low_res_factor, 1.f);
643 float high_res_scale = 1.3f;
644 float low_res_scale = high_res_scale * low_res_factor;
645 float device_scale = 1.7f;
646 float page_scale = 3.2f;
647 float result_scale_x, result_scale_y;
648 gfx::Size result_bounds;
650 SetupPendingTree(valid_pile);
651 pending_layer_->CalculateContentsScale(high_res_scale,
658 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
659 EXPECT_FLOAT_EQ(high_res_scale,
660 pending_layer_->HighResTiling()->contents_scale());
661 EXPECT_FLOAT_EQ(low_res_scale,
662 pending_layer_->LowResTiling()->contents_scale());
665 SetupPendingTree(empty_pile);
666 pending_layer_->CalculateContentsScale(high_res_scale,
673 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
674 ASSERT_EQ(0u, pending_layer_->tilings()->num_tilings());
677 active_layer_->CalculateContentsScale(high_res_scale,
684 ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
686 SetupPendingTree(valid_pile);
687 pending_layer_->CalculateContentsScale(high_res_scale,
694 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
695 ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
696 EXPECT_FLOAT_EQ(high_res_scale,
697 pending_layer_->HighResTiling()->contents_scale());
698 EXPECT_FLOAT_EQ(low_res_scale,
699 pending_layer_->LowResTiling()->contents_scale());
702 TEST_F(PictureLayerImplTest, ZoomOutCrash) {
703 gfx::Size tile_size(400, 400);
704 gfx::Size layer_bounds(1300, 1900);
706 // Set up the high and low res tilings before pinch zoom.
707 scoped_refptr<FakePicturePileImpl> pending_pile =
708 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
709 scoped_refptr<FakePicturePileImpl> active_pile =
710 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
712 SetupTrees(pending_pile, active_pile);
713 EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
714 SetContentsScaleOnBothLayers(32.0f, 1.0f, 32.0f, false);
715 host_impl_.PinchGestureBegin();
716 SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, false);
717 SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, false);
718 EXPECT_EQ(active_layer_->tilings()->NumHighResTilings(), 1);
721 TEST_F(PictureLayerImplTest, PinchGestureTilings) {
722 gfx::Size tile_size(400, 400);
723 gfx::Size layer_bounds(1300, 1900);
725 scoped_refptr<FakePicturePileImpl> pending_pile =
726 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
727 scoped_refptr<FakePicturePileImpl> active_pile =
728 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
730 // Set up the high and low res tilings before pinch zoom.
731 SetupTrees(pending_pile, active_pile);
732 EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
733 SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, false);
734 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
735 EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
738 active_layer_->tilings()->tiling_at(0)->contents_scale());
740 1.0f * low_res_factor,
741 active_layer_->tilings()->tiling_at(1)->contents_scale());
743 // Start a pinch gesture.
744 host_impl_.PinchGestureBegin();
746 // Zoom out by a small amount. We should create a tiling at half
747 // the scale (1/kMaxScaleRatioDuringPinch).
748 SetContentsScaleOnBothLayers(0.90f, 1.0f, 0.9f, false);
749 EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
752 active_layer_->tilings()->tiling_at(0)->contents_scale());
755 active_layer_->tilings()->tiling_at(1)->contents_scale());
757 1.0f * low_res_factor,
758 active_layer_->tilings()->tiling_at(2)->contents_scale());
760 // Zoom out further, close to our low-res scale factor. We should
761 // use that tiling as high-res, and not create a new tiling.
762 SetContentsScaleOnBothLayers(low_res_factor, 1.0f, low_res_factor, false);
763 EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
765 // Zoom in a lot now. Since we increase by increments of
766 // kMaxScaleRatioDuringPinch, this will first use 0.5, then 1.0
767 // and then finally create a new tiling at 2.0.
768 SetContentsScaleOnBothLayers(2.1f, 1.0f, 2.1f, false);
769 EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
770 SetContentsScaleOnBothLayers(2.1f, 1.0f, 2.1f, false);
771 EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
772 SetContentsScaleOnBothLayers(2.1f, 1.0f, 2.1f, false);
773 EXPECT_EQ(4u, active_layer_->tilings()->num_tilings());
776 active_layer_->tilings()->tiling_at(0)->contents_scale());
779 TEST_F(PictureLayerImplTest, CleanUpTilings) {
780 gfx::Size tile_size(400, 400);
781 gfx::Size layer_bounds(1300, 1900);
783 scoped_refptr<FakePicturePileImpl> pending_pile =
784 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
785 scoped_refptr<FakePicturePileImpl> active_pile =
786 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
788 float result_scale_x, result_scale_y;
789 gfx::Size result_bounds;
790 std::vector<PictureLayerTiling*> used_tilings;
792 SetupTrees(pending_pile, active_pile);
793 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
795 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
796 EXPECT_LT(low_res_factor, 1.f);
798 float device_scale = 1.7f;
799 float page_scale = 3.2f;
801 SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, false);
802 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
804 // We only have ideal tilings, so they aren't removed.
805 used_tilings.clear();
806 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
807 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
809 // Changing the ideal but not creating new tilings.
810 SetContentsScaleOnBothLayers(1.5f, device_scale, page_scale, false);
811 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
813 // The tilings are still our target scale, so they aren't removed.
814 used_tilings.clear();
815 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
816 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
818 // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2.
820 SetContentsScaleOnBothLayers(1.2f, device_scale, page_scale, false);
821 ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
824 active_layer_->tilings()->tiling_at(1)->contents_scale());
826 1.f * low_res_factor,
827 active_layer_->tilings()->tiling_at(3)->contents_scale());
829 // Mark the non-ideal tilings as used. They won't be removed.
830 used_tilings.clear();
831 used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
832 used_tilings.push_back(active_layer_->tilings()->tiling_at(3));
833 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
834 ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
836 // Now move the ideal scale to 0.5. Our target stays 1.2.
837 SetContentsScaleOnBothLayers(0.5f, device_scale, page_scale, false);
839 // The high resolution tiling is between target and ideal, so is not
840 // removed. The low res tiling for the old ideal=1.0 scale is removed.
841 used_tilings.clear();
842 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
843 ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
845 // Now move the ideal scale to 1.0. Our target stays 1.2.
846 SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, false);
848 // All the tilings are between are target and the ideal, so they are not
850 used_tilings.clear();
851 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
852 ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
854 // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2.
855 active_layer_->CalculateContentsScale(1.1f,
863 // Because the pending layer's ideal scale is still 1.0, our tilings fall
864 // in the range [1.0,1.2] and are kept.
865 used_tilings.clear();
866 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
867 ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
869 // Move the ideal scale on the pending layer to 1.1 as well. Our target stays
871 pending_layer_->CalculateContentsScale(1.1f,
879 // Our 1.0 tiling now falls outside the range between our ideal scale and our
880 // target raster scale. But it is in our used tilings set, so nothing is
882 used_tilings.clear();
883 used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
884 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
885 ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
887 // If we remove it from our used tilings set, it is outside the range to keep
889 used_tilings.clear();
890 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
891 ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
894 #define EXPECT_BOTH_EQ(expression, x) \
896 EXPECT_EQ(pending_layer_->expression, x); \
897 EXPECT_EQ(active_layer_->expression, x); \
900 TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
901 // Make sure this layer covers multiple tiles, since otherwise low
902 // res won't get created because it is too small.
903 gfx::Size tile_size(host_impl_.settings().default_tile_size);
904 SetupDefaultTrees(gfx::Size(tile_size.width() + 1, tile_size.height() + 1));
905 // Avoid max untiled layer size heuristics via fixed tile size.
906 pending_layer_->set_fixed_tile_size(tile_size);
907 active_layer_->set_fixed_tile_size(tile_size);
909 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
910 float contents_scale = 1.f;
911 float device_scale = 1.f;
912 float page_scale = 1.f;
913 bool animating_transform = true;
915 // Animating, so don't create low res even if there isn't one already.
916 SetContentsScaleOnBothLayers(
917 contents_scale, device_scale, page_scale, animating_transform);
918 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
919 EXPECT_BOTH_EQ(num_tilings(), 1u);
921 // Stop animating, low res gets created.
922 animating_transform = false;
923 SetContentsScaleOnBothLayers(
924 contents_scale, device_scale, page_scale, animating_transform);
925 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
926 EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), low_res_factor);
927 EXPECT_BOTH_EQ(num_tilings(), 2u);
929 // Page scale animation, new high res, but not new low res because animating.
930 contents_scale = 2.f;
932 animating_transform = true;
933 SetContentsScaleOnBothLayers(
934 contents_scale, device_scale, page_scale, animating_transform);
935 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
936 EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), low_res_factor);
937 EXPECT_BOTH_EQ(num_tilings(), 3u);
939 // Stop animating, new low res gets created for final page scale.
940 animating_transform = false;
941 SetContentsScaleOnBothLayers(
942 contents_scale, device_scale, page_scale, animating_transform);
943 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
944 EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), 2.f * low_res_factor);
945 EXPECT_BOTH_EQ(num_tilings(), 4u);
948 TEST_F(PictureLayerImplTest, DontAddLowResForSmallLayers) {
949 gfx::Size tile_size(host_impl_.settings().default_tile_size);
950 SetupDefaultTrees(tile_size);
952 float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
953 float device_scale = 1.f;
954 float page_scale = 1.f;
955 bool animating_transform = false;
957 // Contents exactly fit on one tile at scale 1, no low res.
958 float contents_scale = 1.f;
959 SetContentsScaleOnBothLayers(
960 contents_scale, device_scale, page_scale, animating_transform);
961 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
962 EXPECT_BOTH_EQ(num_tilings(), 1u);
964 ResetTilingsAndRasterScales();
966 // Contents that are smaller than one tile, no low res.
967 contents_scale = 0.123f;
968 SetContentsScaleOnBothLayers(
969 contents_scale, device_scale, page_scale, animating_transform);
970 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
971 EXPECT_BOTH_EQ(num_tilings(), 1u);
973 ResetTilingsAndRasterScales();
975 // Any content bounds that would create more than one tile will
976 // generate a low res tiling.
977 contents_scale = 2.5f;
978 SetContentsScaleOnBothLayers(
979 contents_scale, device_scale, page_scale, animating_transform);
980 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
981 EXPECT_BOTH_EQ(LowResTiling()->contents_scale(),
982 contents_scale * low_res_factor);
983 EXPECT_BOTH_EQ(num_tilings(), 2u);
985 ResetTilingsAndRasterScales();
987 // Mask layers dont create low res since they always fit on one tile.
988 pending_layer_->SetIsMask(true);
989 active_layer_->SetIsMask(true);
990 SetContentsScaleOnBothLayers(
991 contents_scale, device_scale, page_scale, animating_transform);
992 EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
993 EXPECT_BOTH_EQ(num_tilings(), 1u);
996 TEST_F(PictureLayerImplTest, ReleaseResources) {
997 gfx::Size tile_size(400, 400);
998 gfx::Size layer_bounds(1300, 1900);
1000 scoped_refptr<FakePicturePileImpl> pending_pile =
1001 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1002 scoped_refptr<FakePicturePileImpl> active_pile =
1003 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1005 float result_scale_x, result_scale_y;
1006 gfx::Size result_bounds;
1008 SetupTrees(pending_pile, active_pile);
1009 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1011 pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale
1012 2.7f, // device scale
1018 EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
1020 // All tilings should be removed when losing output surface.
1021 active_layer_->ReleaseResources();
1022 EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
1023 pending_layer_->ReleaseResources();
1024 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1026 // This should create new tilings.
1027 pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale
1028 2.7f, // device scale
1034 EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
1037 TEST_F(PictureLayerImplTest, ClampTilesToToMaxTileSize) {
1038 // The default max tile size is larger than 400x400.
1039 gfx::Size tile_size(400, 400);
1040 gfx::Size layer_bounds(5000, 5000);
1042 scoped_refptr<FakePicturePileImpl> pending_pile =
1043 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1044 scoped_refptr<FakePicturePileImpl> active_pile =
1045 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1047 float result_scale_x, result_scale_y;
1048 gfx::Size result_bounds;
1050 SetupTrees(pending_pile, active_pile);
1051 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1053 pending_layer_->CalculateContentsScale(
1054 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1055 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
1057 pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1059 // The default value.
1060 EXPECT_EQ(gfx::Size(256, 256).ToString(),
1061 host_impl_.settings().default_tile_size.ToString());
1063 Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1064 EXPECT_EQ(gfx::Size(256, 256).ToString(),
1065 tile->content_rect().size().ToString());
1067 pending_layer_->ReleaseResources();
1069 // Change the max texture size on the output surface context.
1070 scoped_ptr<TestWebGraphicsContext3D> context =
1071 TestWebGraphicsContext3D::Create();
1072 context->set_max_texture_size(140);
1073 host_impl_.DidLoseOutputSurface();
1074 host_impl_.InitializeRenderer(FakeOutputSurface::Create3d(
1075 context.Pass()).PassAs<OutputSurface>());
1077 pending_layer_->CalculateContentsScale(
1078 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1079 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
1081 pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1083 // Verify the tiles are not larger than the context's max texture size.
1084 tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1085 EXPECT_GE(140, tile->content_rect().width());
1086 EXPECT_GE(140, tile->content_rect().height());
1089 TEST_F(PictureLayerImplTest, ClampSingleTileToToMaxTileSize) {
1090 // The default max tile size is larger than 400x400.
1091 gfx::Size tile_size(400, 400);
1092 gfx::Size layer_bounds(500, 500);
1094 scoped_refptr<FakePicturePileImpl> pending_pile =
1095 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1096 scoped_refptr<FakePicturePileImpl> active_pile =
1097 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1099 float result_scale_x, result_scale_y;
1100 gfx::Size result_bounds;
1102 SetupTrees(pending_pile, active_pile);
1103 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1105 pending_layer_->CalculateContentsScale(
1106 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1107 ASSERT_LE(1u, pending_layer_->tilings()->num_tilings());
1109 pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1111 // The default value. The layer is smaller than this.
1112 EXPECT_EQ(gfx::Size(512, 512).ToString(),
1113 host_impl_.settings().max_untiled_layer_size.ToString());
1115 // There should be a single tile since the layer is small.
1116 PictureLayerTiling* high_res_tiling = pending_layer_->tilings()->tiling_at(0);
1117 EXPECT_EQ(1u, high_res_tiling->AllTilesForTesting().size());
1119 pending_layer_->ReleaseResources();
1121 // Change the max texture size on the output surface context.
1122 scoped_ptr<TestWebGraphicsContext3D> context =
1123 TestWebGraphicsContext3D::Create();
1124 context->set_max_texture_size(140);
1125 host_impl_.DidLoseOutputSurface();
1126 host_impl_.InitializeRenderer(FakeOutputSurface::Create3d(
1127 context.Pass()).PassAs<OutputSurface>());
1129 pending_layer_->CalculateContentsScale(
1130 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1131 ASSERT_LE(1u, pending_layer_->tilings()->num_tilings());
1133 pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
1135 // There should be more than one tile since the max texture size won't cover
1137 high_res_tiling = pending_layer_->tilings()->tiling_at(0);
1138 EXPECT_LT(1u, high_res_tiling->AllTilesForTesting().size());
1140 // Verify the tiles are not larger than the context's max texture size.
1141 Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0];
1142 EXPECT_GE(140, tile->content_rect().width());
1143 EXPECT_GE(140, tile->content_rect().height());
1146 TEST_F(PictureLayerImplTest, DisallowTileDrawQuads) {
1147 MockQuadCuller quad_culler;
1149 gfx::Size tile_size(400, 400);
1150 gfx::Size layer_bounds(1300, 1900);
1152 scoped_refptr<FakePicturePileImpl> pending_pile =
1153 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1154 scoped_refptr<FakePicturePileImpl> active_pile =
1155 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1157 SetupTrees(pending_pile, active_pile);
1159 active_layer_->SetContentBounds(layer_bounds);
1160 active_layer_->draw_properties().visible_content_rect =
1161 gfx::Rect(layer_bounds);
1163 gfx::Rect layer_invalidation(150, 200, 30, 180);
1164 Region invalidation(layer_invalidation);
1165 AddDefaultTilingsWithInvalidation(invalidation);
1167 AppendQuadsData data;
1168 active_layer_->WillDraw(DRAW_MODE_RESOURCELESS_SOFTWARE, NULL);
1169 active_layer_->AppendQuads(&quad_culler, &data);
1170 active_layer_->DidDraw(NULL);
1172 ASSERT_EQ(1U, quad_culler.quad_list().size());
1173 EXPECT_EQ(DrawQuad::PICTURE_CONTENT, quad_culler.quad_list()[0]->material);
1176 TEST_F(PictureLayerImplTest, MarkRequiredNullTiles) {
1177 gfx::Size tile_size(100, 100);
1178 gfx::Size layer_bounds(1000, 1000);
1180 scoped_refptr<FakePicturePileImpl> pending_pile =
1181 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
1182 // Layers with entirely empty piles can't get tilings.
1183 pending_pile->AddRecordingAt(0, 0);
1185 SetupPendingTree(pending_pile);
1187 ASSERT_TRUE(pending_layer_->CanHaveTilings());
1188 pending_layer_->AddTiling(1.0f);
1189 pending_layer_->AddTiling(2.0f);
1191 // It should be safe to call this (and MarkVisibleResourcesAsRequired)
1192 // on a layer with no recordings.
1193 host_impl_.pending_tree()->UpdateDrawProperties();
1194 pending_layer_->MarkVisibleResourcesAsRequired();
1197 TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
1198 gfx::Size tile_size(100, 100);
1199 gfx::Size layer_bounds(200, 200);
1201 scoped_refptr<FakePicturePileImpl> pending_pile =
1202 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1203 SetupPendingTree(pending_pile);
1205 pending_layer_->set_fixed_tile_size(tile_size);
1206 ASSERT_TRUE(pending_layer_->CanHaveTilings());
1207 PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
1208 host_impl_.pending_tree()->UpdateDrawProperties();
1209 EXPECT_EQ(tiling->resolution(), HIGH_RESOLUTION);
1211 pending_layer_->draw_properties().visible_content_rect =
1212 gfx::Rect(0, 0, 100, 200);
1214 // Fake set priorities.
1215 for (PictureLayerTiling::CoverageIterator iter(
1216 tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
1222 TilePriority priority;
1223 priority.resolution = HIGH_RESOLUTION;
1224 gfx::Rect tile_bounds = iter.geometry_rect();
1225 if (pending_layer_->visible_content_rect().Intersects(tile_bounds)) {
1226 priority.priority_bin = TilePriority::NOW;
1227 priority.distance_to_visible = 0.f;
1229 priority.priority_bin = TilePriority::SOON;
1230 priority.distance_to_visible = 1.f;
1232 tile->SetPriority(PENDING_TREE, priority);
1235 pending_layer_->MarkVisibleResourcesAsRequired();
1237 int num_visible = 0;
1238 int num_offscreen = 0;
1240 for (PictureLayerTiling::CoverageIterator iter(
1241 tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
1246 const Tile* tile = *iter;
1247 if (tile->priority(PENDING_TREE).distance_to_visible == 0.f) {
1248 EXPECT_TRUE(tile->required_for_activation());
1251 EXPECT_FALSE(tile->required_for_activation());
1256 EXPECT_GT(num_visible, 0);
1257 EXPECT_GT(num_offscreen, 0);
1260 TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) {
1261 gfx::Size layer_bounds(400, 400);
1262 gfx::Size tile_size(100, 100);
1263 SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1266 pending_layer_->set_invalidation(gfx::Rect(layer_bounds));
1268 CreateHighLowResAndSetAllTilesVisible();
1270 active_layer_->SetAllTilesReady();
1272 // No shared tiles and all active tiles ready, so pending can only
1273 // activate with all high res tiles.
1274 pending_layer_->MarkVisibleResourcesAsRequired();
1275 AssertAllTilesRequired(pending_layer_->HighResTiling());
1276 AssertNoTilesRequired(pending_layer_->LowResTiling());
1279 TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) {
1280 gfx::Size layer_bounds(400, 400);
1281 gfx::Size tile_size(100, 100);
1282 SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1284 // All tiles shared (no invalidation).
1285 CreateHighLowResAndSetAllTilesVisible();
1287 // Verify active tree not ready.
1288 Tile* some_active_tile =
1289 active_layer_->HighResTiling()->AllTilesForTesting()[0];
1290 EXPECT_FALSE(some_active_tile->IsReadyToDraw());
1292 // When high res are required, even if the active tree is not ready,
1293 // the high res tiles must be ready.
1294 host_impl_.active_tree()->SetRequiresHighResToDraw();
1295 pending_layer_->MarkVisibleResourcesAsRequired();
1296 AssertAllTilesRequired(pending_layer_->HighResTiling());
1297 AssertNoTilesRequired(pending_layer_->LowResTiling());
1300 TEST_F(PictureLayerImplTest, NothingRequiredIfAllHighResTilesShared) {
1301 gfx::Size layer_bounds(400, 400);
1302 gfx::Size tile_size(100, 100);
1303 SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
1305 CreateHighLowResAndSetAllTilesVisible();
1307 Tile* some_active_tile =
1308 active_layer_->HighResTiling()->AllTilesForTesting()[0];
1309 EXPECT_FALSE(some_active_tile->IsReadyToDraw());
1311 // All tiles shared (no invalidation), so even though the active tree's
1312 // tiles aren't ready, there is nothing required.
1313 pending_layer_->MarkVisibleResourcesAsRequired();
1314 AssertNoTilesRequired(pending_layer_->HighResTiling());
1315 AssertNoTilesRequired(pending_layer_->LowResTiling());
1318 TEST_F(PictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
1319 gfx::Size layer_bounds(400, 400);
1320 gfx::Size tile_size(100, 100);
1321 scoped_refptr<FakePicturePileImpl> pending_pile =
1322 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1323 // An arbitrary bogus outside the layer recording. Enough for the layer to
1324 // think it can create tiles, but not in bounds so all tiles are null.
1325 Region active_recorded_region;
1326 active_recorded_region.Union(gfx::Rect(1000, 1000, 1, 1));
1327 scoped_refptr<FakePicturePileImpl> active_pile =
1328 FakePicturePileImpl::CreatePileWithRecordedRegion(
1329 tile_size, layer_bounds, active_recorded_region);
1330 SetupTrees(pending_pile, active_pile);
1331 pending_layer_->set_fixed_tile_size(tile_size);
1332 active_layer_->set_fixed_tile_size(tile_size);
1334 CreateHighLowResAndSetAllTilesVisible();
1336 // Active layer has tilings, but no tiles due to missing recordings.
1337 EXPECT_TRUE(active_layer_->CanHaveTilings());
1338 EXPECT_EQ(active_layer_->tilings()->num_tilings(), 2u);
1339 EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u);
1341 // Since the active layer has no tiles at all, the pending layer doesn't
1342 // need content in order to activate. This is attempting to simulate
1343 // scrolling past the end of recorded content on the active layer.
1344 pending_layer_->MarkVisibleResourcesAsRequired();
1345 AssertNoTilesRequired(pending_layer_->HighResTiling());
1346 AssertNoTilesRequired(pending_layer_->LowResTiling());
1349 TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) {
1350 gfx::Size layer_bounds(400, 400);
1351 gfx::Size tile_size(100, 100);
1352 scoped_refptr<FakePicturePileImpl> pending_pile =
1353 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1354 scoped_refptr<FakePicturePileImpl> active_pile =
1355 FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
1356 SetupTrees(pending_pile, active_pile);
1357 pending_layer_->set_fixed_tile_size(tile_size);
1358 active_layer_->set_fixed_tile_size(tile_size);
1360 CreateHighLowResAndSetAllTilesVisible();
1362 // Active layer can't have tiles.
1363 EXPECT_FALSE(active_layer_->CanHaveTilings());
1365 // All high res tiles required. This should be considered identical
1366 // to the case where there is no active layer, to avoid flashing content.
1367 // This can happen if a layer exists for a while and switches from
1368 // not being able to have content to having content.
1369 pending_layer_->MarkVisibleResourcesAsRequired();
1370 AssertAllTilesRequired(pending_layer_->HighResTiling());
1371 AssertNoTilesRequired(pending_layer_->LowResTiling());
1374 TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) {
1375 gfx::Size tile_size(100, 100);
1376 gfx::Size layer_bounds(400, 400);
1377 scoped_refptr<FakePicturePileImpl> pending_pile =
1378 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1380 host_impl_.CreatePendingTree();
1381 LayerTreeImpl* pending_tree = host_impl_.pending_tree();
1383 scoped_ptr<FakePictureLayerImpl> pending_layer =
1384 FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pending_pile);
1385 pending_layer->SetDrawsContent(true);
1386 pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
1388 pending_layer_ = static_cast<FakePictureLayerImpl*>(
1389 host_impl_.pending_tree()->LayerById(id_));
1391 // Set some state on the pending layer, make sure it is not clobbered
1392 // by a sync from the active layer. This could happen because if the
1393 // pending layer has not been post-commit initialized it will attempt
1394 // to sync from the active layer.
1395 bool default_lcd_text_setting = pending_layer_->is_using_lcd_text();
1396 pending_layer_->force_set_lcd_text(!default_lcd_text_setting);
1397 EXPECT_TRUE(pending_layer_->needs_post_commit_initialization());
1399 host_impl_.ActivatePendingTree();
1401 active_layer_ = static_cast<FakePictureLayerImpl*>(
1402 host_impl_.active_tree()->LayerById(id_));
1404 EXPECT_EQ(0u, active_layer_->num_tilings());
1405 EXPECT_EQ(!default_lcd_text_setting, active_layer_->is_using_lcd_text());
1406 EXPECT_FALSE(active_layer_->needs_post_commit_initialization());
1409 TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) {
1410 SetupDefaultTrees(gfx::Size(10, 10));
1411 host_impl_.active_tree()->UpdateDrawProperties();
1412 EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
1414 // Contrived unit test of a real crash. A layer is transparent during a
1415 // context loss, and later becomes opaque, causing active layer SyncTiling to
1417 const float tile_scale = 2.f;
1418 active_layer_->ReleaseResources();
1419 EXPECT_FALSE(active_layer_->tilings()->TilingAtScale(tile_scale));
1420 pending_layer_->AddTiling(2.f);
1421 EXPECT_TRUE(active_layer_->tilings()->TilingAtScale(tile_scale));
1424 TEST_F(PictureLayerImplTest, TilingGpuRasterization) {
1425 gfx::Size default_tile_size(host_impl_.settings().default_tile_size);
1426 gfx::Size layer_bounds(default_tile_size.width() * 4,
1427 default_tile_size.height() * 4);
1428 float result_scale_x, result_scale_y;
1429 gfx::Size result_bounds;
1431 // Layers without GPU rasterization (default).
1432 SetupDefaultTrees(layer_bounds);
1433 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1434 pending_layer_->CalculateContentsScale(
1435 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1436 // Should have a low-res and a high-res tiling.
1437 ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
1439 // Tell the layer to use GPU rasterization.
1440 pending_layer_->SetShouldUseGpuRasterization(true);
1441 EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
1442 pending_layer_->CalculateContentsScale(
1443 1.f, 1.f, 1.f, false, &result_scale_x, &result_scale_y, &result_bounds);
1444 // Should only have the high-res tiling.
1445 ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
1448 TEST_F(PictureLayerImplTest, NoTilingIfDoesNotDrawContent) {
1449 // Set up layers with tilings.
1450 SetupDefaultTrees(gfx::Size(10, 10));
1451 SetContentsScaleOnBothLayers(1.f, 1.f, 1.f, false);
1452 pending_layer_->PushPropertiesTo(active_layer_);
1453 EXPECT_TRUE(pending_layer_->DrawsContent());
1454 EXPECT_TRUE(pending_layer_->CanHaveTilings());
1455 EXPECT_GE(pending_layer_->num_tilings(), 0u);
1456 EXPECT_GE(active_layer_->num_tilings(), 0u);
1458 // Set content to false, which should make CanHaveTilings return false.
1459 pending_layer_->SetDrawsContent(false);
1460 EXPECT_FALSE(pending_layer_->DrawsContent());
1461 EXPECT_FALSE(pending_layer_->CanHaveTilings());
1463 // No tilings should be pushed to active layer.
1464 pending_layer_->PushPropertiesTo(active_layer_);
1465 EXPECT_EQ(0u, active_layer_->num_tilings());
1468 TEST_F(PictureLayerImplTest, FirstTilingDuringPinch) {
1469 SetupDefaultTrees(gfx::Size(10, 10));
1470 host_impl_.PinchGestureBegin();
1471 float high_res_scale = 2.3f;
1472 SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, false);
1474 ASSERT_GE(pending_layer_->num_tilings(), 0u);
1475 EXPECT_FLOAT_EQ(high_res_scale,
1476 pending_layer_->HighResTiling()->contents_scale());
1479 TEST_F(PictureLayerImplTest, FirstTilingTooSmall) {
1480 SetupDefaultTrees(gfx::Size(10, 10));
1481 host_impl_.PinchGestureBegin();
1482 float high_res_scale = 0.0001f;
1483 EXPECT_GT(pending_layer_->MinimumContentsScale(), high_res_scale);
1485 SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, false);
1487 ASSERT_GE(pending_layer_->num_tilings(), 0u);
1488 EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(),
1489 pending_layer_->HighResTiling()->contents_scale());
1492 TEST_F(PictureLayerImplTest, PinchingTooSmall) {
1493 SetupDefaultTrees(gfx::Size(10, 10));
1495 float contents_scale = 0.15f;
1496 SetContentsScaleOnBothLayers(contents_scale, 1.f, 1.f, false);
1498 ASSERT_GE(pending_layer_->num_tilings(), 0u);
1499 EXPECT_FLOAT_EQ(contents_scale,
1500 pending_layer_->HighResTiling()->contents_scale());
1502 host_impl_.PinchGestureBegin();
1504 float page_scale = 0.0001f;
1505 EXPECT_LT(page_scale * contents_scale,
1506 pending_layer_->MinimumContentsScale());
1509 SetContentsScaleOnBothLayers(contents_scale, 1.f, page_scale, false);
1510 ASSERT_GE(pending_layer_->num_tilings(), 0u);
1511 EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(),
1512 pending_layer_->HighResTiling()->contents_scale());
1515 class DeferredInitPictureLayerImplTest : public PictureLayerImplTest {
1517 DeferredInitPictureLayerImplTest()
1518 : PictureLayerImplTest(ImplSidePaintingSettings()) {}
1520 virtual void InitializeRenderer() OVERRIDE {
1521 host_impl_.InitializeRenderer(FakeOutputSurface::CreateDeferredGL(
1522 scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice))
1523 .PassAs<OutputSurface>());
1526 virtual void SetUp() OVERRIDE {
1527 PictureLayerImplTest::SetUp();
1529 // Create some default active and pending trees.
1530 gfx::Size tile_size(100, 100);
1531 gfx::Size layer_bounds(400, 400);
1533 scoped_refptr<FakePicturePileImpl> pending_pile =
1534 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1535 scoped_refptr<FakePicturePileImpl> active_pile =
1536 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
1538 SetupTrees(pending_pile, active_pile);
1542 // This test is really a LayerTreeHostImpl test, in that it makes sure
1543 // that trees need update draw properties after deferred initialization.
1544 // However, this is also a regression test for PictureLayerImpl in that
1545 // not having this update will cause a crash.
1546 TEST_F(DeferredInitPictureLayerImplTest,
1547 PreventUpdateTilePrioritiesDuringLostContext) {
1548 host_impl_.pending_tree()->UpdateDrawProperties();
1549 host_impl_.active_tree()->UpdateDrawProperties();
1550 EXPECT_FALSE(host_impl_.pending_tree()->needs_update_draw_properties());
1551 EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
1553 FakeOutputSurface* fake_output_surface =
1554 static_cast<FakeOutputSurface*>(host_impl_.output_surface());
1555 ASSERT_TRUE(fake_output_surface->InitializeAndSetContext3d(
1556 TestContextProvider::Create(), NULL));
1558 // These will crash PictureLayerImpl if this is not true.
1559 ASSERT_TRUE(host_impl_.pending_tree()->needs_update_draw_properties());
1560 ASSERT_TRUE(host_impl_.active_tree()->needs_update_draw_properties());
1561 host_impl_.active_tree()->UpdateDrawProperties();