blob: 72ee6db7372be9611299a4868c272dcd93bb0eed [file] [log] [blame]
Ady Abraham9e16a482019-12-03 17:19:41 -08001/*
2 * Copyright 2019 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 "SchedulerUnittests"
19
20#include <gmock/gmock.h>
21#include <log/log.h>
22#include <thread>
23
Ady Abrahamc581d3c2020-08-06 17:34:27 -070024#include "Scheduler/VsyncConfiguration.h"
Ady Abraham9e16a482019-12-03 17:19:41 -080025
26using namespace testing;
27
Dominik Laskowski08d05c22020-07-22 00:05:08 -070028namespace android::scheduler {
Ady Abraham9e16a482019-12-03 17:19:41 -080029
Ady Abraham8287e852020-08-12 14:44:58 -070030class TestableWorkDuration : public impl::WorkDuration {
Ady Abraham9e16a482019-12-03 17:19:41 -080031public:
Ady Abraham8287e852020-08-12 14:44:58 -070032 TestableWorkDuration(float currentFps, nsecs_t sfDuration, nsecs_t appDuration,
33 nsecs_t sfEarlyDuration, nsecs_t appEarlyDuration,
34 nsecs_t sfEarlyGlDuration, nsecs_t appEarlyGlDuration)
35 : impl::WorkDuration({60.0f, 90.0f}, currentFps, sfDuration, appDuration, sfEarlyDuration,
36 appEarlyDuration, sfEarlyGlDuration, appEarlyGlDuration) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080037};
38
Ady Abraham8287e852020-08-12 14:44:58 -070039class WorkDurationTest : public testing::Test {
Ady Abraham9e16a482019-12-03 17:19:41 -080040protected:
Ady Abraham8287e852020-08-12 14:44:58 -070041 WorkDurationTest()
42 : mWorkDuration(60.0f, 10'500'000, 20'500'000, 16'000'000, 16'500'000, 13'500'000,
43 21'000'000) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080044
Ady Abraham8287e852020-08-12 14:44:58 -070045 ~WorkDurationTest() = default;
Ady Abraham9e16a482019-12-03 17:19:41 -080046
Ady Abraham8287e852020-08-12 14:44:58 -070047 TestableWorkDuration mWorkDuration;
Ady Abraham9e16a482019-12-03 17:19:41 -080048};
49
Ady Abraham9e16a482019-12-03 17:19:41 -080050/* ------------------------------------------------------------------------
51 * Test cases
52 */
Ady Abraham8287e852020-08-12 14:44:58 -070053TEST_F(WorkDurationTest, getConfigsForRefreshRate_60Hz) {
54 mWorkDuration.setRefreshRateFps(60.0f);
55 auto currentOffsets = mWorkDuration.getCurrentConfigs();
56 auto offsets = mWorkDuration.getConfigsForRefreshRate(60.0f);
Ady Abraham9e16a482019-12-03 17:19:41 -080057
58 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070059 EXPECT_EQ(offsets.late.sfOffset, 6'166'667);
60 EXPECT_EQ(offsets.late.appOffset, 2'333'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080061
Ady Abraham8287e852020-08-12 14:44:58 -070062 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
63 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080064
Ady Abraham8287e852020-08-12 14:44:58 -070065 EXPECT_EQ(offsets.early.sfOffset, 666'667);
66 EXPECT_EQ(offsets.early.appOffset, 833'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080067
Ady Abraham8287e852020-08-12 14:44:58 -070068 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
69 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080070
Ady Abraham8287e852020-08-12 14:44:58 -070071 EXPECT_EQ(offsets.earlyGpu.sfOffset, 3'166'667);
72 EXPECT_EQ(offsets.earlyGpu.appOffset, 15'500'001);
Ady Abraham9e16a482019-12-03 17:19:41 -080073
Ady Abraham8287e852020-08-12 14:44:58 -070074 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
75 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080076}
77
Ady Abraham8287e852020-08-12 14:44:58 -070078TEST_F(WorkDurationTest, getConfigsForRefreshRate_90Hz) {
79 mWorkDuration.setRefreshRateFps(90.0f);
80 auto currentOffsets = mWorkDuration.getCurrentConfigs();
81 auto offsets = mWorkDuration.getConfigsForRefreshRate(90.0f);
Ady Abraham9e16a482019-12-03 17:19:41 -080082
83 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070084 EXPECT_EQ(offsets.late.sfOffset, 611'111);
85 EXPECT_EQ(offsets.late.appOffset, 2'333'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080086
Ady Abraham8287e852020-08-12 14:44:58 -070087 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
88 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080089
Ady Abraham8287e852020-08-12 14:44:58 -070090 EXPECT_EQ(offsets.early.sfOffset, -4'888'889);
91 EXPECT_EQ(offsets.early.appOffset, 833'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080092
Ady Abraham8287e852020-08-12 14:44:58 -070093 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
94 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080095
Ady Abraham8287e852020-08-12 14:44:58 -070096 EXPECT_EQ(offsets.earlyGpu.sfOffset, -2'388'889);
97 EXPECT_EQ(offsets.earlyGpu.appOffset, 9'944'444);
Ady Abraham9e16a482019-12-03 17:19:41 -080098
Ady Abraham8287e852020-08-12 14:44:58 -070099 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
100 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -0800101}
102
Ady Abraham8287e852020-08-12 14:44:58 -0700103TEST_F(WorkDurationTest, getConfigsForRefreshRate_DefaultOffsets) {
104 TestableWorkDuration phaseOffsetsWithDefaultValues(60.0f, -1, -1, -1, -1, -1, -1);
Ady Abraham9e16a482019-12-03 17:19:41 -0800105
Ady Abraham8287e852020-08-12 14:44:58 -0700106 auto validateOffsets = [](const auto& offsets, std::chrono::nanoseconds vsyncPeriod) {
107 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
108 EXPECT_EQ(offsets.late.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800109
Ady Abraham8287e852020-08-12 14:44:58 -0700110 EXPECT_EQ(offsets.late.sfWorkDuration, vsyncPeriod - 1'000'000ns);
111 EXPECT_EQ(offsets.late.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800112
Ady Abraham8287e852020-08-12 14:44:58 -0700113 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
114 EXPECT_EQ(offsets.early.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800115
Ady Abraham8287e852020-08-12 14:44:58 -0700116 EXPECT_EQ(offsets.early.sfWorkDuration, vsyncPeriod - 1'000'000ns);
117 EXPECT_EQ(offsets.early.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800118
Ady Abraham8287e852020-08-12 14:44:58 -0700119 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
120 EXPECT_EQ(offsets.earlyGpu.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800121
Ady Abraham8287e852020-08-12 14:44:58 -0700122 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, vsyncPeriod - 1'000'000ns);
123 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800124 };
125
Ady Abraham8287e852020-08-12 14:44:58 -0700126 const auto testForRefreshRate = [&](float refreshRate) {
127 phaseOffsetsWithDefaultValues.setRefreshRateFps(refreshRate);
128 auto currentOffsets = phaseOffsetsWithDefaultValues.getCurrentConfigs();
129 auto offsets = phaseOffsetsWithDefaultValues.getConfigsForRefreshRate(refreshRate);
130 EXPECT_EQ(currentOffsets, offsets);
131 validateOffsets(offsets,
132 std::chrono::nanoseconds(static_cast<nsecs_t>(1e9f / refreshRate)));
Dominik Laskowski08d05c22020-07-22 00:05:08 -0700133 };
Ady Abraham60120a02020-03-23 11:23:26 -0700134
Ady Abraham8287e852020-08-12 14:44:58 -0700135 testForRefreshRate(90.0f);
136 testForRefreshRate(60.0f);
137}
Ady Abraham60120a02020-03-23 11:23:26 -0700138
Ady Abraham8287e852020-08-12 14:44:58 -0700139TEST_F(WorkDurationTest, getConfigsForRefreshRate_unknownRefreshRate) {
140 auto offsets = mWorkDuration.getConfigsForRefreshRate(14.7f);
Ady Abraham60120a02020-03-23 11:23:26 -0700141
Ady Abraham8287e852020-08-12 14:44:58 -0700142 EXPECT_EQ(offsets.late.sfOffset, 57'527'208);
143 EXPECT_EQ(offsets.late.appOffset, 37'027'208);
Ady Abraham60120a02020-03-23 11:23:26 -0700144
Ady Abraham8287e852020-08-12 14:44:58 -0700145 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
146 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700147
Ady Abraham8287e852020-08-12 14:44:58 -0700148 EXPECT_EQ(offsets.early.sfOffset, 52'027'208);
149 EXPECT_EQ(offsets.early.appOffset, 35'527'208);
Ady Abraham60120a02020-03-23 11:23:26 -0700150
Ady Abraham8287e852020-08-12 14:44:58 -0700151 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
152 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700153
Ady Abraham8287e852020-08-12 14:44:58 -0700154 EXPECT_EQ(offsets.earlyGpu.sfOffset, 54'527'208);
155 EXPECT_EQ(offsets.earlyGpu.appOffset, 33'527'208);
156
157 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
158 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
159}
160
161class TestablePhaseOffsets : public impl::PhaseOffsets {
162public:
163 TestablePhaseOffsets(nsecs_t vsyncPhaseOffsetNs, nsecs_t sfVSyncPhaseOffsetNs,
164 std::optional<nsecs_t> earlySfOffsetNs,
165 std::optional<nsecs_t> earlyGpuSfOffsetNs,
166 std::optional<nsecs_t> earlyAppOffsetNs,
167 std::optional<nsecs_t> earlyGpuAppOffsetNs,
168 nsecs_t highFpsVsyncPhaseOffsetNs, nsecs_t highFpsSfVSyncPhaseOffsetNs,
169 std::optional<nsecs_t> highFpsEarlySfOffsetNs,
170 std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
171 std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
172 std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs,
173 nsecs_t thresholdForNextVsync)
174 : impl::PhaseOffsets({60.0f, 90.0f}, 60.0f, vsyncPhaseOffsetNs, sfVSyncPhaseOffsetNs,
175 earlySfOffsetNs, earlyGpuSfOffsetNs, earlyAppOffsetNs,
176 earlyGpuAppOffsetNs, highFpsVsyncPhaseOffsetNs,
177 highFpsSfVSyncPhaseOffsetNs, highFpsEarlySfOffsetNs,
178 highFpsEarlyGpuSfOffsetNs, highFpsEarlyAppOffsetNs,
179 highFpsEarlyGpuAppOffsetNs, thresholdForNextVsync) {}
180};
181
182class PhaseOffsetsTest : public testing::Test {
183protected:
184 PhaseOffsetsTest() = default;
185 ~PhaseOffsetsTest() = default;
186
187 TestablePhaseOffsets mPhaseOffsets{2'000'000, 6'000'000, 7'000'000, 8'000'000, 3'000'000,
188 4'000'000, 2'000'000, 1'000'000, 2'000'000, 3'000'000,
189 3'000'000, 4'000'000, 10'000'000};
190};
191
192TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_unknownRefreshRate) {
193 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(14.7f);
194
195 EXPECT_EQ(offsets.late.sfOffset, 6'000'000);
196 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
197
198 EXPECT_EQ(offsets.late.sfWorkDuration, 62'027'208ns);
199 EXPECT_EQ(offsets.late.appWorkDuration, 72'027'208ns);
200
201 EXPECT_EQ(offsets.early.sfOffset, 7'000'000);
202 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
203
204 EXPECT_EQ(offsets.early.sfWorkDuration, 61'027'208ns);
205 EXPECT_EQ(offsets.early.appWorkDuration, 72'027'208ns);
206
207 EXPECT_EQ(offsets.earlyGpu.sfOffset, 8'000'000);
208 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
209
210 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 60'027'208ns);
211 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 72'027'208ns);
212}
213
214TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_60Hz) {
215 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(60.0f);
216
217 EXPECT_EQ(offsets.late.sfOffset, 6'000'000);
218 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
219
220 EXPECT_EQ(offsets.late.sfWorkDuration, 10'666'667ns);
221 EXPECT_EQ(offsets.late.appWorkDuration, 20'666'667ns);
222
223 EXPECT_EQ(offsets.early.sfOffset, 7'000'000);
224 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
225
226 EXPECT_EQ(offsets.early.sfWorkDuration, 9'666'667ns);
227 EXPECT_EQ(offsets.early.appWorkDuration, 20'666'667ns);
228
229 EXPECT_EQ(offsets.earlyGpu.sfOffset, 8'000'000);
230 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
231
232 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 8'666'667ns);
233 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 20'666'667ns);
234}
235
236TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_90Hz) {
237 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(90.0f);
238
239 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
240 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
241
242 EXPECT_EQ(offsets.late.sfWorkDuration, 10'111'111ns);
243 EXPECT_EQ(offsets.late.appWorkDuration, 21'222'222ns);
244
245 EXPECT_EQ(offsets.early.sfOffset, 2'000'000);
246 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
247
248 EXPECT_EQ(offsets.early.sfWorkDuration, 9'111'111ns);
249 EXPECT_EQ(offsets.early.appWorkDuration, 21'222'222ns);
250
251 EXPECT_EQ(offsets.earlyGpu.sfOffset, 3'000'000);
252 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
253
254 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 8'111'111ns);
255 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'222'222ns);
256}
257
258TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_DefaultValues_60Hz) {
259 TestablePhaseOffsets phaseOffsets{1'000'000, 1'000'000, {}, {}, {}, {}, 2'000'000,
260 1'000'000, {}, {}, {}, {}, 10'000'000};
261 auto offsets = phaseOffsets.getConfigsForRefreshRate(60.0f);
262
263 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
264 EXPECT_EQ(offsets.late.appOffset, 1'000'000);
265
266 EXPECT_EQ(offsets.late.sfWorkDuration, 15'666'667ns);
267 EXPECT_EQ(offsets.late.appWorkDuration, 16'666'667ns);
268
269 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
270 EXPECT_EQ(offsets.early.appOffset, 1'000'000);
271
272 EXPECT_EQ(offsets.early.sfWorkDuration, 15'666'667ns);
273 EXPECT_EQ(offsets.early.appWorkDuration, 16'666'667ns);
274
275 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
276 EXPECT_EQ(offsets.earlyGpu.appOffset, 1'000'000);
277
278 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 15'666'667ns);
279 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 16'666'667ns);
280}
281
282TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_DefaultValues_90Hz) {
283 TestablePhaseOffsets phaseOffsets{1'000'000, 1'000'000, {}, {}, {}, {}, 2'000'000,
284 1'000'000, {}, {}, {}, {}, 10'000'000};
285 auto offsets = phaseOffsets.getConfigsForRefreshRate(90.0f);
286
287 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
288 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
289
290 EXPECT_EQ(offsets.late.sfWorkDuration, 10'111'111ns);
291 EXPECT_EQ(offsets.late.appWorkDuration, 21'222'222ns);
292
293 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
294 EXPECT_EQ(offsets.early.appOffset, 2'000'000);
295
296 EXPECT_EQ(offsets.early.sfWorkDuration, 10'111'111ns);
297 EXPECT_EQ(offsets.early.appWorkDuration, 21'222'222ns);
298
299 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
300 EXPECT_EQ(offsets.earlyGpu.appOffset, 2'000'000);
301
302 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 10'111'111ns);
303 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'222'222ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700304}
305
Dominik Laskowski08d05c22020-07-22 00:05:08 -0700306} // namespace android::scheduler