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

Unified Diff: cc/trees/layer_tree_host_unittest_picture.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: 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_unittest_occlusion.cc ('k') | cc/trees/layer_tree_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_unittest_picture.cc
diff --git a/cc/trees/layer_tree_host_unittest_picture.cc b/cc/trees/layer_tree_host_unittest_picture.cc
index 159200a2df13eaad8df6481ce1b2bd2889f6dcba..5ce47cd42862e834c4434ac32b8067696fb82a08 100644
--- a/cc/trees/layer_tree_host_unittest_picture.cc
+++ b/cc/trees/layer_tree_host_unittest_picture.cc
@@ -135,7 +135,8 @@ class LayerTreeHostPictureTestTwinLayer
int activates_;
};
-SINGLE_AND_MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestTwinLayer);
+// There is no pending layers in single thread mode.
+MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestTwinLayer);
class LayerTreeHostPictureTestResizeViewportWithGpuRaster
: public LayerTreeHostPictureTest {
@@ -158,7 +159,7 @@ class LayerTreeHostPictureTestResizeViewportWithGpuRaster
void BeginTest() override { PostSetNeedsCommitToMainThread(); }
- void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
+ void CommitCompleteOnThread(LayerTreeHostImpl* impl) override {
LayerImpl* child = impl->sync_tree()->root_layer()->children()[0];
FakePictureLayerImpl* picture_impl =
static_cast<FakePictureLayerImpl*>(child);
@@ -324,8 +325,247 @@ class LayerTreeHostPictureTestChangeLiveTilesRectWithRecycleTree
scoped_refptr<FakePictureLayer> picture_;
};
-SINGLE_AND_MULTI_THREAD_IMPL_TEST_F(
+// Multi-thread only since there is no recycle tree in single thread.
+MULTI_THREAD_IMPL_TEST_F(
LayerTreeHostPictureTestChangeLiveTilesRectWithRecycleTree);
+class LayerTreeHostPictureTestRSLLMembership : public LayerTreeHostPictureTest {
+ void SetupTree() override {
+ scoped_refptr<Layer> root = Layer::Create();
+ root->SetBounds(gfx::Size(100, 100));
+
+ child_ = Layer::Create();
+ root->AddChild(child_);
+
+ // Don't be solid color so the layer has tilings/tiles.
+ client_.set_fill_with_nonsolid_color(true);
+ picture_ = FakePictureLayer::Create(&client_);
+ picture_->SetBounds(gfx::Size(100, 100));
+ child_->AddChild(picture_);
+
+ layer_tree_host()->SetRootLayer(root);
+ LayerTreeHostPictureTest::SetupTree();
+ }
+
+ void BeginTest() override { PostSetNeedsCommitToMainThread(); }
+
+ void CommitCompleteOnThread(LayerTreeHostImpl* impl) override {
+ LayerImpl* root = impl->sync_tree()->root_layer();
+ LayerImpl* child = root->children()[0];
+ LayerImpl* gchild = child->children()[0];
+ FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild);
+
+ switch (impl->sync_tree()->source_frame_number()) {
+ case 0:
+ // On 1st commit the layer has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ break;
+ case 1:
+ // On 2nd commit, the layer is transparent, but its tilings are left
+ // there.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ break;
+ case 2:
+ // On 3rd commit, the layer is visible again, so has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ }
+ }
+
+ void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
+ LayerImpl* root = impl->active_tree()->root_layer();
+ LayerImpl* child = root->children()[0];
+ LayerImpl* gchild = child->children()[0];
+ FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild);
+
+ switch (impl->active_tree()->source_frame_number()) {
+ case 0:
+ // On 1st commit the layer has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ break;
+ case 1:
+ // On 2nd commit, the layer is transparent, but its tilings are left
+ // there.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ break;
+ case 2:
+ // On 3rd commit, the layer is visible again, so has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ EndTest();
+ }
+ }
+
+ void DidCommit() override {
+ switch (layer_tree_host()->source_frame_number()) {
+ case 1:
+ // For the 2nd commit, change opacity to 0 so that the layer will not be
+ // part of the visible frame.
+ child_->SetOpacity(0.f);
+ break;
+ case 2:
+ // For the 3rd commit, change opacity to 1 so that the layer will again
+ // be part of the visible frame.
+ child_->SetOpacity(1.f);
+ }
+ }
+
+ void AfterTest() override {}
+
+ FakeContentLayerClient client_;
+ scoped_refptr<Layer> child_;
+ scoped_refptr<FakePictureLayer> picture_;
+};
+
+SINGLE_AND_MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestRSLLMembership);
+
+class LayerTreeHostPictureTestRSLLMembershipWithScale
+ : public LayerTreeHostPictureTest {
+ void SetupTree() override {
+ scoped_refptr<Layer> root = Layer::Create();
+ root->SetBounds(gfx::Size(100, 100));
+
+ pinch_ = Layer::Create();
+ pinch_->SetBounds(gfx::Size(500, 500));
+ pinch_->SetScrollClipLayerId(root->id());
+ pinch_->SetIsContainerForFixedPositionLayers(true);
+ root->AddChild(pinch_);
+
+ // Don't be solid color so the layer has tilings/tiles.
+ client_.set_fill_with_nonsolid_color(true);
+ picture_ = FakePictureLayer::Create(&client_);
+ picture_->SetBounds(gfx::Size(100, 100));
+ pinch_->AddChild(picture_);
+
+ layer_tree_host()->RegisterViewportLayers(NULL, root, pinch_, pinch_);
+ layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f);
+ layer_tree_host()->SetRootLayer(root);
+ LayerTreeHostPictureTest::SetupTree();
+ }
+
+ void InitializeSettings(LayerTreeSettings* settings) override {
+ settings->layer_transforms_should_scale_layer_contents = true;
+ }
+
+ void BeginTest() override {
+ frame_ = 0;
+ draws_in_frame_ = 0;
+ last_frame_drawn_ = -1;
+ PostSetNeedsCommitToMainThread();
+ }
+
+ void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
+ LayerImpl* root = impl->sync_tree()->root_layer();
+ LayerImpl* pinch = root->children()[0];
+ LayerImpl* gchild = pinch->children()[0];
+ FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild);
+
+ switch (frame_) {
+ case 0:
+ // On 1st commit the layer has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ break;
+ case 1:
+ // On 2nd commit, the layer is transparent, so does not have tilings.
+ EXPECT_EQ(0u, picture->tilings()->num_tilings());
+ break;
+ case 2:
+ // On 3rd commit, the layer is visible again, so has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ }
+ }
+
+ void DrawLayersOnThread(LayerTreeHostImpl* impl) override {
+ LayerImpl* root = impl->active_tree()->root_layer();
+ LayerImpl* pinch = root->children()[0];
+ LayerImpl* gchild = pinch->children()[0];
+ FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild);
+
+ if (frame_ != last_frame_drawn_)
+ draws_in_frame_ = 0;
+ ++draws_in_frame_;
+ last_frame_drawn_ = frame_;
+
+ switch (frame_) {
+ case 0:
+ if (draws_in_frame_ == 1) {
+ // On 1st commit the layer has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ EXPECT_EQ(1.f, picture->HighResTiling()->contents_scale());
+
+ // Pinch zoom in to change the scale on the active tree.
+ impl->PinchGestureBegin();
+ impl->PinchGestureUpdate(2.f, gfx::Point(1, 1));
+ impl->PinchGestureEnd();
+ } else if (picture->tilings()->num_tilings() == 1) {
+ // If the pinch gesture caused a commit we could get here with a
+ // pending tree.
+ EXPECT_FALSE(impl->pending_tree());
+ // The active layer now has only a 2.f scale tiling, which means the
+ // recycled layer's tiling is destroyed.
+ EXPECT_EQ(2.f, picture->HighResTiling()->contents_scale());
+ EXPECT_EQ(0u, picture->GetRecycledTwinLayer()
+ ->picture_layer_tiling_set()
+ ->num_tilings());
+
+ ++frame_;
+ MainThreadTaskRunner()->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &LayerTreeHostPictureTestRSLLMembershipWithScale::NextStep,
+ base::Unretained(this)));
+ }
+ break;
+ case 1:
+ EXPECT_EQ(1, draws_in_frame_);
+ // On 2nd commit, the layer is transparent, so does not create
+ // tilings. Since the 1.f tiling was destroyed in the recycle tree, it
+ // has no tilings left. This is propogated to the active tree.
+ EXPECT_EQ(0u, picture->picture_layer_tiling_set()->num_tilings());
+ EXPECT_EQ(0u, picture->GetRecycledTwinLayer()
+ ->picture_layer_tiling_set()
+ ->num_tilings());
+ ++frame_;
+ MainThreadTaskRunner()->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &LayerTreeHostPictureTestRSLLMembershipWithScale::NextStep,
+ base::Unretained(this)));
+ break;
+ case 2:
+ EXPECT_EQ(1, draws_in_frame_);
+ // On 3rd commit, the layer is visible again, so has tilings.
+ EXPECT_GT(picture->tilings()->num_tilings(), 0u);
+ EndTest();
+ }
+ }
+
+ void NextStep() {
+ switch (frame_) {
+ case 1:
+ // For the 2nd commit, change opacity to 0 so that the layer will not be
+ // part of the visible frame.
+ pinch_->SetOpacity(0.f);
+ break;
+ case 2:
+ // For the 3rd commit, change opacity to 1 so that the layer will again
+ // be part of the visible frame.
+ pinch_->SetOpacity(1.f);
+ break;
+ }
+ }
+
+ void AfterTest() override {}
+
+ FakeContentLayerClient client_;
+ scoped_refptr<Layer> pinch_;
+ scoped_refptr<FakePictureLayer> picture_;
+ int frame_;
+ int draws_in_frame_;
+ int last_frame_drawn_;
+};
+
+// Multi-thread only because in single thread you can't pinch zoom on the
+// compositor thread.
+MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestRSLLMembershipWithScale);
+
} // namespace
} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_unittest_occlusion.cc ('k') | cc/trees/layer_tree_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698