blob: e8e7667a6602ee2f56a29ecc2b0c06f2b5d0aa5a [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 Nair1391de22023-03-05 19:56:14 -0800158 virtual void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000159 std::vector<std::unique_ptr<RequestedLayerState>> layers;
160 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800161 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
162 /*mirror=*/layerIdToMirror)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000163 mLifecycleManager.addLayers(std::move(layers));
164 }
165
166 void updateBackgroundColor(uint32_t id, half alpha) {
167 std::vector<TransactionState> transactions;
168 transactions.emplace_back();
169 transactions.back().states.push_back({});
170 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000171 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair1391de22023-03-05 19:56:14 -0800172 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000173 mLifecycleManager.applyTransactions(transactions);
174 }
175
Vishnu Nair606d9d02023-08-19 14:20:18 -0700176 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({{id, "test"}}); }
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000177
178 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
Vishnu Naira0292282023-12-16 14:32:00 -0800179 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000180 mLifecycleManager.commitChanges();
181
182 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
Vishnu Naira0292282023-12-16 14:32:00 -0800183 LayerHierarchyBuilder newBuilder;
184 newBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000185 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
186 getTraversalPath(newBuilder.getHierarchy()));
187 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
188 getTraversalPathInZOrder(newBuilder.getHierarchy()));
189 EXPECT_FALSE(
190 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
191 }
192
Vishnu Nair1391de22023-03-05 19:56:14 -0800193 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000194 std::vector<TransactionState> transactions;
195 transactions.emplace_back();
196 transactions.back().states.push_back({});
197
198 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800199 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000200 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800201 return transactions;
202 }
203
204 void setZ(uint32_t id, int32_t z) {
205 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000206 }
207
208 void setCrop(uint32_t id, const Rect& crop) {
209 std::vector<TransactionState> transactions;
210 transactions.emplace_back();
211 transactions.back().states.push_back({});
212
213 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800214 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000215 transactions.back().states.front().state.crop = crop;
216 mLifecycleManager.applyTransactions(transactions);
217 }
218
219 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
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::eFlagsChanged;
225 transactions.back().states.front().state.flags = flags;
226 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800227 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000228 mLifecycleManager.applyTransactions(transactions);
229 }
230
231 void setAlpha(uint32_t id, float alpha) {
232 std::vector<TransactionState> transactions;
233 transactions.emplace_back();
234 transactions.back().states.push_back({});
235
236 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800237 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000238 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
239 mLifecycleManager.applyTransactions(transactions);
240 }
241
242 void hideLayer(uint32_t id) {
243 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
244 }
245
246 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
247
248 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
249 std::vector<TransactionState> transactions;
250 transactions.emplace_back();
251 transactions.back().states.push_back({});
252 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
253 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800254 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000255 mLifecycleManager.applyTransactions(transactions);
256 }
257
Vishnu Naircfb2d252023-01-19 04:44:02 +0000258 void setLayerStack(uint32_t id, int32_t layerStack) {
259 std::vector<TransactionState> transactions;
260 transactions.emplace_back();
261 transactions.back().states.push_back({});
262
263 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800264 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000265 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
266 mLifecycleManager.applyTransactions(transactions);
267 }
268
Vishnu Nair92990e22023-02-24 20:01:05 +0000269 void setTouchableRegion(uint32_t id, Region region) {
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::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800275 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000276 transactions.back().states.front().state.windowInfoHandle =
277 sp<gui::WindowInfoHandle>::make();
278 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
279 inputInfo->touchableRegion = region;
280 inputInfo->token = sp<BBinder>::make();
281 mLifecycleManager.applyTransactions(transactions);
282 }
283
Prabir Pradhancf359192024-03-20 00:42:57 +0000284 void setInputInfo(uint32_t id, std::function<void(gui::WindowInfo&)> configureInput) {
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 if (!inputInfo->token) {
295 inputInfo->token = sp<BBinder>::make();
296 }
297 configureInput(*inputInfo);
298
299 mLifecycleManager.applyTransactions(transactions);
300 }
301
Vishnu Nair29354ec2023-03-28 18:51:28 -0700302 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
303 bool replaceTouchableRegionWithCrop) {
304 std::vector<TransactionState> transactions;
305 transactions.emplace_back();
306 transactions.back().states.push_back({});
307
308 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
309 transactions.back().states.front().layerId = id;
310 transactions.back().states.front().state.windowInfoHandle =
311 sp<gui::WindowInfoHandle>::make();
312 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
313 inputInfo->touchableRegion = region;
314 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
315 transactions.back().states.front().touchCropId = touchCropId;
316
317 inputInfo->token = sp<BBinder>::make();
318 mLifecycleManager.applyTransactions(transactions);
319 }
320
Vishnu Nair444f3952023-04-11 13:01:02 -0700321 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
322 std::vector<TransactionState> transactions;
323 transactions.emplace_back();
324 transactions.back().states.push_back({});
325
326 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
327 transactions.back().states.front().layerId = id;
328 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
329 mLifecycleManager.applyTransactions(transactions);
330 }
331
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000332 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
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::eFrameRateSelectionPriority;
338 transactions.back().states.front().layerId = id;
339 transactions.back().states.front().state.frameRateSelectionPriority = priority;
340 mLifecycleManager.applyTransactions(transactions);
341 }
342
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000343 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
344 int8_t changeFrameRateStrategy) {
345 std::vector<TransactionState> transactions;
346 transactions.emplace_back();
347 transactions.back().states.push_back({});
348
349 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
350 transactions.back().states.front().layerId = id;
351 transactions.back().states.front().state.frameRate = frameRate;
352 transactions.back().states.front().state.frameRateCompatibility = compatibility;
353 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
354 mLifecycleManager.applyTransactions(transactions);
355 }
356
Rachel Leece6e0042023-06-27 11:22:54 -0700357 void setFrameRateCategory(uint32_t id, int8_t frameRateCategory) {
358 std::vector<TransactionState> transactions;
359 transactions.emplace_back();
360 transactions.back().states.push_back({});
361
362 transactions.back().states.front().state.what = layer_state_t::eFrameRateCategoryChanged;
363 transactions.back().states.front().layerId = id;
364 transactions.back().states.front().state.frameRateCategory = frameRateCategory;
365 mLifecycleManager.applyTransactions(transactions);
366 }
367
Rachel Lee58cc90d2023-09-05 18:50:20 -0700368 void setFrameRateSelectionStrategy(uint32_t id, int8_t strategy) {
369 std::vector<TransactionState> transactions;
370 transactions.emplace_back();
371 transactions.back().states.push_back({});
372
373 transactions.back().states.front().state.what =
374 layer_state_t::eFrameRateSelectionStrategyChanged;
375 transactions.back().states.front().layerId = id;
376 transactions.back().states.front().state.frameRateSelectionStrategy = strategy;
377 mLifecycleManager.applyTransactions(transactions);
378 }
379
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700380 void setDefaultFrameRateCompatibility(uint32_t id, int8_t defaultFrameRateCompatibility) {
381 std::vector<TransactionState> transactions;
382 transactions.emplace_back();
383 transactions.back().states.push_back({});
384
385 transactions.back().states.front().state.what =
386 layer_state_t::eDefaultFrameRateCompatibilityChanged;
387 transactions.back().states.front().layerId = id;
388 transactions.back().states.front().state.defaultFrameRateCompatibility =
389 defaultFrameRateCompatibility;
390 mLifecycleManager.applyTransactions(transactions);
391 }
392
Vishnu Nair0808ae62023-08-07 21:42:42 -0700393 void setRoundedCorners(uint32_t id, float radius) {
394 std::vector<TransactionState> transactions;
395 transactions.emplace_back();
396 transactions.back().states.push_back({});
397
398 transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
399 transactions.back().states.front().layerId = id;
400 transactions.back().states.front().state.cornerRadius = radius;
401 mLifecycleManager.applyTransactions(transactions);
402 }
403
404 void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
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::eBufferChanged;
410 transactions.back().states.front().layerId = id;
411 transactions.back().states.front().externalTexture = texture;
412 transactions.back().states.front().state.bufferData =
413 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
414 texture->getHeight(), texture->getPixelFormat(),
415 texture->getUsage());
416 mLifecycleManager.applyTransactions(transactions);
417 }
418
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700419 void setBuffer(uint32_t id) {
420 static uint64_t sBufferId = 1;
421 setBuffer(id,
422 std::make_shared<renderengine::mock::
423 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
424 sBufferId++,
425 HAL_PIXEL_FORMAT_RGBA_8888,
426 GRALLOC_USAGE_PROTECTED /*usage*/));
427 }
428
Chavi Weingarten07597342023-09-14 21:10:59 +0000429 void setBufferCrop(uint32_t id, const Rect& bufferCrop) {
430 std::vector<TransactionState> transactions;
431 transactions.emplace_back();
432 transactions.back().states.push_back({});
433
434 transactions.back().states.front().state.what = layer_state_t::eBufferCropChanged;
435 transactions.back().states.front().layerId = id;
436 transactions.back().states.front().state.bufferCrop = bufferCrop;
437 mLifecycleManager.applyTransactions(transactions);
438 }
439
Arthur Hung69f95222023-10-04 07:39:02 +0000440 void setDamageRegion(uint32_t id, const Region& damageRegion) {
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::eSurfaceDamageRegionChanged;
446 transactions.back().states.front().layerId = id;
447 transactions.back().states.front().state.surfaceDamageRegion = damageRegion;
448 mLifecycleManager.applyTransactions(transactions);
449 }
450
Vishnu Nair3996ee32023-08-14 04:32:31 +0000451 void setDataspace(uint32_t id, ui::Dataspace dataspace) {
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::eDataspaceChanged;
457 transactions.back().states.front().layerId = id;
458 transactions.back().states.front().state.dataspace = dataspace;
459 mLifecycleManager.applyTransactions(transactions);
460 }
461
Arthur Hung69f95222023-10-04 07:39:02 +0000462 void setMatrix(uint32_t id, float dsdx, float dtdx, float dtdy, float dsdy) {
463 layer_state_t::matrix22_t matrix{dsdx, dtdx, dtdy, dsdy};
464
465 std::vector<TransactionState> transactions;
466 transactions.emplace_back();
467 transactions.back().states.push_back({});
468
469 transactions.back().states.front().state.what = layer_state_t::eMatrixChanged;
470 transactions.back().states.front().layerId = id;
471 transactions.back().states.front().state.matrix = matrix;
472 mLifecycleManager.applyTransactions(transactions);
473 }
474
Vishnu Nairbefd3e22023-10-05 17:48:31 +0000475 void setShadowRadius(uint32_t id, float shadowRadius) {
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::eShadowRadiusChanged;
481 transactions.back().states.front().layerId = id;
482 transactions.back().states.front().state.shadowRadius = shadowRadius;
483 mLifecycleManager.applyTransactions(transactions);
484 }
485
Chavi Weingartenb74093a2023-10-11 20:29:59 +0000486 void setTrustedOverlay(uint32_t id, bool isTrustedOverlay) {
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::eTrustedOverlayChanged;
492 transactions.back().states.front().layerId = id;
493 transactions.back().states.front().state.isTrustedOverlay = isTrustedOverlay;
494 mLifecycleManager.applyTransactions(transactions);
495 }
496
Vishnu Nairf13c8982023-12-02 11:26:09 -0800497 void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) {
498 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::eDropInputModeChanged;
503 transactions.back().states.front().layerId = id;
504 transactions.back().states.front().state.dropInputMode = dropInputMode;
505 mLifecycleManager.applyTransactions(transactions);
506 }
507
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000508 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000509};
510
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700511class LayerSnapshotTestBase : public LayerHierarchyTestBase {
512protected:
513 LayerSnapshotTestBase() : LayerHierarchyTestBase() {}
514
515 void createRootLayer(uint32_t id) override {
516 LayerHierarchyTestBase::createRootLayer(id);
517 setColor(id);
518 }
519
520 void createLayer(uint32_t id, uint32_t parentId) override {
521 LayerHierarchyTestBase::createLayer(id, parentId);
522 setColor(parentId);
523 }
524
525 void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) override {
526 LayerHierarchyTestBase::mirrorLayer(id, parent, layerToMirror);
527 setColor(id);
528 }
529
530 void update(LayerSnapshotBuilder& snapshotBuilder) {
Vishnu Naira0292282023-12-16 14:32:00 -0800531 mHierarchyBuilder.update(mLifecycleManager);
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700532 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
533 .layerLifecycleManager = mLifecycleManager,
534 .includeMetadata = false,
535 .displays = mFrontEndDisplayInfos,
536 .displayChanges = mHasDisplayChanges,
537 .globalShadowSettings = globalShadowSettings,
538 .supportsBlur = true,
539 .supportedLayerGenericMetadata = {},
540 .genericLayerMetadataKeyMap = {}};
541 snapshotBuilder.update(args);
542
543 mLifecycleManager.commitChanges();
544 }
545
Vishnu Naira0292282023-12-16 14:32:00 -0800546 LayerHierarchyBuilder mHierarchyBuilder;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700547
548 DisplayInfos mFrontEndDisplayInfos;
549 bool mHasDisplayChanges = false;
550
Vishnu Naird9e4f462023-10-06 04:05:45 +0000551 ShadowSettings globalShadowSettings;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700552};
553
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000554} // namespace android::surfaceflinger::frontend