blob: bb7578d744dcf7319e9daad5c678c27b02252e51 [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>
Marin Shalamanov526c3382020-12-10 15:22:29 +010022#include <chrono>
Ady Abraham9e16a482019-12-03 17:19:41 -080023#include <thread>
24
Ady Abrahamc581d3c2020-08-06 17:34:27 -070025#include "Scheduler/VsyncConfiguration.h"
Ady Abraham9e16a482019-12-03 17:19:41 -080026
27using namespace testing;
28
Dominik Laskowski08d05c22020-07-22 00:05:08 -070029namespace android::scheduler {
Ady Abraham9e16a482019-12-03 17:19:41 -080030
Marin Shalamanov526c3382020-12-10 15:22:29 +010031using namespace std::chrono_literals;
32
Ady Abraham8287e852020-08-12 14:44:58 -070033class TestableWorkDuration : public impl::WorkDuration {
Ady Abraham9e16a482019-12-03 17:19:41 -080034public:
Marin Shalamanove8a663d2020-11-24 17:48:00 +010035 TestableWorkDuration(Fps currentFps, nsecs_t sfDuration, nsecs_t appDuration,
Ady Abraham8287e852020-08-12 14:44:58 -070036 nsecs_t sfEarlyDuration, nsecs_t appEarlyDuration,
37 nsecs_t sfEarlyGlDuration, nsecs_t appEarlyGlDuration)
Marin Shalamanov526c3382020-12-10 15:22:29 +010038 : impl::WorkDuration(currentFps, sfDuration, appDuration, sfEarlyDuration,
39 appEarlyDuration, sfEarlyGlDuration, appEarlyGlDuration) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080040};
41
Ady Abraham8287e852020-08-12 14:44:58 -070042class WorkDurationTest : public testing::Test {
Ady Abraham9e16a482019-12-03 17:19:41 -080043protected:
Ady Abraham8287e852020-08-12 14:44:58 -070044 WorkDurationTest()
Marin Shalamanove8a663d2020-11-24 17:48:00 +010045 : 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 -070046 21'000'000) {}
Ady Abraham9e16a482019-12-03 17:19:41 -080047
Ady Abraham8287e852020-08-12 14:44:58 -070048 ~WorkDurationTest() = default;
Ady Abraham9e16a482019-12-03 17:19:41 -080049
Ady Abraham8287e852020-08-12 14:44:58 -070050 TestableWorkDuration mWorkDuration;
Ady Abraham9e16a482019-12-03 17:19:41 -080051};
52
Ady Abraham9e16a482019-12-03 17:19:41 -080053/* ------------------------------------------------------------------------
54 * Test cases
55 */
Ady Abraham8287e852020-08-12 14:44:58 -070056TEST_F(WorkDurationTest, getConfigsForRefreshRate_60Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010057 mWorkDuration.setRefreshRateFps(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -070058 auto currentOffsets = mWorkDuration.getCurrentConfigs();
Marin Shalamanove8a663d2020-11-24 17:48:00 +010059 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham9e16a482019-12-03 17:19:41 -080060
61 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070062 EXPECT_EQ(offsets.late.sfOffset, 6'166'667);
63 EXPECT_EQ(offsets.late.appOffset, 2'333'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080064
Ady Abraham8287e852020-08-12 14:44:58 -070065 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
66 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080067
Ady Abraham8287e852020-08-12 14:44:58 -070068 EXPECT_EQ(offsets.early.sfOffset, 666'667);
69 EXPECT_EQ(offsets.early.appOffset, 833'334);
Ady Abraham9e16a482019-12-03 17:19:41 -080070
Ady Abraham8287e852020-08-12 14:44:58 -070071 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
72 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080073
Ady Abraham8287e852020-08-12 14:44:58 -070074 EXPECT_EQ(offsets.earlyGpu.sfOffset, 3'166'667);
75 EXPECT_EQ(offsets.earlyGpu.appOffset, 15'500'001);
Ady Abraham9e16a482019-12-03 17:19:41 -080076
Ady Abraham8287e852020-08-12 14:44:58 -070077 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
78 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080079}
80
Ady Abraham8287e852020-08-12 14:44:58 -070081TEST_F(WorkDurationTest, getConfigsForRefreshRate_90Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010082 mWorkDuration.setRefreshRateFps(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -070083 auto currentOffsets = mWorkDuration.getCurrentConfigs();
Marin Shalamanove8a663d2020-11-24 17:48:00 +010084 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham9e16a482019-12-03 17:19:41 -080085
86 EXPECT_EQ(currentOffsets, offsets);
Ady Abraham8287e852020-08-12 14:44:58 -070087 EXPECT_EQ(offsets.late.sfOffset, 611'111);
88 EXPECT_EQ(offsets.late.appOffset, 2'333'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080089
Ady Abraham8287e852020-08-12 14:44:58 -070090 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
91 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080092
Ady Abraham8287e852020-08-12 14:44:58 -070093 EXPECT_EQ(offsets.early.sfOffset, -4'888'889);
94 EXPECT_EQ(offsets.early.appOffset, 833'333);
Ady Abraham9e16a482019-12-03 17:19:41 -080095
Ady Abraham8287e852020-08-12 14:44:58 -070096 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
97 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -080098
Ady Abraham8287e852020-08-12 14:44:58 -070099 EXPECT_EQ(offsets.earlyGpu.sfOffset, -2'388'889);
100 EXPECT_EQ(offsets.earlyGpu.appOffset, 9'944'444);
Ady Abraham9e16a482019-12-03 17:19:41 -0800101
Ady Abraham8287e852020-08-12 14:44:58 -0700102 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
103 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
Ady Abraham9e16a482019-12-03 17:19:41 -0800104}
105
Ady Abraham8287e852020-08-12 14:44:58 -0700106TEST_F(WorkDurationTest, getConfigsForRefreshRate_DefaultOffsets) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100107 TestableWorkDuration phaseOffsetsWithDefaultValues(Fps(60.0f), -1, -1, -1, -1, -1, -1);
Ady Abraham9e16a482019-12-03 17:19:41 -0800108
Ady Abraham8287e852020-08-12 14:44:58 -0700109 auto validateOffsets = [](const auto& offsets, std::chrono::nanoseconds vsyncPeriod) {
110 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
111 EXPECT_EQ(offsets.late.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800112
Ady Abraham8287e852020-08-12 14:44:58 -0700113 EXPECT_EQ(offsets.late.sfWorkDuration, vsyncPeriod - 1'000'000ns);
114 EXPECT_EQ(offsets.late.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800115
Ady Abraham8287e852020-08-12 14:44:58 -0700116 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
117 EXPECT_EQ(offsets.early.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800118
Ady Abraham8287e852020-08-12 14:44:58 -0700119 EXPECT_EQ(offsets.early.sfWorkDuration, vsyncPeriod - 1'000'000ns);
120 EXPECT_EQ(offsets.early.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800121
Ady Abraham8287e852020-08-12 14:44:58 -0700122 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
123 EXPECT_EQ(offsets.earlyGpu.appOffset, 1'000'000);
Ady Abraham9e16a482019-12-03 17:19:41 -0800124
Ady Abraham8287e852020-08-12 14:44:58 -0700125 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, vsyncPeriod - 1'000'000ns);
126 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, vsyncPeriod);
Ady Abraham9e16a482019-12-03 17:19:41 -0800127 };
128
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100129 const auto testForRefreshRate = [&](Fps refreshRate) {
Ady Abraham8287e852020-08-12 14:44:58 -0700130 phaseOffsetsWithDefaultValues.setRefreshRateFps(refreshRate);
131 auto currentOffsets = phaseOffsetsWithDefaultValues.getCurrentConfigs();
132 auto offsets = phaseOffsetsWithDefaultValues.getConfigsForRefreshRate(refreshRate);
133 EXPECT_EQ(currentOffsets, offsets);
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100134 validateOffsets(offsets, std::chrono::nanoseconds(refreshRate.getPeriodNsecs()));
Dominik Laskowski08d05c22020-07-22 00:05:08 -0700135 };
Ady Abraham60120a02020-03-23 11:23:26 -0700136
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100137 testForRefreshRate(Fps(90.0f));
138 testForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700139}
Ady Abraham60120a02020-03-23 11:23:26 -0700140
Ady Abraham8287e852020-08-12 14:44:58 -0700141TEST_F(WorkDurationTest, getConfigsForRefreshRate_unknownRefreshRate) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100142 auto offsets = mWorkDuration.getConfigsForRefreshRate(Fps(14.7f));
Ady Abraham60120a02020-03-23 11:23:26 -0700143
Ady Abraham8287e852020-08-12 14:44:58 -0700144 EXPECT_EQ(offsets.late.sfOffset, 57'527'208);
145 EXPECT_EQ(offsets.late.appOffset, 37'027'208);
Ady Abraham60120a02020-03-23 11:23:26 -0700146
Ady Abraham8287e852020-08-12 14:44:58 -0700147 EXPECT_EQ(offsets.late.sfWorkDuration, 10'500'000ns);
148 EXPECT_EQ(offsets.late.appWorkDuration, 20'500'000ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700149
Ady Abraham8287e852020-08-12 14:44:58 -0700150 EXPECT_EQ(offsets.early.sfOffset, 52'027'208);
151 EXPECT_EQ(offsets.early.appOffset, 35'527'208);
Ady Abraham60120a02020-03-23 11:23:26 -0700152
Ady Abraham8287e852020-08-12 14:44:58 -0700153 EXPECT_EQ(offsets.early.sfWorkDuration, 16'000'000ns);
154 EXPECT_EQ(offsets.early.appWorkDuration, 16'500'000ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700155
Ady Abraham8287e852020-08-12 14:44:58 -0700156 EXPECT_EQ(offsets.earlyGpu.sfOffset, 54'527'208);
157 EXPECT_EQ(offsets.earlyGpu.appOffset, 33'527'208);
158
159 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 13'500'000ns);
160 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'000'000ns);
161}
162
163class TestablePhaseOffsets : public impl::PhaseOffsets {
164public:
165 TestablePhaseOffsets(nsecs_t vsyncPhaseOffsetNs, nsecs_t sfVSyncPhaseOffsetNs,
166 std::optional<nsecs_t> earlySfOffsetNs,
167 std::optional<nsecs_t> earlyGpuSfOffsetNs,
168 std::optional<nsecs_t> earlyAppOffsetNs,
169 std::optional<nsecs_t> earlyGpuAppOffsetNs,
170 nsecs_t highFpsVsyncPhaseOffsetNs, nsecs_t highFpsSfVSyncPhaseOffsetNs,
171 std::optional<nsecs_t> highFpsEarlySfOffsetNs,
172 std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
173 std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
174 std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs,
175 nsecs_t thresholdForNextVsync)
Marin Shalamanov526c3382020-12-10 15:22:29 +0100176 : impl::PhaseOffsets(Fps(60.0f), vsyncPhaseOffsetNs, sfVSyncPhaseOffsetNs,
177 earlySfOffsetNs, earlyGpuSfOffsetNs, earlyAppOffsetNs,
178 earlyGpuAppOffsetNs, highFpsVsyncPhaseOffsetNs,
Ady Abraham8287e852020-08-12 14:44:58 -0700179 highFpsSfVSyncPhaseOffsetNs, highFpsEarlySfOffsetNs,
180 highFpsEarlyGpuSfOffsetNs, highFpsEarlyAppOffsetNs,
181 highFpsEarlyGpuAppOffsetNs, thresholdForNextVsync) {}
182};
183
184class PhaseOffsetsTest : public testing::Test {
185protected:
186 PhaseOffsetsTest() = default;
187 ~PhaseOffsetsTest() = default;
188
189 TestablePhaseOffsets mPhaseOffsets{2'000'000, 6'000'000, 7'000'000, 8'000'000, 3'000'000,
190 4'000'000, 2'000'000, 1'000'000, 2'000'000, 3'000'000,
191 3'000'000, 4'000'000, 10'000'000};
192};
193
194TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_unknownRefreshRate) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100195 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(14.7f));
Ady Abraham8287e852020-08-12 14:44:58 -0700196
197 EXPECT_EQ(offsets.late.sfOffset, 6'000'000);
198 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
199
200 EXPECT_EQ(offsets.late.sfWorkDuration, 62'027'208ns);
201 EXPECT_EQ(offsets.late.appWorkDuration, 72'027'208ns);
202
203 EXPECT_EQ(offsets.early.sfOffset, 7'000'000);
204 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
205
206 EXPECT_EQ(offsets.early.sfWorkDuration, 61'027'208ns);
207 EXPECT_EQ(offsets.early.appWorkDuration, 72'027'208ns);
208
209 EXPECT_EQ(offsets.earlyGpu.sfOffset, 8'000'000);
210 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
211
212 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 60'027'208ns);
213 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 72'027'208ns);
214}
215
216TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_60Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100217 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700218
219 EXPECT_EQ(offsets.late.sfOffset, 6'000'000);
220 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
221
222 EXPECT_EQ(offsets.late.sfWorkDuration, 10'666'667ns);
223 EXPECT_EQ(offsets.late.appWorkDuration, 20'666'667ns);
224
225 EXPECT_EQ(offsets.early.sfOffset, 7'000'000);
226 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
227
228 EXPECT_EQ(offsets.early.sfWorkDuration, 9'666'667ns);
229 EXPECT_EQ(offsets.early.appWorkDuration, 20'666'667ns);
230
231 EXPECT_EQ(offsets.earlyGpu.sfOffset, 8'000'000);
232 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
233
234 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 8'666'667ns);
235 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 20'666'667ns);
236}
237
238TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_90Hz) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100239 auto offsets = mPhaseOffsets.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700240
241 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
242 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
243
244 EXPECT_EQ(offsets.late.sfWorkDuration, 10'111'111ns);
245 EXPECT_EQ(offsets.late.appWorkDuration, 21'222'222ns);
246
247 EXPECT_EQ(offsets.early.sfOffset, 2'000'000);
248 EXPECT_EQ(offsets.early.appOffset, 3'000'000);
249
250 EXPECT_EQ(offsets.early.sfWorkDuration, 9'111'111ns);
251 EXPECT_EQ(offsets.early.appWorkDuration, 21'222'222ns);
252
253 EXPECT_EQ(offsets.earlyGpu.sfOffset, 3'000'000);
254 EXPECT_EQ(offsets.earlyGpu.appOffset, 4'000'000);
255
256 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 8'111'111ns);
257 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'222'222ns);
258}
259
260TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_DefaultValues_60Hz) {
261 TestablePhaseOffsets phaseOffsets{1'000'000, 1'000'000, {}, {}, {}, {}, 2'000'000,
262 1'000'000, {}, {}, {}, {}, 10'000'000};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100263 auto offsets = phaseOffsets.getConfigsForRefreshRate(Fps(60.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700264
265 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
266 EXPECT_EQ(offsets.late.appOffset, 1'000'000);
267
268 EXPECT_EQ(offsets.late.sfWorkDuration, 15'666'667ns);
269 EXPECT_EQ(offsets.late.appWorkDuration, 16'666'667ns);
270
271 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
272 EXPECT_EQ(offsets.early.appOffset, 1'000'000);
273
274 EXPECT_EQ(offsets.early.sfWorkDuration, 15'666'667ns);
275 EXPECT_EQ(offsets.early.appWorkDuration, 16'666'667ns);
276
277 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
278 EXPECT_EQ(offsets.earlyGpu.appOffset, 1'000'000);
279
280 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 15'666'667ns);
281 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 16'666'667ns);
282}
283
284TEST_F(PhaseOffsetsTest, getConfigsForRefreshRate_DefaultValues_90Hz) {
285 TestablePhaseOffsets phaseOffsets{1'000'000, 1'000'000, {}, {}, {}, {}, 2'000'000,
286 1'000'000, {}, {}, {}, {}, 10'000'000};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100287 auto offsets = phaseOffsets.getConfigsForRefreshRate(Fps(90.0f));
Ady Abraham8287e852020-08-12 14:44:58 -0700288
289 EXPECT_EQ(offsets.late.sfOffset, 1'000'000);
290 EXPECT_EQ(offsets.late.appOffset, 2'000'000);
291
292 EXPECT_EQ(offsets.late.sfWorkDuration, 10'111'111ns);
293 EXPECT_EQ(offsets.late.appWorkDuration, 21'222'222ns);
294
295 EXPECT_EQ(offsets.early.sfOffset, 1'000'000);
296 EXPECT_EQ(offsets.early.appOffset, 2'000'000);
297
298 EXPECT_EQ(offsets.early.sfWorkDuration, 10'111'111ns);
299 EXPECT_EQ(offsets.early.appWorkDuration, 21'222'222ns);
300
301 EXPECT_EQ(offsets.earlyGpu.sfOffset, 1'000'000);
302 EXPECT_EQ(offsets.earlyGpu.appOffset, 2'000'000);
303
304 EXPECT_EQ(offsets.earlyGpu.sfWorkDuration, 10'111'111ns);
305 EXPECT_EQ(offsets.earlyGpu.appWorkDuration, 21'222'222ns);
Ady Abraham60120a02020-03-23 11:23:26 -0700306}
307
Dominik Laskowski08d05c22020-07-22 00:05:08 -0700308} // namespace android::scheduler