blob: e475b843c9748951df2a3a49501a932559c616dd [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 Nair1391de22023-03-05 19:56:14 -080020#include "Client.h" // temporarily needed for LayerCreationArgs
21#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000022#include "FrontEnd/LayerHierarchy.h"
23#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000024
25namespace android::surfaceflinger::frontend {
26
27class LayerHierarchyTestBase : public testing::Test {
28protected:
29 LayerHierarchyTestBase() {
30 // tree with 3 levels of children
31 // ROOT
32 // ├── 1
33 // │ ├── 11
34 // │ │ └── 111
35 // │ ├── 12
36 // │ │ ├── 121
37 // │ │ └── 122
38 // │ │ └── 1221
39 // │ └── 13
40 // └── 2
41
42 createRootLayer(1);
43 createRootLayer(2);
44 createLayer(11, 1);
45 createLayer(12, 1);
46 createLayer(13, 1);
47 createLayer(111, 11);
48 createLayer(121, 12);
49 createLayer(122, 12);
50 createLayer(1221, 122);
51 }
52
Vishnu Nair1391de22023-03-05 19:56:14 -080053 LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, uint32_t parentId,
54 uint32_t layerIdToMirror) {
55 LayerCreationArgs args(std::make_optional(id));
56 args.name = "testlayer";
Vishnu Nair8fc721b2022-12-22 20:06:32 +000057 args.addToRoot = canBeRoot;
Vishnu Nair1391de22023-03-05 19:56:14 -080058 args.parentId = parentId;
59 args.layerIdToMirror = layerIdToMirror;
Vishnu Nair8fc721b2022-12-22 20:06:32 +000060 return args;
61 }
62
Vishnu Nair1391de22023-03-05 19:56:14 -080063 LayerCreationArgs createDisplayMirrorArgs(uint32_t id, ui::LayerStack layerStackToMirror) {
64 LayerCreationArgs args(std::make_optional(id));
65 args.name = "testlayer";
Vishnu Naira9c43762023-01-27 19:10:25 +000066 args.addToRoot = true;
Vishnu Nair1391de22023-03-05 19:56:14 -080067 args.layerStackToMirror = layerStackToMirror;
Vishnu Naira9c43762023-01-27 19:10:25 +000068 return args;
69 }
70
Vishnu Nair8fc721b2022-12-22 20:06:32 +000071 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
72 std::vector<uint32_t> layerIds;
73 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
74 const LayerHierarchy::TraversalPath&) -> bool {
75 layerIds.emplace_back(hierarchy.getLayer()->id);
76 return true;
77 });
78 return layerIds;
79 }
80
81 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
82 std::vector<uint32_t> layerIds;
83 hierarchy.traverseInZOrder(
84 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
85 const LayerHierarchy::TraversalPath&) -> bool {
86 layerIds.emplace_back(hierarchy.getLayer()->id);
87 return true;
88 });
89 return layerIds;
90 }
91
92 virtual void createRootLayer(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000093 std::vector<std::unique_ptr<RequestedLayerState>> layers;
94 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -080095 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
96 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +000097 mLifecycleManager.addLayers(std::move(layers));
98 }
99
Vishnu Naira9c43762023-01-27 19:10:25 +0000100 void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000101 std::vector<std::unique_ptr<RequestedLayerState>> layers;
102 layers.emplace_back(std::make_unique<RequestedLayerState>(
103 createDisplayMirrorArgs(/*id=*/id, layerStack)));
104 mLifecycleManager.addLayers(std::move(layers));
105 }
106
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000107 virtual void createLayer(uint32_t id, uint32_t parentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000108 std::vector<std::unique_ptr<RequestedLayerState>> layers;
109 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800110 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
111 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000112 mLifecycleManager.addLayers(std::move(layers));
113 }
114
Vishnu Nair1391de22023-03-05 19:56:14 -0800115 std::vector<TransactionState> reparentLayerTransaction(uint32_t id, uint32_t newParentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000116 std::vector<TransactionState> transactions;
117 transactions.emplace_back();
118 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800119 transactions.back().states.front().parentId = newParentId;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000120 transactions.back().states.front().state.what = layer_state_t::eReparent;
Vishnu Nair1391de22023-03-05 19:56:14 -0800121 transactions.back().states.front().relativeParentId = UNASSIGNED_LAYER_ID;
122 transactions.back().states.front().layerId = id;
123 return transactions;
124 }
125
126 void reparentLayer(uint32_t id, uint32_t newParentId) {
127 mLifecycleManager.applyTransactions(reparentLayerTransaction(id, newParentId));
128 }
129
130 std::vector<TransactionState> relativeLayerTransaction(uint32_t id, uint32_t relativeParentId) {
131 std::vector<TransactionState> transactions;
132 transactions.emplace_back();
133 transactions.back().states.push_back({});
134 transactions.back().states.front().relativeParentId = relativeParentId;
135 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
136 transactions.back().states.front().layerId = id;
137 return transactions;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000138 }
139
140 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
Vishnu Nair1391de22023-03-05 19:56:14 -0800141 mLifecycleManager.applyTransactions(relativeLayerTransaction(id, relativeParentId));
142 }
143
144 void removeRelativeZ(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000145 std::vector<TransactionState> transactions;
146 transactions.emplace_back();
147 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800148 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
149 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000150 mLifecycleManager.applyTransactions(transactions);
151 }
152
Vishnu Nair1391de22023-03-05 19:56:14 -0800153 virtual void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000154 std::vector<std::unique_ptr<RequestedLayerState>> layers;
155 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800156 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
157 /*mirror=*/layerIdToMirror)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000158 mLifecycleManager.addLayers(std::move(layers));
159 }
160
161 void updateBackgroundColor(uint32_t id, half alpha) {
162 std::vector<TransactionState> transactions;
163 transactions.emplace_back();
164 transactions.back().states.push_back({});
165 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000166 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair1391de22023-03-05 19:56:14 -0800167 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000168 mLifecycleManager.applyTransactions(transactions);
169 }
170
171 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({id}); }
172
173 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
174 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
175 hierarchyBuilder.update(mLifecycleManager.getLayers(),
176 mLifecycleManager.getDestroyedLayers());
177 }
178 mLifecycleManager.commitChanges();
179
180 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
181 LayerHierarchyBuilder newBuilder(mLifecycleManager.getLayers());
182 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
183 getTraversalPath(newBuilder.getHierarchy()));
184 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
185 getTraversalPathInZOrder(newBuilder.getHierarchy()));
186 EXPECT_FALSE(
187 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
188 }
189
Vishnu Nair1391de22023-03-05 19:56:14 -0800190 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000191 std::vector<TransactionState> transactions;
192 transactions.emplace_back();
193 transactions.back().states.push_back({});
194
195 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800196 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000197 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800198 return transactions;
199 }
200
201 void setZ(uint32_t id, int32_t z) {
202 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000203 }
204
205 void setCrop(uint32_t id, const Rect& crop) {
206 std::vector<TransactionState> transactions;
207 transactions.emplace_back();
208 transactions.back().states.push_back({});
209
210 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800211 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000212 transactions.back().states.front().state.crop = crop;
213 mLifecycleManager.applyTransactions(transactions);
214 }
215
216 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
217 std::vector<TransactionState> transactions;
218 transactions.emplace_back();
219 transactions.back().states.push_back({});
220
221 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
222 transactions.back().states.front().state.flags = flags;
223 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800224 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000225 mLifecycleManager.applyTransactions(transactions);
226 }
227
228 void setAlpha(uint32_t id, float alpha) {
229 std::vector<TransactionState> transactions;
230 transactions.emplace_back();
231 transactions.back().states.push_back({});
232
233 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800234 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000235 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
236 mLifecycleManager.applyTransactions(transactions);
237 }
238
239 void hideLayer(uint32_t id) {
240 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
241 }
242
243 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
244
245 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
246 std::vector<TransactionState> transactions;
247 transactions.emplace_back();
248 transactions.back().states.push_back({});
249 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
250 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800251 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000252 mLifecycleManager.applyTransactions(transactions);
253 }
254
Vishnu Naircfb2d252023-01-19 04:44:02 +0000255 void setLayerStack(uint32_t id, int32_t layerStack) {
256 std::vector<TransactionState> transactions;
257 transactions.emplace_back();
258 transactions.back().states.push_back({});
259
260 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800261 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000262 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
263 mLifecycleManager.applyTransactions(transactions);
264 }
265
Vishnu Nair92990e22023-02-24 20:01:05 +0000266 void setTouchableRegion(uint32_t id, Region region) {
267 std::vector<TransactionState> transactions;
268 transactions.emplace_back();
269 transactions.back().states.push_back({});
270
271 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800272 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000273 transactions.back().states.front().state.windowInfoHandle =
274 sp<gui::WindowInfoHandle>::make();
275 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
276 inputInfo->touchableRegion = region;
277 inputInfo->token = sp<BBinder>::make();
278 mLifecycleManager.applyTransactions(transactions);
279 }
280
Vishnu Nair29354ec2023-03-28 18:51:28 -0700281 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
282 bool replaceTouchableRegionWithCrop) {
283 std::vector<TransactionState> transactions;
284 transactions.emplace_back();
285 transactions.back().states.push_back({});
286
287 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
288 transactions.back().states.front().layerId = id;
289 transactions.back().states.front().state.windowInfoHandle =
290 sp<gui::WindowInfoHandle>::make();
291 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
292 inputInfo->touchableRegion = region;
293 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
294 transactions.back().states.front().touchCropId = touchCropId;
295
296 inputInfo->token = sp<BBinder>::make();
297 mLifecycleManager.applyTransactions(transactions);
298 }
299
Vishnu Nair444f3952023-04-11 13:01:02 -0700300 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
301 std::vector<TransactionState> transactions;
302 transactions.emplace_back();
303 transactions.back().states.push_back({});
304
305 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
306 transactions.back().states.front().layerId = id;
307 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
308 mLifecycleManager.applyTransactions(transactions);
309 }
310
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000311 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
312 std::vector<TransactionState> transactions;
313 transactions.emplace_back();
314 transactions.back().states.push_back({});
315
316 transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
317 transactions.back().states.front().layerId = id;
318 transactions.back().states.front().state.frameRateSelectionPriority = priority;
319 mLifecycleManager.applyTransactions(transactions);
320 }
321
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000322 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
323 int8_t changeFrameRateStrategy) {
324 std::vector<TransactionState> transactions;
325 transactions.emplace_back();
326 transactions.back().states.push_back({});
327
328 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
329 transactions.back().states.front().layerId = id;
330 transactions.back().states.front().state.frameRate = frameRate;
331 transactions.back().states.front().state.frameRateCompatibility = compatibility;
332 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
333 mLifecycleManager.applyTransactions(transactions);
334 }
335
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000336 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000337};
338
339} // namespace android::surfaceflinger::frontend