blob: 19164049a76917abc6f3f4630e4cac86963e11f3 [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
266// mirror tests
267TEST_F(LayerHierarchyTest, canTraverseMirrorLayer) {
268 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
269
270 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
271 UPDATE_AND_VERIFY(hierarchyBuilder);
272
273 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122,
274 1221, 13, 14, 11, 111, 2};
275 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
276 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
277 expectedTraversalPath = {};
278 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
279}
280
281TEST_F(LayerHierarchyTest, canMirrorOffscreenLayer) {
282 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
283
284 reparentLayer(11, UNASSIGNED_LAYER_ID);
285 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
286 UPDATE_AND_VERIFY(hierarchyBuilder);
287
288 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 14, 11, 111, 2};
289 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
290 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
291 expectedTraversalPath = {11, 111};
292 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
293}
294
295TEST_F(LayerHierarchyTest, newChildLayerIsUpdatedInMirrorHierarchy) {
296 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
297 mLifecycleManager.commitChanges();
298 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
299
300 createLayer(1111, 111);
301 createLayer(112, 11);
302 UPDATE_AND_VERIFY(hierarchyBuilder);
303
304 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 1111, 112, 12, 121, 122,
305 1221, 13, 14, 11, 111, 1111, 112, 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
312// mirror & relatives tests
313TEST_F(LayerHierarchyTest, mirrorWithRelativeOutsideMirrorHierarchy) {
314 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
315 reparentRelativeLayer(111, 12);
316 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
317
318 // ROOT
319 // ├── 1
320 // │ ├── 11
321 // │ │ └── 111
322 // │ ├── 12
323 // │ │ ├── 121
324 // │ │ ├── 122
325 // │ │ │ └── 1221
326 // │ │ └ - 111 (relative)
327 // │ ├── 13
328 // │ └── 14
329 // │ └ * 11 (mirroring)
330 // └── 2
331
332 UPDATE_AND_VERIFY(hierarchyBuilder);
333
334 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 111, 121, 122,
335 1221, 13, 14, 11, 111, 2};
336 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
337 // 111 is not reachable in the mirror
338 expectedTraversalPath = {1, 11, 12, 111, 121, 122, 1221, 13, 14, 11, 2};
339 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
340 expectedTraversalPath = {};
341 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
342}
343
344TEST_F(LayerHierarchyTest, mirrorWithRelativeInsideMirrorHierarchy) {
345 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
346 reparentRelativeLayer(1221, 12);
347 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 12);
348
349 // ROOT
350 // ├── 1
351 // │ ├── 11
352 // │ │ └── 111
353 // │ ├── 12
354 // │ │ ├── 121
355 // │ │ ├── 122
356 // │ │ │ └── 1221
357 // │ │ └ - 1221 (relative)
358 // │ ├── 13
359 // │ └── 14
360 // │ └ * 12 (mirroring)
361 // └── 2
362
363 UPDATE_AND_VERIFY(hierarchyBuilder);
364 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 1221,
365 13, 14, 12, 121, 122, 1221, 1221, 2};
366 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
367 // relative layer 1221 is traversable in the mirrored hierarchy as well
368 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 14, 12, 121, 122, 1221, 2};
369 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
370 expectedTraversalPath = {};
371 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
372}
373
374TEST_F(LayerHierarchyTest, childMovesOffscreenWhenRelativeParentDies) {
375 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
376
377 reparentRelativeLayer(11, 2);
378 reparentLayer(2, UNASSIGNED_LAYER_ID);
379 destroyLayerHandle(2);
380
381 UPDATE_AND_VERIFY(hierarchyBuilder);
382 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
383 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
384 expectedTraversalPath = {1, 12, 121, 122, 1221, 13};
385 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
386 expectedTraversalPath = {11, 111};
387 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
388
389 // remove relative parent so layer becomes onscreen again
390 reparentRelativeLayer(11, UNASSIGNED_LAYER_ID);
391 UPDATE_AND_VERIFY(hierarchyBuilder);
392
393 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
394 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
395 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
396 expectedTraversalPath = {};
397 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
398}
399
400TEST_F(LayerHierarchyTest, offscreenLayerCannotBeRelativeToOnscreenLayer) {
401 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
402 reparentRelativeLayer(1221, 2);
403 UPDATE_AND_VERIFY(hierarchyBuilder);
404
405 // verify relz path
406 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
407 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
408 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
409 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
410 expectedTraversalPath = {};
411 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
412
413 // offscreen layer cannot be reached as a relative child
414 reparentLayer(12, UNASSIGNED_LAYER_ID);
415 UPDATE_AND_VERIFY(hierarchyBuilder);
416
417 expectedTraversalPath = {1, 11, 111, 13, 2};
418 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
419 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
420 expectedTraversalPath = {12, 121, 122, 1221};
421 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
422
423 // layer when onscreen can be reached as a relative child again
424 reparentLayer(12, 1);
425 UPDATE_AND_VERIFY(hierarchyBuilder);
426
427 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
428 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
429 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
430 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
431 expectedTraversalPath = {};
432 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
433}
434
435TEST_F(LayerHierarchyTest, backgroundLayersAreBehindParentLayer) {
436 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
437
438 updateBackgroundColor(1, 0.5);
439 UPDATE_AND_VERIFY(hierarchyBuilder);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000440 auto bgLayerId = LayerCreationArgs::getInternalLayerId(1);
441 std::vector<uint32_t> expectedTraversalPath = {1, bgLayerId, 11, 111, 12,
442 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000443 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000444 expectedTraversalPath = {bgLayerId, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000445 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
446 expectedTraversalPath = {};
447 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
448}
449
450// cycle tests
451TEST_F(LayerHierarchyTest, ParentBecomesTheChild) {
452 // remove default hierarchy
453 mLifecycleManager = LayerLifecycleManager();
454 createRootLayer(1);
455 createLayer(11, 1);
456 reparentLayer(1, 11);
457 mLifecycleManager.commitChanges();
458 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
459
460 std::vector<uint32_t> expectedTraversalPath = {};
461 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
462 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
463 expectedTraversalPath = {};
464 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
465}
466
467TEST_F(LayerHierarchyTest, RelativeLoops) {
468 // remove default hierarchy
469 mLifecycleManager = LayerLifecycleManager();
470 createRootLayer(1);
471 createRootLayer(2);
472 createLayer(11, 1);
473 reparentRelativeLayer(11, 2);
474 reparentRelativeLayer(2, 11);
475 mLifecycleManager.commitChanges();
476 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
477
478 // fix loop
479 uint32_t invalidRelativeRoot;
480 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
481 EXPECT_TRUE(hasRelZLoop);
482 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
483 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
484 EXPECT_EQ(invalidRelativeRoot, 11u);
485 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
486
487 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 2};
488 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
489 expectedTraversalPath = {1};
490 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
491 expectedTraversalPath = {11, 2};
492 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
493}
494
495TEST_F(LayerHierarchyTest, IndirectRelativeLoops) {
496 // remove default hierarchy
497 mLifecycleManager = LayerLifecycleManager();
498 createRootLayer(1);
499 createRootLayer(2);
500 createLayer(11, 1);
501 createLayer(111, 11);
502 createLayer(21, 2);
503 createLayer(22, 2);
504 createLayer(221, 22);
505 reparentRelativeLayer(22, 111);
506 reparentRelativeLayer(11, 221);
507 mLifecycleManager.commitChanges();
508 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
509
510 // fix loop
511 uint32_t invalidRelativeRoot;
512 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
513 EXPECT_TRUE(hasRelZLoop);
514 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
515 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
516 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
517
518 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 22, 221, 2, 21, 22, 221};
519 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
520 expectedTraversalPath = {1, 2, 21};
521 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
522 expectedTraversalPath = {11, 111, 22, 221};
523 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
524}
525
526TEST_F(LayerHierarchyTest, ReparentRootLayerToNull) {
527 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
528 reparentLayer(1, UNASSIGNED_LAYER_ID);
529 UPDATE_AND_VERIFY(hierarchyBuilder);
530
531 std::vector<uint32_t> expectedTraversalPath = {2};
532 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
533 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
534 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
535 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
536}
537
538TEST_F(LayerHierarchyTest, AddRemoveLayerInSameTransaction) {
539 // remove default hierarchy
540 mLifecycleManager = LayerLifecycleManager();
541 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
542 createRootLayer(1);
543 destroyLayerHandle(1);
544 UPDATE_AND_VERIFY(hierarchyBuilder);
545
546 std::vector<uint32_t> expectedTraversalPath = {};
547 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
548 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
549 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
550}
551
552// traversal path test
553TEST_F(LayerHierarchyTest, traversalPathId) {
554 setZ(122, -1);
555 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
556 auto checkTraversalPathIdVisitor =
557 [](const LayerHierarchy& hierarchy,
558 const LayerHierarchy::TraversalPath& traversalPath) -> bool {
559 EXPECT_EQ(hierarchy.getLayer()->id, traversalPath.id);
560 return true;
561 };
562 hierarchyBuilder.getHierarchy().traverse(checkTraversalPathIdVisitor);
563 hierarchyBuilder.getHierarchy().traverseInZOrder(checkTraversalPathIdVisitor);
564}
565
Vishnu Naircfb2d252023-01-19 04:44:02 +0000566TEST_F(LayerHierarchyTest, zorderRespectsLayerSequenceId) {
567 // remove default hierarchy
568 mLifecycleManager = LayerLifecycleManager();
569 createRootLayer(1);
570 createRootLayer(2);
571 createRootLayer(4);
572 createRootLayer(5);
573 createLayer(11, 1);
574 createLayer(51, 5);
575 createLayer(53, 5);
576
577 mLifecycleManager.commitChanges();
578 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
579 UPDATE_AND_VERIFY(hierarchyBuilder);
580 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 4, 5, 51, 53};
581 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
582
583 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
584 expectedTraversalPath = {};
585 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
586
587 // A new layer is added with a smaller sequence id. Make sure its sorted correctly. While
588 // sequence ids are always incremented, this scenario can happen when a layer is reparented.
589 createRootLayer(3);
590 createLayer(52, 5);
591
592 UPDATE_AND_VERIFY(hierarchyBuilder);
593 expectedTraversalPath = {1, 11, 2, 3, 4, 5, 51, 52, 53};
594 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
595 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
596 expectedTraversalPath = {};
597 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
598}
599
600TEST_F(LayerHierarchyTest, zorderRespectsLayerZ) {
601 // remove default hierarchy
602 mLifecycleManager = LayerLifecycleManager();
603 createRootLayer(1);
604 createLayer(11, 1);
605 createLayer(12, 1);
606 createLayer(13, 1);
607 setZ(11, -1);
608 setZ(12, 2);
609 setZ(13, 1);
610
611 mLifecycleManager.commitChanges();
612 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
613 UPDATE_AND_VERIFY(hierarchyBuilder);
614 std::vector<uint32_t> expectedTraversalPath = {1, 11, 13, 12};
615 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
616
617 expectedTraversalPath = {11, 1, 13, 12};
618 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
619 expectedTraversalPath = {};
620 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
621}
622
623TEST_F(LayerHierarchyTest, zorderRespectsLayerStack) {
624 // remove default hierarchy
625 mLifecycleManager = LayerLifecycleManager();
626 createRootLayer(1);
627 createRootLayer(2);
628 createLayer(11, 1);
629 createLayer(21, 2);
630 setLayerStack(1, 20);
631 setLayerStack(2, 10);
632
633 mLifecycleManager.commitChanges();
634 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
635 UPDATE_AND_VERIFY(hierarchyBuilder);
636 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 21};
637 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
638
639 expectedTraversalPath = {1, 11, 2, 21};
640 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
641 expectedTraversalPath = {};
642 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
643}
644
Vishnu Naira9c43762023-01-27 19:10:25 +0000645TEST_F(LayerHierarchyTest, canMirrorDisplay) {
646 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
647 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
648 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
649 setLayerStack(3, 1);
650 UPDATE_AND_VERIFY(hierarchyBuilder);
651
652 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2,
653 1, 11, 111, 12, 121, 122, 1221, 13, 2};
654 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
655 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
656 expected = {};
657 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
658}
659
660TEST_F(LayerHierarchyTest, mirrorNonExistingDisplay) {
661 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
662 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
663 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(5));
664 setLayerStack(3, 1);
665 UPDATE_AND_VERIFY(hierarchyBuilder);
666
667 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
668 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
669 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
670 expected = {};
671 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
672}
673
674TEST_F(LayerHierarchyTest, newRootLayerIsMirrored) {
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 createRootLayer(4);
682 UPDATE_AND_VERIFY(hierarchyBuilder);
683
684 std::vector<uint32_t> expected = {3, 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4,
685 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4};
686 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
687 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
688 expected = {};
689 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
690}
691
692TEST_F(LayerHierarchyTest, removedRootLayerIsNoLongerMirrored) {
693 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
694 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
695 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
696 setLayerStack(3, 1);
697 UPDATE_AND_VERIFY(hierarchyBuilder);
698
699 reparentLayer(1, UNASSIGNED_LAYER_ID);
700 destroyLayerHandle(1);
701 UPDATE_AND_VERIFY(hierarchyBuilder);
702
703 std::vector<uint32_t> expected = {3, 2, 2};
704 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
705 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
706 expected = {11, 111, 12, 121, 122, 1221, 13};
707 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
708}
709
Vishnu Nair04f89692022-11-16 23:21:05 +0000710} // namespace android::surfaceflinger::frontend