| 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
|
|
|