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:
MockCanvas(int w,int h)39 explicit MockCanvas(int w, int h) : SkCanvas(w, h) {}
40
drawRect(const SkRect & rect,const SkPaint & paint)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:
LowResTilingsSettings()53 LowResTilingsSettings() { create_low_res_tiling = true; }
54 };
55
56 class PictureLayerImplTest : public testing::Test {
57 public:
PictureLayerImplTest()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
PictureLayerImplTest(const LayerTreeSettings & settings)66 explicit PictureLayerImplTest(const LayerTreeSettings& settings)
67 : proxy_(base::MessageLoopProxy::current()),
68 host_impl_(settings, &proxy_, &shared_bitmap_manager_),
69 id_(7) {}
70
~PictureLayerImplTest()71 virtual ~PictureLayerImplTest() {
72 }
73
SetUp()74 virtual void SetUp() OVERRIDE {
75 InitializeRenderer();
76 }
77
InitializeRenderer()78 virtual void InitializeRenderer() {
79 host_impl_.InitializeRenderer(
80 FakeOutputSurface::Create3d().PassAs<OutputSurface>());
81 }
82
SetupDefaultTrees(const gfx::Size & layer_bounds)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
ActivateTree()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
SetupDefaultTreesWithFixedTileSize(const gfx::Size & layer_bounds,const gfx::Size & tile_size)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
SetupTrees(scoped_refptr<PicturePileImpl> pending_pile,scoped_refptr<PicturePileImpl> active_pile)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
CreateHighLowResAndSetAllTilesVisible()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
AddDefaultTilingsWithInvalidation(const Region & invalidation)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
SetupPendingTree(scoped_refptr<PicturePileImpl> pile)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
SetupDrawPropertiesAndUpdateTiles(FakePictureLayerImpl * layer,float ideal_contents_scale,float device_scale_factor,float page_scale_factor,float maximum_animation_contents_scale,bool animating_transform_to_screen)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 }
VerifyAllTilesExistAndHavePile(const PictureLayerTiling * tiling,PicturePileImpl * pile)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
SetContentsScaleOnBothLayers(float contents_scale,float device_scale_factor,float page_scale_factor,float maximum_animation_contents_scale,bool animating_transform)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
ResetTilingsAndRasterScales()205 void ResetTilingsAndRasterScales() {
206 pending_layer_->ReleaseResources();
207 active_layer_->ReleaseResources();
208 }
209
AssertAllTilesRequired(PictureLayerTiling * tiling)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
AssertNoTilesRequired(PictureLayerTiling * tiling)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:
TestTileGridAlignmentCommon()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
TEST_F(PictureLayerImplTest,TileGridAlignment)288 TEST_F(PictureLayerImplTest, TileGridAlignment) {
289 host_impl_.SetDeviceScaleFactor(1.f);
290 TestTileGridAlignmentCommon();
291 }
292
TEST_F(PictureLayerImplTest,TileGridAlignmentHiDPI)293 TEST_F(PictureLayerImplTest, TileGridAlignmentHiDPI) {
294 host_impl_.SetDeviceScaleFactor(2.f);
295 TestTileGridAlignmentCommon();
296 }
297
TEST_F(PictureLayerImplTest,CloneNoInvalidation)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
TEST_F(PictureLayerImplTest,ExternalViewportRectForPrioritizingTiles)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
TEST_F(PictureLayerImplTest,InvalidViewportForPrioritizingTiles)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
TEST_F(PictureLayerImplTest,ClonePartialInvalidation)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
TEST_F(PictureLayerImplTest,CloneFullInvalidation)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
TEST_F(PictureLayerImplTest,NoInvalidationBoundsChange)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
TEST_F(PictureLayerImplTest,AddTilesFromNewRecording)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
TEST_F(PictureLayerImplTest,ManageTilingsWithNoRecording)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
TEST_F(PictureLayerImplTest,ManageTilingsCreatesTilings)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
TEST_F(PictureLayerImplTest,CreateTilingsEvenIfTwinHasNone)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
TEST_F(PictureLayerImplTest,ZoomOutCrash)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
TEST_F(PictureLayerImplTest,PinchGestureTilings)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
TEST_F(PictureLayerImplTest,SnappedTilingDuringZoom)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
TEST_F(PictureLayerImplTest,CleanUpTilings)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
TEST_F(PictureLayerImplTest,DontAddLowResDuringAnimation)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
TEST_F(PictureLayerImplTest,DontAddLowResForSmallLayers)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
TEST_F(PictureLayerImplTest,HugeMasksDontGetTiles)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
TEST_F(PictureLayerImplTest,ReleaseResources)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
TEST_F(PictureLayerImplTest,ClampTilesToToMaxTileSize)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
TEST_F(PictureLayerImplTest,ClampSingleTileToToMaxTileSize)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
TEST_F(PictureLayerImplTest,DisallowTileDrawQuads)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
TEST_F(PictureLayerImplTest,MarkRequiredNullTiles)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
TEST_F(PictureLayerImplTest,TileScalesWithSolidColorPile)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
TEST_F(PictureLayerImplTest,MarkRequiredOffscreenTiles)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
TEST_F(PictureLayerImplTest,TileOutsideOfViewportForTilePriorityNotRequired)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
TEST_F(PictureLayerImplTest,HighResTileIsComplete)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
TEST_F(PictureLayerImplTest,LowResTileIsIncomplete)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
TEST_F(PictureLayerImplTest,HighResAndIdealResTileIsCompleteWhenRasterScaleIsNotIdeal)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
TEST_F(PictureLayerImplTest,HighResRequiredWhenUnsharedActiveAllReady)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
TEST_F(PictureLayerImplTest,HighResRequiredWhenMissingHighResFlagOn)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
TEST_F(PictureLayerImplTest,NothingRequiredIfAllHighResTilesShared)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
TEST_F(PictureLayerImplTest,NothingRequiredIfActiveMissingTiles)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
TEST_F(PictureLayerImplTest,HighResRequiredIfActiveCantHaveTiles)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
TEST_F(PictureLayerImplTest,HighResRequiredWhenActiveHasDifferentBounds)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
TEST_F(PictureLayerImplTest,ActivateUninitializedLayer)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
TEST_F(PictureLayerImplTest,ShareTilesOnSync)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
TEST_F(PictureLayerImplTest,ShareInvalidActiveTreeTilesOnSync)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
TEST_F(PictureLayerImplTest,RemoveInvalidPendingTreeTilesOnSync)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
TEST_F(PictureLayerImplTest,SyncTilingAfterReleaseResource)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
TEST_F(PictureLayerImplTest,SyncTilingAfterGpuRasterizationToggles)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
TEST_F(PictureLayerImplTest,HighResCreatedWhenBoundsShrink)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
TEST_F(PictureLayerImplTest,NoLowResTilingWithGpuRasterization)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
TEST_F(PictureLayerImplTest,NoTilingIfDoesNotDrawContent)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
TEST_F(PictureLayerImplTest,FirstTilingDuringPinch)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
TEST_F(PictureLayerImplTest,FirstTilingTooSmall)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
TEST_F(PictureLayerImplTest,PinchingTooSmall)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:
InitializeRenderer()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
SetUp()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.
TEST_F(DeferredInitPictureLayerImplTest,PreventUpdateTilesDuringLostContext)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
TEST_F(PictureLayerImplTest,HighResTilingDuringAnimationForCpuRasterization)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
TEST_F(PictureLayerImplTest,HighResTilingDuringAnimationForGpuRasterization)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
TEST_F(PictureLayerImplTest,LayerRasterTileIterator)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
TEST_F(PictureLayerImplTest,LayerEvictionTileIterator)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
TEST_F(PictureLayerImplTest,Occlusion)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
TEST_F(PictureLayerImplTest,RasterScaleChangeWithoutAnimation)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
TEST_F(PictureLayerImplTest,LowResReadyToDrawNotEnoughToActivate)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
TEST_F(PictureLayerImplTest,HighResReadyToDrawEnoughToActivate)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
TEST_F(PictureLayerImplTest,SharedActiveHighResReadyAndPendingLowResReadyNotEnoughToActivate)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
TEST_F(PictureLayerImplTest,SharedActiveHighResReadyNotEnoughToActivate)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:
NoLowResPictureLayerImplTest()3088 NoLowResPictureLayerImplTest()
3089 : PictureLayerImplTest(NoLowResTilingsSettings()) {}
3090 };
3091
TEST_F(NoLowResPictureLayerImplTest,ManageTilingsCreatesTilings)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
TEST_F(NoLowResPictureLayerImplTest,MarkRequiredNullTiles)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
TEST_F(NoLowResPictureLayerImplTest,NothingRequiredIfAllHighResTilesShared)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
TEST_F(NoLowResPictureLayerImplTest,NothingRequiredIfActiveMissingTiles)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
TEST_F(NoLowResPictureLayerImplTest,InvalidViewportForPrioritizingTiles)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
TEST_F(NoLowResPictureLayerImplTest,CleanUpTilings)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
TEST_F(PictureLayerImplTest,ScaleCollision)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
TEST_F(NoLowResPictureLayerImplTest,ReleaseResources)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
TEST_F(PictureLayerImplTest,SharedQuadStateContainsMaxTilingScale)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
TEST_F(PictureLayerImplTest,UpdateTilesForMasksWithNoVisibleContent)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:
PictureLayerImplTestWithDelegatingRenderer()3628 PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {}
3629
InitializeRenderer()3630 virtual void InitializeRenderer() OVERRIDE {
3631 host_impl_.InitializeRenderer(
3632 FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>());
3633 }
3634 };
3635
TEST_F(PictureLayerImplTestWithDelegatingRenderer,DelegatingRendererWithTileOOM)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:
OcclusionTrackingSettings()3688 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3689 };
3690
3691 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3692 public:
OcclusionTrackingPictureLayerImplTest()3693 OcclusionTrackingPictureLayerImplTest()
3694 : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3695
VerifyEvictionConsidersOcclusion(PictureLayerImpl * layer,size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES])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
TEST_F(OcclusionTrackingPictureLayerImplTest,OccludedTilesSkippedDuringRasterization)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
TEST_F(OcclusionTrackingPictureLayerImplTest,OccludedTilesNotMarkedAsRequired)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
TEST_F(OcclusionTrackingPictureLayerImplTest,OcclusionForDifferentScales)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
TEST_F(OcclusionTrackingPictureLayerImplTest,DifferentOcclusionOnTrees)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
TEST_F(OcclusionTrackingPictureLayerImplTest,OccludedTilesConsideredDuringEviction)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
TEST_F(PictureLayerImplTest,RecycledTwinLayer)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
TestQuadsForSolidColor(bool test_for_solid)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
TEST_F(PictureLayerImplTest,DrawSolidQuads)4394 TEST_F(PictureLayerImplTest, DrawSolidQuads) {
4395 TestQuadsForSolidColor(true);
4396 }
4397
TEST_F(PictureLayerImplTest,DrawNonSolidQuads)4398 TEST_F(PictureLayerImplTest, DrawNonSolidQuads) {
4399 TestQuadsForSolidColor(false);
4400 }
4401
TEST_F(PictureLayerImplTest,NonSolidToSolidNoTilings)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
4476