blob: f64ba2a439330fc0da332fc36341ec8cfc30e765 [file] [log] [blame]
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
Vishnu Nair0808ae62023-08-07 21:42:42 -070020#include <gui/fake/BufferData.h>
21
Vishnu Nair1391de22023-03-05 19:56:14 -080022#include "Client.h" // temporarily needed for LayerCreationArgs
23#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000024#include "FrontEnd/LayerHierarchy.h"
25#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000026
27namespace android::surfaceflinger::frontend {
28
29class LayerHierarchyTestBase : public testing::Test {
30protected:
31 LayerHierarchyTestBase() {
32 // tree with 3 levels of children
33 // ROOT
34 // ├── 1
35 // │ ├── 11
36 // │ │ └── 111
37 // │ ├── 12
38 // │ │ ├── 121
39 // │ │ └── 122
40 // │ │ └── 1221
41 // │ └── 13
42 // └── 2
43
44 createRootLayer(1);
45 createRootLayer(2);
46 createLayer(11, 1);
47 createLayer(12, 1);
48 createLayer(13, 1);
49 createLayer(111, 11);
50 createLayer(121, 12);
51 createLayer(122, 12);
52 createLayer(1221, 122);
53 }
54
Vishnu Nair1391de22023-03-05 19:56:14 -080055 LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, uint32_t parentId,
56 uint32_t layerIdToMirror) {
57 LayerCreationArgs args(std::make_optional(id));
58 args.name = "testlayer";
Vishnu Nair8fc721b2022-12-22 20:06:32 +000059 args.addToRoot = canBeRoot;
Vishnu Nair1391de22023-03-05 19:56:14 -080060 args.parentId = parentId;
61 args.layerIdToMirror = layerIdToMirror;
Vishnu Nair8fc721b2022-12-22 20:06:32 +000062 return args;
63 }
64
Vishnu Nair1391de22023-03-05 19:56:14 -080065 LayerCreationArgs createDisplayMirrorArgs(uint32_t id, ui::LayerStack layerStackToMirror) {
66 LayerCreationArgs args(std::make_optional(id));
67 args.name = "testlayer";
Vishnu Naira9c43762023-01-27 19:10:25 +000068 args.addToRoot = true;
Vishnu Nair1391de22023-03-05 19:56:14 -080069 args.layerStackToMirror = layerStackToMirror;
Vishnu Naira9c43762023-01-27 19:10:25 +000070 return args;
71 }
72
Vishnu Nair8fc721b2022-12-22 20:06:32 +000073 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
74 std::vector<uint32_t> layerIds;
75 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
76 const LayerHierarchy::TraversalPath&) -> bool {
77 layerIds.emplace_back(hierarchy.getLayer()->id);
78 return true;
79 });
80 return layerIds;
81 }
82
83 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
84 std::vector<uint32_t> layerIds;
85 hierarchy.traverseInZOrder(
86 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
87 const LayerHierarchy::TraversalPath&) -> bool {
88 layerIds.emplace_back(hierarchy.getLayer()->id);
89 return true;
90 });
91 return layerIds;
92 }
93
94 virtual void createRootLayer(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000095 std::vector<std::unique_ptr<RequestedLayerState>> layers;
96 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -080097 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
98 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +000099 mLifecycleManager.addLayers(std::move(layers));
100 }
101
Vishnu Naira9c43762023-01-27 19:10:25 +0000102 void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000103 std::vector<std::unique_ptr<RequestedLayerState>> layers;
104 layers.emplace_back(std::make_unique<RequestedLayerState>(
105 createDisplayMirrorArgs(/*id=*/id, layerStack)));
106 mLifecycleManager.addLayers(std::move(layers));
107 }
108
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000109 virtual void createLayer(uint32_t id, uint32_t parentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000110 std::vector<std::unique_ptr<RequestedLayerState>> layers;
111 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800112 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
113 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000114 mLifecycleManager.addLayers(std::move(layers));
115 }
116
Vishnu Nair1391de22023-03-05 19:56:14 -0800117 std::vector<TransactionState> reparentLayerTransaction(uint32_t id, uint32_t newParentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000118 std::vector<TransactionState> transactions;
119 transactions.emplace_back();
120 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800121 transactions.back().states.front().parentId = newParentId;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000122 transactions.back().states.front().state.what = layer_state_t::eReparent;
Vishnu Nair1391de22023-03-05 19:56:14 -0800123 transactions.back().states.front().relativeParentId = UNASSIGNED_LAYER_ID;
124 transactions.back().states.front().layerId = id;
125 return transactions;
126 }
127
128 void reparentLayer(uint32_t id, uint32_t newParentId) {
129 mLifecycleManager.applyTransactions(reparentLayerTransaction(id, newParentId));
130 }
131
132 std::vector<TransactionState> relativeLayerTransaction(uint32_t id, uint32_t relativeParentId) {
133 std::vector<TransactionState> transactions;
134 transactions.emplace_back();
135 transactions.back().states.push_back({});
136 transactions.back().states.front().relativeParentId = relativeParentId;
137 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
138 transactions.back().states.front().layerId = id;
139 return transactions;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000140 }
141
142 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
Vishnu Nair1391de22023-03-05 19:56:14 -0800143 mLifecycleManager.applyTransactions(relativeLayerTransaction(id, relativeParentId));
144 }
145
146 void removeRelativeZ(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000147 std::vector<TransactionState> transactions;
148 transactions.emplace_back();
149 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800150 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
151 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000152 mLifecycleManager.applyTransactions(transactions);
153 }
154
Vishnu Nair1391de22023-03-05 19:56:14 -0800155 virtual void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000156 std::vector<std::unique_ptr<RequestedLayerState>> layers;
157 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800158 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
159 /*mirror=*/layerIdToMirror)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000160 mLifecycleManager.addLayers(std::move(layers));
161 }
162
163 void updateBackgroundColor(uint32_t id, half alpha) {
164 std::vector<TransactionState> transactions;
165 transactions.emplace_back();
166 transactions.back().states.push_back({});
167 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000168 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair1391de22023-03-05 19:56:14 -0800169 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000170 mLifecycleManager.applyTransactions(transactions);
171 }
172
173 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({id}); }
174
175 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
176 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
177 hierarchyBuilder.update(mLifecycleManager.getLayers(),
178 mLifecycleManager.getDestroyedLayers());
179 }
180 mLifecycleManager.commitChanges();
181
182 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
183 LayerHierarchyBuilder newBuilder(mLifecycleManager.getLayers());
184 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
185 getTraversalPath(newBuilder.getHierarchy()));
186 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
187 getTraversalPathInZOrder(newBuilder.getHierarchy()));
188 EXPECT_FALSE(
189 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
190 }
191
Vishnu Nair1391de22023-03-05 19:56:14 -0800192 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000193 std::vector<TransactionState> transactions;
194 transactions.emplace_back();
195 transactions.back().states.push_back({});
196
197 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800198 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000199 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800200 return transactions;
201 }
202
203 void setZ(uint32_t id, int32_t z) {
204 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000205 }
206
207 void setCrop(uint32_t id, const Rect& crop) {
208 std::vector<TransactionState> transactions;
209 transactions.emplace_back();
210 transactions.back().states.push_back({});
211
212 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800213 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000214 transactions.back().states.front().state.crop = crop;
215 mLifecycleManager.applyTransactions(transactions);
216 }
217
218 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
219 std::vector<TransactionState> transactions;
220 transactions.emplace_back();
221 transactions.back().states.push_back({});
222
223 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
224 transactions.back().states.front().state.flags = flags;
225 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800226 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000227 mLifecycleManager.applyTransactions(transactions);
228 }
229
230 void setAlpha(uint32_t id, float alpha) {
231 std::vector<TransactionState> transactions;
232 transactions.emplace_back();
233 transactions.back().states.push_back({});
234
235 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800236 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000237 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
238 mLifecycleManager.applyTransactions(transactions);
239 }
240
241 void hideLayer(uint32_t id) {
242 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
243 }
244
245 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
246
247 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
248 std::vector<TransactionState> transactions;
249 transactions.emplace_back();
250 transactions.back().states.push_back({});
251 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
252 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800253 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000254 mLifecycleManager.applyTransactions(transactions);
255 }
256
Vishnu Naircfb2d252023-01-19 04:44:02 +0000257 void setLayerStack(uint32_t id, int32_t layerStack) {
258 std::vector<TransactionState> transactions;
259 transactions.emplace_back();
260 transactions.back().states.push_back({});
261
262 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800263 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000264 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
265 mLifecycleManager.applyTransactions(transactions);
266 }
267
Vishnu Nair92990e22023-02-24 20:01:05 +0000268 void setTouchableRegion(uint32_t id, Region region) {
269 std::vector<TransactionState> transactions;
270 transactions.emplace_back();
271 transactions.back().states.push_back({});
272
273 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800274 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000275 transactions.back().states.front().state.windowInfoHandle =
276 sp<gui::WindowInfoHandle>::make();
277 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
278 inputInfo->touchableRegion = region;
279 inputInfo->token = sp<BBinder>::make();
280 mLifecycleManager.applyTransactions(transactions);
281 }
282
Vishnu Nair29354ec2023-03-28 18:51:28 -0700283 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
284 bool replaceTouchableRegionWithCrop) {
285 std::vector<TransactionState> transactions;
286 transactions.emplace_back();
287 transactions.back().states.push_back({});
288
289 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
290 transactions.back().states.front().layerId = id;
291 transactions.back().states.front().state.windowInfoHandle =
292 sp<gui::WindowInfoHandle>::make();
293 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
294 inputInfo->touchableRegion = region;
295 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
296 transactions.back().states.front().touchCropId = touchCropId;
297
298 inputInfo->token = sp<BBinder>::make();
299 mLifecycleManager.applyTransactions(transactions);
300 }
301
Vishnu Nair444f3952023-04-11 13:01:02 -0700302 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
303 std::vector<TransactionState> transactions;
304 transactions.emplace_back();
305 transactions.back().states.push_back({});
306
307 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
308 transactions.back().states.front().layerId = id;
309 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
310 mLifecycleManager.applyTransactions(transactions);
311 }
312
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000313 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
314 std::vector<TransactionState> transactions;
315 transactions.emplace_back();
316 transactions.back().states.push_back({});
317
318 transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
319 transactions.back().states.front().layerId = id;
320 transactions.back().states.front().state.frameRateSelectionPriority = priority;
321 mLifecycleManager.applyTransactions(transactions);
322 }
323
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000324 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
325 int8_t changeFrameRateStrategy) {
326 std::vector<TransactionState> transactions;
327 transactions.emplace_back();
328 transactions.back().states.push_back({});
329
330 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
331 transactions.back().states.front().layerId = id;
332 transactions.back().states.front().state.frameRate = frameRate;
333 transactions.back().states.front().state.frameRateCompatibility = compatibility;
334 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
335 mLifecycleManager.applyTransactions(transactions);
336 }
337
Vishnu Nair0808ae62023-08-07 21:42:42 -0700338 void setRoundedCorners(uint32_t id, float radius) {
339 std::vector<TransactionState> transactions;
340 transactions.emplace_back();
341 transactions.back().states.push_back({});
342
343 transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
344 transactions.back().states.front().layerId = id;
345 transactions.back().states.front().state.cornerRadius = radius;
346 mLifecycleManager.applyTransactions(transactions);
347 }
348
349 void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
350 std::vector<TransactionState> transactions;
351 transactions.emplace_back();
352 transactions.back().states.push_back({});
353
354 transactions.back().states.front().state.what = layer_state_t::eBufferChanged;
355 transactions.back().states.front().layerId = id;
356 transactions.back().states.front().externalTexture = texture;
357 transactions.back().states.front().state.bufferData =
358 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
359 texture->getHeight(), texture->getPixelFormat(),
360 texture->getUsage());
361 mLifecycleManager.applyTransactions(transactions);
362 }
363
Vishnu Nair3996ee32023-08-14 04:32:31 +0000364 void setDataspace(uint32_t id, ui::Dataspace dataspace) {
365 std::vector<TransactionState> transactions;
366 transactions.emplace_back();
367 transactions.back().states.push_back({});
368
369 transactions.back().states.front().state.what = layer_state_t::eDataspaceChanged;
370 transactions.back().states.front().layerId = id;
371 transactions.back().states.front().state.dataspace = dataspace;
372 mLifecycleManager.applyTransactions(transactions);
373 }
374
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000375 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000376};
377
378} // namespace android::surfaceflinger::frontend