blob: 783df2821b8eee2bda569f37485244bbbbb7f2cb [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);
440
441 std::vector<uint32_t> expectedTraversalPath = {1, 1222, 11, 111, 12, 121, 122, 1221, 13, 2};
442 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
443 expectedTraversalPath = {1222, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
444 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
445 expectedTraversalPath = {};
446 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
447}
448
449// cycle tests
450TEST_F(LayerHierarchyTest, ParentBecomesTheChild) {
451 // remove default hierarchy
452 mLifecycleManager = LayerLifecycleManager();
453 createRootLayer(1);
454 createLayer(11, 1);
455 reparentLayer(1, 11);
456 mLifecycleManager.commitChanges();
457 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
458
459 std::vector<uint32_t> expectedTraversalPath = {};
460 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
461 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
462 expectedTraversalPath = {};
463 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
464}
465
466TEST_F(LayerHierarchyTest, RelativeLoops) {
467 // remove default hierarchy
468 mLifecycleManager = LayerLifecycleManager();
469 createRootLayer(1);
470 createRootLayer(2);
471 createLayer(11, 1);
472 reparentRelativeLayer(11, 2);
473 reparentRelativeLayer(2, 11);
474 mLifecycleManager.commitChanges();
475 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
476
477 // fix loop
478 uint32_t invalidRelativeRoot;
479 bool hasRelZLoop = hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot);
480 EXPECT_TRUE(hasRelZLoop);
481 mLifecycleManager.fixRelativeZLoop(invalidRelativeRoot);
482 hierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers());
483 EXPECT_EQ(invalidRelativeRoot, 11u);
484 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
485
486 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 2};
487 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
488 expectedTraversalPath = {1};
489 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
490 expectedTraversalPath = {11, 2};
491 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
492}
493
494TEST_F(LayerHierarchyTest, IndirectRelativeLoops) {
495 // remove default hierarchy
496 mLifecycleManager = LayerLifecycleManager();
497 createRootLayer(1);
498 createRootLayer(2);
499 createLayer(11, 1);
500 createLayer(111, 11);
501 createLayer(21, 2);
502 createLayer(22, 2);
503 createLayer(221, 22);
504 reparentRelativeLayer(22, 111);
505 reparentRelativeLayer(11, 221);
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_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(invalidRelativeRoot));
516
517 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 22, 221, 2, 21, 22, 221};
518 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
519 expectedTraversalPath = {1, 2, 21};
520 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
521 expectedTraversalPath = {11, 111, 22, 221};
522 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
523}
524
525TEST_F(LayerHierarchyTest, ReparentRootLayerToNull) {
526 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
527 reparentLayer(1, UNASSIGNED_LAYER_ID);
528 UPDATE_AND_VERIFY(hierarchyBuilder);
529
530 std::vector<uint32_t> expectedTraversalPath = {2};
531 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
532 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
533 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
534 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
535}
536
537TEST_F(LayerHierarchyTest, AddRemoveLayerInSameTransaction) {
538 // remove default hierarchy
539 mLifecycleManager = LayerLifecycleManager();
540 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
541 createRootLayer(1);
542 destroyLayerHandle(1);
543 UPDATE_AND_VERIFY(hierarchyBuilder);
544
545 std::vector<uint32_t> expectedTraversalPath = {};
546 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
547 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
548 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
549}
550
551// traversal path test
552TEST_F(LayerHierarchyTest, traversalPathId) {
553 setZ(122, -1);
554 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
555 auto checkTraversalPathIdVisitor =
556 [](const LayerHierarchy& hierarchy,
557 const LayerHierarchy::TraversalPath& traversalPath) -> bool {
558 EXPECT_EQ(hierarchy.getLayer()->id, traversalPath.id);
559 return true;
560 };
561 hierarchyBuilder.getHierarchy().traverse(checkTraversalPathIdVisitor);
562 hierarchyBuilder.getHierarchy().traverseInZOrder(checkTraversalPathIdVisitor);
563}
564
Vishnu Naircfb2d252023-01-19 04:44:02 +0000565TEST_F(LayerHierarchyTest, zorderRespectsLayerSequenceId) {
566 // remove default hierarchy
567 mLifecycleManager = LayerLifecycleManager();
568 createRootLayer(1);
569 createRootLayer(2);
570 createRootLayer(4);
571 createRootLayer(5);
572 createLayer(11, 1);
573 createLayer(51, 5);
574 createLayer(53, 5);
575
576 mLifecycleManager.commitChanges();
577 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
578 UPDATE_AND_VERIFY(hierarchyBuilder);
579 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 4, 5, 51, 53};
580 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
581
582 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
583 expectedTraversalPath = {};
584 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
585
586 // A new layer is added with a smaller sequence id. Make sure its sorted correctly. While
587 // sequence ids are always incremented, this scenario can happen when a layer is reparented.
588 createRootLayer(3);
589 createLayer(52, 5);
590
591 UPDATE_AND_VERIFY(hierarchyBuilder);
592 expectedTraversalPath = {1, 11, 2, 3, 4, 5, 51, 52, 53};
593 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
594 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
595 expectedTraversalPath = {};
596 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
597}
598
599TEST_F(LayerHierarchyTest, zorderRespectsLayerZ) {
600 // remove default hierarchy
601 mLifecycleManager = LayerLifecycleManager();
602 createRootLayer(1);
603 createLayer(11, 1);
604 createLayer(12, 1);
605 createLayer(13, 1);
606 setZ(11, -1);
607 setZ(12, 2);
608 setZ(13, 1);
609
610 mLifecycleManager.commitChanges();
611 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
612 UPDATE_AND_VERIFY(hierarchyBuilder);
613 std::vector<uint32_t> expectedTraversalPath = {1, 11, 13, 12};
614 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
615
616 expectedTraversalPath = {11, 1, 13, 12};
617 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
618 expectedTraversalPath = {};
619 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
620}
621
622TEST_F(LayerHierarchyTest, zorderRespectsLayerStack) {
623 // remove default hierarchy
624 mLifecycleManager = LayerLifecycleManager();
625 createRootLayer(1);
626 createRootLayer(2);
627 createLayer(11, 1);
628 createLayer(21, 2);
629 setLayerStack(1, 20);
630 setLayerStack(2, 10);
631
632 mLifecycleManager.commitChanges();
633 LayerHierarchyBuilder hierarchyBuilder(mLifecycleManager.getLayers());
634 UPDATE_AND_VERIFY(hierarchyBuilder);
635 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 21};
636 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
637
638 expectedTraversalPath = {1, 11, 2, 21};
639 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
640 expectedTraversalPath = {};
641 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
642}
643
Vishnu Nair04f89692022-11-16 23:21:05 +0000644} // namespace android::surfaceflinger::frontend