blob: e124342edcec58ad89f17559b29fc052625307d4 [file] [log] [blame]
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
20#include "FrontEnd/LayerHandle.h"
21#include "FrontEnd/LayerHierarchy.h"
22#include "FrontEnd/LayerLifecycleManager.h"
23#include "FrontEnd/LayerSnapshotBuilder.h"
24#include "Layer.h"
25#include "LayerHierarchyTest.h"
26
27#define UPDATE_AND_VERIFY(BUILDER, ...) \
28 ({ \
29 SCOPED_TRACE(""); \
30 updateAndVerify((BUILDER), /*displayChanges=*/false, __VA_ARGS__); \
31 })
32
33#define UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(BUILDER, ...) \
34 ({ \
35 SCOPED_TRACE(""); \
36 updateAndVerify((BUILDER), /*displayChanges=*/true, __VA_ARGS__); \
37 })
38
39namespace android::surfaceflinger::frontend {
40
Vishnu Naircfb2d252023-01-19 04:44:02 +000041using ftl::Flags;
42using namespace ftl::flag_operators;
43
Vishnu Nair8fc721b2022-12-22 20:06:32 +000044// To run test:
45/**
46 mp :libsurfaceflinger_unittest && adb sync; adb shell \
47 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
48 --gtest_filter="LayerSnapshotTest.*" --gtest_brief=1
49*/
50
51class LayerSnapshotTest : public LayerHierarchyTestBase {
52protected:
53 LayerSnapshotTest() : LayerHierarchyTestBase() {
54 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
55 }
56
57 void createRootLayer(uint32_t id) override {
58 LayerHierarchyTestBase::createRootLayer(id);
59 setColor(id);
60 }
61
62 void createLayer(uint32_t id, uint32_t parentId) override {
63 LayerHierarchyTestBase::createLayer(id, parentId);
64 setColor(parentId);
65 }
66
67 void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) override {
68 LayerHierarchyTestBase::mirrorLayer(id, parent, layerToMirror);
69 setColor(id);
70 }
71
72 void updateAndVerify(LayerSnapshotBuilder& actualBuilder, bool hasDisplayChanges,
73 const std::vector<uint32_t> expectedVisibleLayerIdsInZOrder) {
74 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
75 mHierarchyBuilder.update(mLifecycleManager.getLayers(),
76 mLifecycleManager.getDestroyedLayers());
77 }
78 LayerSnapshotBuilder::Args args{
79 .root = mHierarchyBuilder.getHierarchy(),
80 .layerLifecycleManager = mLifecycleManager,
81 .includeMetadata = false,
82 .displays = mFrontEndDisplayInfos,
83 .displayChanges = hasDisplayChanges,
84 .globalShadowSettings = globalShadowSettings,
85 };
86 actualBuilder.update(args);
87
88 // rebuild layer snapshots from scratch and verify that it matches the updated state.
89 LayerSnapshotBuilder expectedBuilder(args);
90 mLifecycleManager.commitChanges();
91 ASSERT_TRUE(expectedBuilder.getSnapshots().size() > 0);
92 ASSERT_TRUE(actualBuilder.getSnapshots().size() > 0);
93
Vishnu Nair8fc721b2022-12-22 20:06:32 +000094 std::vector<uint32_t> actualVisibleLayerIdsInZOrder;
Vishnu Naircfb2d252023-01-19 04:44:02 +000095 actualBuilder.forEachVisibleSnapshot(
96 [&actualVisibleLayerIdsInZOrder](const LayerSnapshot& snapshot) {
97 actualVisibleLayerIdsInZOrder.push_back(snapshot.path.id);
98 });
Vishnu Nair8fc721b2022-12-22 20:06:32 +000099 EXPECT_EQ(expectedVisibleLayerIdsInZOrder, actualVisibleLayerIdsInZOrder);
100 }
101
102 LayerSnapshot* getSnapshot(uint32_t layerId) { return mSnapshotBuilder.getSnapshot(layerId); }
103
104 LayerHierarchyBuilder mHierarchyBuilder{{}};
105 LayerSnapshotBuilder mSnapshotBuilder;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000106 display::DisplayMap<ui::LayerStack, frontend::DisplayInfo> mFrontEndDisplayInfos;
107 renderengine::ShadowSettings globalShadowSettings;
108 static const std::vector<uint32_t> STARTING_ZORDER;
109};
110const std::vector<uint32_t> LayerSnapshotTest::STARTING_ZORDER = {1, 11, 111, 12, 121,
111 122, 1221, 13, 2};
112
113TEST_F(LayerSnapshotTest, buildSnapshot) {
114 LayerSnapshotBuilder::Args args{
115 .root = mHierarchyBuilder.getHierarchy(),
116 .layerLifecycleManager = mLifecycleManager,
117 .includeMetadata = false,
118 .displays = mFrontEndDisplayInfos,
119 .globalShadowSettings = globalShadowSettings,
120 };
121 LayerSnapshotBuilder builder(args);
122}
123
124TEST_F(LayerSnapshotTest, updateSnapshot) {
125 LayerSnapshotBuilder::Args args{
126 .root = mHierarchyBuilder.getHierarchy(),
127 .layerLifecycleManager = mLifecycleManager,
128 .includeMetadata = false,
129 .displays = mFrontEndDisplayInfos,
130 .globalShadowSettings = globalShadowSettings,
131 };
132
133 LayerSnapshotBuilder builder;
134 builder.update(args);
135}
136
137// update using parent snapshot data
138TEST_F(LayerSnapshotTest, croppedByParent) {
139 /// MAKE ALL LAYERS VISIBLE BY DEFAULT
140 DisplayInfo info;
141 info.info.logicalHeight = 100;
142 info.info.logicalWidth = 200;
143 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
144 Rect layerCrop(0, 0, 10, 20);
145 setCrop(11, layerCrop);
146 EXPECT_TRUE(mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Geometry));
147 UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(mSnapshotBuilder, STARTING_ZORDER);
148 EXPECT_EQ(getSnapshot(11)->geomCrop, layerCrop);
149 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, layerCrop.toFloatRect());
150 float maxHeight = static_cast<float>(info.info.logicalHeight * 10);
151 float maxWidth = static_cast<float>(info.info.logicalWidth * 10);
152
153 FloatRect maxDisplaySize(-maxWidth, -maxHeight, maxWidth, maxHeight);
154 EXPECT_EQ(getSnapshot(1)->geomLayerBounds, maxDisplaySize);
155}
156
157// visibility tests
158TEST_F(LayerSnapshotTest, newLayerHiddenByPolicy) {
159 createLayer(112, 11);
160 hideLayer(112);
161 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
162
163 showLayer(112);
164 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 112, 12, 121, 122, 1221, 13, 2});
165}
166
167TEST_F(LayerSnapshotTest, hiddenByParent) {
168 hideLayer(11);
169 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
170}
171
172TEST_F(LayerSnapshotTest, reparentShowsChild) {
173 hideLayer(11);
174 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
175
176 showLayer(11);
177 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
178}
179
180TEST_F(LayerSnapshotTest, reparentHidesChild) {
181 hideLayer(11);
182 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
183
184 reparentLayer(121, 11);
185 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 122, 1221, 13, 2});
186}
187
188TEST_F(LayerSnapshotTest, unHidingUpdatesSnapshot) {
189 hideLayer(11);
190 Rect crop(1, 2, 3, 4);
191 setCrop(111, crop);
192 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
193
194 showLayer(11);
195 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
196 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, crop.toFloatRect());
197}
198
199TEST_F(LayerSnapshotTest, childBehindParentCanBeHiddenByParent) {
200 setZ(111, -1);
201 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 111, 11, 12, 121, 122, 1221, 13, 2});
202
203 hideLayer(11);
204 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
205}
206
207// relative tests
208TEST_F(LayerSnapshotTest, RelativeParentCanHideChild) {
209 reparentRelativeLayer(13, 11);
210 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
211
212 hideLayer(11);
213 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
214}
215
216TEST_F(LayerSnapshotTest, ReparentingToHiddenRelativeParentHidesChild) {
217 hideLayer(11);
218 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
219 reparentRelativeLayer(13, 11);
220 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
221}
222
223TEST_F(LayerSnapshotTest, AlphaInheritedByChildren) {
224 setAlpha(1, 0.5);
225 setAlpha(122, 0.5);
226 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
227 EXPECT_EQ(getSnapshot(12)->alpha, 0.5f);
228 EXPECT_EQ(getSnapshot(1221)->alpha, 0.25f);
229}
230
231// Change states
232TEST_F(LayerSnapshotTest, UpdateClearsPreviousChangeStates) {
233 setCrop(1, Rect(1, 2, 3, 4));
234 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
235 EXPECT_TRUE(getSnapshot(1)->changes.get() != 0);
236 EXPECT_TRUE(getSnapshot(11)->changes.get() != 0);
237 setCrop(2, Rect(1, 2, 3, 4));
238 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
239 EXPECT_TRUE(getSnapshot(2)->changes.get() != 0);
240 EXPECT_TRUE(getSnapshot(1)->changes.get() == 0);
241 EXPECT_TRUE(getSnapshot(11)->changes.get() == 0);
242}
243
244TEST_F(LayerSnapshotTest, FastPathClearsPreviousChangeStates) {
245 setColor(11, {1._hf, 0._hf, 0._hf});
246 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
247 EXPECT_TRUE(getSnapshot(11)->changes.get() != 0);
248 EXPECT_TRUE(getSnapshot(1)->changes.get() == 0);
249 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
250 EXPECT_TRUE(getSnapshot(11)->changes.get() == 0);
251}
252
253TEST_F(LayerSnapshotTest, FastPathSetsChangeFlagToContent) {
254 setColor(1, {1._hf, 0._hf, 0._hf});
255 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
256 EXPECT_EQ(getSnapshot(1)->changes, RequestedLayerState::Changes::Content);
257}
258
Vishnu Naircfb2d252023-01-19 04:44:02 +0000259TEST_F(LayerSnapshotTest, GameMode) {
260 std::vector<TransactionState> transactions;
261 transactions.emplace_back();
262 transactions.back().states.push_back({});
263 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
264 transactions.back().states.front().state.metadata = LayerMetadata();
265 transactions.back().states.front().state.metadata.setInt32(METADATA_GAME_MODE, 42);
266 transactions.back().states.front().state.surface = mHandles[1];
267 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
268 mLifecycleManager.applyTransactions(transactions);
269 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
270 EXPECT_EQ(static_cast<int32_t>(getSnapshot(1)->gameMode), 42);
271 EXPECT_EQ(static_cast<int32_t>(getSnapshot(11)->gameMode), 42);
272}
273
274TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotes) {
275 // ROOT
276 // ├── 1
277 // │ ├── 11 (frame rate set)
278 // │ │ └── 111
279 // │ ├── 12
280 // │ │ ├── 121
281 // │ │ └── 122
282 // │ │ └── 1221
283 // │ └── 13
284 // └── 2
285
286 std::vector<TransactionState> transactions;
287 transactions.emplace_back();
288 transactions.back().states.push_back({});
289 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
290 transactions.back().states.front().state.frameRate = 90.0;
291 transactions.back().states.front().state.frameRateCompatibility =
292 ANATIVEWINDOW_FRAME_RATE_EXACT;
293 transactions.back().states.front().state.changeFrameRateStrategy =
294 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS;
295 transactions.back().states.front().state.surface = mHandles[11];
296 transactions.back().states.front().state.layerId = static_cast<int32_t>(11);
297 mLifecycleManager.applyTransactions(transactions);
298 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
299
300 EXPECT_EQ(getSnapshot(11)->frameRate.rate.getIntValue(), 90);
301 EXPECT_EQ(getSnapshot(11)->frameRate.type, scheduler::LayerInfo::FrameRateCompatibility::Exact);
302 EXPECT_EQ(getSnapshot(111)->frameRate.rate.getIntValue(), 90);
303 EXPECT_EQ(getSnapshot(111)->frameRate.type,
304 scheduler::LayerInfo::FrameRateCompatibility::Exact);
305 EXPECT_EQ(getSnapshot(1)->frameRate.rate.getIntValue(), 0);
306 EXPECT_EQ(getSnapshot(1)->frameRate.type, scheduler::LayerInfo::FrameRateCompatibility::NoVote);
307}
308
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000309} // namespace android::surfaceflinger::frontend