blob: 3baa48d002f506c63982cd77854cd529ad568452 [file] [log] [blame]
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
Vishnu Nair0808ae62023-08-07 21:42:42 -070020#include <renderengine/mock/FakeExternalTexture.h>
21
Vishnu Nair8fc721b2022-12-22 20:06:32 +000022#include "FrontEnd/LayerHierarchy.h"
23#include "FrontEnd/LayerLifecycleManager.h"
24#include "FrontEnd/LayerSnapshotBuilder.h"
Vishnu Nair3d8565a2023-06-30 07:23:24 +000025#include "Layer.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000026#include "LayerHierarchyTest.h"
Vishnu Nair3996ee32023-08-14 04:32:31 +000027#include "ui/GraphicTypes.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000028
29#define UPDATE_AND_VERIFY(BUILDER, ...) \
30 ({ \
31 SCOPED_TRACE(""); \
32 updateAndVerify((BUILDER), /*displayChanges=*/false, __VA_ARGS__); \
33 })
34
35#define UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(BUILDER, ...) \
36 ({ \
37 SCOPED_TRACE(""); \
38 updateAndVerify((BUILDER), /*displayChanges=*/true, __VA_ARGS__); \
39 })
40
41namespace android::surfaceflinger::frontend {
42
Vishnu Naircfb2d252023-01-19 04:44:02 +000043using ftl::Flags;
44using namespace ftl::flag_operators;
45
Vishnu Nair8fc721b2022-12-22 20:06:32 +000046// To run test:
47/**
48 mp :libsurfaceflinger_unittest && adb sync; adb shell \
49 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
50 --gtest_filter="LayerSnapshotTest.*" --gtest_brief=1
51*/
52
Vishnu Nair47b7bb42023-09-29 16:27:33 -070053class LayerSnapshotTest : public LayerSnapshotTestBase {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000054protected:
Vishnu Nair47b7bb42023-09-29 16:27:33 -070055 LayerSnapshotTest() : LayerSnapshotTestBase() {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000056 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
57 }
58
Vishnu Nair0808ae62023-08-07 21:42:42 -070059 void update(LayerSnapshotBuilder& actualBuilder, LayerSnapshotBuilder::Args& args) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000060 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
Vishnu Naira0292282023-12-16 14:32:00 -080061 mHierarchyBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +000062 }
Vishnu Nair0808ae62023-08-07 21:42:42 -070063 args.root = mHierarchyBuilder.getHierarchy();
64 actualBuilder.update(args);
65 }
66
Chavi Weingarten92c7d8c2024-01-19 23:25:45 +000067 void update(LayerSnapshotBuilder& actualBuilder) {
68 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
69 .layerLifecycleManager = mLifecycleManager,
70 .includeMetadata = false,
71 .displays = mFrontEndDisplayInfos,
72 .globalShadowSettings = globalShadowSettings,
73 .supportsBlur = true,
74 .supportedLayerGenericMetadata = {},
75 .genericLayerMetadataKeyMap = {}};
76 update(actualBuilder, args);
77 }
78
Vishnu Nair0808ae62023-08-07 21:42:42 -070079 void updateAndVerify(LayerSnapshotBuilder& actualBuilder, bool hasDisplayChanges,
80 const std::vector<uint32_t> expectedVisibleLayerIdsInZOrder) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +000081 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
82 .layerLifecycleManager = mLifecycleManager,
83 .includeMetadata = false,
84 .displays = mFrontEndDisplayInfos,
85 .displayChanges = hasDisplayChanges,
86 .globalShadowSettings = globalShadowSettings,
Vishnu Nair444f3952023-04-11 13:01:02 -070087 .supportsBlur = true,
Vishnu Nairc765c6c2023-02-23 00:08:01 +000088 .supportedLayerGenericMetadata = {},
89 .genericLayerMetadataKeyMap = {}};
Vishnu Nair0808ae62023-08-07 21:42:42 -070090 update(actualBuilder, args);
Vishnu Nair8fc721b2022-12-22 20:06:32 +000091
92 // rebuild layer snapshots from scratch and verify that it matches the updated state.
93 LayerSnapshotBuilder expectedBuilder(args);
94 mLifecycleManager.commitChanges();
95 ASSERT_TRUE(expectedBuilder.getSnapshots().size() > 0);
96 ASSERT_TRUE(actualBuilder.getSnapshots().size() > 0);
97
Vishnu Nair8fc721b2022-12-22 20:06:32 +000098 std::vector<uint32_t> actualVisibleLayerIdsInZOrder;
Vishnu Naircfb2d252023-01-19 04:44:02 +000099 actualBuilder.forEachVisibleSnapshot(
100 [&actualVisibleLayerIdsInZOrder](const LayerSnapshot& snapshot) {
101 actualVisibleLayerIdsInZOrder.push_back(snapshot.path.id);
102 });
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000103 EXPECT_EQ(expectedVisibleLayerIdsInZOrder, actualVisibleLayerIdsInZOrder);
104 }
105
106 LayerSnapshot* getSnapshot(uint32_t layerId) { return mSnapshotBuilder.getSnapshot(layerId); }
Vishnu Nair92990e22023-02-24 20:01:05 +0000107 LayerSnapshot* getSnapshot(const LayerHierarchy::TraversalPath path) {
108 return mSnapshotBuilder.getSnapshot(path);
109 }
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000110 LayerSnapshotBuilder mSnapshotBuilder;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000111 static const std::vector<uint32_t> STARTING_ZORDER;
112};
113const std::vector<uint32_t> LayerSnapshotTest::STARTING_ZORDER = {1, 11, 111, 12, 121,
114 122, 1221, 13, 2};
115
116TEST_F(LayerSnapshotTest, buildSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000117 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
118 .layerLifecycleManager = mLifecycleManager,
119 .includeMetadata = false,
120 .displays = mFrontEndDisplayInfos,
121 .globalShadowSettings = globalShadowSettings,
122 .supportedLayerGenericMetadata = {},
123 .genericLayerMetadataKeyMap = {}};
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000124 LayerSnapshotBuilder builder(args);
125}
126
127TEST_F(LayerSnapshotTest, updateSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000128 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
129 .layerLifecycleManager = mLifecycleManager,
130 .includeMetadata = false,
131 .displays = mFrontEndDisplayInfos,
132 .globalShadowSettings = globalShadowSettings,
133 .supportedLayerGenericMetadata = {},
134 .genericLayerMetadataKeyMap = {}
135
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000136 };
137
138 LayerSnapshotBuilder builder;
139 builder.update(args);
140}
141
142// update using parent snapshot data
143TEST_F(LayerSnapshotTest, croppedByParent) {
144 /// MAKE ALL LAYERS VISIBLE BY DEFAULT
145 DisplayInfo info;
146 info.info.logicalHeight = 100;
147 info.info.logicalWidth = 200;
148 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
149 Rect layerCrop(0, 0, 10, 20);
150 setCrop(11, layerCrop);
151 EXPECT_TRUE(mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Geometry));
152 UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(mSnapshotBuilder, STARTING_ZORDER);
153 EXPECT_EQ(getSnapshot(11)->geomCrop, layerCrop);
154 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, layerCrop.toFloatRect());
155 float maxHeight = static_cast<float>(info.info.logicalHeight * 10);
156 float maxWidth = static_cast<float>(info.info.logicalWidth * 10);
157
158 FloatRect maxDisplaySize(-maxWidth, -maxHeight, maxWidth, maxHeight);
159 EXPECT_EQ(getSnapshot(1)->geomLayerBounds, maxDisplaySize);
160}
161
162// visibility tests
163TEST_F(LayerSnapshotTest, newLayerHiddenByPolicy) {
164 createLayer(112, 11);
165 hideLayer(112);
166 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
167
168 showLayer(112);
169 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 112, 12, 121, 122, 1221, 13, 2});
170}
171
172TEST_F(LayerSnapshotTest, hiddenByParent) {
173 hideLayer(11);
174 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
175}
176
177TEST_F(LayerSnapshotTest, reparentShowsChild) {
178 hideLayer(11);
179 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
180
181 showLayer(11);
182 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
183}
184
185TEST_F(LayerSnapshotTest, reparentHidesChild) {
186 hideLayer(11);
187 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
188
189 reparentLayer(121, 11);
190 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 122, 1221, 13, 2});
191}
192
193TEST_F(LayerSnapshotTest, unHidingUpdatesSnapshot) {
194 hideLayer(11);
195 Rect crop(1, 2, 3, 4);
196 setCrop(111, crop);
197 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
198
199 showLayer(11);
200 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
201 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, crop.toFloatRect());
202}
203
204TEST_F(LayerSnapshotTest, childBehindParentCanBeHiddenByParent) {
205 setZ(111, -1);
206 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 111, 11, 12, 121, 122, 1221, 13, 2});
207
208 hideLayer(11);
209 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
210}
211
212// relative tests
213TEST_F(LayerSnapshotTest, RelativeParentCanHideChild) {
214 reparentRelativeLayer(13, 11);
215 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
216
217 hideLayer(11);
218 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
219}
220
221TEST_F(LayerSnapshotTest, ReparentingToHiddenRelativeParentHidesChild) {
222 hideLayer(11);
223 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
224 reparentRelativeLayer(13, 11);
225 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
226}
227
228TEST_F(LayerSnapshotTest, AlphaInheritedByChildren) {
229 setAlpha(1, 0.5);
230 setAlpha(122, 0.5);
231 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700232 EXPECT_EQ(getSnapshot(1)->alpha, 0.5f);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000233 EXPECT_EQ(getSnapshot(12)->alpha, 0.5f);
234 EXPECT_EQ(getSnapshot(1221)->alpha, 0.25f);
235}
236
237// Change states
238TEST_F(LayerSnapshotTest, UpdateClearsPreviousChangeStates) {
239 setCrop(1, Rect(1, 2, 3, 4));
240 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700241 EXPECT_TRUE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
242 EXPECT_TRUE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000243 setCrop(2, Rect(1, 2, 3, 4));
244 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700245 EXPECT_TRUE(getSnapshot(2)->changes.test(RequestedLayerState::Changes::Geometry));
246 EXPECT_FALSE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
247 EXPECT_FALSE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000248}
249
250TEST_F(LayerSnapshotTest, FastPathClearsPreviousChangeStates) {
251 setColor(11, {1._hf, 0._hf, 0._hf});
252 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700253 EXPECT_EQ(getSnapshot(11)->changes, RequestedLayerState::Changes::Content);
254 EXPECT_EQ(getSnapshot(11)->clientChanges, layer_state_t::eColorChanged);
255 EXPECT_EQ(getSnapshot(1)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000256 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700257 EXPECT_EQ(getSnapshot(11)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000258}
259
260TEST_F(LayerSnapshotTest, FastPathSetsChangeFlagToContent) {
261 setColor(1, {1._hf, 0._hf, 0._hf});
262 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
263 EXPECT_EQ(getSnapshot(1)->changes, RequestedLayerState::Changes::Content);
Vishnu Naira02943f2023-06-03 13:44:46 -0700264 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eColorChanged);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000265}
266
Vishnu Naircfb2d252023-01-19 04:44:02 +0000267TEST_F(LayerSnapshotTest, GameMode) {
268 std::vector<TransactionState> transactions;
269 transactions.emplace_back();
270 transactions.back().states.push_back({});
271 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
272 transactions.back().states.front().state.metadata = LayerMetadata();
273 transactions.back().states.front().state.metadata.setInt32(METADATA_GAME_MODE, 42);
Vishnu Nair1391de22023-03-05 19:56:14 -0800274 transactions.back().states.front().layerId = 1;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000275 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
276 mLifecycleManager.applyTransactions(transactions);
Vishnu Naira02943f2023-06-03 13:44:46 -0700277 EXPECT_EQ(mLifecycleManager.getGlobalChanges(), RequestedLayerState::Changes::GameMode);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000278 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700279 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000280 EXPECT_EQ(static_cast<int32_t>(getSnapshot(1)->gameMode), 42);
281 EXPECT_EQ(static_cast<int32_t>(getSnapshot(11)->gameMode), 42);
282}
283
284TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotes) {
285 // ROOT
286 // ├── 1
287 // │ ├── 11 (frame rate set)
288 // │ │ └── 111
289 // │ ├── 12
290 // │ │ ├── 121
291 // │ │ └── 122
292 // │ │ └── 1221
293 // │ └── 13
294 // └── 2
295
Vishnu Nair30515cb2023-10-19 21:54:08 -0700296 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000297 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
298
Rachel Leece6e0042023-06-27 11:22:54 -0700299 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700300 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700301 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700302 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700303 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700304 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000305}
306
Vishnu Nair30515cb2023-10-19 21:54:08 -0700307TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotesDoesNotAffectSiblings) {
308 // ROOT
309 // ├── 1 (verify layer has no vote)
310 // │ ├── 11 (frame rate set)
311 // │ │ └── 111
312 // │ ├── 12 (frame rate set)
313 // │ │ ├── 121
314 // │ │ └── 122
315 // │ │ └── 1221
316 // │ └── 13 (verify layer has default vote)
317 // └── 2
318
319 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
320 setFrameRate(12, 45.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
321
322 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
323
324 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
325 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
326 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
327 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
328 EXPECT_EQ(getSnapshot(12)->frameRate.vote.rate.getIntValue(), 45);
329 EXPECT_EQ(getSnapshot(12)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
330 EXPECT_EQ(getSnapshot(121)->frameRate.vote.rate.getIntValue(), 45);
331 EXPECT_EQ(getSnapshot(121)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
332 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.rate.getIntValue(), 45);
333 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
334
335 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
336 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
337 EXPECT_EQ(getSnapshot(13)->frameRate.vote.rate.getIntValue(), 0);
338 EXPECT_EQ(getSnapshot(13)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
339 EXPECT_EQ(getSnapshot(2)->frameRate.vote.rate.getIntValue(), 0);
340 EXPECT_EQ(getSnapshot(2)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
341}
342
Vishnu Naira02943f2023-06-03 13:44:46 -0700343TEST_F(LayerSnapshotTest, CanCropTouchableRegion) {
Vishnu Nair29354ec2023-03-28 18:51:28 -0700344 // ROOT
345 // ├── 1
346 // │ ├── 11
347 // │ │ └── 111 (touchregion set to touch but cropped by layer 13)
348 // │ ├── 12
349 // │ │ ├── 121
350 // │ │ └── 122
351 // │ │ └── 1221
352 // │ └── 13 (crop set to touchCrop)
353 // └── 2
354
355 Rect touchCrop{300, 300, 400, 500};
356 setCrop(13, touchCrop);
357 Region touch{Rect{0, 0, 1000, 1000}};
358 setTouchableRegionCrop(111, touch, /*touchCropId=*/13, /*replaceTouchableRegionWithCrop=*/true);
359 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
360 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), touchCrop);
361
362 Rect modifiedTouchCrop{100, 300, 400, 700};
363 setCrop(13, modifiedTouchCrop);
364 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
365 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), modifiedTouchCrop);
366}
367
Chavi Weingarten1ba381e2024-01-09 21:54:11 +0000368TEST_F(LayerSnapshotTest, CanCropTouchableRegionWithDisplayTransform) {
369 DisplayInfo displayInfo;
370 displayInfo.transform = ui::Transform(ui::Transform::RotationFlags::ROT_90, 1000, 1000);
371 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), displayInfo);
372
373 Rect touchCrop{300, 300, 400, 500};
374 createRootLayer(3);
375 setCrop(3, touchCrop);
376 setLayerStack(3, 1);
377 Region touch{Rect{0, 0, 1000, 1000}};
378 setTouchableRegionCrop(3, touch, /*touchCropId=*/3, /*replaceTouchableRegionWithCrop=*/false);
379
380 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3});
381 Rect rotatedCrop = {500, 300, 700, 400};
382 EXPECT_EQ(getSnapshot({.id = 3})->inputInfo.touchableRegion.bounds(), rotatedCrop);
383}
384
Vishnu Nair444f3952023-04-11 13:01:02 -0700385TEST_F(LayerSnapshotTest, blurUpdatesWhenAlphaChanges) {
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700386 int blurRadius = 42;
387 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
Vishnu Nair444f3952023-04-11 13:01:02 -0700388
389 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
390 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
391
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700392 blurRadius = 21;
393 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
394 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
395 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
396
Vishnu Nair444f3952023-04-11 13:01:02 -0700397 static constexpr float alpha = 0.5;
398 setAlpha(12, alpha);
399 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700400 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius,
401 static_cast<int>(static_cast<float>(blurRadius) * alpha));
Vishnu Nair444f3952023-04-11 13:01:02 -0700402}
403
Vishnu Naira9c43762023-01-27 19:10:25 +0000404// Display Mirroring Tests
405// tree with 3 levels of children
406// ROOT (DISPLAY 0)
407// ├── 1
408// │ ├── 11
409// │ │ └── 111
410// │ ├── 12 (has skip screenshot flag)
411// │ │ ├── 121
412// │ │ └── 122
413// │ │ └── 1221
414// │ └── 13
415// └── 2
416// ROOT (DISPLAY 1)
417// └── 3 (mirrors display 0)
Vishnu Nair92990e22023-02-24 20:01:05 +0000418TEST_F(LayerSnapshotTest, displayMirrorRespectsLayerSkipScreenshotFlag) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000419 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
420 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
421 setLayerStack(3, 1);
422
Vishnu Nair444f3952023-04-11 13:01:02 -0700423 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 +0000424 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
425}
426
Vishnu Nair92990e22023-02-24 20:01:05 +0000427// ROOT (DISPLAY 0)
428// ├── 1
429// │ ├── 11
430// │ │ └── 111
431// │ └── 13
432// └── 2
433// ROOT (DISPLAY 3)
434// └── 3 (mirrors display 0)
435TEST_F(LayerSnapshotTest, mirrorLayerGetsCorrectLayerStack) {
436 reparentLayer(12, UNASSIGNED_LAYER_ID);
437 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
438 setLayerStack(3, 3);
439 createDisplayMirrorLayer(4, ui::LayerStack::fromValue(0));
440 setLayerStack(4, 4);
441
Vishnu Nair444f3952023-04-11 13:01:02 -0700442 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111,
443 13, 2, 4, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000444 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
Vishnu Nair6f878312023-09-08 11:05:01 -0700445 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
446 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 4u})->outputFilter.layerStack.id, 4u);
Vishnu Nair92990e22023-02-24 20:01:05 +0000447}
448
449// ROOT (DISPLAY 0)
450// ├── 1 (crop 50x50)
451// │ ├── 11
452// │ │ └── 111
453// │ └── 13
454// └── 2
455// ROOT (DISPLAY 3)
456// └── 3 (mirrors display 0) (crop 100x100)
457TEST_F(LayerSnapshotTest, mirrorLayerTouchIsCroppedByMirrorRoot) {
458 reparentLayer(12, UNASSIGNED_LAYER_ID);
459 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
460 setLayerStack(3, 3);
461 setCrop(1, Rect{50, 50});
462 setCrop(3, Rect{100, 100});
463 setCrop(111, Rect{200, 200});
464 Region touch{Rect{0, 0, 1000, 1000}};
465 setTouchableRegion(111, touch);
Vishnu Nair444f3952023-04-11 13:01:02 -0700466 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000467 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
468 EXPECT_TRUE(getSnapshot({.id = 111})->inputInfo.touchableRegion.hasSameRects(touch));
469 Region touchCroppedByMirrorRoot{Rect{0, 0, 50, 50}};
Vishnu Nair6f878312023-09-08 11:05:01 -0700470 EXPECT_TRUE(getSnapshot({.id = 111, .mirrorRootIds = 3u})
Vishnu Nair92990e22023-02-24 20:01:05 +0000471 ->inputInfo.touchableRegion.hasSameRects(touchCroppedByMirrorRoot));
472}
473
474TEST_F(LayerSnapshotTest, canRemoveDisplayMirror) {
475 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
476 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
477 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700478 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 +0000479 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
480 destroyLayerHandle(3);
481 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
482}
483
Vishnu Nairfccd6362023-02-24 23:39:53 +0000484TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterMirroring) {
485 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
486 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
487 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700488 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3,
489 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nairfccd6362023-02-24 23:39:53 +0000490 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
491 destroyLayerHandle(3);
492 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
493
494 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
495}
496
Vishnu Nair6f878312023-09-08 11:05:01 -0700497TEST_F(LayerSnapshotTest, canMirrorDisplayWithMirrors) {
498 reparentLayer(12, UNASSIGNED_LAYER_ID);
499 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
500 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
501 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
502
503 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
504 setLayerStack(3, 3);
505 expected = {1, 11, 111, 13, 14, 11, 111, 2, 3, 1, 11, 111, 13, 14, 11, 111, 2};
506 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
507 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->outputFilter.layerStack.id, 0u);
508 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
509 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u, 14u})->outputFilter.layerStack.id, 3u);
510}
511
Vishnu Nairfccd6362023-02-24 23:39:53 +0000512// Rel z doesn't create duplicate snapshots but this is for completeness
513TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterRelZ) {
514 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
515 reparentRelativeLayer(13, 11);
516 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
517 setZ(13, 0);
518 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
519
520 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
521}
522
523TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterLayerDestruction) {
524 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
525 destroyLayerHandle(2);
526 destroyLayerHandle(122);
527
528 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13};
529 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
530
531 EXPECT_LE(startingNumSnapshots - 2, mSnapshotBuilder.getSnapshots().size());
532}
533
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000534TEST_F(LayerSnapshotTest, snashotContainsMetadataFromLayerCreationArgs) {
535 LayerCreationArgs args(std::make_optional<uint32_t>(200));
536 args.name = "testlayer";
537 args.addToRoot = true;
538 args.metadata.setInt32(42, 24);
539
540 std::vector<std::unique_ptr<RequestedLayerState>> layers;
541 layers.emplace_back(std::make_unique<RequestedLayerState>(args));
542 EXPECT_TRUE(layers.back()->metadata.has(42));
543 EXPECT_EQ(layers.back()->metadata.getInt32(42, 0), 24);
544 mLifecycleManager.addLayers(std::move(layers));
545
546 std::vector<uint32_t> expected = STARTING_ZORDER;
547 expected.push_back(200);
548 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
549
550 EXPECT_TRUE(mSnapshotBuilder.getSnapshot(200)->layerMetadata.has(42));
551 EXPECT_EQ(mSnapshotBuilder.getSnapshot(200)->layerMetadata.getInt32(42, 0), 24);
552}
553
554TEST_F(LayerSnapshotTest, frameRateSelectionPriorityPassedToChildLayers) {
555 setFrameRateSelectionPriority(11, 1);
556
557 setFrameRateSelectionPriority(12, 2);
558
559 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
560 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
561 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
562 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
563 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 2);
564 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 2);
565
566 // reparent and verify the child gets the new parent's framerate selection priority
567 reparentLayer(122, 11);
568
569 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
570 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
571 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
572 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
573 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
574 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 1);
575 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 1);
576}
577
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000578TEST_F(LayerSnapshotTest, framerate) {
579 setFrameRate(11, 244.f, 0, 0);
580
581 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
582 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700583 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
584 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700585 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000586 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
587
588 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700589 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
590 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
591 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700592 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000593 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
594
Rachel Leece6e0042023-06-27 11:22:54 -0700595 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
596 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
597 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700598 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000599 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
600
601 // reparent and verify the child gets the new parent's framerate
602 reparentLayer(122, 11);
603
604 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
605 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
606 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700607 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
608 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700609 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000610
611 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700612 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
613 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
614 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700615 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000616
Rachel Leece6e0042023-06-27 11:22:54 -0700617 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
618 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
619 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700620 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000621
Rachel Leece6e0042023-06-27 11:22:54 -0700622 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
623 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
624 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700625 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000626 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
627
628 // reparent and verify the new parent gets no vote
629 reparentLayer(11, 2);
630 expected = {1, 12, 121, 13, 2, 11, 111, 122, 1221};
631 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
632
633 // verify old parent has invalid framerate (default)
Rachel Leece6e0042023-06-27 11:22:54 -0700634 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
635 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700636 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000637 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
638
639 // verify new parent get no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700640 EXPECT_FALSE(getSnapshot({.id = 2})->frameRate.vote.rate.isValid());
641 EXPECT_EQ(getSnapshot({.id = 2})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700642 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000643 EXPECT_TRUE(getSnapshot({.id = 2})->changes.test(RequestedLayerState::Changes::FrameRate));
644
645 // verify layer and children get the requested votes (unchanged)
Rachel Leece6e0042023-06-27 11:22:54 -0700646 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
647 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
648 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700649 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000650
Rachel Leece6e0042023-06-27 11:22:54 -0700651 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
652 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
653 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700654 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000655
Rachel Leece6e0042023-06-27 11:22:54 -0700656 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
657 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
658 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700659 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000660}
661
Vishnu Nair3996ee32023-08-14 04:32:31 +0000662TEST_F(LayerSnapshotTest, translateDataspace) {
663 setDataspace(1, ui::Dataspace::UNKNOWN);
664 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
665 EXPECT_EQ(getSnapshot({.id = 1})->dataspace, ui::Dataspace::V0_SRGB);
666}
667
Rachel Leece6e0042023-06-27 11:22:54 -0700668// This test is similar to "frameRate" test case but checks that the setFrameRateCategory API
669// interaction also works correctly with the setFrameRate API within SF frontend.
670TEST_F(LayerSnapshotTest, frameRateWithCategory) {
671 // ROOT
672 // ├── 1
673 // │ ├── 11 (frame rate set to 244.f)
674 // │ │ └── 111
675 // │ ├── 12
676 // │ │ ├── 121
677 // │ │ └── 122 (frame rate category set to Normal)
678 // │ │ └── 1221
679 // │ └── 13
680 // └── 2
681 setFrameRate(11, 244.f, 0, 0);
Rachel Lee9580ff12023-12-26 17:33:41 -0800682 setFrameRateCategory(122, ANATIVEWINDOW_FRAME_RATE_CATEGORY_NORMAL);
Rachel Leece6e0042023-06-27 11:22:54 -0700683
684 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
685 // verify parent 1 gets no vote
686 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
687 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700688 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700689 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
690
691 // verify layer 11 and children 111 get the requested votes
692 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
693 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
694 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700695 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700696 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
697
698 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
699 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
700 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700701 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700702 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
703
704 // verify parent 12 gets no vote
705 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
706 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700707 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700708 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
709
710 // verify layer 122 and children 1221 get the requested votes
711 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
712 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
713 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700714 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700715 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
716 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700717 EXPECT_TRUE(
718 getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700719
720 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
721 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
722 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700723 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700724 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
725 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700726 EXPECT_TRUE(
727 getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700728
729 // reparent and verify the child does NOT get the new parent's framerate because it already has
730 // the frame rate category specified.
731 // ROOT
732 // ├─1
733 // │ ├─11 (frame rate set to 244.f)
734 // │ │ ├─111
735 // │ │ └─122 (frame rate category set to Normal)
736 // │ │ └─1221
737 // │ ├─12
738 // │ │ └─121
739 // │ └─13
740 // └─2
741 reparentLayer(122, 11);
742
743 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
744 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
745 // verify parent is gets no vote
746 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
747 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700748 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700749
750 // verify layer 11 and children 111 get the requested votes
751 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
752 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
753 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700754 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700755
756 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
757 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
758 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700759 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700760
761 // verify layer 122 and children 1221 get the requested category vote (unchanged from
762 // reparenting)
763 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
764 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
765 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700766 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700767 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
768 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
769
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));
776}
777
Rachel Lee58cc90d2023-09-05 18:50:20 -0700778TEST_F(LayerSnapshotTest, frameRateSelectionStrategy) {
779 // ROOT
780 // ├── 1
781 // │ ├── 11
782 // │ │ └── 111
783 // │ ├── 12 (frame rate set to 244.f with strategy OverrideChildren)
784 // │ │ ├── 121
785 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
786 // │ │ └── 1221
787 // │ └── 13
788 // └── 2
789 setFrameRate(12, 244.f, 0, 0);
790 setFrameRate(122, 123.f, 0, 0);
791 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
792
793 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
794 // verify parent 1 gets no vote
795 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
796 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700797 scheduler::FrameRateCompatibility::NoVote);
Rachel Lee58cc90d2023-09-05 18:50:20 -0700798 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
799
800 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
801 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
802 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
803 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
804 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
805
806 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
807 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
808 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
809 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
810
811 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
812 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
813 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
814 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
815
816 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
817 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
818 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
819 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Vishnu Nair41376b62023-11-08 05:08:58 -0800820
821 // ROOT
822 // ├── 1
823 // │ ├── 11
824 // │ │ └── 111
825 // │ ├── 12 (frame rate set to default with strategy default)
826 // │ │ ├── 121
827 // │ │ └── 122 (frame rate set to 123.f)
828 // │ │ └── 1221
829 // │ └── 13
830 // └── 2
831 setFrameRate(12, -1.f, 0, 0);
832 setFrameRateSelectionStrategy(12, 0 /* Default */);
833 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
834 // verify parent 1 gets no vote
835 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
836 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
837 scheduler::FrameRateCompatibility::NoVote);
838 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
839
840 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
841 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
842 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
843 scheduler::FrameRateCompatibility::NoVote);
844 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800845 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800846 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
847
848 EXPECT_FALSE(getSnapshot({.id = 121})->frameRate.vote.rate.isValid());
849 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800850 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800851 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
852 scheduler::FrameRateCompatibility::Default);
853 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
854
855 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
856 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800857 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800858 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
859
860 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
861 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800862 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800863 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
864}
865
866TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithCategory) {
867 // ROOT
868 // ├── 1
869 // │ ├── 11
870 // │ │ └── 111
871 // │ ├── 12 (frame rate category set to high with strategy OverrideChildren)
872 // │ │ ├── 121
873 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
874 // │ │ └── 1221
875 // │ └── 13
876 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -0800877 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_HIGH);
Vishnu Nair41376b62023-11-08 05:08:58 -0800878 setFrameRate(122, 123.f, 0, 0);
879 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
880
881 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
882 // verify parent 1 gets no vote
883 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
884 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
885 scheduler::FrameRateCompatibility::NoVote);
886 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
887
888 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
889 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::High);
890 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
891 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
892 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
893
894 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::High);
895 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
896 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
897 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
898
899 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::High);
900 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
901 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
902 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
903
904 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::High);
905 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
906 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
907 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
908
909 // ROOT
910 // ├── 1
911 // │ ├── 11
912 // │ │ └── 111
913 // │ ├── 12 (frame rate category to default with strategy default)
914 // │ │ ├── 121
915 // │ │ └── 122 (frame rate set to 123.f)
916 // │ │ └── 1221
917 // │ └── 13
918 // └── 2
Rachel Lee9580ff12023-12-26 17:33:41 -0800919 setFrameRateCategory(12, ANATIVEWINDOW_FRAME_RATE_CATEGORY_DEFAULT);
Vishnu Nair41376b62023-11-08 05:08:58 -0800920 setFrameRateSelectionStrategy(12, 0 /* Default */);
921 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
922 // verify parent 1 gets no vote
923 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
924 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
925 scheduler::FrameRateCompatibility::NoVote);
926 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.category, FrameRateCategory::Default);
927 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
928
929 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
930 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
931 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
932 scheduler::FrameRateCompatibility::NoVote);
933 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::Default);
934 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800935 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800936 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
937
938 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
939 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800940 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800941 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::Default);
942 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
943 scheduler::FrameRateCompatibility::Default);
944 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
945
946 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
947 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800948 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800949 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Default);
950 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
951
952 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
953 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800954 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800955 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Default);
956 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee58cc90d2023-09-05 18:50:20 -0700957}
958
Rachel Lee70f7b692023-11-22 11:24:02 -0800959TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithOverrideChildrenAndSelf) {
Rachel Leea021bb02023-11-20 21:51:09 -0800960 // ROOT
961 // ├── 1
Rachel Lee70f7b692023-11-22 11:24:02 -0800962 // │ ├── 11 (frame rate set to 11.f with strategy Self)
Rachel Leea021bb02023-11-20 21:51:09 -0800963 // │ │ └── 111 (frame rate is not inherited)
964 // │ ├── 12 (frame rate set to 244.f)
965 // │ │ ├── 121
966 // │ │ └── 122 (strategy OverrideChildren and inherits frame rate 244.f)
967 // │ │ └── 1221 (frame rate set to 123.f but should be overridden by layer 122)
968 // │ └── 13
969 // └── 2
970 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -0800971 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -0800972 setFrameRate(12, 244.f, 0, 0);
973 setFrameRateSelectionStrategy(122, 1 /* OverrideChildren */);
974 setFrameRate(1221, 123.f, 0, 0);
975
976 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
977 // verify parent 1 gets no vote
978 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
979 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
980 scheduler::FrameRateCompatibility::NoVote);
981 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800982 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800983 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
984
985 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 11.f);
986 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800987 scheduler::LayerInfo::FrameRateSelectionStrategy::Self);
Rachel Leea021bb02023-11-20 21:51:09 -0800988 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
989
990 // verify layer 11 does does not propagate its framerate to 111.
991 EXPECT_FALSE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
992 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800993 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800994 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
995
996 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
997 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
998 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800999 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001000 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
1001
1002 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
1003 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -08001004 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -08001005 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
1006
1007 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
1008 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
1009 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1010 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
1011
1012 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
1013 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
1014 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1015 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
1016
1017 // ROOT
1018 // ├── 1 (frame rate set to 1.f with strategy OverrideChildren)
Rachel Lee70f7b692023-11-22 11:24:02 -08001019 // │ ├── 11 (frame rate set to 11.f with strategy Self, but overridden by 1)
Rachel Leea021bb02023-11-20 21:51:09 -08001020 // │ │ └── 111 (frame rate inherited from 11 due to override from 1)
1021 // â‹® â‹®
1022 setFrameRate(1, 1.f, 0, 0);
1023 setFrameRateSelectionStrategy(1, 1 /* OverrideChildren */);
1024 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -08001025 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -08001026 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1027
1028 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.rate.getValue(), 1.f);
1029 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1030 scheduler::FrameRateCompatibility::Default);
1031 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
1032 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1033 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1034
1035 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 1.f);
1036 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
1037 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1038 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1039
1040 // verify layer 11 does does not propagate its framerate to 111.
1041 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 1.f);
1042 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
1043 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1044 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1045}
1046
Vishnu Nair0808ae62023-08-07 21:42:42 -07001047TEST_F(LayerSnapshotTest, skipRoundCornersWhenProtected) {
1048 setRoundedCorners(1, 42.f);
1049 setRoundedCorners(2, 42.f);
1050 setCrop(1, Rect{1000, 1000});
1051 setCrop(2, Rect{1000, 1000});
1052
1053 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1054 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1055 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1056 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1057
1058 // add a buffer with the protected bit, check rounded corners are not set when
1059 // skipRoundCornersWhenProtected == true
1060 setBuffer(1,
1061 std::make_shared<
1062 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1063 1ULL /* bufferId */,
1064 HAL_PIXEL_FORMAT_RGBA_8888,
1065 GRALLOC_USAGE_PROTECTED /*usage*/));
1066
1067 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1068 .layerLifecycleManager = mLifecycleManager,
1069 .includeMetadata = false,
1070 .displays = mFrontEndDisplayInfos,
1071 .displayChanges = false,
1072 .globalShadowSettings = globalShadowSettings,
1073 .supportsBlur = true,
1074 .supportedLayerGenericMetadata = {},
1075 .genericLayerMetadataKeyMap = {},
1076 .skipRoundCornersWhenProtected = true};
1077 update(mSnapshotBuilder, args);
1078 EXPECT_FALSE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1079 // layer 2 doesn't have a buffer and should be unaffected
1080 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1081
1082 // remove protected bit, check rounded corners are set
1083 setBuffer(1,
1084 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1085 2ULL /* bufferId */,
1086 HAL_PIXEL_FORMAT_RGBA_8888,
1087 0 /*usage*/));
1088 update(mSnapshotBuilder, args);
1089 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1090 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1091}
1092
Vishnu Nairbd51f952023-08-31 22:50:14 -07001093TEST_F(LayerSnapshotTest, setRefreshRateIndicatorCompositionType) {
1094 setFlags(1, layer_state_t::eLayerIsRefreshRateIndicator,
1095 layer_state_t::eLayerIsRefreshRateIndicator);
1096 setBuffer(1,
1097 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1098 42ULL /* bufferId */,
1099 HAL_PIXEL_FORMAT_RGBA_8888,
1100 0 /*usage*/));
1101 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1102 EXPECT_EQ(getSnapshot({.id = 1})->compositionType,
1103 aidl::android::hardware::graphics::composer3::Composition::REFRESH_RATE_INDICATOR);
1104}
1105
Chavi Weingarten07597342023-09-14 21:10:59 +00001106TEST_F(LayerSnapshotTest, setBufferCrop) {
1107 // validate no buffer but has crop
1108 Rect crop = Rect(0, 0, 50, 50);
1109 setBufferCrop(1, crop);
1110 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1111 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1112
1113 setBuffer(1,
1114 std::make_shared<renderengine::mock::FakeExternalTexture>(100U /*width*/,
1115 100U /*height*/,
1116 42ULL /* bufferId */,
1117 HAL_PIXEL_FORMAT_RGBA_8888,
1118 0 /*usage*/));
1119 // validate a buffer crop within the buffer bounds
1120 setBufferCrop(1, crop);
1121 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1122 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1123
1124 // validate a buffer crop outside the buffer bounds
1125 crop = Rect(0, 0, 150, 150);
1126 setBufferCrop(1, crop);
1127 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1128 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1129
1130 // validate no buffer crop
1131 setBufferCrop(1, Rect());
1132 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1133 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1134}
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001135
1136TEST_F(LayerSnapshotTest, setShadowRadius) {
1137 static constexpr float SHADOW_RADIUS = 123.f;
1138 setShadowRadius(1, SHADOW_RADIUS);
1139 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1140 EXPECT_EQ(getSnapshot(1)->shadowSettings.length, SHADOW_RADIUS);
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001141}
1142
Chavi Weingartenb74093a2023-10-11 20:29:59 +00001143TEST_F(LayerSnapshotTest, setTrustedOverlayForNonVisibleInput) {
1144 hideLayer(1);
1145 setTrustedOverlay(1, true);
1146 Region touch{Rect{0, 0, 1000, 1000}};
1147 setTouchableRegion(1, touch);
1148
1149 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1150 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1151 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1152}
1153
Alec Mouri89f5d4e2023-10-20 17:12:49 +00001154TEST_F(LayerSnapshotTest, isFrontBuffered) {
1155 setBuffer(1,
1156 std::make_shared<renderengine::mock::FakeExternalTexture>(
1157 1U /*width*/, 1U /*height*/, 1ULL /* bufferId */, HAL_PIXEL_FORMAT_RGBA_8888,
1158 GRALLOC_USAGE_HW_TEXTURE | AHARDWAREBUFFER_USAGE_FRONT_BUFFER /*usage*/));
1159
1160 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1161 EXPECT_TRUE(getSnapshot(1)->isFrontBuffered());
1162
1163 setBuffer(1,
1164 std::make_shared<
1165 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1166 1ULL /* bufferId */,
1167 HAL_PIXEL_FORMAT_RGBA_8888,
1168 GRALLOC_USAGE_HW_TEXTURE /*usage*/));
1169
1170 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1171 EXPECT_FALSE(getSnapshot(1)->isFrontBuffered());
1172}
1173
Chavi Weingarten4aa22af2023-11-17 19:37:07 +00001174TEST_F(LayerSnapshotTest, setSecureRootSnapshot) {
1175 setFlags(1, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1176 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1177 .layerLifecycleManager = mLifecycleManager,
1178 .includeMetadata = false,
1179 .displays = mFrontEndDisplayInfos,
1180 .displayChanges = false,
1181 .globalShadowSettings = globalShadowSettings,
1182 .supportsBlur = true,
1183 .supportedLayerGenericMetadata = {},
1184 .genericLayerMetadataKeyMap = {}};
1185 args.rootSnapshot.isSecure = true;
1186 update(mSnapshotBuilder, args);
1187
1188 EXPECT_TRUE(getSnapshot(1)->isSecure);
1189 // Ensure child is also marked as secure
1190 EXPECT_TRUE(getSnapshot(11)->isSecure);
1191}
1192
Vishnu Nairf13c8982023-12-02 11:26:09 -08001193// b/314350323
1194TEST_F(LayerSnapshotTest, propagateDropInputMode) {
1195 setDropInputMode(1, gui::DropInputMode::ALL);
1196 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1197 .layerLifecycleManager = mLifecycleManager,
1198 .includeMetadata = false,
1199 .displays = mFrontEndDisplayInfos,
1200 .displayChanges = false,
1201 .globalShadowSettings = globalShadowSettings,
1202 .supportsBlur = true,
1203 .supportedLayerGenericMetadata = {},
1204 .genericLayerMetadataKeyMap = {}};
1205 args.rootSnapshot.isSecure = true;
1206 update(mSnapshotBuilder, args);
1207
1208 EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL);
1209 // Ensure child also has the correct drop input mode regardless of whether either layer has
1210 // an input channel
1211 EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL);
1212}
1213
Chavi Weingarten92c7d8c2024-01-19 23:25:45 +00001214TEST_F(LayerSnapshotTest, NonVisibleLayerWithInput) {
1215 LayerHierarchyTestBase::createRootLayer(3);
1216 setColor(3, {-1._hf, -1._hf, -1._hf});
1217 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1218
1219 std::vector<TransactionState> transactions;
1220 transactions.emplace_back();
1221 transactions.back().states.push_back({});
1222 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
1223 transactions.back().states.front().layerId = 3;
1224 transactions.back().states.front().state.windowInfoHandle = sp<gui::WindowInfoHandle>::make();
1225 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
1226 inputInfo->token = sp<BBinder>::make();
1227 mLifecycleManager.applyTransactions(transactions);
1228
1229 update(mSnapshotBuilder);
1230
1231 bool foundInputLayer = false;
1232 mSnapshotBuilder.forEachInputSnapshot([&](const frontend::LayerSnapshot& snapshot) {
1233 if (snapshot.uniqueSequence == 3) {
1234 foundInputLayer = true;
1235 }
1236 });
1237 EXPECT_TRUE(foundInputLayer);
1238}
1239
Vishnu Nair59a6be32024-01-29 10:26:21 -08001240TEST_F(LayerSnapshotTest, canOccludePresentation) {
1241 setFlags(12, layer_state_t::eCanOccludePresentation, layer_state_t::eCanOccludePresentation);
1242 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1243 .layerLifecycleManager = mLifecycleManager,
1244 .includeMetadata = false,
1245 .displays = mFrontEndDisplayInfos,
1246 .displayChanges = false,
1247 .globalShadowSettings = globalShadowSettings,
1248 .supportsBlur = true,
1249 .supportedLayerGenericMetadata = {},
1250 .genericLayerMetadataKeyMap = {}};
1251 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1252
1253 EXPECT_EQ(getSnapshot(1)->inputInfo.canOccludePresentation, false);
1254
1255 // ensure we can set the property on the window info for layer and all its children
1256 EXPECT_EQ(getSnapshot(12)->inputInfo.canOccludePresentation, true);
1257 EXPECT_EQ(getSnapshot(121)->inputInfo.canOccludePresentation, true);
1258 EXPECT_EQ(getSnapshot(1221)->inputInfo.canOccludePresentation, true);
1259}
1260
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001261} // namespace android::surfaceflinger::frontend