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