1 /*
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 #undef LOG_TAG
18 #define LOG_TAG "FrameRateOverrideMappingsTest"
19
20 #include <com_android_graphics_surfaceflinger_flags.h>
21 #include <common/test/FlagUtils.h>
22 #include <gtest/gtest.h>
23 #include <unordered_map>
24
25 #include "Scheduler/FrameRateOverrideMappings.h"
26
27 namespace android::scheduler {
28
29 using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
30 using UidToFrameRateOverride = std::map<uid_t, Fps>;
31
32 class FrameRateOverrideMappingsTest : public testing::Test {
33 protected:
34 FrameRateOverrideMappings mFrameRateOverrideMappings;
35 UidToFrameRateOverride mFrameRateOverrideByContent;
36 };
37
38 namespace {
39 using namespace com::android::graphics::surfaceflinger;
40
TEST_F(FrameRateOverrideMappingsTest,testUpdateFrameRateOverridesByContent)41 TEST_F(FrameRateOverrideMappingsTest, testUpdateFrameRateOverridesByContent) {
42 mFrameRateOverrideByContent.clear();
43 mFrameRateOverrideByContent.emplace(0, 30.0_Hz);
44 mFrameRateOverrideByContent.emplace(1, 60.0_Hz);
45 ASSERT_TRUE(mFrameRateOverrideMappings.updateFrameRateOverridesByContent(
46 mFrameRateOverrideByContent));
47
48 ASSERT_TRUE(isApproxEqual(30.0_Hz,
49 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
50 0, /*supportsFrameRateOverrideByContent*/ true)));
51 ASSERT_TRUE(isApproxEqual(60.0_Hz,
52 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
53 1, /*supportsFrameRateOverrideByContent*/ true)));
54 ASSERT_EQ(std::nullopt,
55 mFrameRateOverrideMappings
56 .getFrameRateOverrideForUid(1, /*supportsFrameRateOverrideByContent*/ false));
57 ASSERT_EQ(std::nullopt,
58 mFrameRateOverrideMappings
59 .getFrameRateOverrideForUid(3, /*supportsFrameRateOverrideByContent*/ true));
60 ASSERT_EQ(std::nullopt,
61 mFrameRateOverrideMappings
62 .getFrameRateOverrideForUid(3, /*supportsFrameRateOverrideByContent*/ false));
63 }
64
TEST_F(FrameRateOverrideMappingsTest,testSetGameModeRefreshRateForUid)65 TEST_F(FrameRateOverrideMappingsTest, testSetGameModeRefreshRateForUid) {
66 SET_FLAG_FOR_TEST(flags::game_default_frame_rate, false);
67
68 mFrameRateOverrideMappings.setGameModeRefreshRateForUid({1, 30.0f});
69 mFrameRateOverrideMappings.setGameModeRefreshRateForUid({2, 90.0f});
70
71 ASSERT_TRUE(isApproxEqual(30.0_Hz,
72 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
73 1, /*supportsFrameRateOverrideByContent*/ true)));
74 ASSERT_TRUE(isApproxEqual(90.0_Hz,
75 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
76 2, /*supportsFrameRateOverrideByContent*/ false)));
77 ASSERT_EQ(std::nullopt,
78 mFrameRateOverrideMappings
79 .getFrameRateOverrideForUid(0, /*supportsFrameRateOverrideByContent*/ true));
80 ASSERT_EQ(std::nullopt,
81 mFrameRateOverrideMappings
82 .getFrameRateOverrideForUid(0, /*supportsFrameRateOverrideByContent*/ false));
83 }
84
TEST_F(FrameRateOverrideMappingsTest,testSetPreferredRefreshRateForUid)85 TEST_F(FrameRateOverrideMappingsTest, testSetPreferredRefreshRateForUid) {
86 mFrameRateOverrideMappings.setPreferredRefreshRateForUid({0, 60.0f});
87 mFrameRateOverrideMappings.setPreferredRefreshRateForUid({2, 120.0f});
88
89 ASSERT_TRUE(isApproxEqual(60.0_Hz,
90 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
91 0, /*supportsFrameRateOverrideByContent*/ true)));
92 ASSERT_TRUE(isApproxEqual(120.0_Hz,
93 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
94 2, /*supportsFrameRateOverrideByContent*/ false)));
95 ASSERT_EQ(std::nullopt,
96 mFrameRateOverrideMappings
97 .getFrameRateOverrideForUid(1, /*supportsFrameRateOverrideByContent*/ true));
98 ASSERT_EQ(std::nullopt,
99 mFrameRateOverrideMappings
100 .getFrameRateOverrideForUid(1, /*supportsFrameRateOverrideByContent*/ false));
101 }
102
TEST_F(FrameRateOverrideMappingsTest,testGetFrameRateOverrideForUidMixed)103 TEST_F(FrameRateOverrideMappingsTest, testGetFrameRateOverrideForUidMixed) {
104 SET_FLAG_FOR_TEST(flags::game_default_frame_rate, false);
105 mFrameRateOverrideByContent.clear();
106 mFrameRateOverrideByContent.emplace(0, 30.0_Hz);
107 mFrameRateOverrideByContent.emplace(1, 60.0_Hz);
108 mFrameRateOverrideByContent.emplace(2, 45.0_Hz);
109 mFrameRateOverrideByContent.emplace(5, 120.0_Hz);
110 ASSERT_TRUE(mFrameRateOverrideMappings.updateFrameRateOverridesByContent(
111 mFrameRateOverrideByContent));
112
113 std::vector<FrameRateOverride> allFrameRateOverrides;
114 ASSERT_EQ(allFrameRateOverrides,
115 mFrameRateOverrideMappings.getAllFrameRateOverrides(
116 /*supportsFrameRateOverrideByContent*/ false));
117 allFrameRateOverrides = {{0, 30.0f}, {1, 60.0f}, {2, 45.0f}, {5, 120.0f}};
118 ASSERT_EQ(allFrameRateOverrides,
119 mFrameRateOverrideMappings.getAllFrameRateOverrides(
120 /*supportsFrameRateOverrideByContent*/ true));
121 mFrameRateOverrideMappings.setGameModeRefreshRateForUid({1, 30.0f});
122 mFrameRateOverrideMappings.setGameModeRefreshRateForUid({2, 90.0f});
123 mFrameRateOverrideMappings.setGameModeRefreshRateForUid({4, 120.0f});
124
125 allFrameRateOverrides.clear();
126 allFrameRateOverrides = {{1, 30.0f}, {2, 90.0f}, {4, 120.0f}};
127 ASSERT_EQ(allFrameRateOverrides,
128 mFrameRateOverrideMappings.getAllFrameRateOverrides(
129 /*supportsFrameRateOverrideByContent*/ false));
130 allFrameRateOverrides.clear();
131 allFrameRateOverrides = {{1, 30.0f}, {2, 90.0f}, {4, 120.0f}, {0, 30.0f}, {5, 120.0f}};
132 ASSERT_EQ(allFrameRateOverrides,
133 mFrameRateOverrideMappings.getAllFrameRateOverrides(
134 /*supportsFrameRateOverrideByContent*/ true));
135
136 mFrameRateOverrideMappings.setPreferredRefreshRateForUid({0, 60.0f});
137 mFrameRateOverrideMappings.setPreferredRefreshRateForUid({2, 120.0f});
138 mFrameRateOverrideMappings.setPreferredRefreshRateForUid({3, 30.0f});
139
140 allFrameRateOverrides.clear();
141 allFrameRateOverrides = {{0, 60.0f}, {2, 120.0f}, {3, 30.0f}, {1, 30.0f}, {4, 120.0f}};
142 ASSERT_EQ(allFrameRateOverrides,
143 mFrameRateOverrideMappings.getAllFrameRateOverrides(
144 /*supportsFrameRateOverrideByContent*/ false));
145 allFrameRateOverrides.clear();
146 allFrameRateOverrides = {{0, 60.0f}, {2, 120.0f}, {3, 30.0f},
147 {1, 30.0f}, {4, 120.0f}, {5, 120.0f}};
148 ASSERT_EQ(allFrameRateOverrides,
149 mFrameRateOverrideMappings.getAllFrameRateOverrides(
150 /*supportsFrameRateOverrideByContent*/ true));
151
152 ASSERT_TRUE(isApproxEqual(60.0_Hz,
153 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
154 0, /*supportsFrameRateOverrideByContent*/ true)));
155 ASSERT_TRUE(isApproxEqual(30.0_Hz,
156 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
157 1, /*supportsFrameRateOverrideByContent*/ true)));
158 ASSERT_TRUE(isApproxEqual(120.0_Hz,
159 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
160 2, /*supportsFrameRateOverrideByContent*/ true)));
161 ASSERT_TRUE(isApproxEqual(30.0_Hz,
162 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
163 3, /*supportsFrameRateOverrideByContent*/ true)));
164 ASSERT_TRUE(isApproxEqual(120.0_Hz,
165 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
166 4, /*supportsFrameRateOverrideByContent*/ true)));
167 ASSERT_TRUE(isApproxEqual(120.0_Hz,
168 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
169 5, /*supportsFrameRateOverrideByContent*/ true)));
170
171 ASSERT_TRUE(isApproxEqual(60.0_Hz,
172 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
173 0, /*supportsFrameRateOverrideByContent*/ false)));
174 ASSERT_TRUE(isApproxEqual(30.0_Hz,
175 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
176 1, /*supportsFrameRateOverrideByContent*/ false)));
177 ASSERT_TRUE(isApproxEqual(120.0_Hz,
178 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
179 2, /*supportsFrameRateOverrideByContent*/ false)));
180 ASSERT_TRUE(isApproxEqual(30.0_Hz,
181 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
182 3, /*supportsFrameRateOverrideByContent*/ false)));
183 ASSERT_TRUE(isApproxEqual(120.0_Hz,
184 *mFrameRateOverrideMappings.getFrameRateOverrideForUid(
185 4, /*supportsFrameRateOverrideByContent*/ false)));
186 ASSERT_EQ(std::nullopt,
187 mFrameRateOverrideMappings
188 .getFrameRateOverrideForUid(5, /*supportsFrameRateOverrideByContent*/ false));
189 }
190 } // namespace
191 } // namespace android::scheduler
192