blob: ba32c68b6145fc75c9207920a21714ef6db80b1f [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
67 void updateAndVerify(LayerSnapshotBuilder& actualBuilder, bool hasDisplayChanges,
68 const std::vector<uint32_t> expectedVisibleLayerIdsInZOrder) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +000069 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
70 .layerLifecycleManager = mLifecycleManager,
71 .includeMetadata = false,
72 .displays = mFrontEndDisplayInfos,
73 .displayChanges = hasDisplayChanges,
74 .globalShadowSettings = globalShadowSettings,
Vishnu Nair444f3952023-04-11 13:01:02 -070075 .supportsBlur = true,
Vishnu Nairc765c6c2023-02-23 00:08:01 +000076 .supportedLayerGenericMetadata = {},
77 .genericLayerMetadataKeyMap = {}};
Vishnu Nair0808ae62023-08-07 21:42:42 -070078 update(actualBuilder, args);
Vishnu Nair8fc721b2022-12-22 20:06:32 +000079
80 // rebuild layer snapshots from scratch and verify that it matches the updated state.
81 LayerSnapshotBuilder expectedBuilder(args);
82 mLifecycleManager.commitChanges();
83 ASSERT_TRUE(expectedBuilder.getSnapshots().size() > 0);
84 ASSERT_TRUE(actualBuilder.getSnapshots().size() > 0);
85
Vishnu Nair8fc721b2022-12-22 20:06:32 +000086 std::vector<uint32_t> actualVisibleLayerIdsInZOrder;
Vishnu Naircfb2d252023-01-19 04:44:02 +000087 actualBuilder.forEachVisibleSnapshot(
88 [&actualVisibleLayerIdsInZOrder](const LayerSnapshot& snapshot) {
89 actualVisibleLayerIdsInZOrder.push_back(snapshot.path.id);
90 });
Vishnu Nair8fc721b2022-12-22 20:06:32 +000091 EXPECT_EQ(expectedVisibleLayerIdsInZOrder, actualVisibleLayerIdsInZOrder);
92 }
93
94 LayerSnapshot* getSnapshot(uint32_t layerId) { return mSnapshotBuilder.getSnapshot(layerId); }
Vishnu Nair92990e22023-02-24 20:01:05 +000095 LayerSnapshot* getSnapshot(const LayerHierarchy::TraversalPath path) {
96 return mSnapshotBuilder.getSnapshot(path);
97 }
Vishnu Nair8fc721b2022-12-22 20:06:32 +000098 LayerSnapshotBuilder mSnapshotBuilder;
Vishnu Nair8fc721b2022-12-22 20:06:32 +000099 static const std::vector<uint32_t> STARTING_ZORDER;
100};
101const std::vector<uint32_t> LayerSnapshotTest::STARTING_ZORDER = {1, 11, 111, 12, 121,
102 122, 1221, 13, 2};
103
104TEST_F(LayerSnapshotTest, buildSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000105 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
106 .layerLifecycleManager = mLifecycleManager,
107 .includeMetadata = false,
108 .displays = mFrontEndDisplayInfos,
109 .globalShadowSettings = globalShadowSettings,
110 .supportedLayerGenericMetadata = {},
111 .genericLayerMetadataKeyMap = {}};
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000112 LayerSnapshotBuilder builder(args);
113}
114
115TEST_F(LayerSnapshotTest, updateSnapshot) {
Vishnu Nairc765c6c2023-02-23 00:08:01 +0000116 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
117 .layerLifecycleManager = mLifecycleManager,
118 .includeMetadata = false,
119 .displays = mFrontEndDisplayInfos,
120 .globalShadowSettings = globalShadowSettings,
121 .supportedLayerGenericMetadata = {},
122 .genericLayerMetadataKeyMap = {}
123
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000124 };
125
126 LayerSnapshotBuilder builder;
127 builder.update(args);
128}
129
130// update using parent snapshot data
131TEST_F(LayerSnapshotTest, croppedByParent) {
132 /// MAKE ALL LAYERS VISIBLE BY DEFAULT
133 DisplayInfo info;
134 info.info.logicalHeight = 100;
135 info.info.logicalWidth = 200;
136 mFrontEndDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info);
137 Rect layerCrop(0, 0, 10, 20);
138 setCrop(11, layerCrop);
139 EXPECT_TRUE(mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Geometry));
140 UPDATE_AND_VERIFY_WITH_DISPLAY_CHANGES(mSnapshotBuilder, STARTING_ZORDER);
141 EXPECT_EQ(getSnapshot(11)->geomCrop, layerCrop);
142 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, layerCrop.toFloatRect());
143 float maxHeight = static_cast<float>(info.info.logicalHeight * 10);
144 float maxWidth = static_cast<float>(info.info.logicalWidth * 10);
145
146 FloatRect maxDisplaySize(-maxWidth, -maxHeight, maxWidth, maxHeight);
147 EXPECT_EQ(getSnapshot(1)->geomLayerBounds, maxDisplaySize);
148}
149
150// visibility tests
151TEST_F(LayerSnapshotTest, newLayerHiddenByPolicy) {
152 createLayer(112, 11);
153 hideLayer(112);
154 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
155
156 showLayer(112);
157 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 111, 112, 12, 121, 122, 1221, 13, 2});
158}
159
160TEST_F(LayerSnapshotTest, hiddenByParent) {
161 hideLayer(11);
162 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
163}
164
165TEST_F(LayerSnapshotTest, reparentShowsChild) {
166 hideLayer(11);
167 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
168
169 showLayer(11);
170 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
171}
172
173TEST_F(LayerSnapshotTest, reparentHidesChild) {
174 hideLayer(11);
175 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
176
177 reparentLayer(121, 11);
178 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 122, 1221, 13, 2});
179}
180
181TEST_F(LayerSnapshotTest, unHidingUpdatesSnapshot) {
182 hideLayer(11);
183 Rect crop(1, 2, 3, 4);
184 setCrop(111, crop);
185 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
186
187 showLayer(11);
188 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
189 EXPECT_EQ(getSnapshot(111)->geomLayerBounds, crop.toFloatRect());
190}
191
192TEST_F(LayerSnapshotTest, childBehindParentCanBeHiddenByParent) {
193 setZ(111, -1);
194 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 111, 11, 12, 121, 122, 1221, 13, 2});
195
196 hideLayer(11);
197 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
198}
199
200// relative tests
201TEST_F(LayerSnapshotTest, RelativeParentCanHideChild) {
202 reparentRelativeLayer(13, 11);
203 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
204
205 hideLayer(11);
206 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
207}
208
209TEST_F(LayerSnapshotTest, ReparentingToHiddenRelativeParentHidesChild) {
210 hideLayer(11);
211 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 13, 2});
212 reparentRelativeLayer(13, 11);
213 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 12, 121, 122, 1221, 2});
214}
215
216TEST_F(LayerSnapshotTest, AlphaInheritedByChildren) {
217 setAlpha(1, 0.5);
218 setAlpha(122, 0.5);
219 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700220 EXPECT_EQ(getSnapshot(1)->alpha, 0.5f);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000221 EXPECT_EQ(getSnapshot(12)->alpha, 0.5f);
222 EXPECT_EQ(getSnapshot(1221)->alpha, 0.25f);
223}
224
225// Change states
226TEST_F(LayerSnapshotTest, UpdateClearsPreviousChangeStates) {
227 setCrop(1, Rect(1, 2, 3, 4));
228 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700229 EXPECT_TRUE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
230 EXPECT_TRUE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000231 setCrop(2, Rect(1, 2, 3, 4));
232 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700233 EXPECT_TRUE(getSnapshot(2)->changes.test(RequestedLayerState::Changes::Geometry));
234 EXPECT_FALSE(getSnapshot(1)->changes.test(RequestedLayerState::Changes::Geometry));
235 EXPECT_FALSE(getSnapshot(11)->changes.test(RequestedLayerState::Changes::Geometry));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000236}
237
238TEST_F(LayerSnapshotTest, FastPathClearsPreviousChangeStates) {
239 setColor(11, {1._hf, 0._hf, 0._hf});
240 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700241 EXPECT_EQ(getSnapshot(11)->changes, RequestedLayerState::Changes::Content);
242 EXPECT_EQ(getSnapshot(11)->clientChanges, layer_state_t::eColorChanged);
243 EXPECT_EQ(getSnapshot(1)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000244 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700245 EXPECT_EQ(getSnapshot(11)->changes.get(), 0u);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000246}
247
248TEST_F(LayerSnapshotTest, FastPathSetsChangeFlagToContent) {
249 setColor(1, {1._hf, 0._hf, 0._hf});
250 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
251 EXPECT_EQ(getSnapshot(1)->changes, RequestedLayerState::Changes::Content);
Vishnu Naira02943f2023-06-03 13:44:46 -0700252 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eColorChanged);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000253}
254
Vishnu Naircfb2d252023-01-19 04:44:02 +0000255TEST_F(LayerSnapshotTest, GameMode) {
256 std::vector<TransactionState> transactions;
257 transactions.emplace_back();
258 transactions.back().states.push_back({});
259 transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
260 transactions.back().states.front().state.metadata = LayerMetadata();
261 transactions.back().states.front().state.metadata.setInt32(METADATA_GAME_MODE, 42);
Vishnu Nair1391de22023-03-05 19:56:14 -0800262 transactions.back().states.front().layerId = 1;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000263 transactions.back().states.front().state.layerId = static_cast<int32_t>(1);
264 mLifecycleManager.applyTransactions(transactions);
Vishnu Naira02943f2023-06-03 13:44:46 -0700265 EXPECT_EQ(mLifecycleManager.getGlobalChanges(), RequestedLayerState::Changes::GameMode);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000266 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Naira02943f2023-06-03 13:44:46 -0700267 EXPECT_EQ(getSnapshot(1)->clientChanges, layer_state_t::eMetadataChanged);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000268 EXPECT_EQ(static_cast<int32_t>(getSnapshot(1)->gameMode), 42);
269 EXPECT_EQ(static_cast<int32_t>(getSnapshot(11)->gameMode), 42);
270}
271
272TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotes) {
273 // ROOT
274 // ├── 1
275 // │ ├── 11 (frame rate set)
276 // │ │ └── 111
277 // │ ├── 12
278 // │ │ ├── 121
279 // │ │ └── 122
280 // │ │ └── 1221
281 // │ └── 13
282 // └── 2
283
Vishnu Nair30515cb2023-10-19 21:54:08 -0700284 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000285 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
286
Rachel Leece6e0042023-06-27 11:22:54 -0700287 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700288 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700289 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700290 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
Rachel Leece6e0042023-06-27 11:22:54 -0700291 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700292 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000293}
294
Vishnu Nair30515cb2023-10-19 21:54:08 -0700295TEST_F(LayerSnapshotTest, NoLayerVoteForParentWithChildVotesDoesNotAffectSiblings) {
296 // ROOT
297 // ├── 1 (verify layer has no vote)
298 // │ ├── 11 (frame rate set)
299 // │ │ └── 111
300 // │ ├── 12 (frame rate set)
301 // │ │ ├── 121
302 // │ │ └── 122
303 // │ │ └── 1221
304 // │ └── 13 (verify layer has default vote)
305 // └── 2
306
307 setFrameRate(11, 90.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
308 setFrameRate(12, 45.0, ANATIVEWINDOW_FRAME_RATE_EXACT, ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS);
309
310 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
311
312 EXPECT_EQ(getSnapshot(11)->frameRate.vote.rate.getIntValue(), 90);
313 EXPECT_EQ(getSnapshot(11)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
314 EXPECT_EQ(getSnapshot(111)->frameRate.vote.rate.getIntValue(), 90);
315 EXPECT_EQ(getSnapshot(111)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
316 EXPECT_EQ(getSnapshot(12)->frameRate.vote.rate.getIntValue(), 45);
317 EXPECT_EQ(getSnapshot(12)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
318 EXPECT_EQ(getSnapshot(121)->frameRate.vote.rate.getIntValue(), 45);
319 EXPECT_EQ(getSnapshot(121)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
320 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.rate.getIntValue(), 45);
321 EXPECT_EQ(getSnapshot(1221)->frameRate.vote.type, scheduler::FrameRateCompatibility::Exact);
322
323 EXPECT_EQ(getSnapshot(1)->frameRate.vote.rate.getIntValue(), 0);
324 EXPECT_EQ(getSnapshot(1)->frameRate.vote.type, scheduler::FrameRateCompatibility::NoVote);
325 EXPECT_EQ(getSnapshot(13)->frameRate.vote.rate.getIntValue(), 0);
326 EXPECT_EQ(getSnapshot(13)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
327 EXPECT_EQ(getSnapshot(2)->frameRate.vote.rate.getIntValue(), 0);
328 EXPECT_EQ(getSnapshot(2)->frameRate.vote.type, scheduler::FrameRateCompatibility::Default);
329}
330
Vishnu Naira02943f2023-06-03 13:44:46 -0700331TEST_F(LayerSnapshotTest, CanCropTouchableRegion) {
Vishnu Nair29354ec2023-03-28 18:51:28 -0700332 // ROOT
333 // ├── 1
334 // │ ├── 11
335 // │ │ └── 111 (touchregion set to touch but cropped by layer 13)
336 // │ ├── 12
337 // │ │ ├── 121
338 // │ │ └── 122
339 // │ │ └── 1221
340 // │ └── 13 (crop set to touchCrop)
341 // └── 2
342
343 Rect touchCrop{300, 300, 400, 500};
344 setCrop(13, touchCrop);
345 Region touch{Rect{0, 0, 1000, 1000}};
346 setTouchableRegionCrop(111, touch, /*touchCropId=*/13, /*replaceTouchableRegionWithCrop=*/true);
347 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
348 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), touchCrop);
349
350 Rect modifiedTouchCrop{100, 300, 400, 700};
351 setCrop(13, modifiedTouchCrop);
352 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
353 EXPECT_EQ(getSnapshot({.id = 111})->inputInfo.touchableRegion.bounds(), modifiedTouchCrop);
354}
355
Vishnu Nair444f3952023-04-11 13:01:02 -0700356TEST_F(LayerSnapshotTest, blurUpdatesWhenAlphaChanges) {
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700357 int blurRadius = 42;
358 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
Vishnu Nair444f3952023-04-11 13:01:02 -0700359
360 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
361 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
362
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700363 blurRadius = 21;
364 setBackgroundBlurRadius(1221, static_cast<uint32_t>(blurRadius));
365 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
366 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius, blurRadius);
367
Vishnu Nair444f3952023-04-11 13:01:02 -0700368 static constexpr float alpha = 0.5;
369 setAlpha(12, alpha);
370 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700371 EXPECT_EQ(getSnapshot({.id = 1221})->backgroundBlurRadius,
372 static_cast<int>(static_cast<float>(blurRadius) * alpha));
Vishnu Nair444f3952023-04-11 13:01:02 -0700373}
374
Vishnu Naira9c43762023-01-27 19:10:25 +0000375// Display Mirroring Tests
376// tree with 3 levels of children
377// ROOT (DISPLAY 0)
378// ├── 1
379// │ ├── 11
380// │ │ └── 111
381// │ ├── 12 (has skip screenshot flag)
382// │ │ ├── 121
383// │ │ └── 122
384// │ │ └── 1221
385// │ └── 13
386// └── 2
387// ROOT (DISPLAY 1)
388// └── 3 (mirrors display 0)
Vishnu Nair92990e22023-02-24 20:01:05 +0000389TEST_F(LayerSnapshotTest, displayMirrorRespectsLayerSkipScreenshotFlag) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000390 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
391 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
392 setLayerStack(3, 1);
393
Vishnu Nair444f3952023-04-11 13:01:02 -0700394 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 +0000395 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
396}
397
Vishnu Nair92990e22023-02-24 20:01:05 +0000398// ROOT (DISPLAY 0)
399// ├── 1
400// │ ├── 11
401// │ │ └── 111
402// │ └── 13
403// └── 2
404// ROOT (DISPLAY 3)
405// └── 3 (mirrors display 0)
406TEST_F(LayerSnapshotTest, mirrorLayerGetsCorrectLayerStack) {
407 reparentLayer(12, UNASSIGNED_LAYER_ID);
408 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
409 setLayerStack(3, 3);
410 createDisplayMirrorLayer(4, ui::LayerStack::fromValue(0));
411 setLayerStack(4, 4);
412
Vishnu Nair444f3952023-04-11 13:01:02 -0700413 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111,
414 13, 2, 4, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000415 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
Vishnu Nair6f878312023-09-08 11:05:01 -0700416 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
417 EXPECT_EQ(getSnapshot({.id = 111, .mirrorRootIds = 4u})->outputFilter.layerStack.id, 4u);
Vishnu Nair92990e22023-02-24 20:01:05 +0000418}
419
420// ROOT (DISPLAY 0)
421// ├── 1 (crop 50x50)
422// │ ├── 11
423// │ │ └── 111
424// │ └── 13
425// └── 2
426// ROOT (DISPLAY 3)
427// └── 3 (mirrors display 0) (crop 100x100)
428TEST_F(LayerSnapshotTest, mirrorLayerTouchIsCroppedByMirrorRoot) {
429 reparentLayer(12, UNASSIGNED_LAYER_ID);
430 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
431 setLayerStack(3, 3);
432 setCrop(1, Rect{50, 50});
433 setCrop(3, Rect{100, 100});
434 setCrop(111, Rect{200, 200});
435 Region touch{Rect{0, 0, 1000, 1000}};
436 setTouchableRegion(111, touch);
Vishnu Nair444f3952023-04-11 13:01:02 -0700437 std::vector<uint32_t> expected = {1, 11, 111, 13, 2, 3, 1, 11, 111, 13, 2};
Vishnu Nair92990e22023-02-24 20:01:05 +0000438 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
439 EXPECT_TRUE(getSnapshot({.id = 111})->inputInfo.touchableRegion.hasSameRects(touch));
440 Region touchCroppedByMirrorRoot{Rect{0, 0, 50, 50}};
Vishnu Nair6f878312023-09-08 11:05:01 -0700441 EXPECT_TRUE(getSnapshot({.id = 111, .mirrorRootIds = 3u})
Vishnu Nair92990e22023-02-24 20:01:05 +0000442 ->inputInfo.touchableRegion.hasSameRects(touchCroppedByMirrorRoot));
443}
444
445TEST_F(LayerSnapshotTest, canRemoveDisplayMirror) {
446 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
447 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
448 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700449 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 +0000450 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
451 destroyLayerHandle(3);
452 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
453}
454
Vishnu Nairfccd6362023-02-24 23:39:53 +0000455TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterMirroring) {
456 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
457 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
458 setLayerStack(3, 1);
Vishnu Nair444f3952023-04-11 13:01:02 -0700459 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3,
460 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nairfccd6362023-02-24 23:39:53 +0000461 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
462 destroyLayerHandle(3);
463 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
464
465 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
466}
467
Vishnu Nair6f878312023-09-08 11:05:01 -0700468TEST_F(LayerSnapshotTest, canMirrorDisplayWithMirrors) {
469 reparentLayer(12, UNASSIGNED_LAYER_ID);
470 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
471 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2};
472 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
473
474 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
475 setLayerStack(3, 3);
476 expected = {1, 11, 111, 13, 14, 11, 111, 2, 3, 1, 11, 111, 13, 14, 11, 111, 2};
477 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
478 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 14u})->outputFilter.layerStack.id, 0u);
479 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u})->outputFilter.layerStack.id, 3u);
480 EXPECT_EQ(getSnapshot({.id = 11, .mirrorRootIds = 3u, 14u})->outputFilter.layerStack.id, 3u);
481}
482
Vishnu Nairfccd6362023-02-24 23:39:53 +0000483// Rel z doesn't create duplicate snapshots but this is for completeness
484TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterRelZ) {
485 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
486 reparentRelativeLayer(13, 11);
487 UPDATE_AND_VERIFY(mSnapshotBuilder, {1, 11, 13, 111, 12, 121, 122, 1221, 2});
488 setZ(13, 0);
489 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
490
491 EXPECT_EQ(startingNumSnapshots, mSnapshotBuilder.getSnapshots().size());
492}
493
494TEST_F(LayerSnapshotTest, cleanUpUnreachableSnapshotsAfterLayerDestruction) {
495 size_t startingNumSnapshots = mSnapshotBuilder.getSnapshots().size();
496 destroyLayerHandle(2);
497 destroyLayerHandle(122);
498
499 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13};
500 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
501
502 EXPECT_LE(startingNumSnapshots - 2, mSnapshotBuilder.getSnapshots().size());
503}
504
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000505TEST_F(LayerSnapshotTest, snashotContainsMetadataFromLayerCreationArgs) {
506 LayerCreationArgs args(std::make_optional<uint32_t>(200));
507 args.name = "testlayer";
508 args.addToRoot = true;
509 args.metadata.setInt32(42, 24);
510
511 std::vector<std::unique_ptr<RequestedLayerState>> layers;
512 layers.emplace_back(std::make_unique<RequestedLayerState>(args));
513 EXPECT_TRUE(layers.back()->metadata.has(42));
514 EXPECT_EQ(layers.back()->metadata.getInt32(42, 0), 24);
515 mLifecycleManager.addLayers(std::move(layers));
516
517 std::vector<uint32_t> expected = STARTING_ZORDER;
518 expected.push_back(200);
519 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
520
521 EXPECT_TRUE(mSnapshotBuilder.getSnapshot(200)->layerMetadata.has(42));
522 EXPECT_EQ(mSnapshotBuilder.getSnapshot(200)->layerMetadata.getInt32(42, 0), 24);
523}
524
525TEST_F(LayerSnapshotTest, frameRateSelectionPriorityPassedToChildLayers) {
526 setFrameRateSelectionPriority(11, 1);
527
528 setFrameRateSelectionPriority(12, 2);
529
530 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
531 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
532 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
533 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
534 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 2);
535 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 2);
536
537 // reparent and verify the child gets the new parent's framerate selection priority
538 reparentLayer(122, 11);
539
540 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
541 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
542 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionPriority, Layer::PRIORITY_UNSET);
543 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionPriority, 1);
544 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionPriority, 2);
545 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionPriority, 1);
546 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionPriority, 1);
547}
548
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000549TEST_F(LayerSnapshotTest, framerate) {
550 setFrameRate(11, 244.f, 0, 0);
551
552 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
553 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700554 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
555 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700556 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000557 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
558
559 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700560 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
561 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
562 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700563 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000564 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
565
Rachel Leece6e0042023-06-27 11:22:54 -0700566 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
567 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
568 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700569 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000570 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
571
572 // reparent and verify the child gets the new parent's framerate
573 reparentLayer(122, 11);
574
575 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
576 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
577 // verify parent is gets no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700578 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
579 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700580 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000581
582 // verify layer and children get the requested votes
Rachel Leece6e0042023-06-27 11:22:54 -0700583 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
584 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
585 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700586 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000587
Rachel Leece6e0042023-06-27 11:22:54 -0700588 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
589 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
590 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700591 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000592
Rachel Leece6e0042023-06-27 11:22:54 -0700593 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
594 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
595 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700596 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000597 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
598
599 // reparent and verify the new parent gets no vote
600 reparentLayer(11, 2);
601 expected = {1, 12, 121, 13, 2, 11, 111, 122, 1221};
602 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
603
604 // verify old parent has invalid framerate (default)
Rachel Leece6e0042023-06-27 11:22:54 -0700605 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
606 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700607 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000608 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
609
610 // verify new parent get no vote
Rachel Leece6e0042023-06-27 11:22:54 -0700611 EXPECT_FALSE(getSnapshot({.id = 2})->frameRate.vote.rate.isValid());
612 EXPECT_EQ(getSnapshot({.id = 2})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700613 scheduler::FrameRateCompatibility::NoVote);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000614 EXPECT_TRUE(getSnapshot({.id = 2})->changes.test(RequestedLayerState::Changes::FrameRate));
615
616 // verify layer and children get the requested votes (unchanged)
Rachel Leece6e0042023-06-27 11:22:54 -0700617 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
618 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
619 EXPECT_EQ(getSnapshot({.id = 11})->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 = 111})->frameRate.vote.rate.isValid());
623 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
624 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700625 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000626
Rachel Leece6e0042023-06-27 11:22:54 -0700627 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
628 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
629 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700630 scheduler::FrameRateCompatibility::Default);
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000631}
632
Vishnu Nair3996ee32023-08-14 04:32:31 +0000633TEST_F(LayerSnapshotTest, translateDataspace) {
634 setDataspace(1, ui::Dataspace::UNKNOWN);
635 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
636 EXPECT_EQ(getSnapshot({.id = 1})->dataspace, ui::Dataspace::V0_SRGB);
637}
638
Rachel Leece6e0042023-06-27 11:22:54 -0700639// This test is similar to "frameRate" test case but checks that the setFrameRateCategory API
640// interaction also works correctly with the setFrameRate API within SF frontend.
641TEST_F(LayerSnapshotTest, frameRateWithCategory) {
642 // ROOT
643 // ├── 1
644 // │ ├── 11 (frame rate set to 244.f)
645 // │ │ └── 111
646 // │ ├── 12
647 // │ │ ├── 121
648 // │ │ └── 122 (frame rate category set to Normal)
649 // │ │ └── 1221
650 // │ └── 13
651 // └── 2
652 setFrameRate(11, 244.f, 0, 0);
653 setFrameRateCategory(122, 3 /* Normal */);
654
655 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
656 // verify parent 1 gets no vote
657 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
658 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700659 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700660 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
661
662 // verify layer 11 and children 111 get the requested votes
663 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
664 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
665 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700666 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700667 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
668
669 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
670 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
671 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700672 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700673 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
674
675 // verify parent 12 gets no vote
676 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
677 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700678 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700679 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
680
681 // verify layer 122 and children 1221 get the requested votes
682 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
683 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
684 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700685 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700686 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
687 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700688 EXPECT_TRUE(
689 getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700690
691 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
692 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
693 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700694 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700695 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
696 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee43369b22023-09-05 18:40:40 -0700697 EXPECT_TRUE(
698 getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::AffectsChildren));
Rachel Leece6e0042023-06-27 11:22:54 -0700699
700 // reparent and verify the child does NOT get the new parent's framerate because it already has
701 // the frame rate category specified.
702 // ROOT
703 // ├─1
704 // │ ├─11 (frame rate set to 244.f)
705 // │ │ ├─111
706 // │ │ └─122 (frame rate category set to Normal)
707 // │ │ └─1221
708 // │ ├─12
709 // │ │ └─121
710 // │ └─13
711 // └─2
712 reparentLayer(122, 11);
713
714 std::vector<uint32_t> expected = {1, 11, 111, 122, 1221, 12, 121, 13, 2};
715 UPDATE_AND_VERIFY(mSnapshotBuilder, expected);
716 // verify parent is gets no vote
717 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
718 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700719 scheduler::FrameRateCompatibility::NoVote);
Rachel Leece6e0042023-06-27 11:22:54 -0700720
721 // verify layer 11 and children 111 get the requested votes
722 EXPECT_TRUE(getSnapshot({.id = 11})->frameRate.vote.rate.isValid());
723 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 244.f);
724 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700725 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700726
727 EXPECT_TRUE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
728 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 244.f);
729 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700730 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700731
732 // verify layer 122 and children 1221 get the requested category vote (unchanged from
733 // reparenting)
734 EXPECT_FALSE(getSnapshot({.id = 122})->frameRate.vote.rate.isValid());
735 EXPECT_TRUE(getSnapshot({.id = 122})->frameRate.isValid());
736 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700737 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700738 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Normal);
739 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
740
741 EXPECT_FALSE(getSnapshot({.id = 1221})->frameRate.vote.rate.isValid());
742 EXPECT_TRUE(getSnapshot({.id = 1221})->frameRate.isValid());
743 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700744 scheduler::FrameRateCompatibility::Default);
Rachel Leece6e0042023-06-27 11:22:54 -0700745 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Normal);
746 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
747}
748
Rachel Lee58cc90d2023-09-05 18:50:20 -0700749TEST_F(LayerSnapshotTest, frameRateSelectionStrategy) {
750 // ROOT
751 // ├── 1
752 // │ ├── 11
753 // │ │ └── 111
754 // │ ├── 12 (frame rate set to 244.f with strategy OverrideChildren)
755 // │ │ ├── 121
756 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
757 // │ │ └── 1221
758 // │ └── 13
759 // └── 2
760 setFrameRate(12, 244.f, 0, 0);
761 setFrameRate(122, 123.f, 0, 0);
762 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
763
764 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
765 // verify parent 1 gets no vote
766 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
767 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
Vishnu Nair3fbe3262023-09-29 17:07:00 -0700768 scheduler::FrameRateCompatibility::NoVote);
Rachel Lee58cc90d2023-09-05 18:50:20 -0700769 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
770
771 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
772 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
773 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
774 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
775 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
776
777 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
778 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
779 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
780 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
781
782 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
783 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
784 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
785 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
786
787 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
788 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
789 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
790 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Vishnu Nair41376b62023-11-08 05:08:58 -0800791
792 // ROOT
793 // ├── 1
794 // │ ├── 11
795 // │ │ └── 111
796 // │ ├── 12 (frame rate set to default with strategy default)
797 // │ │ ├── 121
798 // │ │ └── 122 (frame rate set to 123.f)
799 // │ │ └── 1221
800 // │ └── 13
801 // └── 2
802 setFrameRate(12, -1.f, 0, 0);
803 setFrameRateSelectionStrategy(12, 0 /* Default */);
804 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
805 // verify parent 1 gets no vote
806 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
807 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
808 scheduler::FrameRateCompatibility::NoVote);
809 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
810
811 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
812 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
813 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
814 scheduler::FrameRateCompatibility::NoVote);
815 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800816 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800817 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
818
819 EXPECT_FALSE(getSnapshot({.id = 121})->frameRate.vote.rate.isValid());
820 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800821 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800822 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
823 scheduler::FrameRateCompatibility::Default);
824 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
825
826 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
827 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800828 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800829 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
830
831 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
832 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800833 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800834 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
835}
836
837TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithCategory) {
838 // ROOT
839 // ├── 1
840 // │ ├── 11
841 // │ │ └── 111
842 // │ ├── 12 (frame rate category set to high with strategy OverrideChildren)
843 // │ │ ├── 121
844 // │ │ └── 122 (frame rate set to 123.f but should be overridden by layer 12)
845 // │ │ └── 1221
846 // │ └── 13
847 // └── 2
848 setFrameRateCategory(12, 4 /* high */);
849 setFrameRate(122, 123.f, 0, 0);
850 setFrameRateSelectionStrategy(12, 1 /* OverrideChildren */);
851
852 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
853 // verify parent 1 gets no vote
854 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
855 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
856 scheduler::FrameRateCompatibility::NoVote);
857 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
858
859 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
860 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::High);
861 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
862 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
863 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
864
865 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::High);
866 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
867 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
868 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
869
870 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::High);
871 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
872 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
873 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
874
875 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::High);
876 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
877 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
878 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
879
880 // ROOT
881 // ├── 1
882 // │ ├── 11
883 // │ │ └── 111
884 // │ ├── 12 (frame rate category to default with strategy default)
885 // │ │ ├── 121
886 // │ │ └── 122 (frame rate set to 123.f)
887 // │ │ └── 1221
888 // │ └── 13
889 // └── 2
890 setFrameRateCategory(12, 0 /* default */);
891 setFrameRateSelectionStrategy(12, 0 /* Default */);
892 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
893 // verify parent 1 gets no vote
894 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
895 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
896 scheduler::FrameRateCompatibility::NoVote);
897 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.category, FrameRateCategory::Default);
898 EXPECT_FALSE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
899
900 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
901 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
902 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.type,
903 scheduler::FrameRateCompatibility::NoVote);
904 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.category, FrameRateCategory::Default);
905 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800906 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800907 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
908
909 EXPECT_FALSE(getSnapshot({.id = 12})->frameRate.vote.rate.isValid());
910 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800911 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800912 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.category, FrameRateCategory::Default);
913 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.type,
914 scheduler::FrameRateCompatibility::Default);
915 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
916
917 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 123.f);
918 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800919 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800920 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.category, FrameRateCategory::Default);
921 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
922
923 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 123.f);
924 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800925 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Vishnu Nair41376b62023-11-08 05:08:58 -0800926 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.category, FrameRateCategory::Default);
927 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
Rachel Lee58cc90d2023-09-05 18:50:20 -0700928}
929
Rachel Lee70f7b692023-11-22 11:24:02 -0800930TEST_F(LayerSnapshotTest, frameRateSelectionStrategyWithOverrideChildrenAndSelf) {
Rachel Leea021bb02023-11-20 21:51:09 -0800931 // ROOT
932 // ├── 1
Rachel Lee70f7b692023-11-22 11:24:02 -0800933 // │ ├── 11 (frame rate set to 11.f with strategy Self)
Rachel Leea021bb02023-11-20 21:51:09 -0800934 // │ │ └── 111 (frame rate is not inherited)
935 // │ ├── 12 (frame rate set to 244.f)
936 // │ │ ├── 121
937 // │ │ └── 122 (strategy OverrideChildren and inherits frame rate 244.f)
938 // │ │ └── 1221 (frame rate set to 123.f but should be overridden by layer 122)
939 // │ └── 13
940 // └── 2
941 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -0800942 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -0800943 setFrameRate(12, 244.f, 0, 0);
944 setFrameRateSelectionStrategy(122, 1 /* OverrideChildren */);
945 setFrameRate(1221, 123.f, 0, 0);
946
947 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
948 // verify parent 1 gets no vote
949 EXPECT_FALSE(getSnapshot({.id = 1})->frameRate.vote.rate.isValid());
950 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
951 scheduler::FrameRateCompatibility::NoVote);
952 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800953 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800954 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
955
956 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 11.f);
957 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800958 scheduler::LayerInfo::FrameRateSelectionStrategy::Self);
Rachel Leea021bb02023-11-20 21:51:09 -0800959 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
960
961 // verify layer 11 does does not propagate its framerate to 111.
962 EXPECT_FALSE(getSnapshot({.id = 111})->frameRate.vote.rate.isValid());
963 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800964 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800965 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
966
967 // verify layer 12 and all descendants (121, 122, 1221) get the requested vote
968 EXPECT_EQ(getSnapshot({.id = 12})->frameRate.vote.rate.getValue(), 244.f);
969 EXPECT_EQ(getSnapshot({.id = 12})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800970 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800971 EXPECT_TRUE(getSnapshot({.id = 12})->changes.test(RequestedLayerState::Changes::FrameRate));
972
973 EXPECT_EQ(getSnapshot({.id = 121})->frameRate.vote.rate.getValue(), 244.f);
974 EXPECT_EQ(getSnapshot({.id = 121})->frameRateSelectionStrategy,
Rachel Lee70f7b692023-11-22 11:24:02 -0800975 scheduler::LayerInfo::FrameRateSelectionStrategy::Propagate);
Rachel Leea021bb02023-11-20 21:51:09 -0800976 EXPECT_TRUE(getSnapshot({.id = 121})->changes.test(RequestedLayerState::Changes::FrameRate));
977
978 EXPECT_EQ(getSnapshot({.id = 122})->frameRate.vote.rate.getValue(), 244.f);
979 EXPECT_EQ(getSnapshot({.id = 122})->frameRateSelectionStrategy,
980 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
981 EXPECT_TRUE(getSnapshot({.id = 122})->changes.test(RequestedLayerState::Changes::FrameRate));
982
983 EXPECT_EQ(getSnapshot({.id = 1221})->frameRate.vote.rate.getValue(), 244.f);
984 EXPECT_EQ(getSnapshot({.id = 1221})->frameRateSelectionStrategy,
985 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
986 EXPECT_TRUE(getSnapshot({.id = 1221})->changes.test(RequestedLayerState::Changes::FrameRate));
987
988 // ROOT
989 // ├── 1 (frame rate set to 1.f with strategy OverrideChildren)
Rachel Lee70f7b692023-11-22 11:24:02 -0800990 // │ ├── 11 (frame rate set to 11.f with strategy Self, but overridden by 1)
Rachel Leea021bb02023-11-20 21:51:09 -0800991 // │ │ └── 111 (frame rate inherited from 11 due to override from 1)
992 // â‹® â‹®
993 setFrameRate(1, 1.f, 0, 0);
994 setFrameRateSelectionStrategy(1, 1 /* OverrideChildren */);
995 setFrameRate(11, 11.f, 0, 0);
Rachel Lee70f7b692023-11-22 11:24:02 -0800996 setFrameRateSelectionStrategy(11, 2 /* Self */);
Rachel Leea021bb02023-11-20 21:51:09 -0800997 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
998
999 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.rate.getValue(), 1.f);
1000 EXPECT_EQ(getSnapshot({.id = 1})->frameRate.vote.type,
1001 scheduler::FrameRateCompatibility::Default);
1002 EXPECT_EQ(getSnapshot({.id = 1})->frameRateSelectionStrategy,
1003 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1004 EXPECT_TRUE(getSnapshot({.id = 1})->changes.test(RequestedLayerState::Changes::FrameRate));
1005
1006 EXPECT_EQ(getSnapshot({.id = 11})->frameRate.vote.rate.getValue(), 1.f);
1007 EXPECT_EQ(getSnapshot({.id = 11})->frameRateSelectionStrategy,
1008 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1009 EXPECT_TRUE(getSnapshot({.id = 11})->changes.test(RequestedLayerState::Changes::FrameRate));
1010
1011 // verify layer 11 does does not propagate its framerate to 111.
1012 EXPECT_EQ(getSnapshot({.id = 111})->frameRate.vote.rate.getValue(), 1.f);
1013 EXPECT_EQ(getSnapshot({.id = 111})->frameRateSelectionStrategy,
1014 scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren);
1015 EXPECT_TRUE(getSnapshot({.id = 111})->changes.test(RequestedLayerState::Changes::FrameRate));
1016}
1017
Vishnu Nair0808ae62023-08-07 21:42:42 -07001018TEST_F(LayerSnapshotTest, skipRoundCornersWhenProtected) {
1019 setRoundedCorners(1, 42.f);
1020 setRoundedCorners(2, 42.f);
1021 setCrop(1, Rect{1000, 1000});
1022 setCrop(2, Rect{1000, 1000});
1023
1024 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1025 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1026 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1027 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1028
1029 // add a buffer with the protected bit, check rounded corners are not set when
1030 // skipRoundCornersWhenProtected == true
1031 setBuffer(1,
1032 std::make_shared<
1033 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1034 1ULL /* bufferId */,
1035 HAL_PIXEL_FORMAT_RGBA_8888,
1036 GRALLOC_USAGE_PROTECTED /*usage*/));
1037
1038 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1039 .layerLifecycleManager = mLifecycleManager,
1040 .includeMetadata = false,
1041 .displays = mFrontEndDisplayInfos,
1042 .displayChanges = false,
1043 .globalShadowSettings = globalShadowSettings,
1044 .supportsBlur = true,
1045 .supportedLayerGenericMetadata = {},
1046 .genericLayerMetadataKeyMap = {},
1047 .skipRoundCornersWhenProtected = true};
1048 update(mSnapshotBuilder, args);
1049 EXPECT_FALSE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1050 // layer 2 doesn't have a buffer and should be unaffected
1051 EXPECT_TRUE(getSnapshot({.id = 2})->roundedCorner.hasRoundedCorners());
1052
1053 // remove protected bit, check rounded corners are set
1054 setBuffer(1,
1055 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1056 2ULL /* bufferId */,
1057 HAL_PIXEL_FORMAT_RGBA_8888,
1058 0 /*usage*/));
1059 update(mSnapshotBuilder, args);
1060 EXPECT_TRUE(getSnapshot({.id = 1})->roundedCorner.hasRoundedCorners());
1061 EXPECT_EQ(getSnapshot({.id = 1})->roundedCorner.radius.x, 42.f);
1062}
1063
Vishnu Nairbd51f952023-08-31 22:50:14 -07001064TEST_F(LayerSnapshotTest, setRefreshRateIndicatorCompositionType) {
1065 setFlags(1, layer_state_t::eLayerIsRefreshRateIndicator,
1066 layer_state_t::eLayerIsRefreshRateIndicator);
1067 setBuffer(1,
1068 std::make_shared<renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1069 42ULL /* bufferId */,
1070 HAL_PIXEL_FORMAT_RGBA_8888,
1071 0 /*usage*/));
1072 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1073 EXPECT_EQ(getSnapshot({.id = 1})->compositionType,
1074 aidl::android::hardware::graphics::composer3::Composition::REFRESH_RATE_INDICATOR);
1075}
1076
Chavi Weingarten07597342023-09-14 21:10:59 +00001077TEST_F(LayerSnapshotTest, setBufferCrop) {
1078 // validate no buffer but has crop
1079 Rect crop = Rect(0, 0, 50, 50);
1080 setBufferCrop(1, crop);
1081 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1082 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1083
1084 setBuffer(1,
1085 std::make_shared<renderengine::mock::FakeExternalTexture>(100U /*width*/,
1086 100U /*height*/,
1087 42ULL /* bufferId */,
1088 HAL_PIXEL_FORMAT_RGBA_8888,
1089 0 /*usage*/));
1090 // validate a buffer crop within the buffer bounds
1091 setBufferCrop(1, crop);
1092 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1093 EXPECT_EQ(getSnapshot(1)->geomContentCrop, crop);
1094
1095 // validate a buffer crop outside the buffer bounds
1096 crop = Rect(0, 0, 150, 150);
1097 setBufferCrop(1, crop);
1098 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1099 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1100
1101 // validate no buffer crop
1102 setBufferCrop(1, Rect());
1103 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1104 EXPECT_EQ(getSnapshot(1)->geomContentCrop, Rect(0, 0, 100, 100));
1105}
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001106
1107TEST_F(LayerSnapshotTest, setShadowRadius) {
1108 static constexpr float SHADOW_RADIUS = 123.f;
1109 setShadowRadius(1, SHADOW_RADIUS);
1110 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1111 EXPECT_EQ(getSnapshot(1)->shadowSettings.length, SHADOW_RADIUS);
Vishnu Nairbefd3e22023-10-05 17:48:31 +00001112}
1113
Chavi Weingartenb74093a2023-10-11 20:29:59 +00001114TEST_F(LayerSnapshotTest, setTrustedOverlayForNonVisibleInput) {
1115 hideLayer(1);
1116 setTrustedOverlay(1, true);
1117 Region touch{Rect{0, 0, 1000, 1000}};
1118 setTouchableRegion(1, touch);
1119
1120 UPDATE_AND_VERIFY(mSnapshotBuilder, {2});
1121 EXPECT_TRUE(getSnapshot(1)->inputInfo.inputConfig.test(
1122 gui::WindowInfo::InputConfig::TRUSTED_OVERLAY));
1123}
1124
Alec Mouri89f5d4e2023-10-20 17:12:49 +00001125TEST_F(LayerSnapshotTest, isFrontBuffered) {
1126 setBuffer(1,
1127 std::make_shared<renderengine::mock::FakeExternalTexture>(
1128 1U /*width*/, 1U /*height*/, 1ULL /* bufferId */, HAL_PIXEL_FORMAT_RGBA_8888,
1129 GRALLOC_USAGE_HW_TEXTURE | AHARDWAREBUFFER_USAGE_FRONT_BUFFER /*usage*/));
1130
1131 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1132 EXPECT_TRUE(getSnapshot(1)->isFrontBuffered());
1133
1134 setBuffer(1,
1135 std::make_shared<
1136 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
1137 1ULL /* bufferId */,
1138 HAL_PIXEL_FORMAT_RGBA_8888,
1139 GRALLOC_USAGE_HW_TEXTURE /*usage*/));
1140
1141 UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER);
1142 EXPECT_FALSE(getSnapshot(1)->isFrontBuffered());
1143}
1144
Chavi Weingarten4aa22af2023-11-17 19:37:07 +00001145TEST_F(LayerSnapshotTest, setSecureRootSnapshot) {
1146 setFlags(1, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
1147 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1148 .layerLifecycleManager = mLifecycleManager,
1149 .includeMetadata = false,
1150 .displays = mFrontEndDisplayInfos,
1151 .displayChanges = false,
1152 .globalShadowSettings = globalShadowSettings,
1153 .supportsBlur = true,
1154 .supportedLayerGenericMetadata = {},
1155 .genericLayerMetadataKeyMap = {}};
1156 args.rootSnapshot.isSecure = true;
1157 update(mSnapshotBuilder, args);
1158
1159 EXPECT_TRUE(getSnapshot(1)->isSecure);
1160 // Ensure child is also marked as secure
1161 EXPECT_TRUE(getSnapshot(11)->isSecure);
1162}
1163
Vishnu Nairf13c8982023-12-02 11:26:09 -08001164// b/314350323
1165TEST_F(LayerSnapshotTest, propagateDropInputMode) {
1166 setDropInputMode(1, gui::DropInputMode::ALL);
1167 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
1168 .layerLifecycleManager = mLifecycleManager,
1169 .includeMetadata = false,
1170 .displays = mFrontEndDisplayInfos,
1171 .displayChanges = false,
1172 .globalShadowSettings = globalShadowSettings,
1173 .supportsBlur = true,
1174 .supportedLayerGenericMetadata = {},
1175 .genericLayerMetadataKeyMap = {}};
1176 args.rootSnapshot.isSecure = true;
1177 update(mSnapshotBuilder, args);
1178
1179 EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL);
1180 // Ensure child also has the correct drop input mode regardless of whether either layer has
1181 // an input channel
1182 EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL);
1183}
1184
Vishnu Nair8fc721b2022-12-22 20:06:32 +00001185} // namespace android::surfaceflinger::frontend