blob: 2bb864a10ac903b0f8985f91ffc588ab6b2d270d [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
Rachel Lee45681982024-03-14 18:40:15 -070020#include <common/test/FlagUtils.h>
Vishnu Nair0808ae62023-08-07 21:42:42 -070021#include <renderengine/mock/FakeExternalTexture.h>
22
Vishnu Nair8fc721b2022-12-22 20:06:32 +000023#include "FrontEnd/LayerHierarchy.h"
24#include "FrontEnd/LayerLifecycleManager.h"
25#include "FrontEnd/LayerSnapshotBuilder.h"
Vishnu Nair3d8565a2023-06-30 07:23:24 +000026#include "Layer.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000027#include "LayerHierarchyTest.h"
Vishnu Nair3996ee32023-08-14 04:32:31 +000028#include "ui/GraphicTypes.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000029
Rachel Lee45681982024-03-14 18:40:15 -070030#include <com_android_graphics_surfaceflinger_flags.h>
31
Vishnu Nair8fc721b2022-12-22 20:06:32 +000032#define UPDATE_AND_VERIFY(BUILDER, ...) \
33 ({ \
34 SCOPED_TRACE(""); \
35 updateAndVerify((BUILDER), /*displayChanges=*/false, __VA_ARGS__); \
36 })
37
38#define UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(BUILDER, ...) \
39 ({ \
40 SCOPED_TRACE(""); \
41 updateAndVerify((BUILDER), /*displayChanges=*/true, __VA_ARGS__); \
42 })
43
44namespace android::surfaceflinger::frontend {
45
Vishnu Naircfb2d252023-01-19 04:44:02 +000046using ftl::Flags;
47using namespace ftl::flag_operators;
Rachel Lee45681982024-03-14 18:40:15 -070048using namespace com::android::graphics::surfaceflinger;
Vishnu Naircfb2d252023-01-19 04:44:02 +000049
Vishnu Nair8fc721b2022-12-22 20:06:32 +000050// To run test:
51/**
52 mp :libsurfaceflinger_unittest && adb sync; adb shell \
53 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
54 --gtest_filter="LayerSnapshotTest.*" --gtest_brief=1
55*/
56
Vishnu Nair47b7bb42023-09-29 16:27:33 -070057class LayerSnapshotTest : public LayerSnapshotTestBase {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000058protected:
Vishnu Nair47b7bb42023-09-29 16:27:33 -070059 LayerSnapshotTest() : LayerSnapshotTestBase() {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000060 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
61 }
62
Vishnu Nair0808ae62023-08-07 21:42:42 -070063 void update(LayerSnapshotBuilder& actualBuilder, LayerSnapshotBuilder::Args& args) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000064 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
Vishnu Naira0292282023-12-16 14:32:00 -080065 mHierarchyBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +000066 }
Vishnu Nair0808ae62023-08-07 21:42:42 -070067 args.root = mHierarchyBuilder.getHierarchy();
68 actualBuilder.update(args);
69 }
70
Chavi Weingarten92c7d8c2024-01-19 23:25:45 +000071 void update(LayerSnapshotBuilder& actualBuilder) {
72 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
73 .layerLifecycleManager = mLifecycleManager,
74 .includeMetadata = false,
75 .displays = mFrontEndDisplayInfos,
76 .globalShadowSettings = globalShadowSettings,
77 .supportsBlur = true,
78 .supportedLayerGenericMetadata = {},
79 .genericLayerMetadataKeyMap = {}};
80 update(actualBuilder, args);
81 }
82
Vishnu Nair0808ae62023-08-07 21:42:42 -070083 void updateAndVerify(LayerSnapshotBuilder& actualBuilder, bool hasDisplayChanges,
84 const std::vector<uint32_t> expectedVisibleLayerIdsInZOrder) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +000085 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
86 .layerLifecycleManager = mLifecycleManager,
87 .includeMetadata = false,
88 .displays = mFrontEndDisplayInfos,
89 .displayChanges = hasDisplayChanges,
90 .globalShadowSettings = globalShadowSettings,
Vishnu Nair444f3952023-04-11 13:01:02 -070091 .supportsBlur = true,
Vishnu Nairc765c6c2023-02-23 00:08:01 +000092 .supportedLayerGenericMetadata = {},
93 .genericLayerMetadataKeyMap = {}};
Vishnu Nair0808ae62023-08-07 21:42:42 -070094 update(actualBuilder, args);
Vishnu Nair8fc721b2022-12-22 20:06:32 +000095
96 // rebuild layer snapshots from scratch and verify that it matches the updated state.
97 LayerSnapshotBuilder expectedBuilder(args);
98 mLifecycleManager.commitChanges();
99 ASSERT_TRUE(expectedBuilder.getSnapshots().size() > 0);
100 ASSERT_TRUE(actualBuilder.getSnapshots().size() > 0);
101
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000102 std::vector<uint32_t> actualVisibleLayerIdsInZOrder;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000103 actualBuilder.forEachVisibleSnapshot(
104 [&actualVisibleLayerIdsInZOrder](const LayerSnapshot& snapshot) {
105 actualVisibleLayerIdsInZOrder.push_back(snapshot.path.id);
106 });
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000107 EXPECT_EQ(expectedVisibleLayerIdsInZOrder, actualVisibleLayerIdsInZOrder);
108 }
109
110 LayerSnapshot* getSnapshot(uint32_t layerId) { return mSnapshotBuilder.getSnapshot(layerId); }
Vishnu Nair92990e22023-02-24 20:01:05 +0000111 LayerSnapshot* getSnapshot(const LayerHierarchy::TraversalPath path) {
112 return mSnapshotBuilder.getSnapshot(path);
113 }
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000114 LayerSnapshotBuilder mSnapshotBuilder;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000115 static const std::vector<uint32_t> STARTING_ZORDER;
116};
117const std::vector<uint32_t> LayerSnapshotTest::STARTING_ZORDER = {1, 11, 111, 12, 121,
118 122, 1221, 13, 2};
119
120TEST_F(LayerSnapshotTest, buildSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000121 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
122 .layerLifecycleManager = mLifecycleManager,
123 .includeMetadata = false,
124 .displays = mFrontEndDisplayInfos,
125 .globalShadowSettings = globalShadowSettings,
126 .supportedLayerGenericMetadata = {},
127 .genericLayerMetadataKeyMap = {}};
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000128 LayerSnapshotBuilder builder(args);
129}
130
131TEST_F(LayerSnapshotTest, updateSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000132 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
133 .layerLifecycleManager = mLifecycleManager,
134 .includeMetadata = false,
135 .displays = mFrontEndDisplayInfos,
136 .globalShadowSettings = globalShadowSettings,
137 .supportedLayerGenericMetadata = {},
138 .genericLayerMetadataKeyMap = {}
139
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000140 };
141
142 LayerSnapshotBuilder builder;
143 builder.update(args);
144}
145
146// update using parent snapshot data
147TEST_F(LayerSnapshotTest, croppedByParent) {
148 /// MAKE ALL LAYERS VISIBLE BY DEFAULT
149 DisplayInfo info;
150 info.info.logicalHeight = 100;
151 info.info.logicalWidth = 200;
152 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
153 Rect layerCrop(0, 0, 10, 20);
154 setCrop(11, layerCrop);
155 EXPECT_TRUE(mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Geometry));
156 UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(mSnapshotBuilder, STARTING_ZORDER);
157 EXPECT_EQ(getSnapshot(11)->geomCrop, layerCrop);
158 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, layerCrop.toFloatRect());
159 float maxHeight = static_cast<float>(info.info.logicalHeight * 10);
160 float maxWidth = static_cast<float>(info.info.logicalWidth * 10);
161
162 FloatRect maxDisplaySize(-maxWidth, -maxHeight, maxWidth, maxHeight);
163 EXPECT_EQ(getSnapshot(1)->geomLayerBounds, maxDisplaySize);
164}
165
166// visibility tests
167TEST_F(LayerSnapshotTest, newLayerHiddenByPolicy) {
168 createLayer(112, 11);
169 hideLayer(112);
170 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
171
172 showLayer(112);
173 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 112, 12, 121, 122, 1221, 13, 2});
174}
175
176TEST_F(LayerSnapshotTest, hiddenByParent) {
177 hideLayer(11);
178 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
179}
180
181TEST_F(LayerSnapshotTest, reparentShowsChild) {
182 hideLayer(11);
183 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
184
185 showLayer(11);
186 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
187}
188
189TEST_F(LayerSnapshotTest, reparentHidesChild) {
190 hideLayer(11);
191 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
192
193 reparentLayer(121, 11);
194 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 122, 1221, 13, 2});
195}
196
197TEST_F(LayerSnapshotTest, unHidingUpdatesSnapshot) {
198 hideLayer(11);
199 Rect crop(1, 2, 3, 4);
200 setCrop(111, crop);
201 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
202
203 showLayer(11);
204 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
205 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, crop.toFloatRect());
206}
207
208TEST_F(LayerSnapshotTest, childBehindParentCanBeHiddenByParent) {
209 setZ(111, -1);
210 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 111, 11, 12, 121, 122, 1221, 13, 2});
211
212 hideLayer(11);
213 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
214}
215
Vishnu Nairb4a6a772024-06-12 14:41:08 -0700216TEST_F(LayerSnapshotTest, offscreenLayerSnapshotIsInvisible) {
217 EXPECT_EQ(getSnapshot(111)->isVisible, true);
218
219 reparentLayer(11, UNASSIGNED_LAYER_ID);
220 destroyLayerHandle(11);
221 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
222
223 EXPECT_EQ(getSnapshot(111)->isVisible, false);
224 EXPECT_TRUE(getSnapshot(111)->changes.test(RequestedLayerState::Changes::Visibility));
225}
226
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000227// relative tests
228TEST_F(LayerSnapshotTest, RelativeParentCanHideChild) {
229 reparentRelativeLayer(13, 11);
230 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
231
232 hideLayer(11);
233 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
234}
235
236TEST_F(LayerSnapshotTest, ReparentingToHiddenRelativeParentHidesChild) {
237 hideLayer(11);
238 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
239 reparentRelativeLayer(13, 11);
240 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
241}
242
243TEST_F(LayerSnapshotTest, AlphaInheritedByChildren) {
244 setAlpha(1, 0.5);
245 setAlpha(122, 0.5);
246 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700247 EXPECT_EQ(getSnapshot(1)->alpha, 0.5f);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000248 EXPECT_EQ(getSnapshot(12)->alpha, 0.5f);
249 EXPECT_EQ(getSnapshot(1221)->alpha, 0.25f);
250}
251
252// Change states
253TEST_F(LayerSnapshotTest, UpdateClearsPreviousChangeStates) {
254 setCrop(1, Rect(1, 2, 3, 4));
255 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700256 EXPECT_TRUE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
257 EXPECT_TRUE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000258 setCrop(2, Rect(1, 2, 3, 4));
259 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700260 EXPECT_TRUE(getSnapshot(2)->changes.test(RequestedLayerState::Changes::Geometry));
261 EXPECT_FALSE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
262 EXPECT_FALSE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000263}
264
265TEST_F(LayerSnapshotTest, FastPathClearsPreviousChangeStates) {
266 setColor(11, {1._hf, 0._hf, 0._hf});
267 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nairdf59f472024-05-17 16:51:33 +0000268 EXPECT_EQ(getSnapshot(11)->changes,
Ady Abraham6846ade2024-05-20 21:58:27 +0000269 RequestedLayerState::Changes::Content);
Vishnu Naira02943f2023-06-03 13:44:46 -0700270 EXPECT_EQ(getSnapshot(11)->clientChanges, layer_state_t::eColorChanged);
271 EXPECT_EQ(getSnapshot(1)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000272 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700273 EXPECT_EQ(getSnapshot(11)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000274}
275
276TEST_F(LayerSnapshotTest, FastPathSetsChangeFlagToContent) {
277 setColor(1, {1._hf, 0._hf, 0._hf});
278 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nairdf59f472024-05-17 16:51:33 +0000279 EXPECT_EQ(getSnapshot(1)->changes,
Ady Abraham6846ade2024-05-20 21:58:27 +0000280 RequestedLayerState::Changes::Content);
Vishnu Naira02943f2023-06-03 13:44:46 -0700281 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eColorChanged);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000282}
283
Vishnu Nair39a74a92024-07-29 19:01:50 +0000284TEST_F(LayerSnapshotTest, ChildrenInheritGameMode) {
285 setGameMode(1, gui::GameMode::Performance);
Nergi Rahardi27613c32024-05-23 06:57:02 +0000286 EXPECT_EQ(mLifecycleManager.getGlobalChanges(),
287 RequestedLayerState::Changes::GameMode | RequestedLayerState::Changes::Metadata);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000288 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700289 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
Vishnu Nair39a74a92024-07-29 19:01:50 +0000290 EXPECT_EQ(getSnapshot(1)->gameMode, gui::GameMode::Performance);
291 EXPECT_EQ(getSnapshot(11)->gameMode, gui::GameMode::Performance);
292}
293
294TEST_F(LayerSnapshotTest, ChildrenCanOverrideGameMode) {
295 setGameMode(1, gui::GameMode::Performance);
296 setGameMode(11, gui::GameMode::Battery);
297 EXPECT_EQ(mLifecycleManager.getGlobalChanges(),
298 RequestedLayerState::Changes::GameMode | RequestedLayerState::Changes::Metadata);
299 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
300 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
301 EXPECT_EQ(getSnapshot(1)->gameMode, gui::GameMode::Performance);
302 EXPECT_EQ(getSnapshot(11)->gameMode, gui::GameMode::Battery);
303}
304
305TEST_F(LayerSnapshotTest, ReparentingUpdatesGameMode) {
306 setGameMode(1, gui::GameMode::Performance);
307 EXPECT_EQ(mLifecycleManager.getGlobalChanges(),
308 RequestedLayerState::Changes::GameMode | RequestedLayerState::Changes::Metadata);
309 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
310 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
311 EXPECT_EQ(getSnapshot(1)->gameMode, gui::GameMode::Performance);
312 EXPECT_EQ(getSnapshot(2)->gameMode, gui::GameMode::Unsupported);
313
314 reparentLayer(2, 1);
315 setZ(2, 2);
316 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
317 EXPECT_EQ(getSnapshot(2)->gameMode, gui::GameMode::Performance);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000318}
319
Nergi Rahardi27613c32024-05-23 06:57:02 +0000320TEST_F(LayerSnapshotTest, UpdateMetadata) {
321 std::vector<TransactionState> transactions;
322 transactions.emplace_back();
323 transactions.back().states.push_back({});
324 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
325 // This test focuses on metadata used by ARC++ to ensure LayerMetadata is updated correctly,
326 // and not using stale data.
327 transactions.back().states.front().state.metadata = LayerMetadata();
328 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_UID, 123);
329 transactions.back().states.front().state.metadata.setInt32(METADATA_WINDOW_TYPE, 234);
330 transactions.back().states.front().state.metadata.setInt32(METADATA_TASK_ID, 345);
331 transactions.back().states.front().state.metadata.setInt32(METADATA_MOUSE_CURSOR, 456);
332 transactions.back().states.front().state.metadata.setInt32(METADATA_ACCESSIBILITY_ID, 567);
333 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_PID, 678);
334 transactions.back().states.front().state.metadata.setInt32(METADATA_CALLING_UID, 789);
335
336 transactions.back().states.front().layerId = 1;
337 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
338
339 mLifecycleManager.applyTransactions(transactions);
340 EXPECT_EQ(mLifecycleManager.getGlobalChanges(), RequestedLayerState::Changes::Metadata);
341
342 // Setting includeMetadata=true to ensure metadata update is applied to LayerSnapshot
343 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
344 .layerLifecycleManager = mLifecycleManager,
345 .includeMetadata = true,
346 .displays = mFrontEndDisplayInfos,
347 .globalShadowSettings = globalShadowSettings,
348 .supportsBlur = true,
349 .supportedLayerGenericMetadata = {},
350 .genericLayerMetadataKeyMap = {}};
351 update(mSnapshotBuilder, args);
352
353 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
354 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_UID, -1), 123);
355 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_WINDOW_TYPE, -1), 234);
356 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_TASK_ID, -1), 345);
357 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_MOUSE_CURSOR, -1), 456);
358 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_ACCESSIBILITY_ID, -1), 567);
359 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_PID, -1), 678);
360 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_CALLING_UID, -1), 789);
361}
362
Nergi Rahardi0dfc0962024-05-23 06:57:36 +0000363TEST_F(LayerSnapshotTest, UpdateMetadataOfHiddenLayers) {
364 hideLayer(1);
365
366 std::vector<TransactionState> transactions;
367 transactions.emplace_back();
368 transactions.back().states.push_back({});
369 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
370 // This test focuses on metadata used by ARC++ to ensure LayerMetadata is updated correctly,
371 // and not using stale data.
372 transactions.back().states.front().state.metadata = LayerMetadata();
373 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_UID, 123);
374 transactions.back().states.front().state.metadata.setInt32(METADATA_WINDOW_TYPE, 234);
375 transactions.back().states.front().state.metadata.setInt32(METADATA_TASK_ID, 345);
376 transactions.back().states.front().state.metadata.setInt32(METADATA_MOUSE_CURSOR, 456);
377 transactions.back().states.front().state.metadata.setInt32(METADATA_ACCESSIBILITY_ID, 567);
378 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_PID, 678);
379 transactions.back().states.front().state.metadata.setInt32(METADATA_CALLING_UID, 789);
380
381 transactions.back().states.front().layerId = 1;
382 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
383
384 mLifecycleManager.applyTransactions(transactions);
385 EXPECT_EQ(mLifecycleManager.getGlobalChanges(),
386 RequestedLayerState::Changes::Metadata | RequestedLayerState::Changes::Visibility |
387 RequestedLayerState::Changes::VisibleRegion |
388 RequestedLayerState::Changes::AffectsChildren);
389
390 // Setting includeMetadata=true to ensure metadata update is applied to LayerSnapshot
391 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
392 .layerLifecycleManager = mLifecycleManager,
393 .includeMetadata = true,
394 .displays = mFrontEndDisplayInfos,
395 .globalShadowSettings = globalShadowSettings,
396 .supportsBlur = true,
397 .supportedLayerGenericMetadata = {},
398 .genericLayerMetadataKeyMap = {}};
399 update(mSnapshotBuilder, args);
400
401 EXPECT_EQ(static_cast<int64_t>(getSnapshot(1)->clientChanges),
402 layer_state_t::eMetadataChanged | layer_state_t::eFlagsChanged);
403 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_UID, -1), 123);
404 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_WINDOW_TYPE, -1), 234);
405 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_TASK_ID, -1), 345);
406 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_MOUSE_CURSOR, -1), 456);
407 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_ACCESSIBILITY_ID, -1), 567);
408 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_PID, -1), 678);
409 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_CALLING_UID, -1), 789);
410}
411
Vishnu Naircfb2d252023-01-19 04:44:02 +0000412TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotes) {
413 // ROOT
414 // ├── 1
415 // │ ├── 11 (frame rate set)
416 // │ │ └── 111
417 // │ ├── 12
418 // │ │ ├── 121
419 // │ │ └── 122
420 // │ │ └── 1221
421 // │ └── 13
422 // └── 2
423
Vishnu Nair30515cb2023-10-19 21:54:08 -0700424 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000425 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
426
Rachel Leece6e0042023-06-27 11:22:54 -0700427 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700428 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700429 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700430 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700431 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700432 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000433}
434
Vishnu Nair30515cb2023-10-19 21:54:08 -0700435TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotesDoesNotAffectSiblings) {
436 // ROOT
437 // ├── 1 (verify layer has no vote)
438 // │ ├── 11 (frame rate set)
439 // │ │ └── 111
440 // │ ├── 12 (frame rate set)
441 // │ │ ├── 121
442 // │ │ └── 122
443 // │ │ └── 1221
444 // │ └── 13 (verify layer has default vote)
445 // └── 2
446
447 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
448 setFrameRate(12, 45.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
449
450 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
451
452 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
453 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
454 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
455 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
456 EXPECT_EQ(getSnapshot(12)->frameRate.vote.rate.getIntValue(), 45);
457 EXPECT_EQ(getSnapshot(12)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
458 EXPECT_EQ(getSnapshot(121)->frameRate.vote.rate.getIntValue(), 45);
459 EXPECT_EQ(getSnapshot(121)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
460 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.rate.getIntValue(), 45);
461 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
462
463 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
464 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
465 EXPECT_EQ(getSnapshot(13)->frameRate.vote.rate.getIntValue(), 0);
466 EXPECT_EQ(getSnapshot(13)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
467 EXPECT_EQ(getSnapshot(2)->frameRate.vote.rate.getIntValue(), 0);
468 EXPECT_EQ(getSnapshot(2)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
469}
470
Vishnu Naira02943f2023-06-03 13:44:46 -0700471TEST_F(LayerSnapshotTest, CanCropTouchableRegion) {
Vishnu Nair29354ec2023-03-28 18:51:28 -0700472 // ROOT
473 // ├── 1
474 // │ ├── 11
475 // │ │ └── 111 (touchregion set to touch but cropped by layer 13)
476 // │ ├── 12
477 // │ │ ├── 121
478 // │ │ └── 122
479 // │ │ └── 1221
480 // │ └── 13 (crop set to touchCrop)
481 // └── 2
482
483 Rect touchCrop{300, 300, 400, 500};
484 setCrop(13, touchCrop);
485 Region touch{Rect{0, 0, 1000, 1000}};
486 setTouchableRegionCrop(111, touch, /*touchCropId=*/13, /*replaceTouchableRegionWithCrop=*/true);
487 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
488 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), touchCrop);
489
490 Rect modifiedTouchCrop{100, 300, 400, 700};
491 setCrop(13, modifiedTouchCrop);
492 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
493 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), modifiedTouchCrop);
494}
495
Chavi Weingarten1ba381e2024-01-09 21:54:11 +0000496TEST_F(LayerSnapshotTest, CanCropTouchableRegionWithDisplayTransform) {
497 DisplayInfo displayInfo;
498 displayInfo.transform = ui::Transform(ui::Transform::RotationFlags::ROT_90, 1000, 1000);
499 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), displayInfo);
500
501 Rect touchCrop{300, 300, 400, 500};
502 createRootLayer(3);
503 setCrop(3, touchCrop);
504 setLayerStack(3, 1);
505 Region touch{Rect{0, 0, 1000, 1000}};
506 setTouchableRegionCrop(3, touch, /*touchCropId=*/3, /*replaceTouchableRegionWithCrop=*/false);
507
508 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3});
509 Rect rotatedCrop = {500, 300, 700, 400};
510 EXPECT_EQ(getSnapshot({.id = 3})->inputInfo.touchableRegion.bounds(), rotatedCrop);
511}
512
Vishnu Nair444f3952023-04-11 13:01:02 -0700513TEST_F(LayerSnapshotTest, blurUpdatesWhenAlphaChanges) {
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700514 int blurRadius = 42;
515 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
Vishnu Nair444f3952023-04-11 13:01:02 -0700516
517 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
518 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
519
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700520 blurRadius = 21;
521 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
522 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
523 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
524
Vishnu Nair444f3952023-04-11 13:01:02 -0700525 static constexpr float alpha = 0.5;
526 setAlpha(12, alpha);
527 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700528 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius,
529 static_cast<int>(static_cast<float>(blurRadius) * alpha));
Vishnu Nair444f3952023-04-11 13:01:02 -0700530}
531
Vishnu Naira9c43762023-01-27 19:10:25 +0000532// Display Mirroring Tests
533// tree with 3 levels of children
534// ROOT (DISPLAY 0)
535// ├── 1
536// │ ├── 11
537// │ │ └── 111
538// │ ├── 12 (has skip screenshot flag)
539// │ │ ├── 121
540// │ │ └── 122
541// │ │ └── 1221
542// │ └── 13
543// └── 2
544// ROOT (DISPLAY 1)
545// └── 3 (mirrors display 0)
Vishnu Nair92990e22023-02-24 20:01:05 +0000546TEST_F(LayerSnapshotTest, displayMirrorRespectsLayerSkipScreenshotFlag) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000547 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
548 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
549 setLayerStack(3, 1);
550
Vishnu Nair444f3952023-04-11 13:01:02 -0700551 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Naira9c43762023-01-27 19:10:25 +0000552 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
553}
554
Vishnu Nair92990e22023-02-24 20:01:05 +0000555// ROOT (DISPLAY 0)
556// ├── 1
557// │ ├── 11
558// │ │ └── 111
559// │ └── 13
560// └── 2
561// ROOT (DISPLAY 3)
562// └── 3 (mirrors display 0)
563TEST_F(LayerSnapshotTest, mirrorLayerGetsCorrectLayerStack) {
564 reparentLayer(12, UNASSIGNED_LAYER_ID);
565 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
566 setLayerStack(3, 3);
567 createDisplayMirrorLayer(4, ui::LayerStack::fromValue(0));
568 setLayerStack(4, 4);
569
Vishnu Nair444f3952023-04-11 13:01:02 -0700570 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111,
571 13, 2, 4, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000572 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
Vishnu Nair6f878312023-09-08 11:05:01 -0700573 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
574 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 4u})->outputFilter.layerStack.id, 4u);
Vishnu Nair92990e22023-02-24 20:01:05 +0000575}
576
577// ROOT (DISPLAY 0)
578// ├── 1 (crop 50x50)
579// │ ├── 11
580// │ │ └── 111
581// │ └── 13
582// └── 2
583// ROOT (DISPLAY 3)
584// └── 3 (mirrors display 0) (crop 100x100)
585TEST_F(LayerSnapshotTest, mirrorLayerTouchIsCroppedByMirrorRoot) {
586 reparentLayer(12, UNASSIGNED_LAYER_ID);
587 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
588 setLayerStack(3, 3);
589 setCrop(1, Rect{50, 50});
590 setCrop(3, Rect{100, 100});
591 setCrop(111, Rect{200, 200});
592 Region touch{Rect{0, 0, 1000, 1000}};
593 setTouchableRegion(111, touch);
Vishnu Nair444f3952023-04-11 13:01:02 -0700594 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000595 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
596 EXPECT_TRUE(getSnapshot({.id = 111})->inputInfo.touchableRegion.hasSameRects(touch));
597 Region touchCroppedByMirrorRoot{Rect{0, 0, 50, 50}};
Vishnu Nair6f878312023-09-08 11:05:01 -0700598 EXPECT_TRUE(getSnapshot({.id = 111, .mirrorRootIds = 3u})
Vishnu Nair92990e22023-02-24 20:01:05 +0000599 ->inputInfo.touchableRegion.hasSameRects(touchCroppedByMirrorRoot));
600}
601
602TEST_F(LayerSnapshotTest, canRemoveDisplayMirror) {
603 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
604 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
605 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700606 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000607 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
608 destroyLayerHandle(3);
609 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
610}
611
Vishnu Nairfccd6362023-02-24 23:39:53 +0000612TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterMirroring) {
613 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
614 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
615 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700616 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3,
617 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nairfccd6362023-02-24 23:39:53 +0000618 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
619 destroyLayerHandle(3);
620 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
621
622 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
623}
624
Vishnu Nair6f878312023-09-08 11:05:01 -0700625TEST_F(LayerSnapshotTest, canMirrorDisplayWithMirrors) {
626 reparentLayer(12, UNASSIGNED_LAYER_ID);
627 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
628 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
629 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
630
631 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
632 setLayerStack(3, 3);
633 expected = {1, 11, 111, 13, 14, 11, 111, 2, 3, 1, 11, 111, 13, 14, 11, 111, 2};
634 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
635 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->outputFilter.layerStack.id, 0u);
636 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
637 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u, 14u})->outputFilter.layerStack.id, 3u);
638}
639
Vishnu Nairfccd6362023-02-24 23:39:53 +0000640// Rel z doesn't create duplicate snapshots but this is for completeness
641TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterRelZ) {
642 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
643 reparentRelativeLayer(13, 11);
644 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
645 setZ(13, 0);
646 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
647
648 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
649}
650
651TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterLayerDestruction) {
652 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
653 destroyLayerHandle(2);
654 destroyLayerHandle(122);
655
656 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13};
657 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
658
659 EXPECT_LE(startingNumSnapshots - 2, mSnapshotBuilder.getSnapshots().size());
660}
661
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000662TEST_F(LayerSnapshotTest, snashotContainsMetadataFromLayerCreationArgs) {
663 LayerCreationArgs args(std::make_optional<uint32_t>(200));
664 args.name = "testlayer";
665 args.addToRoot = true;
666 args.metadata.setInt32(42, 24);
667
668 std::vector<std::unique_ptr<RequestedLayerState>> layers;
669 layers.emplace_back(std::make_unique<RequestedLayerState>(args));
670 EXPECT_TRUE(layers.back()->metadata.has(42));
671 EXPECT_EQ(layers.back()->metadata.getInt32(42, 0), 24);
672 mLifecycleManager.addLayers(std::move(layers));
673
674 std::vector<uint32_t> expected = STARTING_ZORDER;
675 expected.push_back(200);
676 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
677
678 EXPECT_TRUE(mSnapshotBuilder.getSnapshot(200)->layerMetadata.has(42));
679 EXPECT_EQ(mSnapshotBuilder.getSnapshot(200)->layerMetadata.getInt32(42, 0), 24);
680}
681
682TEST_F(LayerSnapshotTest, frameRateSelectionPriorityPassedToChildLayers) {
683 setFrameRateSelectionPriority(11, 1);
684
685 setFrameRateSelectionPriority(12, 2);
686
687 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
688 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
689 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
690 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
691 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 2);
692 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 2);
693
694 // reparent and verify the child gets the new parent's framerate selection priority
695 reparentLayer(122, 11);
696
697 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
698 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
699 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
700 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
701 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
702 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 1);
703 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 1);
704}
705
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000706TEST_F(LayerSnapshotTest, framerate) {
707 setFrameRate(11, 244.f, 0, 0);
708
709 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
710 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700711 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
712 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700713 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000714 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
715
716 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700717 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
718 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
719 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700720 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000721 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
722
Rachel Leece6e0042023-06-27 11:22:54 -0700723 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
724 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
725 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700726 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000727 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
728
729 // reparent and verify the child gets the new parent's framerate
730 reparentLayer(122, 11);
731
732 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
733 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
734 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700735 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
736 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700737 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000738
739 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700740 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
741 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
742 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700743 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000744
Rachel Leece6e0042023-06-27 11:22:54 -0700745 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
746 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
747 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700748 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000749
Rachel Leece6e0042023-06-27 11:22:54 -0700750 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
751 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
752 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700753 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000754 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
755
756 // reparent and verify the new parent gets no vote
757 reparentLayer(11, 2);
758 expected = {1, 12, 121, 13, 2, 11, 111, 122, 1221};
759 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
760
761 // verify old parent has invalid framerate (default)
Rachel Leece6e0042023-06-27 11:22:54 -0700762 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
763 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700764 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000765 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
766
767 // verify new parent get no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700768 EXPECT_FALSE(getSnapshot({.id = 2})->frameRate.vote.rate.isValid());
769 EXPECT_EQ(getSnapshot({.id = 2})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700770 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000771 EXPECT_TRUE(getSnapshot({.id = 2})->changes.test(RequestedLayerState::Changes::FrameRate));
772
773 // verify layer and children get the requested votes (unchanged)
Rachel Leece6e0042023-06-27 11:22:54 -0700774 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
775 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
776 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700777 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000778
Rachel Leece6e0042023-06-27 11:22:54 -0700779 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
780 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
781 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700782 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000783
Rachel Leece6e0042023-06-27 11:22:54 -0700784 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
785 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
786 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700787 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000788}
789
Vishnu Nair3996ee32023-08-14 04:32:31 +0000790TEST_F(LayerSnapshotTest, translateDataspace) {
791 setDataspace(1, ui::Dataspace::UNKNOWN);
792 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
793 EXPECT_EQ(getSnapshot({.id = 1})->dataspace, ui::Dataspace::V0_SRGB);
794}
795
Rachel Leece6e0042023-06-27 11:22:54 -0700796// This test is similar to "frameRate" test case but checks that the setFrameRateCategory API
797// interaction also works correctly with the setFrameRate API within SF frontend.
798TEST_F(LayerSnapshotTest, frameRateWithCategory) {
Rachel Lee45681982024-03-14 18:40:15 -0700799 SET_FLAG_FOR_TEST(flags::frame_rate_category_mrr, true);
800
Rachel Leece6e0042023-06-27 11:22:54 -0700801 // ROOT
802 // ├── 1
803 // │ ├── 11 (frame rate set to 244.f)
804 // │ │ └── 111
805 // │ ├── 12
806 // │ │ ├── 121
807 // │ │ └── 122 (frame rate category set to Normal)
808 // │ │ └── 1221
809 // │ └── 13
810 // └── 2
811 setFrameRate(11, 244.f, 0, 0);
Rachel Lee9580ff12023-12-26 17:33:41 -0800812 setFrameRateCategory(122, ANATIVEWINDOW_FRAME_RATE_CATEGORY_NORMAL);
Rachel Leece6e0042023-06-27 11:22:54 -0700813
814 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
815 // verify parent 1 gets no vote
816 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
817 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700818 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700819 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
820
821 // verify layer 11 and children 111 get the requested votes
822 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
823 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
824 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700825 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700826 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
827
828 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
829 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
830 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700831 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700832 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
833
834 // verify parent 12 gets no vote
835 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
836 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700837 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700838 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
839
840 // verify layer 122 and children 1221 get the requested votes
841 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
842 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
843 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700844 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700845 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
846 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700847 EXPECT_TRUE(
848 getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700849
850 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
851 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
852 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700853 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700854 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
855 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700856 EXPECT_TRUE(
857 getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700858
859 // reparent and verify the child does NOT get the new parent's framerate because it already has
860 // the frame rate category specified.
861 // ROOT
862 // ├─1
863 // │ ├─11 (frame rate set to 244.f)
864 // │ │ ├─111
865 // │ │ └─122 (frame rate category set to Normal)
866 // │ │ └─1221
867 // │ ├─12
868 // │ │ └─121
869 // │ └─13
870 // └─2
871 reparentLayer(122, 11);
872
873 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
874 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
875 // verify parent is gets no vote
876 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
877 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700878 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700879
880 // verify layer 11 and children 111 get the requested votes
881 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
882 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
883 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700884 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700885
886 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
887 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
888 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700889 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700890
891 // verify layer 122 and children 1221 get the requested category vote (unchanged from
892 // reparenting)
893 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
894 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
895 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700896 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700897 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
898 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
899
900 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
901 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
902 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700903 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700904 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
905 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
906}
907
Rachel Lee58cc90d2023-09-05 18:50:20 -0700908TEST_F(LayerSnapshotTest, frameRateSelectionStrategy) {
909 // ROOT
910 // ├── 1
911 // │ ├── 11
912 // │ │ └── 111
913 // │ ├── 12 (frame rate set to 244.f with strategy OverrideChildren)
914 // │ │ ├── 121
915 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
916 // │ │ └── 1221
917 // │ └── 13
918 // └── 2
919 setFrameRate(12, 244.f, 0, 0);
920 setFrameRate(122, 123.f, 0, 0);
921 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
922
923 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
924 // verify parent 1 gets no vote
925 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
926 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700927 scheduler::FrameRateCompatibility::NoVote);
Rachel Lee58cc90d2023-09-05 18:50:20 -0700928 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
929
930 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
931 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
932 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
933 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
934 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
935
936 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
937 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
938 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
939 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
940
941 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
942 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
943 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
944 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
945
946 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
947 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
948 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
949 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Vishnu Nair41376b62023-11-08 05:08:58 -0800950
951 // ROOT
952 // ├── 1
953 // │ ├── 11
954 // │ │ └── 111
955 // │ ├── 12 (frame rate set to default with strategy default)
956 // │ │ ├── 121
957 // │ │ └── 122 (frame rate set to 123.f)
958 // │ │ └── 1221
959 // │ └── 13
960 // └── 2
961 setFrameRate(12, -1.f, 0, 0);
962 setFrameRateSelectionStrategy(12, 0 /* Default */);
963 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
964 // verify parent 1 gets no vote
965 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
966 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
967 scheduler::FrameRateCompatibility::NoVote);
968 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
969
970 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
971 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
972 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
973 scheduler::FrameRateCompatibility::NoVote);
974 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800975 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800976 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
977
978 EXPECT_FALSE(getSnapshot({.id = 121})->frameRate.vote.rate.isValid());
979 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800980 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800981 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
982 scheduler::FrameRateCompatibility::Default);
983 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
984
985 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
986 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800987 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800988 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
989
990 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
991 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800992 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800993 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
994}
995
996TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithCategory) {
Rachel Lee45681982024-03-14 18:40:15 -0700997 SET_FLAG_FOR_TEST(flags::frame_rate_category_mrr, true);
998
Vishnu Nair41376b62023-11-08 05:08:58 -0800999 // ROOT
1000 // ├── 1
1001 // │ ├── 11
1002 // │ │ └── 111
1003 // │ ├── 12 (frame rate category set to high with strategy OverrideChildren)
1004 // │ │ ├── 121
1005 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
1006 // │ │ └── 1221
1007 // │ └── 13
1008 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -08001009 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_HIGH);
Vishnu Nair41376b62023-11-08 05:08:58 -08001010 setFrameRate(122, 123.f, 0, 0);
1011 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
1012
1013 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1014 // verify parent 1 gets no vote
1015 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
1016 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1017 scheduler::FrameRateCompatibility::NoVote);
1018 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1019
1020 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
1021 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::High);
1022 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
1023 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1024 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
1025
1026 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::High);
1027 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
1028 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1029 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
1030
1031 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::High);
1032 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
1033 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1034 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1035
1036 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::High);
1037 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
1038 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1039 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
1040
1041 // ROOT
1042 // ├── 1
1043 // │ ├── 11
1044 // │ │ └── 111
1045 // │ ├── 12 (frame rate category to default with strategy default)
1046 // │ │ ├── 121
1047 // │ │ └── 122 (frame rate set to 123.f)
1048 // │ │ └── 1221
1049 // │ └── 13
1050 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -08001051 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_DEFAULT);
Vishnu Nair41376b62023-11-08 05:08:58 -08001052 setFrameRateSelectionStrategy(12, 0 /* Default */);
1053 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1054 // verify parent 1 gets no vote
1055 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
1056 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1057 scheduler::FrameRateCompatibility::NoVote);
1058 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.category, FrameRateCategory::Default);
1059 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1060
1061 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
1062 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
1063 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
1064 scheduler::FrameRateCompatibility::NoVote);
1065 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::Default);
1066 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001067 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001068 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
1069
1070 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
1071 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001072 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001073 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::Default);
1074 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
1075 scheduler::FrameRateCompatibility::Default);
1076 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
1077
1078 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
1079 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001080 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001081 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Default);
1082 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1083
1084 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
1085 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001086 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001087 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Default);
1088 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee58cc90d2023-09-05 18:50:20 -07001089}
1090
Rachel Lee70f7b692023-11-22 11:24:02 -08001091TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithOverrideChildrenAndSelf) {
Rachel Leea021bb02023-11-20 21:51:09 -08001092 // ROOT
1093 // ├── 1
Rachel Lee70f7b692023-11-22 11:24:02 -08001094 // │ ├── 11 (frame rate set to 11.f with strategy Self)
Rachel Leea021bb02023-11-20 21:51:09 -08001095 // │ │ └── 111 (frame rate is not inherited)
1096 // │ ├── 12 (frame rate set to 244.f)
1097 // │ │ ├── 121
1098 // │ │ └── 122 (strategy OverrideChildren and inherits frame rate 244.f)
1099 // │ │ └── 1221 (frame rate set to 123.f but should be overridden by layer 122)
1100 // │ └── 13
1101 // └── 2
1102 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -08001103 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -08001104 setFrameRate(12, 244.f, 0, 0);
1105 setFrameRateSelectionStrategy(122, 1 /* OverrideChildren */);
1106 setFrameRate(1221, 123.f, 0, 0);
1107
1108 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1109 // verify parent 1 gets no vote
1110 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
1111 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1112 scheduler::FrameRateCompatibility::NoVote);
1113 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001114 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001115 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1116
1117 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 11.f);
1118 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001119 scheduler::LayerInfo::FrameRateSelectionStrategy::Self);
Rachel Leea021bb02023-11-20 21:51:09 -08001120 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1121
1122 // verify layer 11 does does not propagate its framerate to 111.
1123 EXPECT_FALSE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
1124 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001125 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001126 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1127
1128 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
1129 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
1130 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001131 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001132 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
1133
1134 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
1135 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001136 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001137 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
1138
1139 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
1140 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
1141 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1142 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1143
1144 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
1145 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
1146 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1147 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
1148
1149 // ROOT
1150 // ├── 1 (frame rate set to 1.f with strategy OverrideChildren)
Rachel Lee70f7b692023-11-22 11:24:02 -08001151 // │ ├── 11 (frame rate set to 11.f with strategy Self, but overridden by 1)
Rachel Leea021bb02023-11-20 21:51:09 -08001152 // │ │ └── 111 (frame rate inherited from 11 due to override from 1)
1153 // â‹® â‹®
1154 setFrameRate(1, 1.f, 0, 0);
1155 setFrameRateSelectionStrategy(1, 1 /* OverrideChildren */);
1156 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -08001157 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -08001158 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1159
1160 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.rate.getValue(), 1.f);
1161 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1162 scheduler::FrameRateCompatibility::Default);
1163 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
1164 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1165 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1166
1167 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 1.f);
1168 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
1169 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1170 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1171
1172 // verify layer 11 does does not propagate its framerate to 111.
1173 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 1.f);
1174 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
1175 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1176 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1177}
1178
Vishnu Nair0808ae62023-08-07 21:42:42 -07001179TEST_F(LayerSnapshotTest, skipRoundCornersWhenProtected) {
1180 setRoundedCorners(1, 42.f);
1181 setRoundedCorners(2, 42.f);
1182 setCrop(1, Rect{1000, 1000});
1183 setCrop(2, Rect{1000, 1000});
1184
1185 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1186 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1187 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1188 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1189
1190 // add a buffer with the protected bit, check rounded corners are not set when
1191 // skipRoundCornersWhenProtected == true
1192 setBuffer(1,
1193 std::make_shared<
1194 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1195 1ULL /* bufferId */,
1196 HAL_PIXEL_FORMAT_RGBA_8888,
1197 GRALLOC_USAGE_PROTECTED /*usage*/));
1198
1199 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1200 .layerLifecycleManager = mLifecycleManager,
1201 .includeMetadata = false,
1202 .displays = mFrontEndDisplayInfos,
1203 .displayChanges = false,
1204 .globalShadowSettings = globalShadowSettings,
1205 .supportsBlur = true,
1206 .supportedLayerGenericMetadata = {},
1207 .genericLayerMetadataKeyMap = {},
1208 .skipRoundCornersWhenProtected = true};
1209 update(mSnapshotBuilder, args);
1210 EXPECT_FALSE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1211 // layer 2 doesn't have a buffer and should be unaffected
1212 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1213
1214 // remove protected bit, check rounded corners are set
1215 setBuffer(1,
1216 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1217 2ULL /* bufferId */,
1218 HAL_PIXEL_FORMAT_RGBA_8888,
1219 0 /*usage*/));
1220 update(mSnapshotBuilder, args);
1221 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1222 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1223}
1224
Vishnu Nairbd51f952023-08-31 22:50:14 -07001225TEST_F(LayerSnapshotTest, setRefreshRateIndicatorCompositionType) {
1226 setFlags(1, layer_state_t::eLayerIsRefreshRateIndicator,
1227 layer_state_t::eLayerIsRefreshRateIndicator);
1228 setBuffer(1,
1229 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1230 42ULL /* bufferId */,
1231 HAL_PIXEL_FORMAT_RGBA_8888,
1232 0 /*usage*/));
1233 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1234 EXPECT_EQ(getSnapshot({.id = 1})->compositionType,
1235 aidl::android::hardware::graphics::composer3::Composition::REFRESH_RATE_INDICATOR);
1236}
1237
Chavi Weingarten07597342023-09-14 21:10:59 +00001238TEST_F(LayerSnapshotTest, setBufferCrop) {
1239 // validate no buffer but has crop
1240 Rect crop = Rect(0, 0, 50, 50);
1241 setBufferCrop(1, crop);
1242 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1243 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1244
1245 setBuffer(1,
1246 std::make_shared<renderengine::mock::FakeExternalTexture>(100U /*width*/,
1247 100U /*height*/,
1248 42ULL /* bufferId */,
1249 HAL_PIXEL_FORMAT_RGBA_8888,
1250 0 /*usage*/));
1251 // validate a buffer crop within the buffer bounds
1252 setBufferCrop(1, crop);
1253 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1254 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1255
1256 // validate a buffer crop outside the buffer bounds
1257 crop = Rect(0, 0, 150, 150);
1258 setBufferCrop(1, crop);
1259 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1260 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1261
1262 // validate no buffer crop
1263 setBufferCrop(1, Rect());
1264 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1265 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1266}
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001267
1268TEST_F(LayerSnapshotTest, setShadowRadius) {
1269 static constexpr float SHADOW_RADIUS = 123.f;
1270 setShadowRadius(1, SHADOW_RADIUS);
1271 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1272 EXPECT_EQ(getSnapshot(1)->shadowSettings.length, SHADOW_RADIUS);
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001273}
1274
Chavi Weingartenb74093a2023-10-11 20:29:59 +00001275TEST_F(LayerSnapshotTest, setTrustedOverlayForNonVisibleInput) {
1276 hideLayer(1);
Vishnu Nair9e0017e2024-05-22 19:02:44 +00001277 setTrustedOverlay(1, gui::TrustedOverlay::ENABLED);
Chavi Weingartenb74093a2023-10-11 20:29:59 +00001278 Region touch{Rect{0, 0, 1000, 1000}};
1279 setTouchableRegion(1, touch);
1280
1281 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1282 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1283 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1284}
1285
Vishnu Nairab942862024-06-13 22:59:06 -07001286TEST_F(LayerSnapshotTest, alphaChangesPropagateToInput) {
1287 Region touch{Rect{0, 0, 1000, 1000}};
1288 setTouchableRegion(1, touch);
1289 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1290
1291 setAlpha(1, 0.5f);
1292 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1293 EXPECT_EQ(getSnapshot(1)->inputInfo.alpha, 0.5f);
1294}
1295
Alec Mouri89f5d4e2023-10-20 17:12:49 +00001296TEST_F(LayerSnapshotTest, isFrontBuffered) {
1297 setBuffer(1,
1298 std::make_shared<renderengine::mock::FakeExternalTexture>(
1299 1U /*width*/, 1U /*height*/, 1ULL /* bufferId */, HAL_PIXEL_FORMAT_RGBA_8888,
1300 GRALLOC_USAGE_HW_TEXTURE | AHARDWAREBUFFER_USAGE_FRONT_BUFFER /*usage*/));
1301
1302 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1303 EXPECT_TRUE(getSnapshot(1)->isFrontBuffered());
1304
1305 setBuffer(1,
1306 std::make_shared<
1307 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1308 1ULL /* bufferId */,
1309 HAL_PIXEL_FORMAT_RGBA_8888,
1310 GRALLOC_USAGE_HW_TEXTURE /*usage*/));
1311
1312 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1313 EXPECT_FALSE(getSnapshot(1)->isFrontBuffered());
1314}
1315
Chavi Weingarten4aa22af2023-11-17 19:37:07 +00001316TEST_F(LayerSnapshotTest, setSecureRootSnapshot) {
1317 setFlags(1, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1318 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1319 .layerLifecycleManager = mLifecycleManager,
1320 .includeMetadata = false,
1321 .displays = mFrontEndDisplayInfos,
1322 .displayChanges = false,
1323 .globalShadowSettings = globalShadowSettings,
1324 .supportsBlur = true,
1325 .supportedLayerGenericMetadata = {},
1326 .genericLayerMetadataKeyMap = {}};
1327 args.rootSnapshot.isSecure = true;
1328 update(mSnapshotBuilder, args);
1329
1330 EXPECT_TRUE(getSnapshot(1)->isSecure);
1331 // Ensure child is also marked as secure
1332 EXPECT_TRUE(getSnapshot(11)->isSecure);
1333}
1334
Prabir Pradhancf359192024-03-20 00:42:57 +00001335TEST_F(LayerSnapshotTest, setSensitiveForTracingConfigForSecureLayers) {
1336 setFlags(11, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1337
1338 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1339
1340 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001341 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001342 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001343 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001344 EXPECT_FALSE(getSnapshot(1)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001345 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001346 EXPECT_FALSE(getSnapshot(12)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001347 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001348 EXPECT_FALSE(getSnapshot(2)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001349 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001350}
1351
1352TEST_F(LayerSnapshotTest, setSensitiveForTracingFromInputWindowHandle) {
1353 setInputInfo(11, [](auto& inputInfo) {
Arpit Singh490ccc92024-04-30 14:26:21 +00001354 inputInfo.inputConfig |= gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY;
Prabir Pradhancf359192024-03-20 00:42:57 +00001355 });
1356
1357 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1358
1359 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001360 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001361 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001362 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001363 EXPECT_FALSE(getSnapshot(1)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001364 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001365 EXPECT_FALSE(getSnapshot(12)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001366 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001367 EXPECT_FALSE(getSnapshot(2)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001368 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001369}
1370
Vishnu Nairf13c8982023-12-02 11:26:09 -08001371// b/314350323
1372TEST_F(LayerSnapshotTest, propagateDropInputMode) {
1373 setDropInputMode(1, gui::DropInputMode::ALL);
1374 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1375 .layerLifecycleManager = mLifecycleManager,
1376 .includeMetadata = false,
1377 .displays = mFrontEndDisplayInfos,
1378 .displayChanges = false,
1379 .globalShadowSettings = globalShadowSettings,
1380 .supportsBlur = true,
1381 .supportedLayerGenericMetadata = {},
1382 .genericLayerMetadataKeyMap = {}};
1383 args.rootSnapshot.isSecure = true;
1384 update(mSnapshotBuilder, args);
1385
1386 EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL);
1387 // Ensure child also has the correct drop input mode regardless of whether either layer has
1388 // an input channel
1389 EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL);
1390}
1391
Chavi Weingarten92c7d8c2024-01-19 23:25:45 +00001392TEST_F(LayerSnapshotTest, NonVisibleLayerWithInput) {
1393 LayerHierarchyTestBase::createRootLayer(3);
1394 setColor(3, {-1._hf, -1._hf, -1._hf});
1395 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1396
1397 std::vector<TransactionState> transactions;
1398 transactions.emplace_back();
1399 transactions.back().states.push_back({});
1400 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
1401 transactions.back().states.front().layerId = 3;
1402 transactions.back().states.front().state.windowInfoHandle = sp<gui::WindowInfoHandle>::make();
1403 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
1404 inputInfo->token = sp<BBinder>::make();
1405 mLifecycleManager.applyTransactions(transactions);
1406
1407 update(mSnapshotBuilder);
1408
1409 bool foundInputLayer = false;
1410 mSnapshotBuilder.forEachInputSnapshot([&](const frontend::LayerSnapshot& snapshot) {
1411 if (snapshot.uniqueSequence == 3) {
1412 foundInputLayer = true;
1413 }
1414 });
1415 EXPECT_TRUE(foundInputLayer);
1416}
1417
Nergi Rahardi0dfc0962024-05-23 06:57:36 +00001418TEST_F(LayerSnapshotTest, ForEachSnapshotsWithPredicate) {
1419 std::vector<uint32_t> visitedUniqueSequences;
1420 mSnapshotBuilder.forEachSnapshot(
1421 [&](const std::unique_ptr<frontend::LayerSnapshot>& snapshot) {
1422 visitedUniqueSequences.push_back(snapshot->uniqueSequence);
1423 },
1424 [](const frontend::LayerSnapshot& snapshot) { return snapshot.uniqueSequence == 111; });
1425 EXPECT_EQ(visitedUniqueSequences.size(), 1u);
1426 EXPECT_EQ(visitedUniqueSequences[0], 111u);
1427}
1428
Vishnu Nair59a6be32024-01-29 10:26:21 -08001429TEST_F(LayerSnapshotTest, canOccludePresentation) {
1430 setFlags(12, layer_state_t::eCanOccludePresentation, layer_state_t::eCanOccludePresentation);
1431 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1432 .layerLifecycleManager = mLifecycleManager,
1433 .includeMetadata = false,
1434 .displays = mFrontEndDisplayInfos,
1435 .displayChanges = false,
1436 .globalShadowSettings = globalShadowSettings,
1437 .supportsBlur = true,
1438 .supportedLayerGenericMetadata = {},
1439 .genericLayerMetadataKeyMap = {}};
1440 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1441
1442 EXPECT_EQ(getSnapshot(1)->inputInfo.canOccludePresentation, false);
1443
1444 // ensure we can set the property on the window info for layer and all its children
1445 EXPECT_EQ(getSnapshot(12)->inputInfo.canOccludePresentation, true);
1446 EXPECT_EQ(getSnapshot(121)->inputInfo.canOccludePresentation, true);
1447 EXPECT_EQ(getSnapshot(1221)->inputInfo.canOccludePresentation, true);
1448}
1449
Vishnu Nair491827d2024-04-29 23:43:26 +00001450TEST_F(LayerSnapshotTest, mirroredHierarchyIgnoresLocalTransform) {
1451 SET_FLAG_FOR_TEST(flags::detached_mirror, true);
1452 reparentLayer(12, UNASSIGNED_LAYER_ID);
1453 setPosition(11, 2, 20);
1454 setPosition(111, 20, 200);
1455 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
1456 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
1457 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
1458
1459 // mirror root has no position set
1460 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->localTransform.tx(), 0);
1461 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->localTransform.ty(), 0);
1462 // original root still has a position
1463 EXPECT_EQ(getSnapshot({.id = 11})->localTransform.tx(), 2);
1464 EXPECT_EQ(getSnapshot({.id = 11})->localTransform.ty(), 20);
1465
1466 // mirror child still has the correct position
1467 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->localTransform.tx(), 20);
1468 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->localTransform.ty(), 200);
1469 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->geomLayerTransform.tx(), 20);
1470 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->geomLayerTransform.ty(), 200);
1471
1472 // original child still has the correct position including its parent's position
1473 EXPECT_EQ(getSnapshot({.id = 111})->localTransform.tx(), 20);
1474 EXPECT_EQ(getSnapshot({.id = 111})->localTransform.ty(), 200);
1475 EXPECT_EQ(getSnapshot({.id = 111})->geomLayerTransform.tx(), 22);
1476 EXPECT_EQ(getSnapshot({.id = 111})->geomLayerTransform.ty(), 220);
1477}
1478
Vishnu Nair9e0017e2024-05-22 19:02:44 +00001479TEST_F(LayerSnapshotTest, overrideParentTrustedOverlayState) {
1480 SET_FLAG_FOR_TEST(flags::override_trusted_overlay, true);
1481 hideLayer(1);
1482 setTrustedOverlay(1, gui::TrustedOverlay::ENABLED);
1483
1484 Region touch{Rect{0, 0, 1000, 1000}};
1485 setTouchableRegion(1, touch);
1486 setTouchableRegion(11, touch);
1487 setTouchableRegion(111, touch);
1488
1489 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1490 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1491 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1492 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
1493 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1494 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
1495 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1496
1497 // disable trusted overlay and override parent state
1498 setTrustedOverlay(11, gui::TrustedOverlay::DISABLED);
1499 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1500 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1501 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1502 EXPECT_FALSE(getSnapshot(11)->inputInfo.inputConfig.test(
1503 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1504 EXPECT_FALSE(getSnapshot(111)->inputInfo.inputConfig.test(
1505 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1506
1507 // unset state and go back to default behavior of inheriting
1508 // state
1509 setTrustedOverlay(11, gui::TrustedOverlay::UNSET);
1510 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1511 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1512 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1513 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
1514 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1515 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
1516 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1517}
1518
1519TEST_F(LayerSnapshotTest, doNotOverrideParentTrustedOverlayState) {
1520 SET_FLAG_FOR_TEST(flags::override_trusted_overlay, false);
1521 hideLayer(1);
1522 setTrustedOverlay(1, gui::TrustedOverlay::ENABLED);
1523
1524 Region touch{Rect{0, 0, 1000, 1000}};
1525 setTouchableRegion(1, touch);
1526 setTouchableRegion(11, touch);
1527 setTouchableRegion(111, touch);
1528
1529 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1530 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1531 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1532 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
1533 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1534 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
1535 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1536
1537 // disable trusted overlay but flag is disabled so this behaves
1538 // as UNSET
1539 setTrustedOverlay(11, gui::TrustedOverlay::DISABLED);
1540 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1541 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1542 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1543 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
1544 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1545 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
1546 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1547
1548 // unset state and go back to default behavior of inheriting
1549 // state
1550 setTrustedOverlay(11, gui::TrustedOverlay::UNSET);
1551 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1552 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1553 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1554 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
1555 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1556 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
1557 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1558}
1559
Vishnu Nair384ba8a2024-07-25 20:41:17 -07001560static constexpr const FloatRect LARGE_FLOAT_RECT{std::numeric_limits<float>::min(),
1561 std::numeric_limits<float>::min(),
1562 std::numeric_limits<float>::max(),
1563 std::numeric_limits<float>::max()};
1564TEST_F(LayerSnapshotTest, layerVisibleByDefault) {
1565 DisplayInfo info;
1566 info.info.logicalHeight = 1000000;
1567 info.info.logicalWidth = 1000000;
1568 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
1569 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1570 EXPECT_FALSE(getSnapshot(1)->isHiddenByPolicy());
1571}
1572
1573TEST_F(LayerSnapshotTest, hideLayerWithZeroMatrix) {
1574 DisplayInfo info;
1575 info.info.logicalHeight = 1000000;
1576 info.info.logicalWidth = 1000000;
1577 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
1578 setMatrix(1, 0.f, 0.f, 0.f, 0.f);
1579 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1580 EXPECT_TRUE(getSnapshot(1)->isHiddenByPolicy());
1581}
1582
1583TEST_F(LayerSnapshotTest, hideLayerWithInfMatrix) {
1584 DisplayInfo info;
1585 info.info.logicalHeight = 1000000;
1586 info.info.logicalWidth = 1000000;
1587 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
1588 setMatrix(1, std::numeric_limits<float>::infinity(), 0.f, 0.f,
1589 std::numeric_limits<float>::infinity());
1590 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1591 EXPECT_TRUE(getSnapshot(1)->isHiddenByPolicy());
1592}
1593
1594TEST_F(LayerSnapshotTest, hideLayerWithNanMatrix) {
1595 DisplayInfo info;
1596 info.info.logicalHeight = 1000000;
1597 info.info.logicalWidth = 1000000;
1598 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
1599 setMatrix(1, std::numeric_limits<float>::quiet_NaN(), 0.f, 0.f,
1600 std::numeric_limits<float>::quiet_NaN());
1601 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1602 EXPECT_TRUE(getSnapshot(1)->isHiddenByPolicy());
1603}
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001604} // namespace android::surfaceflinger::frontend