diff options
author | Hui Shu <hush@google.com> | 2014-12-03 15:48:29 -0800 |
---|---|---|
committer | Hui Shu <hush@google.com> | 2014-12-03 23:49:45 +0000 |
commit | 16eb802a40c4bfb5d55b2827f23bd51543a9db59 (patch) | |
tree | ba0facc7b603358f9eb2f6f057c565839883ad04 | |
parent | a1cbb3b9bf476a92ed07e9800de0bd642d1912db (diff) | |
download | chromium_src-16eb802a40c4bfb5d55b2827f23bd51543a9db59.zip chromium_src-16eb802a40c4bfb5d55b2827f23bd51543a9db59.tar.gz chromium_src-16eb802a40c4bfb5d55b2827f23bd51543a9db59.tar.bz2 |
Clip a layer when its render target's render surface is clipped.
An empty clip rect of a render surface does not necessarily mean
the surface is unclippped.
BUG=435797
Review URL: https://codereview.chromium.org/751453005
Cr-Commit-Position: refs/heads/master@{#306481}
(cherry picked from commit 887bb5444a8474c45fda32bbd750f1a72a21ec49)
Review URL: https://codereview.chromium.org/777753003
Cr-Commit-Position: refs/branch-heads/2214@{#204}
Cr-Branched-From: 03655fd3f6d72165dc3c9bd2c89807305316fe6c-refs/heads/master@{#303346}
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 25 | ||||
-rw-r--r-- | cc/layers/tiled_layer_unittest.cc | 8 | ||||
-rw-r--r-- | cc/resources/tile_manager_unittest.cc | 18 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common.cc | 2 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common_unittest.cc | 50 |
5 files changed, 98 insertions, 5 deletions
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 4b42eca..b75aa63 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -1872,6 +1872,9 @@ TEST_F(PictureLayerImplTest, TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) { gfx::Size layer_bounds(400, 400); gfx::Size tile_size(100, 100); + + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // No tiles shared. @@ -1893,6 +1896,9 @@ TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) { TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) { gfx::Size layer_bounds(400, 400); gfx::Size tile_size(100, 100); + + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // All tiles shared (no invalidation). @@ -1917,6 +1923,9 @@ TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) { TEST_F(PictureLayerImplTest, AllHighResRequiredEvenIfShared) { gfx::Size layer_bounds(400, 400); gfx::Size tile_size(100, 100); + + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); CreateHighLowResAndSetAllTilesVisible(); @@ -1991,6 +2000,9 @@ TEST_F(PictureLayerImplTest, NothingRequiredIfActiveMissingTiles) { TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) { gfx::Size layer_bounds(400, 400); gfx::Size tile_size(100, 100); + + host_impl_.SetViewportSize(layer_bounds); + scoped_refptr<FakePicturePileImpl> pending_pile = FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); scoped_refptr<FakePicturePileImpl> active_pile = @@ -3136,6 +3148,8 @@ TEST_F(PictureLayerImplTest, LowResReadyToDrawNotEnoughToActivate) { gfx::Size tile_size(100, 100); gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // Make sure some tiles are not shared. @@ -3163,6 +3177,8 @@ TEST_F(PictureLayerImplTest, HighResReadyToDrawEnoughToActivate) { gfx::Size tile_size(100, 100); gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // Make sure some tiles are not shared. @@ -3186,6 +3202,8 @@ TEST_F(PictureLayerImplTest, gfx::Size tile_size(100, 100); gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // Make sure some tiles are not shared. @@ -3210,6 +3228,8 @@ TEST_F(PictureLayerImplTest, SharedActiveHighResReadyNotEnoughToActivate) { gfx::Size tile_size(100, 100); gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); // Make sure some tiles are not shared. @@ -3297,6 +3317,9 @@ TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) { TEST_F(NoLowResPictureLayerImplTest, AllHighResRequiredEvenIfShared) { gfx::Size layer_bounds(400, 400); gfx::Size tile_size(100, 100); + + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); CreateHighLowResAndSetAllTilesVisible(); @@ -3658,6 +3681,8 @@ TEST_F(PictureLayerImplTest, SharedQuadStateContainsMaxTilingScale) { gfx::Size tile_size(400, 400); gfx::Size layer_bounds(1000, 2000); + host_impl_.SetViewportSize(layer_bounds); + scoped_refptr<FakePicturePileImpl> pending_pile = FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); scoped_refptr<FakePicturePileImpl> active_pile = diff --git a/cc/layers/tiled_layer_unittest.cc b/cc/layers/tiled_layer_unittest.cc index 9c814be..e0676d2 100644 --- a/cc/layers/tiled_layer_unittest.cc +++ b/cc/layers/tiled_layer_unittest.cc @@ -260,6 +260,8 @@ class TiledLayerTest : public testing::Test { }; TEST_F(TiledLayerTest, PushDirtyTiles) { + layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); + scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); scoped_ptr<FakeTiledLayerImpl> layer_impl = @@ -289,6 +291,8 @@ TEST_F(TiledLayerTest, PushDirtyTiles) { } TEST_F(TiledLayerTest, Scale) { + layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); + layer_tree_host_->SetDeviceScaleFactor(1.5); scoped_refptr<FakeTiledLayer> layer = @@ -351,6 +355,8 @@ TEST_F(TiledLayerTest, PushOccludedDirtyTiles) { } TEST_F(TiledLayerTest, PushDeletedTiles) { + layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); + scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); scoped_ptr<FakeTiledLayerImpl> layer_impl = @@ -1200,6 +1206,8 @@ TEST_F(TiledLayerPartialUpdateTest, PartialUpdates) { } TEST_F(TiledLayerTest, TilesPaintedWithoutOcclusion) { + layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); + scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); RenderSurfaceLayerList render_surface_layer_list; diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc index 2f0735c..cd5e890 100644 --- a/cc/resources/tile_manager_unittest.cc +++ b/cc/resources/tile_manager_unittest.cc @@ -149,7 +149,9 @@ class TileManagerTilePriorityQueueTest : public testing::Test { }; TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) { - SetupDefaultTrees(gfx::Size(1000, 1000)); + const gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTrees(layer_bounds); active_layer_->CreateDefaultTilingsAndTiles(); pending_layer_->CreateDefaultTilingsAndTiles(); @@ -391,7 +393,9 @@ TEST_F(TileManagerTilePriorityQueueTest, ActivationComesBeforeEventually) { } TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) { - SetupDefaultTrees(gfx::Size(1000, 1000)); + const gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTrees(layer_bounds); active_layer_->CreateDefaultTilingsAndTiles(); pending_layer_->CreateDefaultTilingsAndTiles(); @@ -560,6 +564,8 @@ TEST_F(TileManagerTilePriorityQueueTest, gfx::Size tile_size(102, 102); gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + scoped_refptr<FakePicturePileImpl> pending_pile = FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); SetupPendingTree(pending_pile); @@ -670,7 +676,9 @@ TEST_F(TileManagerTilePriorityQueueTest, } TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { - SetupDefaultTrees(gfx::Size(1000, 1000)); + const gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTrees(layer_bounds); active_layer_->CreateDefaultTilingsAndTiles(); pending_layer_->CreateDefaultTilingsAndTiles(); @@ -717,7 +725,9 @@ TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { } TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) { - SetupDefaultTrees(gfx::Size(1000, 1000)); + const gfx::Size layer_bounds(1000, 1000); + host_impl_.SetViewportSize(layer_bounds); + SetupDefaultTrees(layer_bounds); active_layer_->CreateDefaultTilingsAndTiles(); pending_layer_->CreateDefaultTilingsAndTiles(); diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index fd15b52..eb90012 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc @@ -392,7 +392,7 @@ static gfx::Rect CalculateVisibleContentRect( gfx::Rect visible_rect_in_target_surface_space = layer->drawable_content_rect(); - if (!layer->render_target()->render_surface()->clip_rect().IsEmpty()) { + if (layer->render_target()->render_surface()->is_clipped()) { // The |layer| L has a target T which owns a surface Ts. The surface Ts // has a target TsT. // diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index e0436ba..d4ded78 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc @@ -2791,6 +2791,56 @@ TEST_F(LayerTreeHostCommonTest, } TEST_F(LayerTreeHostCommonTest, + VisibleContentRectsForClippedSurfaceWithEmptyClip) { + scoped_refptr<Layer> root = Layer::Create(); + scoped_refptr<LayerWithForcedDrawsContent> child1 = + make_scoped_refptr(new LayerWithForcedDrawsContent()); + scoped_refptr<LayerWithForcedDrawsContent> child2 = + make_scoped_refptr(new LayerWithForcedDrawsContent()); + scoped_refptr<LayerWithForcedDrawsContent> child3 = + make_scoped_refptr(new LayerWithForcedDrawsContent()); + root->AddChild(child1); + root->AddChild(child2); + root->AddChild(child3); + + scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost()); + host->SetRootLayer(root); + + gfx::Transform identity_matrix; + SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(), + gfx::PointF(), gfx::Size(100, 100), true, false); + SetLayerPropertiesForTesting(child1.get(), identity_matrix, gfx::Point3F(), + gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true, + false); + SetLayerPropertiesForTesting(child2.get(), identity_matrix, gfx::Point3F(), + gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true, + false); + SetLayerPropertiesForTesting(child3.get(), identity_matrix, gfx::Point3F(), + gfx::PointF(125.f, 125.f), gfx::Size(50, 50), + true, false); + + RenderSurfaceLayerList render_surface_layer_list; + // Now set the root render surface an empty clip. + LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( + root.get(), gfx::Size(), &render_surface_layer_list); + + LayerTreeHostCommon::CalculateDrawProperties(&inputs); + ASSERT_TRUE(root->render_surface()); + EXPECT_FALSE(root->is_clipped()); + + gfx::Rect empty; + EXPECT_EQ(empty, root->render_surface()->clip_rect()); + EXPECT_TRUE(root->render_surface()->is_clipped()); + + // Visible content rect calculation will check if the target surface is + // clipped or not. An empty clip rect does not indicate the render surface + // is unclipped. + EXPECT_EQ(empty, child1->visible_content_rect()); + EXPECT_EQ(empty, child2->visible_content_rect()); + EXPECT_EQ(empty, child3->visible_content_rect()); +} + +TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) { scoped_refptr<Layer> root = Layer::Create(); scoped_refptr<LayerWithForcedDrawsContent> child = |