blob: 5ff64174827c88f07a64c048209fbe9088bd342d [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
216// relative tests
217TEST_F(LayerSnapshotTest, RelativeParentCanHideChild) {
218 reparentRelativeLayer(13, 11);
219 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
220
221 hideLayer(11);
222 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
223}
224
225TEST_F(LayerSnapshotTest, ReparentingToHiddenRelativeParentHidesChild) {
226 hideLayer(11);
227 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
228 reparentRelativeLayer(13, 11);
229 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
230}
231
232TEST_F(LayerSnapshotTest, AlphaInheritedByChildren) {
233 setAlpha(1, 0.5);
234 setAlpha(122, 0.5);
235 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700236 EXPECT_EQ(getSnapshot(1)->alpha, 0.5f);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000237 EXPECT_EQ(getSnapshot(12)->alpha, 0.5f);
238 EXPECT_EQ(getSnapshot(1221)->alpha, 0.25f);
239}
240
241// Change states
242TEST_F(LayerSnapshotTest, UpdateClearsPreviousChangeStates) {
243 setCrop(1, Rect(1, 2, 3, 4));
244 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700245 EXPECT_TRUE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
246 EXPECT_TRUE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000247 setCrop(2, Rect(1, 2, 3, 4));
248 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700249 EXPECT_TRUE(getSnapshot(2)->changes.test(RequestedLayerState::Changes::Geometry));
250 EXPECT_FALSE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
251 EXPECT_FALSE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000252}
253
254TEST_F(LayerSnapshotTest, FastPathClearsPreviousChangeStates) {
255 setColor(11, {1._hf, 0._hf, 0._hf});
256 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700257 EXPECT_EQ(getSnapshot(11)->changes, RequestedLayerState::Changes::Content);
258 EXPECT_EQ(getSnapshot(11)->clientChanges, layer_state_t::eColorChanged);
259 EXPECT_EQ(getSnapshot(1)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000260 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700261 EXPECT_EQ(getSnapshot(11)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000262}
263
264TEST_F(LayerSnapshotTest, FastPathSetsChangeFlagToContent) {
265 setColor(1, {1._hf, 0._hf, 0._hf});
266 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
267 EXPECT_EQ(getSnapshot(1)->changes, RequestedLayerState::Changes::Content);
Vishnu Naira02943f2023-06-03 13:44:46 -0700268 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eColorChanged);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000269}
270
Vishnu Naircfb2d252023-01-19 04:44:02 +0000271TEST_F(LayerSnapshotTest, GameMode) {
272 std::vector<TransactionState> transactions;
273 transactions.emplace_back();
274 transactions.back().states.push_back({});
275 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
276 transactions.back().states.front().state.metadata = LayerMetadata();
277 transactions.back().states.front().state.metadata.setInt32(METADATA_GAME_MODE, 42);
Vishnu Nair1391de22023-03-05 19:56:14 -0800278 transactions.back().states.front().layerId = 1;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000279 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
280 mLifecycleManager.applyTransactions(transactions);
Nergi Rahardi6431d4a2024-05-15 18:42:48 +0900281 EXPECT_EQ(mLifecycleManager.getGlobalChanges(),
282 RequestedLayerState::Changes::GameMode | RequestedLayerState::Changes::Metadata);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000283 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700284 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000285 EXPECT_EQ(static_cast<int32_t>(getSnapshot(1)->gameMode), 42);
286 EXPECT_EQ(static_cast<int32_t>(getSnapshot(11)->gameMode), 42);
287}
288
Nergi Rahardi6431d4a2024-05-15 18:42:48 +0900289TEST_F(LayerSnapshotTest, UpdateMetadata) {
290 std::vector<TransactionState> transactions;
291 transactions.emplace_back();
292 transactions.back().states.push_back({});
293 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
294 // This test focuses on metadata used by ARC++ to ensure LayerMetadata is updated correctly,
295 // and not using stale data.
296 transactions.back().states.front().state.metadata = LayerMetadata();
297 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_UID, 123);
298 transactions.back().states.front().state.metadata.setInt32(METADATA_WINDOW_TYPE, 234);
299 transactions.back().states.front().state.metadata.setInt32(METADATA_TASK_ID, 345);
300 transactions.back().states.front().state.metadata.setInt32(METADATA_MOUSE_CURSOR, 456);
301 transactions.back().states.front().state.metadata.setInt32(METADATA_ACCESSIBILITY_ID, 567);
302 transactions.back().states.front().state.metadata.setInt32(METADATA_OWNER_PID, 678);
303 transactions.back().states.front().state.metadata.setInt32(METADATA_CALLING_UID, 789);
304
305 transactions.back().states.front().layerId = 1;
306 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
307
308 mLifecycleManager.applyTransactions(transactions);
309 EXPECT_EQ(mLifecycleManager.getGlobalChanges(), RequestedLayerState::Changes::Metadata);
310
311 // Setting includeMetadata=true to ensure metadata update is applied to LayerSnapshot
312 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
313 .layerLifecycleManager = mLifecycleManager,
314 .includeMetadata = true,
315 .displays = mFrontEndDisplayInfos,
316 .globalShadowSettings = globalShadowSettings,
317 .supportsBlur = true,
318 .supportedLayerGenericMetadata = {},
319 .genericLayerMetadataKeyMap = {}};
320 update(mSnapshotBuilder, args);
321
322 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
323 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_UID, -1), 123);
324 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_WINDOW_TYPE, -1), 234);
325 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_TASK_ID, -1), 345);
326 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_MOUSE_CURSOR, -1), 456);
327 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_ACCESSIBILITY_ID, -1), 567);
328 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_OWNER_PID, -1), 678);
329 EXPECT_EQ(getSnapshot(1)->layerMetadata.getInt32(METADATA_CALLING_UID, -1), 789);
330}
331
Vishnu Naircfb2d252023-01-19 04:44:02 +0000332TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotes) {
333 // ROOT
334 // ├── 1
335 // │ ├── 11 (frame rate set)
336 // │ │ └── 111
337 // │ ├── 12
338 // │ │ ├── 121
339 // │ │ └── 122
340 // │ │ └── 1221
341 // │ └── 13
342 // └── 2
343
Vishnu Nair30515cb2023-10-19 21:54:08 -0700344 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000345 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
346
Rachel Leece6e0042023-06-27 11:22:54 -0700347 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700348 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700349 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700350 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700351 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700352 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000353}
354
Vishnu Nair30515cb2023-10-19 21:54:08 -0700355TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotesDoesNotAffectSiblings) {
356 // ROOT
357 // ├── 1 (verify layer has no vote)
358 // │ ├── 11 (frame rate set)
359 // │ │ └── 111
360 // │ ├── 12 (frame rate set)
361 // │ │ ├── 121
362 // │ │ └── 122
363 // │ │ └── 1221
364 // │ └── 13 (verify layer has default vote)
365 // └── 2
366
367 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
368 setFrameRate(12, 45.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
369
370 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
371
372 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
373 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
374 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
375 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
376 EXPECT_EQ(getSnapshot(12)->frameRate.vote.rate.getIntValue(), 45);
377 EXPECT_EQ(getSnapshot(12)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
378 EXPECT_EQ(getSnapshot(121)->frameRate.vote.rate.getIntValue(), 45);
379 EXPECT_EQ(getSnapshot(121)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
380 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.rate.getIntValue(), 45);
381 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
382
383 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
384 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
385 EXPECT_EQ(getSnapshot(13)->frameRate.vote.rate.getIntValue(), 0);
386 EXPECT_EQ(getSnapshot(13)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
387 EXPECT_EQ(getSnapshot(2)->frameRate.vote.rate.getIntValue(), 0);
388 EXPECT_EQ(getSnapshot(2)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
389}
390
Vishnu Naira02943f2023-06-03 13:44:46 -0700391TEST_F(LayerSnapshotTest, CanCropTouchableRegion) {
Vishnu Nair29354ec2023-03-28 18:51:28 -0700392 // ROOT
393 // ├── 1
394 // │ ├── 11
395 // │ │ └── 111 (touchregion set to touch but cropped by layer 13)
396 // │ ├── 12
397 // │ │ ├── 121
398 // │ │ └── 122
399 // │ │ └── 1221
400 // │ └── 13 (crop set to touchCrop)
401 // └── 2
402
403 Rect touchCrop{300, 300, 400, 500};
404 setCrop(13, touchCrop);
405 Region touch{Rect{0, 0, 1000, 1000}};
406 setTouchableRegionCrop(111, touch, /*touchCropId=*/13, /*replaceTouchableRegionWithCrop=*/true);
407 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
408 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), touchCrop);
409
410 Rect modifiedTouchCrop{100, 300, 400, 700};
411 setCrop(13, modifiedTouchCrop);
412 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
413 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), modifiedTouchCrop);
414}
415
Chavi Weingarten1ba381e2024-01-09 21:54:11 +0000416TEST_F(LayerSnapshotTest, CanCropTouchableRegionWithDisplayTransform) {
417 DisplayInfo displayInfo;
418 displayInfo.transform = ui::Transform(ui::Transform::RotationFlags::ROT_90, 1000, 1000);
419 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), displayInfo);
420
421 Rect touchCrop{300, 300, 400, 500};
422 createRootLayer(3);
423 setCrop(3, touchCrop);
424 setLayerStack(3, 1);
425 Region touch{Rect{0, 0, 1000, 1000}};
426 setTouchableRegionCrop(3, touch, /*touchCropId=*/3, /*replaceTouchableRegionWithCrop=*/false);
427
428 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3});
429 Rect rotatedCrop = {500, 300, 700, 400};
430 EXPECT_EQ(getSnapshot({.id = 3})->inputInfo.touchableRegion.bounds(), rotatedCrop);
431}
432
Vishnu Nair444f3952023-04-11 13:01:02 -0700433TEST_F(LayerSnapshotTest, blurUpdatesWhenAlphaChanges) {
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700434 int blurRadius = 42;
435 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
Vishnu Nair444f3952023-04-11 13:01:02 -0700436
437 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
438 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
439
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700440 blurRadius = 21;
441 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
442 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
443 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
444
Vishnu Nair444f3952023-04-11 13:01:02 -0700445 static constexpr float alpha = 0.5;
446 setAlpha(12, alpha);
447 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700448 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius,
449 static_cast<int>(static_cast<float>(blurRadius) * alpha));
Vishnu Nair444f3952023-04-11 13:01:02 -0700450}
451
Vishnu Naira9c43762023-01-27 19:10:25 +0000452// Display Mirroring Tests
453// tree with 3 levels of children
454// ROOT (DISPLAY 0)
455// ├── 1
456// │ ├── 11
457// │ │ └── 111
458// │ ├── 12 (has skip screenshot flag)
459// │ │ ├── 121
460// │ │ └── 122
461// │ │ └── 1221
462// │ └── 13
463// └── 2
464// ROOT (DISPLAY 1)
465// └── 3 (mirrors display 0)
Vishnu Nair92990e22023-02-24 20:01:05 +0000466TEST_F(LayerSnapshotTest, displayMirrorRespectsLayerSkipScreenshotFlag) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000467 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
468 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
469 setLayerStack(3, 1);
470
Vishnu Nair444f3952023-04-11 13:01:02 -0700471 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 +0000472 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
473}
474
Vishnu Nair92990e22023-02-24 20:01:05 +0000475// ROOT (DISPLAY 0)
476// ├── 1
477// │ ├── 11
478// │ │ └── 111
479// │ └── 13
480// └── 2
481// ROOT (DISPLAY 3)
482// └── 3 (mirrors display 0)
483TEST_F(LayerSnapshotTest, mirrorLayerGetsCorrectLayerStack) {
484 reparentLayer(12, UNASSIGNED_LAYER_ID);
485 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
486 setLayerStack(3, 3);
487 createDisplayMirrorLayer(4, ui::LayerStack::fromValue(0));
488 setLayerStack(4, 4);
489
Vishnu Nair444f3952023-04-11 13:01:02 -0700490 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111,
491 13, 2, 4, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000492 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
Vishnu Nair6f878312023-09-08 11:05:01 -0700493 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
494 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 4u})->outputFilter.layerStack.id, 4u);
Vishnu Nair92990e22023-02-24 20:01:05 +0000495}
496
497// ROOT (DISPLAY 0)
498// ├── 1 (crop 50x50)
499// │ ├── 11
500// │ │ └── 111
501// │ └── 13
502// └── 2
503// ROOT (DISPLAY 3)
504// └── 3 (mirrors display 0) (crop 100x100)
505TEST_F(LayerSnapshotTest, mirrorLayerTouchIsCroppedByMirrorRoot) {
506 reparentLayer(12, UNASSIGNED_LAYER_ID);
507 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
508 setLayerStack(3, 3);
509 setCrop(1, Rect{50, 50});
510 setCrop(3, Rect{100, 100});
511 setCrop(111, Rect{200, 200});
512 Region touch{Rect{0, 0, 1000, 1000}};
513 setTouchableRegion(111, touch);
Vishnu Nair444f3952023-04-11 13:01:02 -0700514 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000515 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
516 EXPECT_TRUE(getSnapshot({.id = 111})->inputInfo.touchableRegion.hasSameRects(touch));
517 Region touchCroppedByMirrorRoot{Rect{0, 0, 50, 50}};
Vishnu Nair6f878312023-09-08 11:05:01 -0700518 EXPECT_TRUE(getSnapshot({.id = 111, .mirrorRootIds = 3u})
Vishnu Nair92990e22023-02-24 20:01:05 +0000519 ->inputInfo.touchableRegion.hasSameRects(touchCroppedByMirrorRoot));
520}
521
522TEST_F(LayerSnapshotTest, canRemoveDisplayMirror) {
523 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
524 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
525 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700526 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 +0000527 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
528 destroyLayerHandle(3);
529 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
530}
531
Vishnu Nairfccd6362023-02-24 23:39:53 +0000532TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterMirroring) {
533 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
534 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
535 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700536 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3,
537 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nairfccd6362023-02-24 23:39:53 +0000538 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
539 destroyLayerHandle(3);
540 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
541
542 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
543}
544
Vishnu Nair6f878312023-09-08 11:05:01 -0700545TEST_F(LayerSnapshotTest, canMirrorDisplayWithMirrors) {
546 reparentLayer(12, UNASSIGNED_LAYER_ID);
547 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
548 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
549 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
550
551 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
552 setLayerStack(3, 3);
553 expected = {1, 11, 111, 13, 14, 11, 111, 2, 3, 1, 11, 111, 13, 14, 11, 111, 2};
554 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
555 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->outputFilter.layerStack.id, 0u);
556 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
557 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u, 14u})->outputFilter.layerStack.id, 3u);
558}
559
Vishnu Nairfccd6362023-02-24 23:39:53 +0000560// Rel z doesn't create duplicate snapshots but this is for completeness
561TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterRelZ) {
562 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
563 reparentRelativeLayer(13, 11);
564 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
565 setZ(13, 0);
566 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
567
568 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
569}
570
571TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterLayerDestruction) {
572 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
573 destroyLayerHandle(2);
574 destroyLayerHandle(122);
575
576 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13};
577 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
578
579 EXPECT_LE(startingNumSnapshots - 2, mSnapshotBuilder.getSnapshots().size());
580}
581
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000582TEST_F(LayerSnapshotTest, snashotContainsMetadataFromLayerCreationArgs) {
583 LayerCreationArgs args(std::make_optional<uint32_t>(200));
584 args.name = "testlayer";
585 args.addToRoot = true;
586 args.metadata.setInt32(42, 24);
587
588 std::vector<std::unique_ptr<RequestedLayerState>> layers;
589 layers.emplace_back(std::make_unique<RequestedLayerState>(args));
590 EXPECT_TRUE(layers.back()->metadata.has(42));
591 EXPECT_EQ(layers.back()->metadata.getInt32(42, 0), 24);
592 mLifecycleManager.addLayers(std::move(layers));
593
594 std::vector<uint32_t> expected = STARTING_ZORDER;
595 expected.push_back(200);
596 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
597
598 EXPECT_TRUE(mSnapshotBuilder.getSnapshot(200)->layerMetadata.has(42));
599 EXPECT_EQ(mSnapshotBuilder.getSnapshot(200)->layerMetadata.getInt32(42, 0), 24);
600}
601
602TEST_F(LayerSnapshotTest, frameRateSelectionPriorityPassedToChildLayers) {
603 setFrameRateSelectionPriority(11, 1);
604
605 setFrameRateSelectionPriority(12, 2);
606
607 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
608 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
609 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
610 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
611 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 2);
612 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 2);
613
614 // reparent and verify the child gets the new parent's framerate selection priority
615 reparentLayer(122, 11);
616
617 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
618 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
619 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
620 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
621 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
622 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 1);
623 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 1);
624}
625
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000626TEST_F(LayerSnapshotTest, framerate) {
627 setFrameRate(11, 244.f, 0, 0);
628
629 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
630 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700631 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
632 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700633 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000634 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
635
636 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700637 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
638 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
639 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700640 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000641 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
642
Rachel Leece6e0042023-06-27 11:22:54 -0700643 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
644 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
645 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700646 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000647 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
648
649 // reparent and verify the child gets the new parent's framerate
650 reparentLayer(122, 11);
651
652 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
653 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
654 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700655 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
656 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700657 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000658
659 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700660 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
661 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
662 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700663 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000664
Rachel Leece6e0042023-06-27 11:22:54 -0700665 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
666 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
667 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700668 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000669
Rachel Leece6e0042023-06-27 11:22:54 -0700670 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
671 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
672 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700673 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000674 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
675
676 // reparent and verify the new parent gets no vote
677 reparentLayer(11, 2);
678 expected = {1, 12, 121, 13, 2, 11, 111, 122, 1221};
679 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
680
681 // verify old parent has invalid framerate (default)
Rachel Leece6e0042023-06-27 11:22:54 -0700682 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
683 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700684 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000685 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
686
687 // verify new parent get no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700688 EXPECT_FALSE(getSnapshot({.id = 2})->frameRate.vote.rate.isValid());
689 EXPECT_EQ(getSnapshot({.id = 2})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700690 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000691 EXPECT_TRUE(getSnapshot({.id = 2})->changes.test(RequestedLayerState::Changes::FrameRate));
692
693 // verify layer and children get the requested votes (unchanged)
Rachel Leece6e0042023-06-27 11:22:54 -0700694 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
695 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
696 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700697 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000698
Rachel Leece6e0042023-06-27 11:22:54 -0700699 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
700 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
701 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700702 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000703
Rachel Leece6e0042023-06-27 11:22:54 -0700704 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
705 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
706 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700707 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000708}
709
Vishnu Nair3996ee32023-08-14 04:32:31 +0000710TEST_F(LayerSnapshotTest, translateDataspace) {
711 setDataspace(1, ui::Dataspace::UNKNOWN);
712 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
713 EXPECT_EQ(getSnapshot({.id = 1})->dataspace, ui::Dataspace::V0_SRGB);
714}
715
Rachel Leece6e0042023-06-27 11:22:54 -0700716// This test is similar to "frameRate" test case but checks that the setFrameRateCategory API
717// interaction also works correctly with the setFrameRate API within SF frontend.
718TEST_F(LayerSnapshotTest, frameRateWithCategory) {
Rachel Lee45681982024-03-14 18:40:15 -0700719 SET_FLAG_FOR_TEST(flags::frame_rate_category_mrr, true);
720
Rachel Leece6e0042023-06-27 11:22:54 -0700721 // ROOT
722 // ├── 1
723 // │ ├── 11 (frame rate set to 244.f)
724 // │ │ └── 111
725 // │ ├── 12
726 // │ │ ├── 121
727 // │ │ └── 122 (frame rate category set to Normal)
728 // │ │ └── 1221
729 // │ └── 13
730 // └── 2
731 setFrameRate(11, 244.f, 0, 0);
Rachel Lee9580ff12023-12-26 17:33:41 -0800732 setFrameRateCategory(122, ANATIVEWINDOW_FRAME_RATE_CATEGORY_NORMAL);
Rachel Leece6e0042023-06-27 11:22:54 -0700733
734 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
735 // verify parent 1 gets no vote
736 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
737 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700738 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700739 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
740
741 // verify layer 11 and children 111 get the requested votes
742 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
743 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
744 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700745 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700746 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
747
748 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
749 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
750 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700751 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700752 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
753
754 // verify parent 12 gets no vote
755 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
756 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700757 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700758 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
759
760 // verify layer 122 and children 1221 get the requested votes
761 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
762 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
763 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700764 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700765 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
766 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700767 EXPECT_TRUE(
768 getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700769
770 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
771 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
772 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700773 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700774 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
775 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700776 EXPECT_TRUE(
777 getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700778
779 // reparent and verify the child does NOT get the new parent's framerate because it already has
780 // the frame rate category specified.
781 // ROOT
782 // ├─1
783 // │ ├─11 (frame rate set to 244.f)
784 // │ │ ├─111
785 // │ │ └─122 (frame rate category set to Normal)
786 // │ │ └─1221
787 // │ ├─12
788 // │ │ └─121
789 // │ └─13
790 // └─2
791 reparentLayer(122, 11);
792
793 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
794 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
795 // verify parent is gets no vote
796 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
797 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700798 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700799
800 // verify layer 11 and children 111 get the requested votes
801 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
802 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
803 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700804 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700805
806 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
807 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
808 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700809 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700810
811 // verify layer 122 and children 1221 get the requested category vote (unchanged from
812 // reparenting)
813 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
814 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
815 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700816 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700817 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
818 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
819
820 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
821 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
822 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700823 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700824 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
825 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
826}
827
Rachel Lee58cc90d2023-09-05 18:50:20 -0700828TEST_F(LayerSnapshotTest, frameRateSelectionStrategy) {
829 // ROOT
830 // ├── 1
831 // │ ├── 11
832 // │ │ └── 111
833 // │ ├── 12 (frame rate set to 244.f with strategy OverrideChildren)
834 // │ │ ├── 121
835 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
836 // │ │ └── 1221
837 // │ └── 13
838 // └── 2
839 setFrameRate(12, 244.f, 0, 0);
840 setFrameRate(122, 123.f, 0, 0);
841 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
842
843 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
844 // verify parent 1 gets no vote
845 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
846 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700847 scheduler::FrameRateCompatibility::NoVote);
Rachel Lee58cc90d2023-09-05 18:50:20 -0700848 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
849
850 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
851 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
852 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
853 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
854 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
855
856 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
857 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
858 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
859 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
860
861 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
862 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
863 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
864 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
865
866 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
867 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
868 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
869 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Vishnu Nair41376b62023-11-08 05:08:58 -0800870
871 // ROOT
872 // ├── 1
873 // │ ├── 11
874 // │ │ └── 111
875 // │ ├── 12 (frame rate set to default with strategy default)
876 // │ │ ├── 121
877 // │ │ └── 122 (frame rate set to 123.f)
878 // │ │ └── 1221
879 // │ └── 13
880 // └── 2
881 setFrameRate(12, -1.f, 0, 0);
882 setFrameRateSelectionStrategy(12, 0 /* Default */);
883 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
884 // verify parent 1 gets no vote
885 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
886 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
887 scheduler::FrameRateCompatibility::NoVote);
888 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
889
890 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
891 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
892 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
893 scheduler::FrameRateCompatibility::NoVote);
894 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800895 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800896 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
897
898 EXPECT_FALSE(getSnapshot({.id = 121})->frameRate.vote.rate.isValid());
899 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800900 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800901 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
902 scheduler::FrameRateCompatibility::Default);
903 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
904
905 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
906 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800907 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800908 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
909
910 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
911 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800912 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800913 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
914}
915
916TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithCategory) {
Rachel Lee45681982024-03-14 18:40:15 -0700917 SET_FLAG_FOR_TEST(flags::frame_rate_category_mrr, true);
918
Vishnu Nair41376b62023-11-08 05:08:58 -0800919 // ROOT
920 // ├── 1
921 // │ ├── 11
922 // │ │ └── 111
923 // │ ├── 12 (frame rate category set to high with strategy OverrideChildren)
924 // │ │ ├── 121
925 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
926 // │ │ └── 1221
927 // │ └── 13
928 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -0800929 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_HIGH);
Vishnu Nair41376b62023-11-08 05:08:58 -0800930 setFrameRate(122, 123.f, 0, 0);
931 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
932
933 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
934 // verify parent 1 gets no vote
935 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
936 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
937 scheduler::FrameRateCompatibility::NoVote);
938 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
939
940 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
941 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::High);
942 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
943 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
944 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
945
946 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::High);
947 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
948 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
949 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
950
951 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::High);
952 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
953 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
954 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
955
956 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::High);
957 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
958 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
959 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
960
961 // ROOT
962 // ├── 1
963 // │ ├── 11
964 // │ │ └── 111
965 // │ ├── 12 (frame rate category to default with strategy default)
966 // │ │ ├── 121
967 // │ │ └── 122 (frame rate set to 123.f)
968 // │ │ └── 1221
969 // │ └── 13
970 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -0800971 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_DEFAULT);
Vishnu Nair41376b62023-11-08 05:08:58 -0800972 setFrameRateSelectionStrategy(12, 0 /* Default */);
973 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
974 // verify parent 1 gets no vote
975 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
976 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
977 scheduler::FrameRateCompatibility::NoVote);
978 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.category, FrameRateCategory::Default);
979 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
980
981 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
982 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
983 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
984 scheduler::FrameRateCompatibility::NoVote);
985 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::Default);
986 EXPECT_EQ(getSnapshot({.id = 12})->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 = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
989
990 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
991 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800992 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800993 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::Default);
994 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
995 scheduler::FrameRateCompatibility::Default);
996 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
997
998 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
999 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001000 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001001 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Default);
1002 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1003
1004 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
1005 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001006 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -08001007 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Default);
1008 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee58cc90d2023-09-05 18:50:20 -07001009}
1010
Rachel Lee70f7b692023-11-22 11:24:02 -08001011TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithOverrideChildrenAndSelf) {
Rachel Leea021bb02023-11-20 21:51:09 -08001012 // ROOT
1013 // ├── 1
Rachel Lee70f7b692023-11-22 11:24:02 -08001014 // │ ├── 11 (frame rate set to 11.f with strategy Self)
Rachel Leea021bb02023-11-20 21:51:09 -08001015 // │ │ └── 111 (frame rate is not inherited)
1016 // │ ├── 12 (frame rate set to 244.f)
1017 // │ │ ├── 121
1018 // │ │ └── 122 (strategy OverrideChildren and inherits frame rate 244.f)
1019 // │ │ └── 1221 (frame rate set to 123.f but should be overridden by layer 122)
1020 // │ └── 13
1021 // └── 2
1022 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -08001023 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -08001024 setFrameRate(12, 244.f, 0, 0);
1025 setFrameRateSelectionStrategy(122, 1 /* OverrideChildren */);
1026 setFrameRate(1221, 123.f, 0, 0);
1027
1028 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1029 // verify parent 1 gets no vote
1030 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
1031 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1032 scheduler::FrameRateCompatibility::NoVote);
1033 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001034 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001035 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1036
1037 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 11.f);
1038 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001039 scheduler::LayerInfo::FrameRateSelectionStrategy::Self);
Rachel Leea021bb02023-11-20 21:51:09 -08001040 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1041
1042 // verify layer 11 does does not propagate its framerate to 111.
1043 EXPECT_FALSE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
1044 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001045 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001046 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1047
1048 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
1049 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
1050 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001051 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001052 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
1053
1054 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
1055 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001056 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001057 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
1058
1059 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
1060 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
1061 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1062 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1063
1064 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
1065 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
1066 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1067 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
1068
1069 // ROOT
1070 // ├── 1 (frame rate set to 1.f with strategy OverrideChildren)
Rachel Lee70f7b692023-11-22 11:24:02 -08001071 // │ ├── 11 (frame rate set to 11.f with strategy Self, but overridden by 1)
Rachel Leea021bb02023-11-20 21:51:09 -08001072 // │ │ └── 111 (frame rate inherited from 11 due to override from 1)
1073 // â‹® â‹®
1074 setFrameRate(1, 1.f, 0, 0);
1075 setFrameRateSelectionStrategy(1, 1 /* OverrideChildren */);
1076 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -08001077 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -08001078 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1079
1080 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.rate.getValue(), 1.f);
1081 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1082 scheduler::FrameRateCompatibility::Default);
1083 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
1084 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1085 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1086
1087 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 1.f);
1088 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
1089 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1090 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1091
1092 // verify layer 11 does does not propagate its framerate to 111.
1093 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 1.f);
1094 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
1095 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1096 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1097}
1098
Vishnu Nair0808ae62023-08-07 21:42:42 -07001099TEST_F(LayerSnapshotTest, skipRoundCornersWhenProtected) {
1100 setRoundedCorners(1, 42.f);
1101 setRoundedCorners(2, 42.f);
1102 setCrop(1, Rect{1000, 1000});
1103 setCrop(2, Rect{1000, 1000});
1104
1105 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1106 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1107 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1108 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1109
1110 // add a buffer with the protected bit, check rounded corners are not set when
1111 // skipRoundCornersWhenProtected == true
1112 setBuffer(1,
1113 std::make_shared<
1114 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1115 1ULL /* bufferId */,
1116 HAL_PIXEL_FORMAT_RGBA_8888,
1117 GRALLOC_USAGE_PROTECTED /*usage*/));
1118
1119 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1120 .layerLifecycleManager = mLifecycleManager,
1121 .includeMetadata = false,
1122 .displays = mFrontEndDisplayInfos,
1123 .displayChanges = false,
1124 .globalShadowSettings = globalShadowSettings,
1125 .supportsBlur = true,
1126 .supportedLayerGenericMetadata = {},
1127 .genericLayerMetadataKeyMap = {},
1128 .skipRoundCornersWhenProtected = true};
1129 update(mSnapshotBuilder, args);
1130 EXPECT_FALSE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1131 // layer 2 doesn't have a buffer and should be unaffected
1132 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1133
1134 // remove protected bit, check rounded corners are set
1135 setBuffer(1,
1136 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1137 2ULL /* bufferId */,
1138 HAL_PIXEL_FORMAT_RGBA_8888,
1139 0 /*usage*/));
1140 update(mSnapshotBuilder, args);
1141 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1142 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1143}
1144
Vishnu Nairbd51f952023-08-31 22:50:14 -07001145TEST_F(LayerSnapshotTest, setRefreshRateIndicatorCompositionType) {
1146 setFlags(1, layer_state_t::eLayerIsRefreshRateIndicator,
1147 layer_state_t::eLayerIsRefreshRateIndicator);
1148 setBuffer(1,
1149 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1150 42ULL /* bufferId */,
1151 HAL_PIXEL_FORMAT_RGBA_8888,
1152 0 /*usage*/));
1153 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1154 EXPECT_EQ(getSnapshot({.id = 1})->compositionType,
1155 aidl::android::hardware::graphics::composer3::Composition::REFRESH_RATE_INDICATOR);
1156}
1157
Chavi Weingarten07597342023-09-14 21:10:59 +00001158TEST_F(LayerSnapshotTest, setBufferCrop) {
1159 // validate no buffer but has crop
1160 Rect crop = Rect(0, 0, 50, 50);
1161 setBufferCrop(1, crop);
1162 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1163 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1164
1165 setBuffer(1,
1166 std::make_shared<renderengine::mock::FakeExternalTexture>(100U /*width*/,
1167 100U /*height*/,
1168 42ULL /* bufferId */,
1169 HAL_PIXEL_FORMAT_RGBA_8888,
1170 0 /*usage*/));
1171 // validate a buffer crop within the buffer bounds
1172 setBufferCrop(1, crop);
1173 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1174 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1175
1176 // validate a buffer crop outside the buffer bounds
1177 crop = Rect(0, 0, 150, 150);
1178 setBufferCrop(1, crop);
1179 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1180 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1181
1182 // validate no buffer crop
1183 setBufferCrop(1, Rect());
1184 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1185 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1186}
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001187
1188TEST_F(LayerSnapshotTest, setShadowRadius) {
1189 static constexpr float SHADOW_RADIUS = 123.f;
1190 setShadowRadius(1, SHADOW_RADIUS);
1191 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1192 EXPECT_EQ(getSnapshot(1)->shadowSettings.length, SHADOW_RADIUS);
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001193}
1194
Chavi Weingartenb74093a2023-10-11 20:29:59 +00001195TEST_F(LayerSnapshotTest, setTrustedOverlayForNonVisibleInput) {
1196 hideLayer(1);
1197 setTrustedOverlay(1, true);
1198 Region touch{Rect{0, 0, 1000, 1000}};
1199 setTouchableRegion(1, touch);
1200
1201 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1202 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1203 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1204}
1205
Alec Mouri89f5d4e2023-10-20 17:12:49 +00001206TEST_F(LayerSnapshotTest, isFrontBuffered) {
1207 setBuffer(1,
1208 std::make_shared<renderengine::mock::FakeExternalTexture>(
1209 1U /*width*/, 1U /*height*/, 1ULL /* bufferId */, HAL_PIXEL_FORMAT_RGBA_8888,
1210 GRALLOC_USAGE_HW_TEXTURE | AHARDWAREBUFFER_USAGE_FRONT_BUFFER /*usage*/));
1211
1212 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1213 EXPECT_TRUE(getSnapshot(1)->isFrontBuffered());
1214
1215 setBuffer(1,
1216 std::make_shared<
1217 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1218 1ULL /* bufferId */,
1219 HAL_PIXEL_FORMAT_RGBA_8888,
1220 GRALLOC_USAGE_HW_TEXTURE /*usage*/));
1221
1222 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1223 EXPECT_FALSE(getSnapshot(1)->isFrontBuffered());
1224}
1225
Chavi Weingarten4aa22af2023-11-17 19:37:07 +00001226TEST_F(LayerSnapshotTest, setSecureRootSnapshot) {
1227 setFlags(1, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1228 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1229 .layerLifecycleManager = mLifecycleManager,
1230 .includeMetadata = false,
1231 .displays = mFrontEndDisplayInfos,
1232 .displayChanges = false,
1233 .globalShadowSettings = globalShadowSettings,
1234 .supportsBlur = true,
1235 .supportedLayerGenericMetadata = {},
1236 .genericLayerMetadataKeyMap = {}};
1237 args.rootSnapshot.isSecure = true;
1238 update(mSnapshotBuilder, args);
1239
1240 EXPECT_TRUE(getSnapshot(1)->isSecure);
1241 // Ensure child is also marked as secure
1242 EXPECT_TRUE(getSnapshot(11)->isSecure);
1243}
1244
Prabir Pradhancf359192024-03-20 00:42:57 +00001245TEST_F(LayerSnapshotTest, setSensitiveForTracingConfigForSecureLayers) {
1246 setFlags(11, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1247
1248 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1249
1250 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001251 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001252 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001253 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001254 EXPECT_FALSE(getSnapshot(1)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001255 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001256 EXPECT_FALSE(getSnapshot(12)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001257 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001258 EXPECT_FALSE(getSnapshot(2)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001259 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001260}
1261
1262TEST_F(LayerSnapshotTest, setSensitiveForTracingFromInputWindowHandle) {
1263 setInputInfo(11, [](auto& inputInfo) {
Arpit Singh490ccc92024-04-30 14:26:21 +00001264 inputInfo.inputConfig |= gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY;
Prabir Pradhancf359192024-03-20 00:42:57 +00001265 });
1266
1267 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1268
1269 EXPECT_TRUE(getSnapshot(11)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001270 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001271 EXPECT_TRUE(getSnapshot(111)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001272 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001273 EXPECT_FALSE(getSnapshot(1)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001274 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001275 EXPECT_FALSE(getSnapshot(12)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001276 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001277 EXPECT_FALSE(getSnapshot(2)->inputInfo.inputConfig.test(
Arpit Singh490ccc92024-04-30 14:26:21 +00001278 gui::WindowInfo::InputConfig::SENSITIVE_FOR_PRIVACY));
Prabir Pradhancf359192024-03-20 00:42:57 +00001279}
1280
Vishnu Nairf13c8982023-12-02 11:26:09 -08001281// b/314350323
1282TEST_F(LayerSnapshotTest, propagateDropInputMode) {
1283 setDropInputMode(1, gui::DropInputMode::ALL);
1284 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1285 .layerLifecycleManager = mLifecycleManager,
1286 .includeMetadata = false,
1287 .displays = mFrontEndDisplayInfos,
1288 .displayChanges = false,
1289 .globalShadowSettings = globalShadowSettings,
1290 .supportsBlur = true,
1291 .supportedLayerGenericMetadata = {},
1292 .genericLayerMetadataKeyMap = {}};
1293 args.rootSnapshot.isSecure = true;
1294 update(mSnapshotBuilder, args);
1295
1296 EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL);
1297 // Ensure child also has the correct drop input mode regardless of whether either layer has
1298 // an input channel
1299 EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL);
1300}
1301
Chavi Weingarten92c7d8c2024-01-19 23:25:45 +00001302TEST_F(LayerSnapshotTest, NonVisibleLayerWithInput) {
1303 LayerHierarchyTestBase::createRootLayer(3);
1304 setColor(3, {-1._hf, -1._hf, -1._hf});
1305 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1306
1307 std::vector<TransactionState> transactions;
1308 transactions.emplace_back();
1309 transactions.back().states.push_back({});
1310 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
1311 transactions.back().states.front().layerId = 3;
1312 transactions.back().states.front().state.windowInfoHandle = sp<gui::WindowInfoHandle>::make();
1313 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
1314 inputInfo->token = sp<BBinder>::make();
1315 mLifecycleManager.applyTransactions(transactions);
1316
1317 update(mSnapshotBuilder);
1318
1319 bool foundInputLayer = false;
1320 mSnapshotBuilder.forEachInputSnapshot([&](const frontend::LayerSnapshot& snapshot) {
1321 if (snapshot.uniqueSequence == 3) {
1322 foundInputLayer = true;
1323 }
1324 });
1325 EXPECT_TRUE(foundInputLayer);
1326}
1327
Vishnu Nair59a6be32024-01-29 10:26:21 -08001328TEST_F(LayerSnapshotTest, canOccludePresentation) {
1329 setFlags(12, layer_state_t::eCanOccludePresentation, layer_state_t::eCanOccludePresentation);
1330 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1331 .layerLifecycleManager = mLifecycleManager,
1332 .includeMetadata = false,
1333 .displays = mFrontEndDisplayInfos,
1334 .displayChanges = false,
1335 .globalShadowSettings = globalShadowSettings,
1336 .supportsBlur = true,
1337 .supportedLayerGenericMetadata = {},
1338 .genericLayerMetadataKeyMap = {}};
1339 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1340
1341 EXPECT_EQ(getSnapshot(1)->inputInfo.canOccludePresentation, false);
1342
1343 // ensure we can set the property on the window info for layer and all its children
1344 EXPECT_EQ(getSnapshot(12)->inputInfo.canOccludePresentation, true);
1345 EXPECT_EQ(getSnapshot(121)->inputInfo.canOccludePresentation, true);
1346 EXPECT_EQ(getSnapshot(1221)->inputInfo.canOccludePresentation, true);
1347}
1348
Vishnu Nair491827d2024-04-29 23:43:26 +00001349TEST_F(LayerSnapshotTest, mirroredHierarchyIgnoresLocalTransform) {
1350 SET_FLAG_FOR_TEST(flags::detached_mirror, true);
1351 reparentLayer(12, UNASSIGNED_LAYER_ID);
1352 setPosition(11, 2, 20);
1353 setPosition(111, 20, 200);
1354 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
1355 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
1356 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
1357
1358 // mirror root has no position set
1359 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->localTransform.tx(), 0);
1360 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->localTransform.ty(), 0);
1361 // original root still has a position
1362 EXPECT_EQ(getSnapshot({.id = 11})->localTransform.tx(), 2);
1363 EXPECT_EQ(getSnapshot({.id = 11})->localTransform.ty(), 20);
1364
1365 // mirror child still has the correct position
1366 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->localTransform.tx(), 20);
1367 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->localTransform.ty(), 200);
1368 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->geomLayerTransform.tx(), 20);
1369 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 14u})->geomLayerTransform.ty(), 200);
1370
1371 // original child still has the correct position including its parent's position
1372 EXPECT_EQ(getSnapshot({.id = 111})->localTransform.tx(), 20);
1373 EXPECT_EQ(getSnapshot({.id = 111})->localTransform.ty(), 200);
1374 EXPECT_EQ(getSnapshot({.id = 111})->geomLayerTransform.tx(), 22);
1375 EXPECT_EQ(getSnapshot({.id = 111})->geomLayerTransform.ty(), 220);
1376}
1377
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001378} // namespace android::surfaceflinger::frontend