Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "cc/layers/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <limits> | 8 #include <limits> | 
| 9 #include <set> | 9 #include <set> | 
| 10 #include <utility> | 10 #include <utility> | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 float page_scale_factor, | 157 float page_scale_factor, | 
| 158 float maximum_animation_contents_scale, | 158 float maximum_animation_contents_scale, | 
| 159 bool animating_transform_to_screen) { | 159 bool animating_transform_to_screen) { | 
| 160 layer->draw_properties().ideal_contents_scale = ideal_contents_scale; | 160 layer->draw_properties().ideal_contents_scale = ideal_contents_scale; | 
| 161 layer->draw_properties().device_scale_factor = device_scale_factor; | 161 layer->draw_properties().device_scale_factor = device_scale_factor; | 
| 162 layer->draw_properties().page_scale_factor = page_scale_factor; | 162 layer->draw_properties().page_scale_factor = page_scale_factor; | 
| 163 layer->draw_properties().maximum_animation_contents_scale = | 163 layer->draw_properties().maximum_animation_contents_scale = | 
| 164 maximum_animation_contents_scale; | 164 maximum_animation_contents_scale; | 
| 165 layer->draw_properties().screen_space_transform_is_animating = | 165 layer->draw_properties().screen_space_transform_is_animating = | 
| 166 animating_transform_to_screen; | 166 animating_transform_to_screen; | 
| 167 layer->UpdateTiles(Occlusion()); | 167 bool draw_properties_valid_for_tile_priority = true; | 
| 168 layer->UpdateTiles(Occlusion(), draw_properties_valid_for_tile_priority); | |
| 168 } | 169 } | 
| 169 static void VerifyAllTilesExistAndHavePile( | 170 static void VerifyAllTilesExistAndHavePile( | 
| 170 const PictureLayerTiling* tiling, | 171 const PictureLayerTiling* tiling, | 
| 171 PicturePileImpl* pile) { | 172 PicturePileImpl* pile) { | 
| 172 for (PictureLayerTiling::CoverageIterator iter( | 173 for (PictureLayerTiling::CoverageIterator iter( | 
| 173 tiling, | 174 tiling, | 
| 174 tiling->contents_scale(), | 175 tiling->contents_scale(), | 
| 175 gfx::Rect(tiling->tiling_size())); | 176 gfx::Rect(tiling->tiling_size())); | 
| 176 iter; | 177 iter; | 
| 177 ++iter) { | 178 ++iter) { | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 gfx::Transform transform, transform_for_tile_priority; | 348 gfx::Transform transform, transform_for_tile_priority; | 
| 348 | 349 | 
| 349 host_impl_.SetExternalDrawConstraints(transform, | 350 host_impl_.SetExternalDrawConstraints(transform, | 
| 350 viewport, | 351 viewport, | 
| 351 viewport, | 352 viewport, | 
| 352 viewport_rect_for_tile_priority, | 353 viewport_rect_for_tile_priority, | 
| 353 transform_for_tile_priority, | 354 transform_for_tile_priority, | 
| 354 resourceless_software_draw); | 355 resourceless_software_draw); | 
| 355 active_layer_->draw_properties().visible_content_rect = viewport; | 356 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 356 active_layer_->draw_properties().screen_space_transform = transform; | 357 active_layer_->draw_properties().screen_space_transform = transform; | 
| 357 active_layer_->UpdateTiles(Occlusion()); | 358 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 358 | 359 | 
| 359 gfx::Rect viewport_rect_for_tile_priority_in_view_space = | 360 gfx::Rect viewport_rect_for_tile_priority_in_view_space = | 
| 360 viewport_rect_for_tile_priority; | 361 viewport_rect_for_tile_priority; | 
| 361 | 362 | 
| 362 // Verify the viewport rect for tile priority is used in picture layer impl. | 363 // Verify the viewport rect for tile priority is used in picture layer impl. | 
| 363 EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(), | 364 EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(), | 
| 364 viewport_rect_for_tile_priority_in_view_space); | 365 viewport_rect_for_tile_priority_in_view_space); | 
| 365 | 366 | 
| 366 // Verify the viewport rect for tile priority is used in picture layer tiling. | 367 // Verify the viewport rect for tile priority is used in picture layer tiling. | 
| 367 PictureLayerTilingSet* tilings = active_layer_->tilings(); | 368 PictureLayerTilingSet* tilings = active_layer_->tilings(); | 
| (...skipping 17 matching lines...) Expand all Loading... | |
| 385 transform_for_tile_priority.Translate(100, 100); | 386 transform_for_tile_priority.Translate(100, 100); | 
| 386 transform_for_tile_priority.Rotate(45); | 387 transform_for_tile_priority.Rotate(45); | 
| 387 host_impl_.SetExternalDrawConstraints(transform, | 388 host_impl_.SetExternalDrawConstraints(transform, | 
| 388 viewport, | 389 viewport, | 
| 389 viewport, | 390 viewport, | 
| 390 viewport_rect_for_tile_priority, | 391 viewport_rect_for_tile_priority, | 
| 391 transform_for_tile_priority, | 392 transform_for_tile_priority, | 
| 392 resourceless_software_draw); | 393 resourceless_software_draw); | 
| 393 active_layer_->draw_properties().visible_content_rect = viewport; | 394 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 394 active_layer_->draw_properties().screen_space_transform = transform; | 395 active_layer_->draw_properties().screen_space_transform = transform; | 
| 395 active_layer_->UpdateTiles(Occlusion()); | 396 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 396 | 397 | 
| 397 gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization); | 398 gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization); | 
| 398 bool success = transform_for_tile_priority.GetInverse(&screen_to_view); | 399 bool success = transform_for_tile_priority.GetInverse(&screen_to_view); | 
| 399 EXPECT_TRUE(success); | 400 EXPECT_TRUE(success); | 
| 400 | 401 | 
| 401 // Note that we don't clip this to the layer bounds, since it is expected that | 402 // Note that we don't clip this to the layer bounds, since it is expected that | 
| 402 // the rect will sometimes be outside of the layer bounds. If we clip to | 403 // the rect will sometimes be outside of the layer bounds. If we clip to | 
| 403 // bounds, then tile priorities will end up being incorrect in cases of fully | 404 // bounds, then tile priorities will end up being incorrect in cases of fully | 
| 404 // offscreen layer. | 405 // offscreen layer. | 
| 405 viewport_rect_for_tile_priority_in_view_space = | 406 viewport_rect_for_tile_priority_in_view_space = | 
| 406 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 407 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 
| 407 screen_to_view, viewport_rect_for_tile_priority)); | 408 screen_to_view, viewport_rect_for_tile_priority)); | 
| 408 | 409 | 
| 409 // Verify the viewport rect for tile priority is used in PictureLayerImpl. | 410 // Verify the viewport rect for tile priority is used in PictureLayerImpl. | 
| 410 EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(), | 411 EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(), | 
| 411 viewport_rect_for_tile_priority_in_view_space); | 412 viewport_rect_for_tile_priority_in_view_space); | 
| 412 | 413 | 
| 413 tilings = active_layer_->tilings(); | 414 tilings = active_layer_->tilings(); | 
| 414 for (size_t i = 0; i < tilings->num_tilings(); i++) { | 415 for (size_t i = 0; i < tilings->num_tilings(); i++) { | 
| 415 PictureLayerTiling* tiling = tilings->tiling_at(i); | 416 PictureLayerTiling* tiling = tilings->tiling_at(i); | 
| 416 EXPECT_EQ( | 417 EXPECT_EQ( | 
| 417 tiling->GetCurrentVisibleRectForTesting(), | 418 tiling->GetCurrentVisibleRectForTesting(), | 
| 418 gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space, | 419 gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space, | 
| 419 tiling->contents_scale())); | 420 tiling->contents_scale())); | 
| 420 } | 421 } | 
| 421 } | 422 } | 
| 422 | 423 | 
| 423 TEST_F(PictureLayerImplTest, | 424 TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) { | 
| 424 ResourcelessSoftwareDrawHasValidViewportForTilePriority) { | |
| 425 base::TimeTicks time_ticks; | 425 base::TimeTicks time_ticks; | 
| 426 time_ticks += base::TimeDelta::FromMilliseconds(1); | 426 time_ticks += base::TimeDelta::FromMilliseconds(1); | 
| 427 host_impl_.SetCurrentBeginFrameArgs( | 427 host_impl_.SetCurrentBeginFrameArgs( | 
| 428 CreateBeginFrameArgsForTesting(time_ticks)); | 428 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 429 | 429 | 
| 430 gfx::Size tile_size(100, 100); | 430 gfx::Size tile_size(100, 100); | 
| 431 gfx::Size layer_bounds(400, 400); | 431 gfx::Size layer_bounds(400, 400); | 
| 432 | 432 | 
| 433 scoped_refptr<FakePicturePileImpl> pending_pile = | 433 scoped_refptr<FakePicturePileImpl> pending_pile = | 
| 434 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 434 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 435 scoped_refptr<FakePicturePileImpl> active_pile = | 435 scoped_refptr<FakePicturePileImpl> active_pile = | 
| 436 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 436 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 437 | 437 | 
| 438 SetupTrees(pending_pile, active_pile); | 438 SetupTrees(pending_pile, active_pile); | 
| 439 | 439 | 
| 440 Region invalidation; | 440 Region invalidation; | 
| 441 AddDefaultTilingsWithInvalidation(invalidation); | 441 AddDefaultTilingsWithInvalidation(invalidation); | 
| 442 SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); | 442 SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); | 
| 443 | 443 | 
| 444 // UpdateTiles with valid viewport. Should update tile viewport. | 444 // UpdateTiles with valid viewport. Should update tile viewport. | 
| 445 // Note viewport is considered invalid if and only if in resourceless | |
| 446 // software draw. | |
| 445 bool resourceless_software_draw = false; | 447 bool resourceless_software_draw = false; | 
| 446 gfx::Rect viewport = gfx::Rect(layer_bounds); | 448 gfx::Rect viewport = gfx::Rect(layer_bounds); | 
| 447 gfx::Transform transform; | 449 gfx::Transform transform; | 
| 448 host_impl_.SetExternalDrawConstraints(transform, | 450 host_impl_.SetExternalDrawConstraints(transform, | 
| 449 viewport, | 451 viewport, | 
| 450 viewport, | 452 viewport, | 
| 451 viewport, | 453 viewport, | 
| 452 transform, | 454 transform, | 
| 453 resourceless_software_draw); | 455 resourceless_software_draw); | 
| 454 active_layer_->draw_properties().visible_content_rect = viewport; | 456 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 455 active_layer_->draw_properties().screen_space_transform = transform; | 457 active_layer_->draw_properties().screen_space_transform = transform; | 
| 456 active_layer_->UpdateTiles(Occlusion()); | 458 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 457 | 459 | 
| 458 gfx::Rect visible_rect_for_tile_priority = | 460 gfx::Rect visible_rect_for_tile_priority = | 
| 459 active_layer_->visible_rect_for_tile_priority(); | 461 active_layer_->visible_rect_for_tile_priority(); | 
| 460 EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); | 462 EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); | 
| 461 gfx::Rect viewport_rect_for_tile_priority = | 463 gfx::Rect viewport_rect_for_tile_priority = | 
| 462 active_layer_->viewport_rect_for_tile_priority(); | 464 active_layer_->viewport_rect_for_tile_priority(); | 
| 463 EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty()); | 465 EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty()); | 
| 464 gfx::Transform screen_space_transform_for_tile_priority = | 466 gfx::Transform screen_space_transform_for_tile_priority = | 
| 465 active_layer_->screen_space_transform_for_tile_priority(); | 467 active_layer_->screen_space_transform_for_tile_priority(); | 
| 466 | 468 | 
| 467 // PictureLayerImpl does not make a special case for | 469 // Expand viewport and set it as invalid for prioritizing tiles. | 
| 468 // resource_less_software_draw, so the tile viewport and matrix should be | 470 // Should update viewport and transform, but not update visible rect. | 
| 469 // respected. | |
| 470 time_ticks += base::TimeDelta::FromMilliseconds(200); | 471 time_ticks += base::TimeDelta::FromMilliseconds(200); | 
| 471 host_impl_.SetCurrentBeginFrameArgs( | 472 host_impl_.SetCurrentBeginFrameArgs( | 
| 472 CreateBeginFrameArgsForTesting(time_ticks)); | 473 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 473 resourceless_software_draw = true; | 474 resourceless_software_draw = true; | 
| 474 viewport = gfx::ScaleToEnclosingRect(viewport, 2); | 475 viewport = gfx::ScaleToEnclosingRect(viewport, 2); | 
| 475 transform.Translate(1.f, 1.f); | 476 transform.Translate(1.f, 1.f); | 
| 476 active_layer_->draw_properties().visible_content_rect = viewport; | 477 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 477 active_layer_->draw_properties().screen_space_transform = transform; | 478 active_layer_->draw_properties().screen_space_transform = transform; | 
| 478 host_impl_.SetExternalDrawConstraints(transform, | 479 host_impl_.SetExternalDrawConstraints(transform, | 
| 479 viewport, | 480 viewport, | 
| 480 viewport, | 481 viewport, | 
| 481 viewport, | 482 viewport, | 
| 482 transform, | 483 transform, | 
| 483 resourceless_software_draw); | 484 resourceless_software_draw); | 
| 484 active_layer_->UpdateTiles(Occlusion()); | 485 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 485 | 486 | 
| 486 visible_rect_for_tile_priority = | 487 // Viewport and transform for tile priority are updated. | 
| 487 gfx::ScaleToEnclosingRect(visible_rect_for_tile_priority, 2); | 488 EXPECT_RECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority()); | 
| 
 
danakj
2014/10/01 02:05:14
nit: you can EXPECT_EQ instead of EXPECT_RECT_EQ n
 
 | |
| 488 viewport_rect_for_tile_priority = | 489 EXPECT_TRANSFORMATION_MATRIX_EQ( | 
| 489 gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority, 2); | 490 transform, active_layer_->screen_space_transform_for_tile_priority()); | 
| 490 screen_space_transform_for_tile_priority = transform; | 491 // Visible rect for tile priority retains old value. | 
| 491 EXPECT_RECT_EQ(visible_rect_for_tile_priority, | 492 EXPECT_RECT_EQ(visible_rect_for_tile_priority, | 
| 492 active_layer_->visible_rect_for_tile_priority()); | 493 active_layer_->visible_rect_for_tile_priority()); | 
| 493 EXPECT_RECT_EQ(viewport_rect_for_tile_priority, | 494 | 
| 494 active_layer_->viewport_rect_for_tile_priority()); | 495 // Keep expanded viewport but mark it valid. Should update tile viewport. | 
| 496 time_ticks += base::TimeDelta::FromMilliseconds(200); | |
| 497 host_impl_.SetCurrentBeginFrameArgs( | |
| 498 CreateBeginFrameArgsForTesting(time_ticks)); | |
| 499 resourceless_software_draw = false; | |
| 500 host_impl_.SetExternalDrawConstraints(transform, | |
| 501 viewport, | |
| 502 viewport, | |
| 503 viewport, | |
| 504 transform, | |
| 505 resourceless_software_draw); | |
| 506 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | |
| 507 | |
| 495 EXPECT_TRANSFORMATION_MATRIX_EQ( | 508 EXPECT_TRANSFORMATION_MATRIX_EQ( | 
| 496 screen_space_transform_for_tile_priority, | 509 transform, active_layer_->screen_space_transform_for_tile_priority()); | 
| 497 active_layer_->screen_space_transform_for_tile_priority()); | 510 EXPECT_RECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority()); | 
| 511 | |
| 512 gfx::Rect viewport_rect_in_layer = | |
| 513 active_layer_->viewport_rect_for_tile_priority(); | |
| 514 viewport_rect_in_layer.Offset(1, 1); // Match translate in |transform|. | |
| 515 EXPECT_RECT_EQ(viewport, viewport_rect_in_layer); | |
| 
 
danakj
2014/10/01 02:05:14
nit: slightly prefer modifying the expected instea
 
 | |
| 498 } | 516 } | 
| 499 | 517 | 
| 500 TEST_F(PictureLayerImplTest, ClonePartialInvalidation) { | 518 TEST_F(PictureLayerImplTest, ClonePartialInvalidation) { | 
| 501 gfx::Size tile_size(100, 100); | 519 gfx::Size tile_size(100, 100); | 
| 502 gfx::Size layer_bounds(400, 400); | 520 gfx::Size layer_bounds(400, 400); | 
| 503 gfx::Rect layer_invalidation(150, 200, 30, 180); | 521 gfx::Rect layer_invalidation(150, 200, 30, 180); | 
| 504 | 522 | 
| 505 scoped_refptr<FakePicturePileImpl> pending_pile = | 523 scoped_refptr<FakePicturePileImpl> pending_pile = | 
| 506 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 524 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 507 scoped_refptr<FakePicturePileImpl> active_pile = | 525 scoped_refptr<FakePicturePileImpl> active_pile = | 
| (...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1412 } | 1430 } | 
| 1413 | 1431 | 
| 1414 TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) { | 1432 TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) { | 
| 1415 gfx::Size tile_size(100, 100); | 1433 gfx::Size tile_size(100, 100); | 
| 1416 gfx::Size layer_bounds(200, 200); | 1434 gfx::Size layer_bounds(200, 200); | 
| 1417 | 1435 | 
| 1418 scoped_refptr<FakePicturePileImpl> pending_pile = | 1436 scoped_refptr<FakePicturePileImpl> pending_pile = | 
| 1419 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 1437 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 1420 SetupPendingTree(pending_pile); | 1438 SetupPendingTree(pending_pile); | 
| 1421 | 1439 | 
| 1440 gfx::Transform transform; | |
| 1441 gfx::Transform transform_for_tile_priority; | |
| 1442 bool resourceless_software_draw = false; | |
| 1443 gfx::Rect viewport(0, 0, 100, 200); | |
| 1444 host_impl_.SetExternalDrawConstraints(transform, | |
| 1445 viewport, | |
| 1446 viewport, | |
| 1447 viewport, | |
| 1448 transform, | |
| 1449 resourceless_software_draw); | |
| 1450 | |
| 1422 pending_layer_->set_fixed_tile_size(tile_size); | 1451 pending_layer_->set_fixed_tile_size(tile_size); | 
| 1423 ASSERT_TRUE(pending_layer_->CanHaveTilings()); | 1452 ASSERT_TRUE(pending_layer_->CanHaveTilings()); | 
| 1424 PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f); | 1453 PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f); | 
| 1425 host_impl_.pending_tree()->UpdateDrawProperties(); | 1454 host_impl_.pending_tree()->UpdateDrawProperties(); | 
| 1426 EXPECT_EQ(tiling->resolution(), HIGH_RESOLUTION); | 1455 EXPECT_EQ(tiling->resolution(), HIGH_RESOLUTION); | 
| 1427 | 1456 EXPECT_RECT_EQ(viewport, pending_layer_->visible_rect_for_tile_priority()); | 
| 1428 pending_layer_->draw_properties().visible_content_rect = | |
| 1429 gfx::Rect(0, 0, 100, 200); | |
| 1430 | 1457 | 
| 1431 // Fake set priorities. | 1458 // Fake set priorities. | 
| 1432 for (PictureLayerTiling::CoverageIterator iter( | 1459 for (PictureLayerTiling::CoverageIterator iter( | 
| 1433 tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds)); | 1460 tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds)); | 
| 1434 iter; | 1461 iter; | 
| 1435 ++iter) { | 1462 ++iter) { | 
| 1436 if (!*iter) | 1463 if (!*iter) | 
| 1437 continue; | 1464 continue; | 
| 1438 Tile* tile = *iter; | 1465 Tile* tile = *iter; | 
| 1439 TilePriority priority; | 1466 TilePriority priority; | 
| 1440 priority.resolution = HIGH_RESOLUTION; | 1467 priority.resolution = HIGH_RESOLUTION; | 
| 1441 gfx::Rect tile_bounds = iter.geometry_rect(); | 1468 gfx::Rect tile_bounds = iter.geometry_rect(); | 
| 1442 if (pending_layer_->visible_content_rect().Intersects(tile_bounds)) { | 1469 if (pending_layer_->visible_rect_for_tile_priority().Intersects( | 
| 1470 tile_bounds)) { | |
| 1443 priority.priority_bin = TilePriority::NOW; | 1471 priority.priority_bin = TilePriority::NOW; | 
| 1444 priority.distance_to_visible = 0.f; | 1472 priority.distance_to_visible = 0.f; | 
| 1445 } else { | 1473 } else { | 
| 1446 priority.priority_bin = TilePriority::SOON; | 1474 priority.priority_bin = TilePriority::SOON; | 
| 1447 priority.distance_to_visible = 1.f; | 1475 priority.distance_to_visible = 1.f; | 
| 1448 } | 1476 } | 
| 1449 tile->SetPriority(PENDING_TREE, priority); | 1477 tile->SetPriority(PENDING_TREE, priority); | 
| 1450 } | 1478 } | 
| 1451 | 1479 | 
| 1452 pending_layer_->MarkVisibleResourcesAsRequired(); | 1480 pending_layer_->MarkVisibleResourcesAsRequired(); | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1508 transform_for_tile_priority, | 1536 transform_for_tile_priority, | 
| 1509 resourceless_software_draw); | 1537 resourceless_software_draw); | 
| 1510 host_impl_.pending_tree()->UpdateDrawProperties(); | 1538 host_impl_.pending_tree()->UpdateDrawProperties(); | 
| 1511 | 1539 | 
| 1512 // Set visible content rect that is different from | 1540 // Set visible content rect that is different from | 
| 1513 // external_viewport_for_tile_priority. | 1541 // external_viewport_for_tile_priority. | 
| 1514 pending_layer_->draw_properties().visible_content_rect = visible_content_rect; | 1542 pending_layer_->draw_properties().visible_content_rect = visible_content_rect; | 
| 1515 time_ticks += base::TimeDelta::FromMilliseconds(200); | 1543 time_ticks += base::TimeDelta::FromMilliseconds(200); | 
| 1516 host_impl_.SetCurrentBeginFrameArgs( | 1544 host_impl_.SetCurrentBeginFrameArgs( | 
| 1517 CreateBeginFrameArgsForTesting(time_ticks)); | 1545 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 1518 pending_layer_->UpdateTiles(Occlusion()); | 1546 pending_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 1519 | 1547 | 
| 1520 pending_layer_->MarkVisibleResourcesAsRequired(); | 1548 pending_layer_->MarkVisibleResourcesAsRequired(); | 
| 1521 | 1549 | 
| 1522 // Intersect the two rects. Any tile outside should not be required for | 1550 // Intersect the two rects. Any tile outside should not be required for | 
| 1523 // activation. | 1551 // activation. | 
| 1524 gfx::Rect viewport_for_tile_priority = | 1552 gfx::Rect viewport_for_tile_priority = | 
| 1525 pending_layer_->GetViewportForTilePriorityInContentSpace(); | 1553 pending_layer_->GetViewportForTilePriorityInContentSpace(); | 
| 1526 viewport_for_tile_priority.Intersect(pending_layer_->visible_content_rect()); | 1554 viewport_for_tile_priority.Intersect(pending_layer_->visible_content_rect()); | 
| 1527 | 1555 | 
| 1528 int num_inside = 0; | 1556 int num_inside = 0; | 
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2572 EXPECT_EQ(low_res_tile_count + high_res_tile_count + non_ideal_tile_count, | 2600 EXPECT_EQ(low_res_tile_count + high_res_tile_count + non_ideal_tile_count, | 
| 2573 unique_tiles.size()); | 2601 unique_tiles.size()); | 
| 2574 | 2602 | 
| 2575 // No NOW tiles. | 2603 // No NOW tiles. | 
| 2576 time_ticks += base::TimeDelta::FromMilliseconds(200); | 2604 time_ticks += base::TimeDelta::FromMilliseconds(200); | 
| 2577 host_impl_.SetCurrentBeginFrameArgs( | 2605 host_impl_.SetCurrentBeginFrameArgs( | 
| 2578 CreateBeginFrameArgsForTesting(time_ticks)); | 2606 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 2579 | 2607 | 
| 2580 pending_layer_->draw_properties().visible_content_rect = | 2608 pending_layer_->draw_properties().visible_content_rect = | 
| 2581 gfx::Rect(1100, 1100, 500, 500); | 2609 gfx::Rect(1100, 1100, 500, 500); | 
| 2582 pending_layer_->UpdateTiles(Occlusion()); | 2610 bool draw_properties_valid_for_tile_priority = true; | 
| 2611 pending_layer_->UpdateTiles(Occlusion(), | |
| 2612 draw_properties_valid_for_tile_priority); | |
| 2583 | 2613 | 
| 2584 unique_tiles.clear(); | 2614 unique_tiles.clear(); | 
| 2585 high_res_tile_count = 0u; | 2615 high_res_tile_count = 0u; | 
| 2586 for (it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); | 2616 for (it = PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); | 
| 2587 it; | 2617 it; | 
| 2588 ++it) { | 2618 ++it) { | 
| 2589 Tile* tile = *it; | 2619 Tile* tile = *it; | 
| 2590 TilePriority priority = tile->priority(PENDING_TREE); | 2620 TilePriority priority = tile->priority(PENDING_TREE); | 
| 2591 | 2621 | 
| 2592 EXPECT_TRUE(tile); | 2622 EXPECT_TRUE(tile); | 
| 2593 | 2623 | 
| 2594 // Non-high res tiles only get visible tiles. | 2624 // Non-high res tiles only get visible tiles. | 
| 2595 EXPECT_EQ(HIGH_RESOLUTION, priority.resolution); | 2625 EXPECT_EQ(HIGH_RESOLUTION, priority.resolution); | 
| 2596 EXPECT_NE(TilePriority::NOW, priority.priority_bin); | 2626 EXPECT_NE(TilePriority::NOW, priority.priority_bin); | 
| 2597 | 2627 | 
| 2598 high_res_tile_count += priority.resolution == HIGH_RESOLUTION; | 2628 high_res_tile_count += priority.resolution == HIGH_RESOLUTION; | 
| 2599 | 2629 | 
| 2600 unique_tiles.insert(tile); | 2630 unique_tiles.insert(tile); | 
| 2601 } | 2631 } | 
| 2602 | 2632 | 
| 2603 EXPECT_EQ(16u, high_res_tile_count); | 2633 EXPECT_EQ(16u, high_res_tile_count); | 
| 2604 EXPECT_EQ(high_res_tile_count, unique_tiles.size()); | 2634 EXPECT_EQ(high_res_tile_count, unique_tiles.size()); | 
| 2605 | 2635 | 
| 2606 time_ticks += base::TimeDelta::FromMilliseconds(200); | 2636 time_ticks += base::TimeDelta::FromMilliseconds(200); | 
| 2607 host_impl_.SetCurrentBeginFrameArgs( | 2637 host_impl_.SetCurrentBeginFrameArgs( | 
| 2608 CreateBeginFrameArgsForTesting(time_ticks)); | 2638 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 2609 | 2639 | 
| 2610 pending_layer_->draw_properties().visible_content_rect = | 2640 pending_layer_->draw_properties().visible_content_rect = | 
| 2611 gfx::Rect(0, 0, 500, 500); | 2641 gfx::Rect(0, 0, 500, 500); | 
| 2612 pending_layer_->UpdateTiles(Occlusion()); | 2642 pending_layer_->UpdateTiles(Occlusion(), | 
| 2643 draw_properties_valid_for_tile_priority); | |
| 2613 | 2644 | 
| 2614 std::vector<Tile*> high_res_tiles = high_res_tiling->AllTilesForTesting(); | 2645 std::vector<Tile*> high_res_tiles = high_res_tiling->AllTilesForTesting(); | 
| 2615 for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin(); | 2646 for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin(); | 
| 2616 tile_it != high_res_tiles.end(); | 2647 tile_it != high_res_tiles.end(); | 
| 2617 ++tile_it) { | 2648 ++tile_it) { | 
| 2618 Tile* tile = *tile_it; | 2649 Tile* tile = *tile_it; | 
| 2619 ManagedTileState::DrawInfo& draw_info = tile->draw_info(); | 2650 ManagedTileState::DrawInfo& draw_info = tile->draw_info(); | 
| 2620 draw_info.SetSolidColorForTesting(SK_ColorRED); | 2651 draw_info.SetSolidColorForTesting(SK_ColorRED); | 
| 2621 } | 2652 } | 
| 2622 | 2653 | 
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3123 EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u); | 3154 EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u); | 
| 3124 | 3155 | 
| 3125 // Since the active layer has no tiles at all, the pending layer doesn't | 3156 // Since the active layer has no tiles at all, the pending layer doesn't | 
| 3126 // need content in order to activate. | 3157 // need content in order to activate. | 
| 3127 pending_layer_->MarkVisibleResourcesAsRequired(); | 3158 pending_layer_->MarkVisibleResourcesAsRequired(); | 
| 3128 AssertNoTilesRequired(pending_layer_->HighResTiling()); | 3159 AssertNoTilesRequired(pending_layer_->HighResTiling()); | 
| 3129 if (host_impl_.settings().create_low_res_tiling) | 3160 if (host_impl_.settings().create_low_res_tiling) | 
| 3130 AssertNoTilesRequired(pending_layer_->LowResTiling()); | 3161 AssertNoTilesRequired(pending_layer_->LowResTiling()); | 
| 3131 } | 3162 } | 
| 3132 | 3163 | 
| 3133 TEST_F(NoLowResPictureLayerImplTest, | 3164 TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { | 
| 3134 ResourcelessSoftwareDrawHasValidViewportForTilePriority) { | |
| 3135 base::TimeTicks time_ticks; | 3165 base::TimeTicks time_ticks; | 
| 3136 time_ticks += base::TimeDelta::FromMilliseconds(1); | 3166 time_ticks += base::TimeDelta::FromMilliseconds(1); | 
| 3137 host_impl_.SetCurrentBeginFrameArgs( | 3167 host_impl_.SetCurrentBeginFrameArgs( | 
| 3138 CreateBeginFrameArgsForTesting(time_ticks)); | 3168 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 3139 | 3169 | 
| 3140 gfx::Size tile_size(100, 100); | 3170 gfx::Size tile_size(100, 100); | 
| 3141 gfx::Size layer_bounds(400, 400); | 3171 gfx::Size layer_bounds(400, 400); | 
| 3142 | 3172 | 
| 3143 scoped_refptr<FakePicturePileImpl> pending_pile = | 3173 scoped_refptr<FakePicturePileImpl> pending_pile = | 
| 3144 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 3174 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 3145 scoped_refptr<FakePicturePileImpl> active_pile = | 3175 scoped_refptr<FakePicturePileImpl> active_pile = | 
| 3146 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 3176 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 3147 | 3177 | 
| 3148 SetupTrees(pending_pile, active_pile); | 3178 SetupTrees(pending_pile, active_pile); | 
| 3149 | 3179 | 
| 3150 Region invalidation; | 3180 Region invalidation; | 
| 3151 AddDefaultTilingsWithInvalidation(invalidation); | 3181 AddDefaultTilingsWithInvalidation(invalidation); | 
| 3152 SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); | 3182 SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); | 
| 3153 | 3183 | 
| 3154 // UpdateTiles with valid viewport. Should update tile viewport. | 3184 // UpdateTiles with valid viewport. Should update tile viewport. | 
| 3185 // Note viewport is considered invalid if and only if in resourceless | |
| 3186 // software draw. | |
| 3155 bool resourceless_software_draw = false; | 3187 bool resourceless_software_draw = false; | 
| 3156 gfx::Rect viewport = gfx::Rect(layer_bounds); | 3188 gfx::Rect viewport = gfx::Rect(layer_bounds); | 
| 3157 gfx::Transform transform; | 3189 gfx::Transform transform; | 
| 3158 host_impl_.SetExternalDrawConstraints(transform, | 3190 host_impl_.SetExternalDrawConstraints(transform, | 
| 3159 viewport, | 3191 viewport, | 
| 3160 viewport, | 3192 viewport, | 
| 3161 viewport, | 3193 viewport, | 
| 3162 transform, | 3194 transform, | 
| 3163 resourceless_software_draw); | 3195 resourceless_software_draw); | 
| 3164 active_layer_->draw_properties().visible_content_rect = viewport; | 3196 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 3165 active_layer_->draw_properties().screen_space_transform = transform; | 3197 active_layer_->draw_properties().screen_space_transform = transform; | 
| 3166 active_layer_->UpdateTiles(Occlusion()); | 3198 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 3167 | 3199 | 
| 3168 gfx::Rect visible_rect_for_tile_priority = | 3200 gfx::Rect visible_rect_for_tile_priority = | 
| 3169 active_layer_->visible_rect_for_tile_priority(); | 3201 active_layer_->visible_rect_for_tile_priority(); | 
| 3170 EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); | 3202 EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); | 
| 3171 gfx::Rect viewport_rect_for_tile_priority = | 3203 gfx::Rect viewport_rect_for_tile_priority = | 
| 3172 active_layer_->viewport_rect_for_tile_priority(); | 3204 active_layer_->viewport_rect_for_tile_priority(); | 
| 3173 EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty()); | 3205 EXPECT_FALSE(viewport_rect_for_tile_priority.IsEmpty()); | 
| 3174 gfx::Transform screen_space_transform_for_tile_priority = | 3206 gfx::Transform screen_space_transform_for_tile_priority = | 
| 3175 active_layer_->screen_space_transform_for_tile_priority(); | 3207 active_layer_->screen_space_transform_for_tile_priority(); | 
| 3176 | 3208 | 
| 3177 // PictureLayerImpl does not make a special case for | 3209 // Expand viewport and set it as invalid for prioritizing tiles. | 
| 3178 // resource_less_software_draw, so the tile viewport and matrix should be | 3210 // Should update viewport and transform, but not update visible rect. | 
| 3179 // respected. | |
| 3180 time_ticks += base::TimeDelta::FromMilliseconds(200); | 3211 time_ticks += base::TimeDelta::FromMilliseconds(200); | 
| 3181 host_impl_.SetCurrentBeginFrameArgs( | 3212 host_impl_.SetCurrentBeginFrameArgs( | 
| 3182 CreateBeginFrameArgsForTesting(time_ticks)); | 3213 CreateBeginFrameArgsForTesting(time_ticks)); | 
| 3183 resourceless_software_draw = true; | 3214 resourceless_software_draw = true; | 
| 3184 viewport = gfx::ScaleToEnclosingRect(viewport, 2); | 3215 viewport = gfx::ScaleToEnclosingRect(viewport, 2); | 
| 3185 transform.Translate(1.f, 1.f); | 3216 transform.Translate(1.f, 1.f); | 
| 3186 active_layer_->draw_properties().visible_content_rect = viewport; | 3217 active_layer_->draw_properties().visible_content_rect = viewport; | 
| 3187 active_layer_->draw_properties().screen_space_transform = transform; | 3218 active_layer_->draw_properties().screen_space_transform = transform; | 
| 3188 host_impl_.SetExternalDrawConstraints(transform, | 3219 host_impl_.SetExternalDrawConstraints(transform, | 
| 3189 viewport, | 3220 viewport, | 
| 3190 viewport, | 3221 viewport, | 
| 3191 viewport, | 3222 viewport, | 
| 3192 transform, | 3223 transform, | 
| 3193 resourceless_software_draw); | 3224 resourceless_software_draw); | 
| 3194 active_layer_->UpdateTiles(Occlusion()); | 3225 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | 
| 3195 | 3226 | 
| 3196 visible_rect_for_tile_priority = | 3227 // Viewport and transform for tile priority are updated. | 
| 3197 gfx::ScaleToEnclosingRect(visible_rect_for_tile_priority, 2); | 3228 EXPECT_RECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority()); | 
| 3198 viewport_rect_for_tile_priority = | 3229 EXPECT_TRANSFORMATION_MATRIX_EQ( | 
| 3199 gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority, 2); | 3230 transform, active_layer_->screen_space_transform_for_tile_priority()); | 
| 3200 screen_space_transform_for_tile_priority = transform; | 3231 // Visible rect for tile priority retains old value. | 
| 3201 | |
| 3202 EXPECT_RECT_EQ(visible_rect_for_tile_priority, | 3232 EXPECT_RECT_EQ(visible_rect_for_tile_priority, | 
| 3203 active_layer_->visible_rect_for_tile_priority()); | 3233 active_layer_->visible_rect_for_tile_priority()); | 
| 3204 EXPECT_RECT_EQ(viewport_rect_for_tile_priority, | 3234 | 
| 3205 active_layer_->viewport_rect_for_tile_priority()); | 3235 // Keep expanded viewport but mark it valid. Should update tile viewport. | 
| 3236 time_ticks += base::TimeDelta::FromMilliseconds(200); | |
| 3237 host_impl_.SetCurrentBeginFrameArgs( | |
| 3238 CreateBeginFrameArgsForTesting(time_ticks)); | |
| 3239 resourceless_software_draw = false; | |
| 3240 host_impl_.SetExternalDrawConstraints(transform, | |
| 3241 viewport, | |
| 3242 viewport, | |
| 3243 viewport, | |
| 3244 transform, | |
| 3245 resourceless_software_draw); | |
| 3246 active_layer_->UpdateTiles(Occlusion(), !resourceless_software_draw); | |
| 3247 | |
| 3206 EXPECT_TRANSFORMATION_MATRIX_EQ( | 3248 EXPECT_TRANSFORMATION_MATRIX_EQ( | 
| 3207 screen_space_transform_for_tile_priority, | 3249 transform, active_layer_->screen_space_transform_for_tile_priority()); | 
| 3208 active_layer_->screen_space_transform_for_tile_priority()); | 3250 EXPECT_RECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority()); | 
| 3251 | |
| 3252 gfx::Rect viewport_rect_in_layer = | |
| 3253 active_layer_->viewport_rect_for_tile_priority(); | |
| 3254 viewport_rect_in_layer.Offset(1, 1); // Match translate in |transform|. | |
| 3255 EXPECT_RECT_EQ(viewport, viewport_rect_in_layer); | |
| 3209 } | 3256 } | 
| 3210 | 3257 | 
| 3211 TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) { | 3258 TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) { | 
| 3212 gfx::Size tile_size(400, 400); | 3259 gfx::Size tile_size(400, 400); | 
| 3213 gfx::Size layer_bounds(1300, 1900); | 3260 gfx::Size layer_bounds(1300, 1900); | 
| 3214 | 3261 | 
| 3215 scoped_refptr<FakePicturePileImpl> pending_pile = | 3262 scoped_refptr<FakePicturePileImpl> pending_pile = | 
| 3216 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 3263 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| 3217 scoped_refptr<FakePicturePileImpl> active_pile = | 3264 scoped_refptr<FakePicturePileImpl> active_pile = | 
| 3218 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 3265 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 
| (...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4358 SetupPendingTree(pending_pile2); | 4405 SetupPendingTree(pending_pile2); | 
| 4359 ActivateTree(); | 4406 ActivateTree(); | 
| 4360 | 4407 | 
| 4361 // We've switched to a solid color, so we should end up with no tilings. | 4408 // We've switched to a solid color, so we should end up with no tilings. | 
| 4362 ASSERT_TRUE(active_layer_->tilings()); | 4409 ASSERT_TRUE(active_layer_->tilings()); | 
| 4363 EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); | 4410 EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); | 
| 4364 } | 4411 } | 
| 4365 | 4412 | 
| 4366 } // namespace | 4413 } // namespace | 
| 4367 } // namespace cc | 4414 } // namespace cc | 
| OLD | NEW |