1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/message_loop/message_loop_proxy.h"
6 #include "cc/layers/solid_color_layer.h"
7 #include "cc/layers/surface_layer.h"
8 #include "cc/test/fake_impl_proxy.h"
9 #include "cc/test/fake_layer_tree_host.h"
10 #include "cc/test/fake_layer_tree_host_client.h"
11 #include "cc/test/fake_layer_tree_host_impl.h"
12 #include "cc/test/fake_output_surface.h"
13 #include "cc/test/layer_tree_test.h"
14 #include "cc/test/test_shared_bitmap_manager.h"
15 #include "cc/trees/layer_tree_host.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
22 class SurfaceLayerTest : public testing::Test {
26 FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D)) {}
29 virtual void SetUp() {
30 layer_tree_host_ = FakeLayerTreeHost::Create(&fake_client_);
31 layer_tree_host_->SetViewportSize(gfx::Size(10, 10));
34 virtual void TearDown() {
35 if (layer_tree_host_) {
36 layer_tree_host_->SetRootLayer(nullptr);
37 layer_tree_host_ = nullptr;
41 scoped_ptr<FakeLayerTreeHost> layer_tree_host_;
42 FakeLayerTreeHostClient fake_client_;
43 TestSharedBitmapManager shared_bitmap_manager_;
46 void SatisfyCallback(SurfaceSequence* out, SurfaceSequence in) {
50 void RequireCallback(SurfaceId* out_id,
51 std::set<SurfaceSequence>* out,
58 // Check that one surface can be referenced by multiple LayerTreeHosts, and
59 // each will create its own SurfaceSequence that's satisfied on destruction.
60 TEST_F(SurfaceLayerTest, MultipleFramesOneSurface) {
61 SurfaceSequence blank_change; // Receives sequence if commit doesn't happen.
63 SurfaceId required_id;
64 std::set<SurfaceSequence> required_seq;
65 scoped_refptr<SurfaceLayer> layer(SurfaceLayer::Create(
66 base::Bind(&SatisfyCallback, &blank_change),
67 base::Bind(&RequireCallback, &required_id, &required_seq)));
68 layer->SetSurfaceId(SurfaceId(1), gfx::Size(1, 1));
69 layer_tree_host_->set_surface_id_namespace(1);
70 layer_tree_host_->SetRootLayer(layer);
72 scoped_ptr<FakeLayerTreeHost> layer_tree_host2 =
73 FakeLayerTreeHost::Create(&fake_client_);
74 scoped_refptr<SurfaceLayer> layer2(SurfaceLayer::Create(
75 base::Bind(&SatisfyCallback, &blank_change),
76 base::Bind(&RequireCallback, &required_id, &required_seq)));
77 layer2->SetSurfaceId(SurfaceId(1), gfx::Size(1, 1));
78 layer_tree_host2->set_surface_id_namespace(2);
79 layer_tree_host2->SetRootLayer(layer2);
81 // Layers haven't been removed, so no sequence should be satisfied.
82 EXPECT_TRUE(blank_change.is_null());
84 SurfaceSequence expected1(1u, 1u);
85 SurfaceSequence expected2(2u, 1u);
87 layer_tree_host2->SetRootLayer(nullptr);
88 layer_tree_host2.reset();
90 // Layer was removed so sequence from second LayerTreeHost should be
92 EXPECT_TRUE(blank_change == expected2);
94 // Set of sequences that need to be satisfied should include sequences from
96 EXPECT_TRUE(required_id == SurfaceId(1));
97 EXPECT_EQ(2u, required_seq.size());
98 EXPECT_TRUE(required_seq.count(expected1));
99 EXPECT_TRUE(required_seq.count(expected2));
101 layer_tree_host_->SetRootLayer(nullptr);
102 layer_tree_host_.reset();
104 // Layer was removed so sequence from first LayerTreeHost should be
106 EXPECT_TRUE(blank_change == expected1);
108 // No more SurfaceSequences should have been generated that need to have be
110 EXPECT_EQ(2u, required_seq.size());
113 // Check that setting content scale on the surface works.
114 TEST_F(SurfaceLayerTest, ScaleSurface) {
115 SurfaceSequence blank_change;
116 SurfaceId required_id;
117 std::set<SurfaceSequence> required_seq;
118 scoped_refptr<SurfaceLayer> layer(SurfaceLayer::Create(
119 base::Bind(&SatisfyCallback, &blank_change),
120 base::Bind(&RequireCallback, &required_id, &required_seq)));
121 gfx::Size surface_size(10, 15);
122 layer->SetSurfaceId(SurfaceId(1), surface_size);
123 layer->SetBounds(gfx::Size(25, 45));
128 layer->CalculateContentsScale(2.f, &scale_x, &scale_y, &bounds);
129 EXPECT_EQ(10.f / 25.f, scale_x);
130 EXPECT_EQ(15.f / 45.f, scale_y);
131 EXPECT_EQ(surface_size.ToString(), bounds.ToString());
133 layer->SetBounds(gfx::Size(0, 0));
134 layer->CalculateContentsScale(2.f, &scale_x, &scale_y, &bounds);
135 EXPECT_EQ(1.f, scale_x);
136 EXPECT_EQ(1.f, scale_y);
137 EXPECT_EQ(surface_size.ToString(), bounds.ToString());
140 // Check that SurfaceSequence is sent through swap promise.
141 class SurfaceLayerSwapPromise : public LayerTreeTest {
143 SurfaceLayerSwapPromise()
144 : commit_count_(0), sequence_was_satisfied_(false) {}
146 void BeginTest() override {
147 layer_tree_host()->set_surface_id_namespace(1);
148 layer_ = SurfaceLayer::Create(
149 base::Bind(&SatisfyCallback, &satisfied_sequence_),
150 base::Bind(&RequireCallback, &required_id_, &required_set_));
151 layer_->SetSurfaceId(SurfaceId(1), gfx::Size(1, 1));
153 // Layer hasn't been added to tree so no SurfaceSequence generated yet.
154 EXPECT_EQ(0u, required_set_.size());
156 layer_tree_host()->SetRootLayer(layer_);
158 // Should have SurfaceSequence from first tree.
159 SurfaceSequence expected(1u, 1u);
160 EXPECT_TRUE(required_id_ == SurfaceId(1));
161 EXPECT_EQ(1u, required_set_.size());
162 EXPECT_TRUE(required_set_.count(expected));
164 gfx::Size bounds(100, 100);
165 layer_tree_host()->SetViewportSize(bounds);
166 PostSetNeedsCommitToMainThread();
169 void DidCommit() override {
170 base::MessageLoopProxy::current()->PostTask(
171 FROM_HERE, base::Bind(&SurfaceLayerSwapPromise::ChangeTree,
172 base::Unretained(this)));
177 switch (commit_count_) {
179 // Remove SurfaceLayer from tree to cause SwapPromise to be created.
180 blank_layer_ = SolidColorLayer::Create();
181 blank_layer_->SetIsDrawable(true);
182 blank_layer_->SetBounds(gfx::Size(10, 10));
183 layer_tree_host()->SetRootLayer(blank_layer_);
193 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
195 std::vector<uint32_t>& satisfied =
196 output_surface()->last_sent_frame().metadata.satisfies_sequences;
197 EXPECT_LE(satisfied.size(), 1u);
198 if (satisfied.size() == 1) {
199 // Eventually the one SurfaceSequence should be satisfied, but only
200 // after the layer was removed from the tree, and only once.
201 EXPECT_EQ(1u, satisfied[0]);
202 EXPECT_LE(1, commit_count_);
203 EXPECT_FALSE(sequence_was_satisfied_);
204 sequence_was_satisfied_ = true;
209 void AfterTest() override {
210 EXPECT_TRUE(required_id_ == SurfaceId(1));
211 EXPECT_EQ(1u, required_set_.size());
212 // Sequence should have been satisfied through Swap, not with the
214 EXPECT_TRUE(satisfied_sequence_.is_null());
219 bool sequence_was_satisfied_;
220 scoped_refptr<SurfaceLayer> layer_;
221 scoped_refptr<Layer> blank_layer_;
222 SurfaceSequence satisfied_sequence_;
224 SurfaceId required_id_;
225 std::set<SurfaceSequence> required_set_;
228 // TODO(jbauman): Reenable on single thread once http://crbug.com/421923 is
230 MULTI_THREAD_TEST_F(SurfaceLayerSwapPromise);