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