Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2845)

Unified Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 926023003: cc: Fix bug in generating picture layer pairs from 2 lists. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: layerlistbug: . Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_impl_unittest.cc
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 4deb8e430a2c9c51ba6a1536a6f51052d6a8eb79..afea2d284831654385aee2fedb9facc336ccb995 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -8070,17 +8070,26 @@ TEST_F(LayerTreeHostImplTest, GetPictureLayerImplPairs) {
scoped_ptr<PictureLayerImpl> layer =
FakePictureLayerImpl::Create(host_impl_->pending_tree(), 10);
layer->SetBounds(gfx::Size(10, 10));
+ scoped_ptr<FakePictureLayerImpl> nondraw_layer =
+ FakePictureLayerImpl::Create(host_impl_->pending_tree(), 12);
+ nondraw_layer->SetBounds(gfx::Size(10, 10));
scoped_refptr<RasterSource> pile(FakePicturePileImpl::CreateEmptyPile(
gfx::Size(10, 10), gfx::Size(10, 10)));
Region empty_invalidation;
const PictureLayerTilingSet* null_tiling_set = nullptr;
layer->UpdateRasterSource(pile, &empty_invalidation, null_tiling_set);
+ nondraw_layer->UpdateRasterSource(pile, &empty_invalidation, null_tiling_set);
+ layer->AddChild(nondraw_layer.Pass());
host_impl_->pending_tree()->SetRootLayer(layer.Pass());
LayerTreeImpl* pending_tree = host_impl_->pending_tree();
LayerImpl* pending_layer = pending_tree->root_layer();
+ FakePictureLayerImpl* pending_nondraw_layer =
+ static_cast<FakePictureLayerImpl*>(pending_layer->children()[0]);
+
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
std::vector<PictureLayerImpl::Pair> layer_pairs;
host_impl_->GetPictureLayerImplPairs(&layer_pairs, true);
@@ -8092,10 +8101,16 @@ TEST_F(LayerTreeHostImplTest, GetPictureLayerImplPairs) {
LayerTreeImpl* active_tree = host_impl_->active_tree();
LayerImpl* active_layer = active_tree->root_layer();
+ FakePictureLayerImpl* active_nondraw_layer =
+ static_cast<FakePictureLayerImpl*>(active_layer->children()[0]);
EXPECT_NE(active_tree, pending_tree);
EXPECT_NE(active_layer, pending_layer);
+ EXPECT_NE(active_nondraw_layer, pending_nondraw_layer);
EXPECT_NE(nullptr, active_tree);
EXPECT_NE(nullptr, active_layer);
+ EXPECT_NE(nullptr, active_nondraw_layer);
+
+ active_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
host_impl_->CreatePendingTree();
@@ -8120,20 +8135,192 @@ TEST_F(LayerTreeHostImplTest, GetPictureLayerImplPairs) {
host_impl_->pending_tree()->root_layer()->AddChild(
FakePictureLayerImpl::Create(host_impl_->pending_tree(), 11));
- LayerImpl* new_pending_layer = pending_tree->root_layer()->children()[0];
+ LayerImpl* new_pending_layer = pending_tree->root_layer()->children()[1];
layer_pairs.clear();
host_impl_->GetPictureLayerImplPairs(&layer_pairs, true);
EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(new_pending_layer, layer_pairs[1].pending);
+ EXPECT_EQ(nullptr, layer_pairs[1].active);
+
+ host_impl_->pending_tree()->root_layer()->RemoveChild(new_pending_layer);
+ // Have the pending layer be part of the RSLL now. It should appear in the
+ // list without an active twin.
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(true);
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, true);
+ EXPECT_EQ(2u, layer_pairs.size());
// The pair ordering is flaky, so make it consistent.
if (layer_pairs[0].active != active_layer)
std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[1].pending);
+ EXPECT_EQ(nullptr, layer_pairs[1].active);
+ // Have the active layer be part of the RSLL now instead. It should appear in
+ // the list without a pending twin.
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
+ active_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(true);
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, true);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(nullptr, layer_pairs[1].pending);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[1].active);
+}
+
+TEST_F(LayerTreeHostImplTest, GetPictureLayerImplPairsWithNonRSLLMembers) {
+ host_impl_->CreatePendingTree();
+
+ scoped_ptr<PictureLayerImpl> layer =
+ FakePictureLayerImpl::Create(host_impl_->pending_tree(), 10);
+ layer->SetBounds(gfx::Size(10, 10));
+ scoped_ptr<FakePictureLayerImpl> nondraw_layer =
+ FakePictureLayerImpl::Create(host_impl_->pending_tree(), 12);
+ nondraw_layer->SetBounds(gfx::Size(10, 10));
+
+ scoped_refptr<RasterSource> pile(FakePicturePileImpl::CreateEmptyPile(
+ gfx::Size(10, 10), gfx::Size(10, 10)));
+ Region empty_invalidation;
+ const PictureLayerTilingSet* null_tiling_set = nullptr;
+ layer->UpdateRasterSource(pile, &empty_invalidation, null_tiling_set);
+ nondraw_layer->UpdateRasterSource(pile, &empty_invalidation, null_tiling_set);
+
+ layer->AddChild(nondraw_layer.Pass());
+ host_impl_->pending_tree()->SetRootLayer(layer.Pass());
+
+ LayerTreeImpl* pending_tree = host_impl_->pending_tree();
+ LayerImpl* pending_layer = pending_tree->root_layer();
+ FakePictureLayerImpl* pending_nondraw_layer =
+ static_cast<FakePictureLayerImpl*>(pending_layer->children()[0]);
+
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
+
+ std::vector<PictureLayerImpl::Pair> layer_pairs;
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].pending != pending_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(nullptr, layer_pairs[0].active);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[1].pending);
+ EXPECT_EQ(nullptr, layer_pairs[1].active);
+
+ host_impl_->ActivateSyncTree();
+
+ LayerTreeImpl* active_tree = host_impl_->active_tree();
+ LayerImpl* active_layer = active_tree->root_layer();
+ FakePictureLayerImpl* active_nondraw_layer =
+ static_cast<FakePictureLayerImpl*>(active_layer->children()[0]);
+ EXPECT_NE(active_tree, pending_tree);
+ EXPECT_NE(active_layer, pending_layer);
+ EXPECT_NE(active_nondraw_layer, pending_nondraw_layer);
+ EXPECT_NE(nullptr, active_tree);
+ EXPECT_NE(nullptr, active_layer);
+ EXPECT_NE(nullptr, active_nondraw_layer);
+
+ active_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
+
+ host_impl_->CreatePendingTree();
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[1].pending);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[1].active);
+
+ // Activate, the active layer has no twin now.
+ host_impl_->ActivateSyncTree();
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(nullptr, layer_pairs[0].pending);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[1].active);
+ EXPECT_EQ(nullptr, layer_pairs[1].pending);
+
+ // Create another layer in the pending tree that's not in the active tree. We
+ // should get three pairs including the nondraw layers.
+ host_impl_->CreatePendingTree();
+ host_impl_->pending_tree()->root_layer()->AddChild(
+ FakePictureLayerImpl::Create(host_impl_->pending_tree(), 11));
+
+ LayerImpl* new_pending_layer = pending_tree->root_layer()->children()[1];
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(3u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[2]);
+ if (layer_pairs[1].pending != new_pending_layer)
+ std::swap(layer_pairs[1], layer_pairs[2]);
EXPECT_EQ(active_layer, layer_pairs[0].active);
EXPECT_EQ(pending_layer, layer_pairs[0].pending);
EXPECT_EQ(new_pending_layer, layer_pairs[1].pending);
EXPECT_EQ(nullptr, layer_pairs[1].active);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[2].active);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[2].pending);
+
+ host_impl_->pending_tree()->root_layer()->RemoveChild(new_pending_layer);
+
+ // Have the pending layer be part of the RSLL now. It should appear in the
+ // list, as should its active twin since we don't request only layers with
+ // valid draw properties.
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(true);
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[1].pending);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[1].active);
+
+ // Have the active layer be part of the RSLL now instead. It should appear in
+ // the list, as should its pending twin since we don't request only layers
+ // with valid draw properties.
+ pending_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(false);
+ active_nondraw_layer->SetIsDrawnRenderSurfaceLayerListMember(true);
+
+ layer_pairs.clear();
+ host_impl_->GetPictureLayerImplPairs(&layer_pairs, false);
+ EXPECT_EQ(2u, layer_pairs.size());
+ // The pair ordering is flaky, so make it consistent.
+ if (layer_pairs[0].active != active_layer)
+ std::swap(layer_pairs[0], layer_pairs[1]);
+ EXPECT_EQ(active_layer, layer_pairs[0].active);
+ EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+ EXPECT_EQ(active_nondraw_layer, layer_pairs[1].active);
+ EXPECT_EQ(pending_nondraw_layer, layer_pairs[1].pending);
}
TEST_F(LayerTreeHostImplTest, DidBecomeActive) {
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698