blob: 2a35f695606ff6d494cc6179a59ed649b1a8ae1c [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:
Marin Shalamanove8a663d2020-11-24 17:48:00 +010032 TestableWorkDuration(Fps currentFps, nsecs_t sfDuration, nsecs_t appDuration,
Ady Abraham8287e852020-08-12 14:44:58 -070033 nsecs_t sfEarlyDuration, nsecs_t appEarlyDuration,
34 nsecs_t sfEarlyGlDuration, nsecs_t appEarlyGlDuration)
Marin Shalamanove8a663d2020-11-24 17:48:00 +010035 : impl::WorkDuration({Fps(60.0f), Fps(90.0f)}, currentFps, sfDuration, appDuration,
36 sfEarlyDuration, appEarlyDuration, sfEarlyGlDuration,
37 appEarlyGlDuration) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080038};
39
Ady Abraham8287e852020-08-12 14:44:58 -070040class WorkDurationTest : public testing::Test {
Ady Abraham9e16a482019-12-03 17:19:41 -080041protected:
Ady Abraham8287e852020-08-12 14:44:58 -070042 WorkDurationTest()
Marin Shalamanove8a663d2020-11-24 17:48:00 +010043 : mWorkDuration(Fps(60.0f), 10'500'000, 20'500'000, 16'000'000, 16'500'000, 13'500'000,
Ady Abraham8287e852020-08-12 14:44:58 -070044 21'000'000) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080045
Ady Abraham8287e852020-08-12 14:44:58 -070046 ~WorkDurationTest() = default;
Ady Abraham9e16a482019-12-03 17:19:41 -080047
Ady Abraham8287e852020-08-12 14:44:58 -070048 TestableWorkDuration mWorkDuration;
Ady Abraham9e16a482019-12-03 17:19:41 -080049};
50
Ady Abraham9e16a482019-12-03 17:19:41 -080051/* ------------------------------------------------------------------------
52 * Test cases
53 */
Ady Abraham8287e852020-08-12 14:44:58 -070054TEST_F(WorkDurationTest, getConfigsForRefreshRate_60Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010055 mWorkDuration.setRefreshRateFps(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -070056 auto currentOffsets = mWorkDuration.getCurrentConfigs();
Marin Shalamanove8a663d2020-11-24 17:48:00 +010057 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham9e16a482019-12-03 17:19:41 -080058
59 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070060 EXPECT_EQ(offsets.late.sfOffset, 6'166'667);
61 EXPECT_EQ(offsets.late.appOffset, 2'333'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080062
Ady Abraham8287e852020-08-12 14:44:58 -070063 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
64 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080065
Ady Abraham8287e852020-08-12 14:44:58 -070066 EXPECT_EQ(offsets.early.sfOffset, 666'667);
67 EXPECT_EQ(offsets.early.appOffset, 833'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080068
Ady Abraham8287e852020-08-12 14:44:58 -070069 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
70 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080071
Ady Abraham8287e852020-08-12 14:44:58 -070072 EXPECT_EQ(offsets.earlyGpu.sfOffset, 3'166'667);
73 EXPECT_EQ(offsets.earlyGpu.appOffset, 15'500'001);
Ady Abraham9e16a482019-12-03 17:19:41 -080074
Ady Abraham8287e852020-08-12 14:44:58 -070075 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
76 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080077}
78
Ady Abraham8287e852020-08-12 14:44:58 -070079TEST_F(WorkDurationTest, getConfigsForRefreshRate_90Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010080 mWorkDuration.setRefreshRateFps(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -070081 auto currentOffsets = mWorkDuration.getCurrentConfigs();
Marin Shalamanove8a663d2020-11-24 17:48:00 +010082 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham9e16a482019-12-03 17:19:41 -080083
84 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070085 EXPECT_EQ(offsets.late.sfOffset, 611'111);
86 EXPECT_EQ(offsets.late.appOffset, 2'333'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080087
Ady Abraham8287e852020-08-12 14:44:58 -070088 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
89 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080090
Ady Abraham8287e852020-08-12 14:44:58 -070091 EXPECT_EQ(offsets.early.sfOffset, -4'888'889);
92 EXPECT_EQ(offsets.early.appOffset, 833'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080093
Ady Abraham8287e852020-08-12 14:44:58 -070094 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
95 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080096
Ady Abraham8287e852020-08-12 14:44:58 -070097 EXPECT_EQ(offsets.earlyGpu.sfOffset, -2'388'889);
98 EXPECT_EQ(offsets.earlyGpu.appOffset, 9'944'444);
Ady Abraham9e16a482019-12-03 17:19:41 -080099
Ady Abraham8287e852020-08-12 14:44:58 -0700100 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
101 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -0800102}
103
Ady Abraham8287e852020-08-12 14:44:58 -0700104TEST_F(WorkDurationTest, getConfigsForRefreshRate_DefaultOffsets) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100105 TestableWorkDuration phaseOffsetsWithDefaultValues(Fps(60.0f), -1, -1, -1, -1, -1, -1);
Ady Abraham9e16a482019-12-03 17:19:41 -0800106
Ady Abraham8287e852020-08-12 14:44:58 -0700107 auto validateOffsets = [](const auto& offsets, std::chrono::nanoseconds vsyncPeriod) {
108 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
109 EXPECT_EQ(offsets.late.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800110
Ady Abraham8287e852020-08-12 14:44:58 -0700111 EXPECT_EQ(offsets.late.sfWorkDuration, vsyncPeriod - 1'000'000ns);
112 EXPECT_EQ(offsets.late.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800113
Ady Abraham8287e852020-08-12 14:44:58 -0700114 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
115 EXPECT_EQ(offsets.early.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800116
Ady Abraham8287e852020-08-12 14:44:58 -0700117 EXPECT_EQ(offsets.early.sfWorkDuration, vsyncPeriod - 1'000'000ns);
118 EXPECT_EQ(offsets.early.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800119
Ady Abraham8287e852020-08-12 14:44:58 -0700120 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
121 EXPECT_EQ(offsets.earlyGpu.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800122
Ady Abraham8287e852020-08-12 14:44:58 -0700123 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, vsyncPeriod - 1'000'000ns);
124 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800125 };
126
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100127 const auto testForRefreshRate = [&](Fps refreshRate) {
Ady Abraham8287e852020-08-12 14:44:58 -0700128 phaseOffsetsWithDefaultValues.setRefreshRateFps(refreshRate);
129 auto currentOffsets = phaseOffsetsWithDefaultValues.getCurrentConfigs();
130 auto offsets = phaseOffsetsWithDefaultValues.getConfigsForRefreshRate(refreshRate);
131 EXPECT_EQ(currentOffsets, offsets);
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100132 validateOffsets(offsets, std::chrono::nanoseconds(refreshRate.getPeriodNsecs()));
Dominik Laskowski08d05c22020-07-22 00:05:08 -0700133 };
Ady Abraham60120a02020-03-23 11:23:26 -0700134
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100135 testForRefreshRate(Fps(90.0f));
136 testForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700137}
Ady Abraham60120a02020-03-23 11:23:26 -0700138
Ady Abraham8287e852020-08-12 14:44:58 -0700139TEST_F(WorkDurationTest, getConfigsForRefreshRate_unknownRefreshRate) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100140 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(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)
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100174 : impl::PhaseOffsets({Fps(60.0f), Fps(90.0f)}, Fps(60.0f), vsyncPhaseOffsetNs,
175 sfVSyncPhaseOffsetNs, earlySfOffsetNs, earlyGpuSfOffsetNs,
176 earlyAppOffsetNs, earlyGpuAppOffsetNs, highFpsVsyncPhaseOffsetNs,
Ady Abraham8287e852020-08-12 14:44:58 -0700177 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) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100193 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(14.7f));
Ady Abraham8287e852020-08-12 14:44:58 -0700194
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) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100215 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700216
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) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100237 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700238
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};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100261 auto offsets = phaseOffsets.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700262
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};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100285 auto offsets = phaseOffsets.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700286
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