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