blob: 0d6a486ad0f5de1eef6dce7795001db412e11529 [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 Nair150065b2023-04-17 19:14:11 -0700469 auto hierarchy = hierarchyBuilder.getPartialHierarchy(1, /*childrenOnly=*/true);
470 auto bgLayerId = hierarchy.mChildren.front().first->getLayer()->id;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000471 std::vector<uint32_t> expectedTraversalPath = {1, bgLayerId, 11, 111, 12,
472 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000473 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000474 expectedTraversalPath = {bgLayerId, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000475 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
476 expectedTraversalPath = {};
477 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
478}
479
480// cycle tests
481TEST_F(LayerHierarchyTest, ParentBecomesTheChild) {
482 // remove default hierarchy
483 mLifecycleManager = LayerLifecycleManager();
484 createRootLayer(1);
485 createLayer(11, 1);
486 reparentLayer(1, 11);
487 mLifecycleManager.commitChanges();
488 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
489
490 std::vector<uint32_t> expectedTraversalPath = {};
491 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
492 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
493 expectedTraversalPath = {};
494 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
495}
496
497TEST_F(LayerHierarchyTest, RelativeLoops) {
498 // remove default hierarchy
499 mLifecycleManager = LayerLifecycleManager();
500 createRootLayer(1);
501 createRootLayer(2);
502 createLayer(11, 1);
503 reparentRelativeLayer(11, 2);
504 reparentRelativeLayer(2, 11);
505 mLifecycleManager.commitChanges();
506 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
507
508 // fix loop
509 uint32_t invalidRelativeRoot;
510 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
511 EXPECT_TRUE(hasRelZLoop);
512 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
513 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
514 EXPECT_EQ(invalidRelativeRoot, 11u);
515 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
516
517 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 2};
518 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
519 expectedTraversalPath = {1};
520 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
521 expectedTraversalPath = {11, 2};
522 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
523}
524
525TEST_F(LayerHierarchyTest, IndirectRelativeLoops) {
526 // remove default hierarchy
527 mLifecycleManager = LayerLifecycleManager();
528 createRootLayer(1);
529 createRootLayer(2);
530 createLayer(11, 1);
531 createLayer(111, 11);
532 createLayer(21, 2);
533 createLayer(22, 2);
534 createLayer(221, 22);
535 reparentRelativeLayer(22, 111);
536 reparentRelativeLayer(11, 221);
537 mLifecycleManager.commitChanges();
538 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
539
540 // fix loop
541 uint32_t invalidRelativeRoot;
542 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
543 EXPECT_TRUE(hasRelZLoop);
544 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
545 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
546 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
547
548 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 22, 221, 2, 21, 22, 221};
549 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
550 expectedTraversalPath = {1, 2, 21};
551 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
552 expectedTraversalPath = {11, 111, 22, 221};
553 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
554}
555
556TEST_F(LayerHierarchyTest, ReparentRootLayerToNull) {
557 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
558 reparentLayer(1, UNASSIGNED_LAYER_ID);
559 UPDATE_AND_VERIFY(hierarchyBuilder);
560
561 std::vector<uint32_t> expectedTraversalPath = {2};
562 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
563 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
564 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
565 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
566}
567
568TEST_F(LayerHierarchyTest, AddRemoveLayerInSameTransaction) {
569 // remove default hierarchy
570 mLifecycleManager = LayerLifecycleManager();
571 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
572 createRootLayer(1);
573 destroyLayerHandle(1);
574 UPDATE_AND_VERIFY(hierarchyBuilder);
575
576 std::vector<uint32_t> expectedTraversalPath = {};
577 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
578 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
579 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
580}
581
582// traversal path test
583TEST_F(LayerHierarchyTest, traversalPathId) {
584 setZ(122, -1);
585 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
586 auto checkTraversalPathIdVisitor =
587 [](const LayerHierarchy& hierarchy,
588 const LayerHierarchy::TraversalPath& traversalPath) -> bool {
589 EXPECT_EQ(hierarchy.getLayer()->id, traversalPath.id);
590 return true;
591 };
592 hierarchyBuilder.getHierarchy().traverse(checkTraversalPathIdVisitor);
593 hierarchyBuilder.getHierarchy().traverseInZOrder(checkTraversalPathIdVisitor);
594}
595
Vishnu Naircfb2d252023-01-19 04:44:02 +0000596TEST_F(LayerHierarchyTest, zorderRespectsLayerSequenceId) {
597 // remove default hierarchy
598 mLifecycleManager = LayerLifecycleManager();
599 createRootLayer(1);
600 createRootLayer(2);
601 createRootLayer(4);
602 createRootLayer(5);
603 createLayer(11, 1);
604 createLayer(51, 5);
605 createLayer(53, 5);
606
607 mLifecycleManager.commitChanges();
608 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
609 UPDATE_AND_VERIFY(hierarchyBuilder);
610 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 4, 5, 51, 53};
611 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
612
613 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
614 expectedTraversalPath = {};
615 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
616
617 // A new layer is added with a smaller sequence id. Make sure its sorted correctly. While
618 // sequence ids are always incremented, this scenario can happen when a layer is reparented.
619 createRootLayer(3);
620 createLayer(52, 5);
621
622 UPDATE_AND_VERIFY(hierarchyBuilder);
623 expectedTraversalPath = {1, 11, 2, 3, 4, 5, 51, 52, 53};
624 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
625 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
626 expectedTraversalPath = {};
627 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
628}
629
630TEST_F(LayerHierarchyTest, zorderRespectsLayerZ) {
631 // remove default hierarchy
632 mLifecycleManager = LayerLifecycleManager();
633 createRootLayer(1);
634 createLayer(11, 1);
635 createLayer(12, 1);
636 createLayer(13, 1);
637 setZ(11, -1);
638 setZ(12, 2);
639 setZ(13, 1);
640
641 mLifecycleManager.commitChanges();
642 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
643 UPDATE_AND_VERIFY(hierarchyBuilder);
644 std::vector<uint32_t> expectedTraversalPath = {1, 11, 13, 12};
645 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
646
647 expectedTraversalPath = {11, 1, 13, 12};
648 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
649 expectedTraversalPath = {};
650 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
651}
652
653TEST_F(LayerHierarchyTest, zorderRespectsLayerStack) {
654 // remove default hierarchy
655 mLifecycleManager = LayerLifecycleManager();
656 createRootLayer(1);
657 createRootLayer(2);
658 createLayer(11, 1);
659 createLayer(21, 2);
660 setLayerStack(1, 20);
661 setLayerStack(2, 10);
662
663 mLifecycleManager.commitChanges();
664 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
665 UPDATE_AND_VERIFY(hierarchyBuilder);
666 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 21};
667 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
668
669 expectedTraversalPath = {1, 11, 2, 21};
670 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
671 expectedTraversalPath = {};
672 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
673}
674
Vishnu Naira9c43762023-01-27 19:10:25 +0000675TEST_F(LayerHierarchyTest, canMirrorDisplay) {
676 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
677 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
678 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
679 setLayerStack(3, 1);
680 UPDATE_AND_VERIFY(hierarchyBuilder);
681
682 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2,
683 1, 11, 111, 12, 121, 122, 1221, 13, 2};
684 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
685 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
686 expected = {};
687 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
688}
689
690TEST_F(LayerHierarchyTest, mirrorNonExistingDisplay) {
691 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
692 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
693 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(5));
694 setLayerStack(3, 1);
695 UPDATE_AND_VERIFY(hierarchyBuilder);
696
697 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
698 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
699 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
700 expected = {};
701 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
702}
703
704TEST_F(LayerHierarchyTest, newRootLayerIsMirrored) {
705 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
706 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
707 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
708 setLayerStack(3, 1);
709 UPDATE_AND_VERIFY(hierarchyBuilder);
710
711 createRootLayer(4);
712 UPDATE_AND_VERIFY(hierarchyBuilder);
713
714 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4,
715 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4};
716 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
717 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
718 expected = {};
719 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
720}
721
722TEST_F(LayerHierarchyTest, removedRootLayerIsNoLongerMirrored) {
723 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
724 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
725 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
726 setLayerStack(3, 1);
727 UPDATE_AND_VERIFY(hierarchyBuilder);
728
729 reparentLayer(1, UNASSIGNED_LAYER_ID);
730 destroyLayerHandle(1);
731 UPDATE_AND_VERIFY(hierarchyBuilder);
732
733 std::vector<uint32_t> expected = {3, 2, 2};
734 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
735 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
736 expected = {11, 111, 12, 121, 122, 1221, 13};
737 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
738}
739
Vishnu Nair04f89692022-11-16 23:21:05 +0000740} // namespace android::surfaceflinger::frontend