blob: ddf3363244e0220d92ce6b44f930924119b64e1c [file] [log] [blame]
Vishnu Nair04f89692022-11-16 23:21:05 +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
Vishnu Nair04f89692022-11-16 23:21:05 +000020#include "FrontEnd/LayerHierarchy.h"
21#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000022#include "LayerHierarchyTest.h"
Vishnu Nair04f89692022-11-16 23:21:05 +000023
24#define UPDATE_AND_VERIFY(HIERARCHY) \
25 ({ \
26 SCOPED_TRACE(""); \
27 updateAndVerify((HIERARCHY)); \
28 })
29
30namespace android::surfaceflinger::frontend {
31
Vishnu Nair04f89692022-11-16 23:21:05 +000032// To run test:
33/**
34 mp :libsurfaceflinger_unittest && adb sync; adb shell \
35 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
36 --gtest_filter="LayerHierarchyTest.*" --gtest_repeat=100 \
37 --gtest_shuffle \
38 --gtest_brief=1
39*/
40
Vishnu Nair8fc721b2022-12-22 20:06:32 +000041class LayerHierarchyTest : public LayerHierarchyTestBase {
Vishnu Nair04f89692022-11-16 23:21:05 +000042protected:
Vishnu Nair8fc721b2022-12-22 20:06:32 +000043 LayerHierarchyTest() : LayerHierarchyTestBase() { mLifecycleManager.commitChanges(); }
Vishnu Nair04f89692022-11-16 23:21:05 +000044};
45
46// reparenting tests
47TEST_F(LayerHierarchyTest, addLayer) {
48 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
49 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
50 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
51 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
52 expectedTraversalPath = {};
53 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
54
55 createRootLayer(3);
56 createLayer(112, 11);
57 createLayer(12211, 1221);
58 UPDATE_AND_VERIFY(hierarchyBuilder);
59 expectedTraversalPath = {1, 11, 111, 112, 12, 121, 122, 1221, 12211, 13, 2, 3};
60 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
61 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
62 expectedTraversalPath = {};
63 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
64}
65
66TEST_F(LayerHierarchyTest, reparentLayer) {
67 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
68 reparentLayer(2, 11);
69 reparentLayer(111, 12);
70 reparentLayer(1221, 1);
71 reparentLayer(1221, 13);
72 UPDATE_AND_VERIFY(hierarchyBuilder);
73
74 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 12, 111, 121, 122, 13, 1221};
75 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
76 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
77 expectedTraversalPath = {};
78 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
79}
80
81TEST_F(LayerHierarchyTest, reparentLayerToNull) {
82 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
83
84 reparentLayer(2, UNASSIGNED_LAYER_ID);
85 reparentLayer(11, UNASSIGNED_LAYER_ID);
86 reparentLayer(1221, 13);
87 reparentLayer(1221, UNASSIGNED_LAYER_ID);
88
89 UPDATE_AND_VERIFY(hierarchyBuilder);
90
91 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 13};
92 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
93 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
94 expectedTraversalPath = {2, 11, 111, 1221};
95 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
96}
97
98TEST_F(LayerHierarchyTest, reparentLayerToNullAndDestroyHandles) {
99 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
100 reparentLayer(2, UNASSIGNED_LAYER_ID);
101 reparentLayer(11, UNASSIGNED_LAYER_ID);
102 reparentLayer(1221, UNASSIGNED_LAYER_ID);
103
104 destroyLayerHandle(2);
105 destroyLayerHandle(11);
106 destroyLayerHandle(1221);
107
108 UPDATE_AND_VERIFY(hierarchyBuilder);
109
110 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 13};
111 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
112 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
113 expectedTraversalPath = {111};
114 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
115}
116
117TEST_F(LayerHierarchyTest, destroyHandleThenDestroyParentLayer) {
118 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
119 destroyLayerHandle(111);
120 UPDATE_AND_VERIFY(hierarchyBuilder);
121
122 // handle is destroyed but layer is kept alive and reachable by parent
123 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
124 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
125 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
126 expectedTraversalPath = {};
127 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
128
129 // destroy parent layer and the child gets destroyed
130 reparentLayer(11, UNASSIGNED_LAYER_ID);
131 destroyLayerHandle(11);
132 UPDATE_AND_VERIFY(hierarchyBuilder);
133
134 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2};
135 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
136 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
137 expectedTraversalPath = {};
138 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
139}
140
141TEST_F(LayerHierarchyTest, layerSurvivesTemporaryReparentToNull) {
142 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
143 reparentLayer(11, UNASSIGNED_LAYER_ID);
144 reparentLayer(11, 1);
145
146 UPDATE_AND_VERIFY(hierarchyBuilder);
147
148 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
149 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
150 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
151 expectedTraversalPath = {};
152 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
153}
154
155// offscreen tests
156TEST_F(LayerHierarchyTest, layerMovesOnscreen) {
157 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
158
159 reparentLayer(11, UNASSIGNED_LAYER_ID);
160 UPDATE_AND_VERIFY(hierarchyBuilder);
161
162 reparentLayer(11, 1);
163 UPDATE_AND_VERIFY(hierarchyBuilder);
164
165 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
166 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
167 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
168 expectedTraversalPath = {};
169 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
170}
171
172TEST_F(LayerHierarchyTest, addLayerToOffscreenParent) {
173 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
174
175 reparentLayer(11, UNASSIGNED_LAYER_ID);
176 UPDATE_AND_VERIFY(hierarchyBuilder);
177
178 createLayer(112, 11);
179 UPDATE_AND_VERIFY(hierarchyBuilder);
180
181 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2};
182 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
183 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
184 expectedTraversalPath = {11, 111, 112};
185 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
186}
187
188// rel-z tests
189TEST_F(LayerHierarchyTest, setRelativeParent) {
190 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
191 reparentRelativeLayer(11, 2);
192 UPDATE_AND_VERIFY(hierarchyBuilder);
193
194 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
195 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
196 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
197 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
198 expectedTraversalPath = {};
199 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
200}
201
202TEST_F(LayerHierarchyTest, reparentFromRelativeParentWithSetLayer) {
203 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
204 reparentRelativeLayer(11, 2);
205 UPDATE_AND_VERIFY(hierarchyBuilder);
206
Vishnu Nair1391de22023-03-05 19:56:14 -0800207 // This calls setLayer
208 removeRelativeZ(11);
Vishnu Nair04f89692022-11-16 23:21:05 +0000209 UPDATE_AND_VERIFY(hierarchyBuilder);
210
211 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
212 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
213 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
214 expectedTraversalPath = {};
215 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
216}
217
218TEST_F(LayerHierarchyTest, reparentToRelativeParent) {
219 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
220 reparentRelativeLayer(11, 2);
221 UPDATE_AND_VERIFY(hierarchyBuilder);
222
223 reparentLayer(11, 2);
224 UPDATE_AND_VERIFY(hierarchyBuilder);
225
226 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
227 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
228 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
229 expectedTraversalPath = {};
230 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
231}
232
233TEST_F(LayerHierarchyTest, setParentAsRelativeParent) {
234 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
235 reparentLayer(11, 2);
236 UPDATE_AND_VERIFY(hierarchyBuilder);
237
238 reparentRelativeLayer(11, 2);
239 UPDATE_AND_VERIFY(hierarchyBuilder);
240
241 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
242 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
243 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
244 expectedTraversalPath = {};
245 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
246}
247
248TEST_F(LayerHierarchyTest, relativeChildMovesOffscreenIsNotTraversable) {
249 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
250 reparentRelativeLayer(11, 2);
251 UPDATE_AND_VERIFY(hierarchyBuilder);
252
253 reparentLayer(2, UNASSIGNED_LAYER_ID);
254 UPDATE_AND_VERIFY(hierarchyBuilder);
255
256 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
257 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
258 expectedTraversalPath = {1, 12, 121, 122, 1221, 13};
259 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
260 expectedTraversalPath = {2, 11, 111};
261 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
262}
263
Vishnu Nairfccd6362023-02-24 23:39:53 +0000264TEST_F(LayerHierarchyTest, reparentRelativeLayer) {
265 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
266 reparentRelativeLayer(11, 2);
267 UPDATE_AND_VERIFY(hierarchyBuilder);
268
269 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
270 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
271 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
272 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
273 expectedTraversalPath = {};
274 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
275
276 reparentLayer(11, 1);
277 UPDATE_AND_VERIFY(hierarchyBuilder);
278 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
279 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
280 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
281 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
282 expectedTraversalPath = {};
283 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
284
285 setZ(11, 0);
286 UPDATE_AND_VERIFY(hierarchyBuilder);
287 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
288 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
289 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
290 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
291 expectedTraversalPath = {};
292 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
293}
294
Vishnu Nair04f89692022-11-16 23:21:05 +0000295// mirror tests
296TEST_F(LayerHierarchyTest, canTraverseMirrorLayer) {
297 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
298
299 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
300 UPDATE_AND_VERIFY(hierarchyBuilder);
301
302 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122,
303 1221, 13, 14, 11, 111, 2};
304 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
305 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
306 expectedTraversalPath = {};
307 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
308}
309
310TEST_F(LayerHierarchyTest, canMirrorOffscreenLayer) {
311 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
312
313 reparentLayer(11, UNASSIGNED_LAYER_ID);
314 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
315 UPDATE_AND_VERIFY(hierarchyBuilder);
316
317 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 14, 11, 111, 2};
318 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
319 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
320 expectedTraversalPath = {11, 111};
321 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
322}
323
324TEST_F(LayerHierarchyTest, newChildLayerIsUpdatedInMirrorHierarchy) {
325 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
326 mLifecycleManager.commitChanges();
327 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
328
329 createLayer(1111, 111);
330 createLayer(112, 11);
331 UPDATE_AND_VERIFY(hierarchyBuilder);
332
333 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 1111, 112, 12, 121, 122,
334 1221, 13, 14, 11, 111, 1111, 112, 2};
335 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
336 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
337 expectedTraversalPath = {};
338 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
339}
340
341// mirror & relatives tests
342TEST_F(LayerHierarchyTest, mirrorWithRelativeOutsideMirrorHierarchy) {
343 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
344 reparentRelativeLayer(111, 12);
345 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
346
347 // ROOT
348 // ├── 1
349 // │ ├── 11
350 // │ │ └── 111
351 // │ ├── 12
352 // │ │ ├── 121
353 // │ │ ├── 122
354 // │ │ │ └── 1221
355 // │ │ └ - 111 (relative)
356 // │ ├── 13
357 // │ └── 14
358 // │ └ * 11 (mirroring)
359 // └── 2
360
361 UPDATE_AND_VERIFY(hierarchyBuilder);
362
363 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 111, 121, 122,
364 1221, 13, 14, 11, 111, 2};
365 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
366 // 111 is not reachable in the mirror
367 expectedTraversalPath = {1, 11, 12, 111, 121, 122, 1221, 13, 14, 11, 2};
368 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
369 expectedTraversalPath = {};
370 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
371}
372
373TEST_F(LayerHierarchyTest, mirrorWithRelativeInsideMirrorHierarchy) {
374 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
375 reparentRelativeLayer(1221, 12);
376 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 12);
377
378 // ROOT
379 // ├── 1
380 // │ ├── 11
381 // │ │ └── 111
382 // │ ├── 12
383 // │ │ ├── 121
384 // │ │ ├── 122
385 // │ │ │ └── 1221
386 // │ │ └ - 1221 (relative)
387 // │ ├── 13
388 // │ └── 14
389 // │ └ * 12 (mirroring)
390 // └── 2
391
392 UPDATE_AND_VERIFY(hierarchyBuilder);
393 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 1221,
394 13, 14, 12, 121, 122, 1221, 1221, 2};
395 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
396 // relative layer 1221 is traversable in the mirrored hierarchy as well
397 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 14, 12, 121, 122, 1221, 2};
398 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
399 expectedTraversalPath = {};
400 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
401}
402
403TEST_F(LayerHierarchyTest, childMovesOffscreenWhenRelativeParentDies) {
404 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
405
406 reparentRelativeLayer(11, 2);
407 reparentLayer(2, UNASSIGNED_LAYER_ID);
408 destroyLayerHandle(2);
409
410 UPDATE_AND_VERIFY(hierarchyBuilder);
411 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
412 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
413 expectedTraversalPath = {1, 12, 121, 122, 1221, 13};
414 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
415 expectedTraversalPath = {11, 111};
416 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
417
418 // remove relative parent so layer becomes onscreen again
Vishnu Nair1391de22023-03-05 19:56:14 -0800419 removeRelativeZ(11);
Vishnu Nair04f89692022-11-16 23:21:05 +0000420 UPDATE_AND_VERIFY(hierarchyBuilder);
421
422 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
423 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
424 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
425 expectedTraversalPath = {};
426 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
427}
428
429TEST_F(LayerHierarchyTest, offscreenLayerCannotBeRelativeToOnscreenLayer) {
430 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
431 reparentRelativeLayer(1221, 2);
432 UPDATE_AND_VERIFY(hierarchyBuilder);
433
434 // verify relz path
435 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
436 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
437 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
438 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
439 expectedTraversalPath = {};
440 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
441
442 // offscreen layer cannot be reached as a relative child
443 reparentLayer(12, UNASSIGNED_LAYER_ID);
444 UPDATE_AND_VERIFY(hierarchyBuilder);
445
446 expectedTraversalPath = {1, 11, 111, 13, 2};
447 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
448 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
449 expectedTraversalPath = {12, 121, 122, 1221};
450 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
451
452 // layer when onscreen can be reached as a relative child again
453 reparentLayer(12, 1);
454 UPDATE_AND_VERIFY(hierarchyBuilder);
455
456 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
457 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
458 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
459 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
460 expectedTraversalPath = {};
461 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
462}
463
464TEST_F(LayerHierarchyTest, backgroundLayersAreBehindParentLayer) {
465 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
466
467 updateBackgroundColor(1, 0.5);
468 UPDATE_AND_VERIFY(hierarchyBuilder);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000469 auto bgLayerId = LayerCreationArgs::getInternalLayerId(1);
470 std::vector<uint32_t> expectedTraversalPath = {1, bgLayerId, 11, 111, 12,
471 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000472 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000473 expectedTraversalPath = {bgLayerId, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000474 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
475 expectedTraversalPath = {};
476 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
477}
478
479// cycle tests
480TEST_F(LayerHierarchyTest, ParentBecomesTheChild) {
481 // remove default hierarchy
482 mLifecycleManager = LayerLifecycleManager();
483 createRootLayer(1);
484 createLayer(11, 1);
485 reparentLayer(1, 11);
486 mLifecycleManager.commitChanges();
487 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
488
489 std::vector<uint32_t> expectedTraversalPath = {};
490 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
491 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
492 expectedTraversalPath = {};
493 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
494}
495
496TEST_F(LayerHierarchyTest, RelativeLoops) {
497 // remove default hierarchy
498 mLifecycleManager = LayerLifecycleManager();
499 createRootLayer(1);
500 createRootLayer(2);
501 createLayer(11, 1);
502 reparentRelativeLayer(11, 2);
503 reparentRelativeLayer(2, 11);
504 mLifecycleManager.commitChanges();
505 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
506
507 // fix loop
508 uint32_t invalidRelativeRoot;
509 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
510 EXPECT_TRUE(hasRelZLoop);
511 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
512 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
513 EXPECT_EQ(invalidRelativeRoot, 11u);
514 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
515
516 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 2};
517 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
518 expectedTraversalPath = {1};
519 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
520 expectedTraversalPath = {11, 2};
521 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
522}
523
524TEST_F(LayerHierarchyTest, IndirectRelativeLoops) {
525 // remove default hierarchy
526 mLifecycleManager = LayerLifecycleManager();
527 createRootLayer(1);
528 createRootLayer(2);
529 createLayer(11, 1);
530 createLayer(111, 11);
531 createLayer(21, 2);
532 createLayer(22, 2);
533 createLayer(221, 22);
534 reparentRelativeLayer(22, 111);
535 reparentRelativeLayer(11, 221);
536 mLifecycleManager.commitChanges();
537 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
538
539 // fix loop
540 uint32_t invalidRelativeRoot;
541 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
542 EXPECT_TRUE(hasRelZLoop);
543 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
544 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
545 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
546
547 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 22, 221, 2, 21, 22, 221};
548 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
549 expectedTraversalPath = {1, 2, 21};
550 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
551 expectedTraversalPath = {11, 111, 22, 221};
552 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
553}
554
555TEST_F(LayerHierarchyTest, ReparentRootLayerToNull) {
556 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
557 reparentLayer(1, UNASSIGNED_LAYER_ID);
558 UPDATE_AND_VERIFY(hierarchyBuilder);
559
560 std::vector<uint32_t> expectedTraversalPath = {2};
561 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
562 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
563 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
564 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
565}
566
567TEST_F(LayerHierarchyTest, AddRemoveLayerInSameTransaction) {
568 // remove default hierarchy
569 mLifecycleManager = LayerLifecycleManager();
570 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
571 createRootLayer(1);
572 destroyLayerHandle(1);
573 UPDATE_AND_VERIFY(hierarchyBuilder);
574
575 std::vector<uint32_t> expectedTraversalPath = {};
576 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
577 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
578 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
579}
580
581// traversal path test
582TEST_F(LayerHierarchyTest, traversalPathId) {
583 setZ(122, -1);
584 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
585 auto checkTraversalPathIdVisitor =
586 [](const LayerHierarchy& hierarchy,
587 const LayerHierarchy::TraversalPath& traversalPath) -> bool {
588 EXPECT_EQ(hierarchy.getLayer()->id, traversalPath.id);
589 return true;
590 };
591 hierarchyBuilder.getHierarchy().traverse(checkTraversalPathIdVisitor);
592 hierarchyBuilder.getHierarchy().traverseInZOrder(checkTraversalPathIdVisitor);
593}
594
Vishnu Naircfb2d252023-01-19 04:44:02 +0000595TEST_F(LayerHierarchyTest, zorderRespectsLayerSequenceId) {
596 // remove default hierarchy
597 mLifecycleManager = LayerLifecycleManager();
598 createRootLayer(1);
599 createRootLayer(2);
600 createRootLayer(4);
601 createRootLayer(5);
602 createLayer(11, 1);
603 createLayer(51, 5);
604 createLayer(53, 5);
605
606 mLifecycleManager.commitChanges();
607 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
608 UPDATE_AND_VERIFY(hierarchyBuilder);
609 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 4, 5, 51, 53};
610 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
611
612 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
613 expectedTraversalPath = {};
614 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
615
616 // A new layer is added with a smaller sequence id. Make sure its sorted correctly. While
617 // sequence ids are always incremented, this scenario can happen when a layer is reparented.
618 createRootLayer(3);
619 createLayer(52, 5);
620
621 UPDATE_AND_VERIFY(hierarchyBuilder);
622 expectedTraversalPath = {1, 11, 2, 3, 4, 5, 51, 52, 53};
623 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
624 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
625 expectedTraversalPath = {};
626 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
627}
628
629TEST_F(LayerHierarchyTest, zorderRespectsLayerZ) {
630 // remove default hierarchy
631 mLifecycleManager = LayerLifecycleManager();
632 createRootLayer(1);
633 createLayer(11, 1);
634 createLayer(12, 1);
635 createLayer(13, 1);
636 setZ(11, -1);
637 setZ(12, 2);
638 setZ(13, 1);
639
640 mLifecycleManager.commitChanges();
641 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
642 UPDATE_AND_VERIFY(hierarchyBuilder);
643 std::vector<uint32_t> expectedTraversalPath = {1, 11, 13, 12};
644 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
645
646 expectedTraversalPath = {11, 1, 13, 12};
647 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
648 expectedTraversalPath = {};
649 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
650}
651
652TEST_F(LayerHierarchyTest, zorderRespectsLayerStack) {
653 // remove default hierarchy
654 mLifecycleManager = LayerLifecycleManager();
655 createRootLayer(1);
656 createRootLayer(2);
657 createLayer(11, 1);
658 createLayer(21, 2);
659 setLayerStack(1, 20);
660 setLayerStack(2, 10);
661
662 mLifecycleManager.commitChanges();
663 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
664 UPDATE_AND_VERIFY(hierarchyBuilder);
665 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 21};
666 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
667
668 expectedTraversalPath = {1, 11, 2, 21};
669 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
670 expectedTraversalPath = {};
671 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
672}
673
Vishnu Naira9c43762023-01-27 19:10:25 +0000674TEST_F(LayerHierarchyTest, canMirrorDisplay) {
675 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
676 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
677 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
678 setLayerStack(3, 1);
679 UPDATE_AND_VERIFY(hierarchyBuilder);
680
681 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2,
682 1, 11, 111, 12, 121, 122, 1221, 13, 2};
683 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
684 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
685 expected = {};
686 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
687}
688
689TEST_F(LayerHierarchyTest, mirrorNonExistingDisplay) {
690 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
691 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
692 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(5));
693 setLayerStack(3, 1);
694 UPDATE_AND_VERIFY(hierarchyBuilder);
695
696 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
697 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
698 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
699 expected = {};
700 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
701}
702
703TEST_F(LayerHierarchyTest, newRootLayerIsMirrored) {
704 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
705 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
706 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
707 setLayerStack(3, 1);
708 UPDATE_AND_VERIFY(hierarchyBuilder);
709
710 createRootLayer(4);
711 UPDATE_AND_VERIFY(hierarchyBuilder);
712
713 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4,
714 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4};
715 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
716 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
717 expected = {};
718 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
719}
720
721TEST_F(LayerHierarchyTest, removedRootLayerIsNoLongerMirrored) {
722 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
723 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
724 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
725 setLayerStack(3, 1);
726 UPDATE_AND_VERIFY(hierarchyBuilder);
727
728 reparentLayer(1, UNASSIGNED_LAYER_ID);
729 destroyLayerHandle(1);
730 UPDATE_AND_VERIFY(hierarchyBuilder);
731
732 std::vector<uint32_t> expected = {3, 2, 2};
733 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
734 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
735 expected = {11, 111, 12, 121, 122, 1221, 13};
736 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
737}
738
Vishnu Nair04f89692022-11-16 23:21:05 +0000739} // namespace android::surfaceflinger::frontend