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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 gfx::Size tile_size(100, 100); | 73 gfx::Size tile_size(100, 100); |
74 | 74 |
75 scoped_refptr<FakePicturePileImpl> pending_pile = | 75 scoped_refptr<FakePicturePileImpl> pending_pile = |
76 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 76 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
77 scoped_refptr<FakePicturePileImpl> active_pile = | 77 scoped_refptr<FakePicturePileImpl> active_pile = |
78 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 78 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
79 | 79 |
80 SetupTrees(pending_pile, active_pile); | 80 SetupTrees(pending_pile, active_pile); |
81 } | 81 } |
82 | 82 |
| 83 void SetupDefaultPendingTree(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 |
| 89 SetupPendingTree(pending_pile); |
| 90 host_impl_.pending_tree()->SetPageScaleFactorAndLimits(1.f, 0.25f, 100.f); |
| 91 } |
| 92 |
83 void ActivateTree() { | 93 void ActivateTree() { |
84 host_impl_.ActivateSyncTree(); | 94 host_impl_.ActivateSyncTree(); |
85 CHECK(!host_impl_.pending_tree()); | 95 CHECK(!host_impl_.pending_tree()); |
86 pending_layer_ = NULL; | 96 pending_layer_ = NULL; |
87 active_layer_ = static_cast<FakePictureLayerImpl*>( | 97 active_layer_ = static_cast<FakePictureLayerImpl*>( |
88 host_impl_.active_tree()->LayerById(id_)); | 98 host_impl_.active_tree()->LayerById(id_)); |
89 } | 99 } |
90 | 100 |
91 void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds, | 101 void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds, |
92 const gfx::Size& tile_size) { | 102 const gfx::Size& tile_size) { |
(...skipping 1390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1483 host_impl_.ActivateSyncTree(); | 1493 host_impl_.ActivateSyncTree(); |
1484 | 1494 |
1485 active_layer_ = static_cast<FakePictureLayerImpl*>( | 1495 active_layer_ = static_cast<FakePictureLayerImpl*>( |
1486 host_impl_.active_tree()->LayerById(id_)); | 1496 host_impl_.active_tree()->LayerById(id_)); |
1487 | 1497 |
1488 EXPECT_EQ(0u, active_layer_->num_tilings()); | 1498 EXPECT_EQ(0u, active_layer_->num_tilings()); |
1489 EXPECT_EQ(raster_page_scale, active_layer_->raster_page_scale()); | 1499 EXPECT_EQ(raster_page_scale, active_layer_->raster_page_scale()); |
1490 EXPECT_FALSE(active_layer_->needs_post_commit_initialization()); | 1500 EXPECT_FALSE(active_layer_->needs_post_commit_initialization()); |
1491 } | 1501 } |
1492 | 1502 |
1493 TEST_F(PictureLayerImplTest, RemoveInvalidTilesOnActivation) { | 1503 TEST_F(PictureLayerImplTest, ShareTilesOnSync) { |
1494 SetupDefaultTrees(gfx::Size(1500, 1500)); | 1504 SetupDefaultTrees(gfx::Size(1500, 1500)); |
1495 AddDefaultTilingsWithInvalidation(gfx::Rect(0, 0, 1, 1)); | 1505 AddDefaultTilingsWithInvalidation(gfx::Rect()); |
1496 | 1506 |
1497 FakePictureLayerImpl* recycled_layer = pending_layer_; | |
1498 host_impl_.ActivateSyncTree(); | 1507 host_impl_.ActivateSyncTree(); |
1499 | 1508 host_impl_.CreatePendingTree(); |
1500 active_layer_ = static_cast<FakePictureLayerImpl*>( | 1509 active_layer_ = static_cast<FakePictureLayerImpl*>( |
1501 host_impl_.active_tree()->LayerById(id_)); | 1510 host_impl_.active_tree()->LayerById(id_)); |
1502 | 1511 |
| 1512 // Force the active tree to sync to the pending tree "post-commit". |
| 1513 pending_layer_->DoPostCommitInitializationIfNeeded(); |
| 1514 |
| 1515 // Both invalidations should drop tiles from the pending tree. |
1503 EXPECT_EQ(3u, active_layer_->num_tilings()); | 1516 EXPECT_EQ(3u, active_layer_->num_tilings()); |
1504 EXPECT_EQ(3u, recycled_layer->num_tilings()); | 1517 EXPECT_EQ(3u, pending_layer_->num_tilings()); |
1505 EXPECT_FALSE(host_impl_.pending_tree()); | |
1506 for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { | 1518 for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
1507 PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i); | 1519 PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i); |
1508 PictureLayerTiling* recycled_tiling = | 1520 PictureLayerTiling* pending_tiling = |
1509 recycled_layer->tilings()->tiling_at(i); | 1521 pending_layer_->tilings()->tiling_at(i); |
1510 | 1522 |
1511 ASSERT_TRUE(active_tiling); | 1523 ASSERT_TRUE(active_tiling); |
1512 ASSERT_TRUE(recycled_tiling); | 1524 ASSERT_TRUE(pending_tiling); |
1513 | 1525 |
1514 EXPECT_TRUE(active_tiling->TileAt(0, 0)); | 1526 EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
1515 EXPECT_TRUE(active_tiling->TileAt(1, 0)); | 1527 EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
1516 EXPECT_TRUE(active_tiling->TileAt(0, 1)); | 1528 EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
1517 EXPECT_TRUE(active_tiling->TileAt(1, 1)); | 1529 EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
1518 | 1530 |
1519 EXPECT_FALSE(recycled_tiling->TileAt(0, 0)); | 1531 EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
1520 EXPECT_TRUE(recycled_tiling->TileAt(1, 0)); | 1532 EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
1521 EXPECT_TRUE(recycled_tiling->TileAt(0, 1)); | 1533 EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
1522 EXPECT_TRUE(recycled_tiling->TileAt(1, 1)); | 1534 EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
1523 | 1535 |
1524 EXPECT_EQ(active_tiling->TileAt(1, 0), recycled_tiling->TileAt(1, 0)); | 1536 EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
1525 EXPECT_EQ(active_tiling->TileAt(0, 1), recycled_tiling->TileAt(0, 1)); | 1537 EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
1526 EXPECT_EQ(active_tiling->TileAt(1, 1), recycled_tiling->TileAt(1, 1)); | 1538 EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
| 1539 EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
1527 } | 1540 } |
1528 } | 1541 } |
1529 | 1542 |
| 1543 TEST_F(PictureLayerImplTest, RemoveInvalidActiveTreeTilesOnSync) { |
| 1544 SetupDefaultTrees(gfx::Size(1500, 1500)); |
| 1545 AddDefaultTilingsWithInvalidation(gfx::Rect(0, 0, 1, 1)); |
| 1546 |
| 1547 // This activates the 0,0,1,1 invalidation. |
| 1548 host_impl_.ActivateSyncTree(); |
| 1549 host_impl_.CreatePendingTree(); |
| 1550 active_layer_ = static_cast<FakePictureLayerImpl*>( |
| 1551 host_impl_.active_tree()->LayerById(id_)); |
| 1552 |
| 1553 // Force the active tree to sync to the pending tree "post-commit". |
| 1554 pending_layer_->DoPostCommitInitializationIfNeeded(); |
| 1555 |
| 1556 // Both invalidations should drop tiles from the pending tree. |
| 1557 EXPECT_EQ(3u, active_layer_->num_tilings()); |
| 1558 EXPECT_EQ(3u, pending_layer_->num_tilings()); |
| 1559 for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
| 1560 PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i); |
| 1561 PictureLayerTiling* pending_tiling = |
| 1562 pending_layer_->tilings()->tiling_at(i); |
| 1563 |
| 1564 ASSERT_TRUE(active_tiling); |
| 1565 ASSERT_TRUE(pending_tiling); |
| 1566 |
| 1567 EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
| 1568 EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
| 1569 EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
| 1570 EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
| 1571 |
| 1572 EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
| 1573 EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
| 1574 EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
| 1575 EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
| 1576 |
| 1577 EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
| 1578 EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
| 1579 EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
| 1580 EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
| 1581 } |
| 1582 } |
| 1583 |
| 1584 TEST_F(PictureLayerImplTest, RemoveInvalidPendingTreeTilesOnSync) { |
| 1585 SetupDefaultTrees(gfx::Size(1500, 1500)); |
| 1586 AddDefaultTilingsWithInvalidation(gfx::Rect()); |
| 1587 |
| 1588 host_impl_.ActivateSyncTree(); |
| 1589 host_impl_.CreatePendingTree(); |
| 1590 active_layer_ = static_cast<FakePictureLayerImpl*>( |
| 1591 host_impl_.active_tree()->LayerById(id_)); |
| 1592 |
| 1593 // Set some invalidation on the pending tree "during commit". We should |
| 1594 // replace raster tiles that touch this. |
| 1595 pending_layer_->set_invalidation(gfx::Rect(1, 1)); |
| 1596 |
| 1597 // Force the active tree to sync to the pending tree "post-commit". |
| 1598 pending_layer_->DoPostCommitInitializationIfNeeded(); |
| 1599 |
| 1600 // Both invalidations should drop tiles from the pending tree. |
| 1601 EXPECT_EQ(3u, active_layer_->num_tilings()); |
| 1602 EXPECT_EQ(3u, pending_layer_->num_tilings()); |
| 1603 for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
| 1604 PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i); |
| 1605 PictureLayerTiling* pending_tiling = |
| 1606 pending_layer_->tilings()->tiling_at(i); |
| 1607 |
| 1608 ASSERT_TRUE(active_tiling); |
| 1609 ASSERT_TRUE(pending_tiling); |
| 1610 |
| 1611 EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
| 1612 EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
| 1613 EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
| 1614 EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
| 1615 |
| 1616 EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
| 1617 EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
| 1618 EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
| 1619 EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
| 1620 |
| 1621 EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
| 1622 EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
| 1623 EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
| 1624 EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
| 1625 } |
| 1626 } |
| 1627 |
1530 TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) { | 1628 TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) { |
1531 SetupDefaultTrees(gfx::Size(10, 10)); | 1629 SetupDefaultTrees(gfx::Size(10, 10)); |
1532 host_impl_.active_tree()->UpdateDrawProperties(); | 1630 host_impl_.active_tree()->UpdateDrawProperties(); |
1533 EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties()); | 1631 EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties()); |
1534 | 1632 |
1535 // Contrived unit test of a real crash. A layer is transparent during a | 1633 // Contrived unit test of a real crash. A layer is transparent during a |
1536 // context loss, and later becomes opaque, causing active layer SyncTiling to | 1634 // context loss, and later becomes opaque, causing active layer SyncTiling to |
1537 // be called. | 1635 // be called. |
1538 float new_scale = 1.f; | 1636 float new_scale = 1.f; |
1539 active_layer_->ReleaseResources(); | 1637 active_layer_->ReleaseResources(); |
(...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3095 NOTREACHED(); | 3193 NOTREACHED(); |
3096 } | 3194 } |
3097 | 3195 |
3098 tiling_count++; | 3196 tiling_count++; |
3099 } | 3197 } |
3100 | 3198 |
3101 EXPECT_EQ(tiling_count, 5); | 3199 EXPECT_EQ(tiling_count, 5); |
3102 } | 3200 } |
3103 } // namespace | 3201 } // namespace |
3104 } // namespace cc | 3202 } // namespace cc |
OLD | NEW |