blob: 8b3303c8099fa9cd639a2c5851ef08098af06a9b [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>
Vishnu Nair47b7bb42023-09-29 16:27:33 -070021#include <renderengine/mock/FakeExternalTexture.h>
Vishnu Naird9e4f462023-10-06 04:05:45 +000022#include <ui/ShadowSettings.h>
Vishnu Nair0808ae62023-08-07 21:42:42 -070023
Vishnu Nair1391de22023-03-05 19:56:14 -080024#include "Client.h" // temporarily needed for LayerCreationArgs
25#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000026#include "FrontEnd/LayerHierarchy.h"
27#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair47b7bb42023-09-29 16:27:33 -070028#include "FrontEnd/LayerSnapshotBuilder.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000029
30namespace android::surfaceflinger::frontend {
31
32class LayerHierarchyTestBase : public testing::Test {
33protected:
34 LayerHierarchyTestBase() {
35 // tree with 3 levels of children
36 // ROOT
37 // ├── 1
38 // │ ├── 11
39 // │ │ └── 111
40 // │ ├── 12
41 // │ │ ├── 121
42 // │ │ └── 122
43 // │ │ └── 1221
44 // │ └── 13
45 // └── 2
46
47 createRootLayer(1);
48 createRootLayer(2);
49 createLayer(11, 1);
50 createLayer(12, 1);
51 createLayer(13, 1);
52 createLayer(111, 11);
53 createLayer(121, 12);
54 createLayer(122, 12);
55 createLayer(1221, 122);
56 }
57
Vishnu Nair1391de22023-03-05 19:56:14 -080058 LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, uint32_t parentId,
59 uint32_t layerIdToMirror) {
60 LayerCreationArgs args(std::make_optional(id));
61 args.name = "testlayer";
Vishnu Nair8fc721b2022-12-22 20:06:32 +000062 args.addToRoot = canBeRoot;
Vishnu Nair1391de22023-03-05 19:56:14 -080063 args.parentId = parentId;
64 args.layerIdToMirror = layerIdToMirror;
Vishnu Nair8fc721b2022-12-22 20:06:32 +000065 return args;
66 }
67
Vishnu Nair1391de22023-03-05 19:56:14 -080068 LayerCreationArgs createDisplayMirrorArgs(uint32_t id, ui::LayerStack layerStackToMirror) {
69 LayerCreationArgs args(std::make_optional(id));
70 args.name = "testlayer";
Vishnu Naira9c43762023-01-27 19:10:25 +000071 args.addToRoot = true;
Vishnu Nair1391de22023-03-05 19:56:14 -080072 args.layerStackToMirror = layerStackToMirror;
Vishnu Naira9c43762023-01-27 19:10:25 +000073 return args;
74 }
75
Vishnu Nair8fc721b2022-12-22 20:06:32 +000076 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
77 std::vector<uint32_t> layerIds;
78 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
79 const LayerHierarchy::TraversalPath&) -> bool {
80 layerIds.emplace_back(hierarchy.getLayer()->id);
81 return true;
82 });
83 return layerIds;
84 }
85
86 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
87 std::vector<uint32_t> layerIds;
88 hierarchy.traverseInZOrder(
89 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
90 const LayerHierarchy::TraversalPath&) -> bool {
91 layerIds.emplace_back(hierarchy.getLayer()->id);
92 return true;
93 });
94 return layerIds;
95 }
96
97 virtual void createRootLayer(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000098 std::vector<std::unique_ptr<RequestedLayerState>> layers;
99 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800100 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
101 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000102 mLifecycleManager.addLayers(std::move(layers));
103 }
104
Vishnu Naira9c43762023-01-27 19:10:25 +0000105 void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000106 std::vector<std::unique_ptr<RequestedLayerState>> layers;
107 layers.emplace_back(std::make_unique<RequestedLayerState>(
108 createDisplayMirrorArgs(/*id=*/id, layerStack)));
109 mLifecycleManager.addLayers(std::move(layers));
110 }
111
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000112 virtual void createLayer(uint32_t id, uint32_t parentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000113 std::vector<std::unique_ptr<RequestedLayerState>> layers;
114 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800115 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
116 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000117 mLifecycleManager.addLayers(std::move(layers));
118 }
119
Vishnu Nair1391de22023-03-05 19:56:14 -0800120 std::vector<TransactionState> reparentLayerTransaction(uint32_t id, uint32_t newParentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000121 std::vector<TransactionState> transactions;
122 transactions.emplace_back();
123 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800124 transactions.back().states.front().parentId = newParentId;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000125 transactions.back().states.front().state.what = layer_state_t::eReparent;
Vishnu Nair1391de22023-03-05 19:56:14 -0800126 transactions.back().states.front().relativeParentId = UNASSIGNED_LAYER_ID;
127 transactions.back().states.front().layerId = id;
128 return transactions;
129 }
130
131 void reparentLayer(uint32_t id, uint32_t newParentId) {
132 mLifecycleManager.applyTransactions(reparentLayerTransaction(id, newParentId));
133 }
134
135 std::vector<TransactionState> relativeLayerTransaction(uint32_t id, uint32_t relativeParentId) {
136 std::vector<TransactionState> transactions;
137 transactions.emplace_back();
138 transactions.back().states.push_back({});
139 transactions.back().states.front().relativeParentId = relativeParentId;
140 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
141 transactions.back().states.front().layerId = id;
142 return transactions;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000143 }
144
145 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
Vishnu Nair1391de22023-03-05 19:56:14 -0800146 mLifecycleManager.applyTransactions(relativeLayerTransaction(id, relativeParentId));
147 }
148
149 void removeRelativeZ(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000150 std::vector<TransactionState> transactions;
151 transactions.emplace_back();
152 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800153 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
154 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000155 mLifecycleManager.applyTransactions(transactions);
156 }
157
Vishnu Nair491827d2024-04-29 23:43:26 +0000158 void setPosition(uint32_t id, float x, float y) {
159 std::vector<TransactionState> transactions;
160 transactions.emplace_back();
161 transactions.back().states.push_back({});
162 transactions.back().states.front().state.what = layer_state_t::ePositionChanged;
163 transactions.back().states.front().state.x = x;
164 transactions.back().states.front().state.y = y;
165 transactions.back().states.front().layerId = id;
166 mLifecycleManager.applyTransactions(transactions);
167 }
168
Vishnu Nair1391de22023-03-05 19:56:14 -0800169 virtual void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000170 std::vector<std::unique_ptr<RequestedLayerState>> layers;
171 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800172 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
173 /*mirror=*/layerIdToMirror)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000174 mLifecycleManager.addLayers(std::move(layers));
175 }
176
177 void updateBackgroundColor(uint32_t id, half alpha) {
178 std::vector<TransactionState> transactions;
179 transactions.emplace_back();
180 transactions.back().states.push_back({});
181 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000182 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair1391de22023-03-05 19:56:14 -0800183 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000184 mLifecycleManager.applyTransactions(transactions);
185 }
186
Vishnu Nair606d9d02023-08-19 14:20:18 -0700187 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({{id, "test"}}); }
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000188
189 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
Vishnu Naira0292282023-12-16 14:32:00 -0800190 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000191 mLifecycleManager.commitChanges();
192
193 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
Vishnu Naira0292282023-12-16 14:32:00 -0800194 LayerHierarchyBuilder newBuilder;
195 newBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000196 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
197 getTraversalPath(newBuilder.getHierarchy()));
198 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
199 getTraversalPathInZOrder(newBuilder.getHierarchy()));
200 EXPECT_FALSE(
201 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
202 }
203
Vishnu Nair1391de22023-03-05 19:56:14 -0800204 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000205 std::vector<TransactionState> transactions;
206 transactions.emplace_back();
207 transactions.back().states.push_back({});
208
209 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800210 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000211 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800212 return transactions;
213 }
214
215 void setZ(uint32_t id, int32_t z) {
216 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000217 }
218
219 void setCrop(uint32_t id, const Rect& crop) {
220 std::vector<TransactionState> transactions;
221 transactions.emplace_back();
222 transactions.back().states.push_back({});
223
224 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800225 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000226 transactions.back().states.front().state.crop = crop;
227 mLifecycleManager.applyTransactions(transactions);
228 }
229
230 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
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::eFlagsChanged;
236 transactions.back().states.front().state.flags = flags;
237 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800238 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000239 mLifecycleManager.applyTransactions(transactions);
240 }
241
242 void setAlpha(uint32_t id, float alpha) {
243 std::vector<TransactionState> transactions;
244 transactions.emplace_back();
245 transactions.back().states.push_back({});
246
247 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800248 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000249 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
250 mLifecycleManager.applyTransactions(transactions);
251 }
252
253 void hideLayer(uint32_t id) {
254 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
255 }
256
257 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
258
259 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
260 std::vector<TransactionState> transactions;
261 transactions.emplace_back();
262 transactions.back().states.push_back({});
263 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
264 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800265 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000266 mLifecycleManager.applyTransactions(transactions);
267 }
268
Vishnu Naircfb2d252023-01-19 04:44:02 +0000269 void setLayerStack(uint32_t id, int32_t layerStack) {
270 std::vector<TransactionState> transactions;
271 transactions.emplace_back();
272 transactions.back().states.push_back({});
273
274 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800275 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000276 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
277 mLifecycleManager.applyTransactions(transactions);
278 }
279
Vishnu Nair92990e22023-02-24 20:01:05 +0000280 void setTouchableRegion(uint32_t id, Region region) {
281 std::vector<TransactionState> transactions;
282 transactions.emplace_back();
283 transactions.back().states.push_back({});
284
285 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800286 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000287 transactions.back().states.front().state.windowInfoHandle =
288 sp<gui::WindowInfoHandle>::make();
289 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
290 inputInfo->touchableRegion = region;
291 inputInfo->token = sp<BBinder>::make();
292 mLifecycleManager.applyTransactions(transactions);
293 }
294
Prabir Pradhancf359192024-03-20 00:42:57 +0000295 void setInputInfo(uint32_t id, std::function<void(gui::WindowInfo&)> configureInput) {
296 std::vector<TransactionState> transactions;
297 transactions.emplace_back();
298 transactions.back().states.push_back({});
299
300 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
301 transactions.back().states.front().layerId = id;
302 transactions.back().states.front().state.windowInfoHandle =
303 sp<gui::WindowInfoHandle>::make();
304 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
305 if (!inputInfo->token) {
306 inputInfo->token = sp<BBinder>::make();
307 }
308 configureInput(*inputInfo);
309
310 mLifecycleManager.applyTransactions(transactions);
311 }
312
Vishnu Nair29354ec2023-03-28 18:51:28 -0700313 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
314 bool replaceTouchableRegionWithCrop) {
315 std::vector<TransactionState> transactions;
316 transactions.emplace_back();
317 transactions.back().states.push_back({});
318
319 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
320 transactions.back().states.front().layerId = id;
321 transactions.back().states.front().state.windowInfoHandle =
322 sp<gui::WindowInfoHandle>::make();
323 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
324 inputInfo->touchableRegion = region;
325 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
326 transactions.back().states.front().touchCropId = touchCropId;
327
328 inputInfo->token = sp<BBinder>::make();
329 mLifecycleManager.applyTransactions(transactions);
330 }
331
Vishnu Nair444f3952023-04-11 13:01:02 -0700332 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
333 std::vector<TransactionState> transactions;
334 transactions.emplace_back();
335 transactions.back().states.push_back({});
336
337 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
338 transactions.back().states.front().layerId = id;
339 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
340 mLifecycleManager.applyTransactions(transactions);
341 }
342
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000343 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
344 std::vector<TransactionState> transactions;
345 transactions.emplace_back();
346 transactions.back().states.push_back({});
347
348 transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
349 transactions.back().states.front().layerId = id;
350 transactions.back().states.front().state.frameRateSelectionPriority = priority;
351 mLifecycleManager.applyTransactions(transactions);
352 }
353
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000354 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
355 int8_t changeFrameRateStrategy) {
356 std::vector<TransactionState> transactions;
357 transactions.emplace_back();
358 transactions.back().states.push_back({});
359
360 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
361 transactions.back().states.front().layerId = id;
362 transactions.back().states.front().state.frameRate = frameRate;
363 transactions.back().states.front().state.frameRateCompatibility = compatibility;
364 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
365 mLifecycleManager.applyTransactions(transactions);
366 }
367
Rachel Leece6e0042023-06-27 11:22:54 -0700368 void setFrameRateCategory(uint32_t id, int8_t frameRateCategory) {
369 std::vector<TransactionState> transactions;
370 transactions.emplace_back();
371 transactions.back().states.push_back({});
372
373 transactions.back().states.front().state.what = layer_state_t::eFrameRateCategoryChanged;
374 transactions.back().states.front().layerId = id;
375 transactions.back().states.front().state.frameRateCategory = frameRateCategory;
376 mLifecycleManager.applyTransactions(transactions);
377 }
378
Rachel Lee58cc90d2023-09-05 18:50:20 -0700379 void setFrameRateSelectionStrategy(uint32_t id, int8_t strategy) {
380 std::vector<TransactionState> transactions;
381 transactions.emplace_back();
382 transactions.back().states.push_back({});
383
384 transactions.back().states.front().state.what =
385 layer_state_t::eFrameRateSelectionStrategyChanged;
386 transactions.back().states.front().layerId = id;
387 transactions.back().states.front().state.frameRateSelectionStrategy = strategy;
388 mLifecycleManager.applyTransactions(transactions);
389 }
390
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700391 void setDefaultFrameRateCompatibility(uint32_t id, int8_t defaultFrameRateCompatibility) {
392 std::vector<TransactionState> transactions;
393 transactions.emplace_back();
394 transactions.back().states.push_back({});
395
396 transactions.back().states.front().state.what =
397 layer_state_t::eDefaultFrameRateCompatibilityChanged;
398 transactions.back().states.front().layerId = id;
399 transactions.back().states.front().state.defaultFrameRateCompatibility =
400 defaultFrameRateCompatibility;
401 mLifecycleManager.applyTransactions(transactions);
402 }
403
Vishnu Nair0808ae62023-08-07 21:42:42 -0700404 void setRoundedCorners(uint32_t id, float radius) {
405 std::vector<TransactionState> transactions;
406 transactions.emplace_back();
407 transactions.back().states.push_back({});
408
409 transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
410 transactions.back().states.front().layerId = id;
411 transactions.back().states.front().state.cornerRadius = radius;
412 mLifecycleManager.applyTransactions(transactions);
413 }
414
415 void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
416 std::vector<TransactionState> transactions;
417 transactions.emplace_back();
418 transactions.back().states.push_back({});
419
420 transactions.back().states.front().state.what = layer_state_t::eBufferChanged;
421 transactions.back().states.front().layerId = id;
422 transactions.back().states.front().externalTexture = texture;
423 transactions.back().states.front().state.bufferData =
424 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
425 texture->getHeight(), texture->getPixelFormat(),
426 texture->getUsage());
427 mLifecycleManager.applyTransactions(transactions);
428 }
429
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700430 void setBuffer(uint32_t id) {
431 static uint64_t sBufferId = 1;
432 setBuffer(id,
433 std::make_shared<renderengine::mock::
434 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
435 sBufferId++,
436 HAL_PIXEL_FORMAT_RGBA_8888,
437 GRALLOC_USAGE_PROTECTED /*usage*/));
438 }
439
Chavi Weingarten07597342023-09-14 21:10:59 +0000440 void setBufferCrop(uint32_t id, const Rect& bufferCrop) {
441 std::vector<TransactionState> transactions;
442 transactions.emplace_back();
443 transactions.back().states.push_back({});
444
445 transactions.back().states.front().state.what = layer_state_t::eBufferCropChanged;
446 transactions.back().states.front().layerId = id;
447 transactions.back().states.front().state.bufferCrop = bufferCrop;
448 mLifecycleManager.applyTransactions(transactions);
449 }
450
Arthur Hung69f95222023-10-04 07:39:02 +0000451 void setDamageRegion(uint32_t id, const Region& damageRegion) {
452 std::vector<TransactionState> transactions;
453 transactions.emplace_back();
454 transactions.back().states.push_back({});
455
456 transactions.back().states.front().state.what = layer_state_t::eSurfaceDamageRegionChanged;
457 transactions.back().states.front().layerId = id;
458 transactions.back().states.front().state.surfaceDamageRegion = damageRegion;
459 mLifecycleManager.applyTransactions(transactions);
460 }
461
Vishnu Nair3996ee32023-08-14 04:32:31 +0000462 void setDataspace(uint32_t id, ui::Dataspace dataspace) {
463 std::vector<TransactionState> transactions;
464 transactions.emplace_back();
465 transactions.back().states.push_back({});
466
467 transactions.back().states.front().state.what = layer_state_t::eDataspaceChanged;
468 transactions.back().states.front().layerId = id;
469 transactions.back().states.front().state.dataspace = dataspace;
470 mLifecycleManager.applyTransactions(transactions);
471 }
472
Arthur Hung69f95222023-10-04 07:39:02 +0000473 void setMatrix(uint32_t id, float dsdx, float dtdx, float dtdy, float dsdy) {
474 layer_state_t::matrix22_t matrix{dsdx, dtdx, dtdy, dsdy};
475
476 std::vector<TransactionState> transactions;
477 transactions.emplace_back();
478 transactions.back().states.push_back({});
479
480 transactions.back().states.front().state.what = layer_state_t::eMatrixChanged;
481 transactions.back().states.front().layerId = id;
482 transactions.back().states.front().state.matrix = matrix;
483 mLifecycleManager.applyTransactions(transactions);
484 }
485
Vishnu Nairbefd3e22023-10-05 17:48:31 +0000486 void setShadowRadius(uint32_t id, float shadowRadius) {
487 std::vector<TransactionState> transactions;
488 transactions.emplace_back();
489 transactions.back().states.push_back({});
490
491 transactions.back().states.front().state.what = layer_state_t::eShadowRadiusChanged;
492 transactions.back().states.front().layerId = id;
493 transactions.back().states.front().state.shadowRadius = shadowRadius;
494 mLifecycleManager.applyTransactions(transactions);
495 }
496
Vishnu Nair9e0017e2024-05-22 19:02:44 +0000497 void setTrustedOverlay(uint32_t id, gui::TrustedOverlay trustedOverlay) {
Chavi Weingartenb74093a2023-10-11 20:29:59 +0000498 std::vector<TransactionState> transactions;
499 transactions.emplace_back();
500 transactions.back().states.push_back({});
501
502 transactions.back().states.front().state.what = layer_state_t::eTrustedOverlayChanged;
503 transactions.back().states.front().layerId = id;
Vishnu Nair9e0017e2024-05-22 19:02:44 +0000504 transactions.back().states.front().state.trustedOverlay = trustedOverlay;
Chavi Weingartenb74093a2023-10-11 20:29:59 +0000505 mLifecycleManager.applyTransactions(transactions);
506 }
507
Vishnu Nairf13c8982023-12-02 11:26:09 -0800508 void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) {
509 std::vector<TransactionState> transactions;
510 transactions.emplace_back();
511 transactions.back().states.push_back({});
512
513 transactions.back().states.front().state.what = layer_state_t::eDropInputModeChanged;
514 transactions.back().states.front().layerId = id;
515 transactions.back().states.front().state.dropInputMode = dropInputMode;
516 mLifecycleManager.applyTransactions(transactions);
517 }
518
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000519 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000520};
521
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700522class LayerSnapshotTestBase : public LayerHierarchyTestBase {
523protected:
524 LayerSnapshotTestBase() : LayerHierarchyTestBase() {}
525
526 void createRootLayer(uint32_t id) override {
527 LayerHierarchyTestBase::createRootLayer(id);
528 setColor(id);
529 }
530
531 void createLayer(uint32_t id, uint32_t parentId) override {
532 LayerHierarchyTestBase::createLayer(id, parentId);
533 setColor(parentId);
534 }
535
536 void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) override {
537 LayerHierarchyTestBase::mirrorLayer(id, parent, layerToMirror);
538 setColor(id);
539 }
540
541 void update(LayerSnapshotBuilder& snapshotBuilder) {
Vishnu Naira0292282023-12-16 14:32:00 -0800542 mHierarchyBuilder.update(mLifecycleManager);
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700543 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
544 .layerLifecycleManager = mLifecycleManager,
545 .includeMetadata = false,
546 .displays = mFrontEndDisplayInfos,
547 .displayChanges = mHasDisplayChanges,
548 .globalShadowSettings = globalShadowSettings,
549 .supportsBlur = true,
550 .supportedLayerGenericMetadata = {},
551 .genericLayerMetadataKeyMap = {}};
552 snapshotBuilder.update(args);
553
554 mLifecycleManager.commitChanges();
555 }
556
Vishnu Naira0292282023-12-16 14:32:00 -0800557 LayerHierarchyBuilder mHierarchyBuilder;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700558
559 DisplayInfos mFrontEndDisplayInfos;
560 bool mHasDisplayChanges = false;
561
Vishnu Naird9e4f462023-10-06 04:05:45 +0000562 ShadowSettings globalShadowSettings;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700563};
564
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000565} // namespace android::surfaceflinger::frontend