blob: bfdd5963f377092bc199a27d82ec4cd08005b6ec [file] [log] [blame]
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -05001/*
2 * Copyright 2023 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 "LibSurfaceFlingerUnittests"
19
20#include <ftl/fake_guard.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <log/log.h>
24
25#include <scheduler/Fps.h>
26#include "Scheduler/VsyncSchedule.h"
27#include "ThreadContext.h"
Ady Abrahamc585dba2023-11-15 18:41:35 -080028#include "mock/DisplayHardware/MockDisplayMode.h"
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050029#include "mock/MockVSyncDispatch.h"
30#include "mock/MockVSyncTracker.h"
31#include "mock/MockVsyncController.h"
32
Ady Abrahamc585dba2023-11-15 18:41:35 -080033using android::mock::createDisplayMode;
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050034using testing::_;
35
36namespace android {
37
Dominik Laskowski66295432023-03-14 12:25:36 -040038constexpr PhysicalDisplayId kDisplayId = PhysicalDisplayId::fromPort(42u);
Leon Scroggins III67388622023-02-06 20:36:20 -050039
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050040class VsyncScheduleTest : public testing::Test {
41protected:
42 VsyncScheduleTest();
43 ~VsyncScheduleTest() override;
44
Dominik Laskowski66295432023-03-14 12:25:36 -040045 testing::MockFunction<void(PhysicalDisplayId, bool)> mRequestHardwareVsync;
46
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050047 const std::unique_ptr<scheduler::VsyncSchedule> mVsyncSchedule =
48 std::unique_ptr<scheduler::VsyncSchedule>(
Dominik Laskowski66295432023-03-14 12:25:36 -040049 new scheduler::VsyncSchedule(kDisplayId, std::make_shared<mock::VSyncTracker>(),
Leon Scroggins III67388622023-02-06 20:36:20 -050050 std::make_shared<mock::VSyncDispatch>(),
Dominik Laskowski66295432023-03-14 12:25:36 -040051 std::make_unique<mock::VsyncController>(),
52 mRequestHardwareVsync.AsStdFunction()));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050053
54 mock::VsyncController& getController() {
55 return *static_cast<mock::VsyncController*>(&mVsyncSchedule->getController());
56 }
57};
58
59VsyncScheduleTest::VsyncScheduleTest() {
60 const ::testing::TestInfo* const test_info =
61 ::testing::UnitTest::GetInstance()->current_test_info();
62 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
63}
64
65VsyncScheduleTest::~VsyncScheduleTest() {
66 const ::testing::TestInfo* const test_info =
67 ::testing::UnitTest::GetInstance()->current_test_info();
68 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
69}
70
71namespace {
72
73using namespace testing;
74
75TEST_F(VsyncScheduleTest, InitiallyDisallowed) {
76 ASSERT_FALSE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
77}
78
79TEST_F(VsyncScheduleTest, EnableDoesNothingWhenDisallowed) {
Dominik Laskowski66295432023-03-14 12:25:36 -040080 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050081
Dominik Laskowski66295432023-03-14 12:25:36 -040082 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050083}
84
85TEST_F(VsyncScheduleTest, DisableDoesNothingWhenDisallowed) {
Dominik Laskowski66295432023-03-14 12:25:36 -040086 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050087
Dominik Laskowski66295432023-03-14 12:25:36 -040088 mVsyncSchedule->disableHardwareVsync(false /* disallow */);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050089}
90
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -050091TEST_F(VsyncScheduleTest, DisableDoesNothingWhenDisallowed2) {
Dominik Laskowski66295432023-03-14 12:25:36 -040092 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -050093
Dominik Laskowski66295432023-03-14 12:25:36 -040094 mVsyncSchedule->disableHardwareVsync(true /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -050095}
96
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -050097TEST_F(VsyncScheduleTest, MakeAllowed) {
98 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
99}
100
101TEST_F(VsyncScheduleTest, DisableDoesNothingWhenDisabled) {
102 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400103 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500104
Dominik Laskowski66295432023-03-14 12:25:36 -0400105 mVsyncSchedule->disableHardwareVsync(false /* disallow */);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500106}
107
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500108TEST_F(VsyncScheduleTest, DisableDoesNothingWhenDisabled2) {
109 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400110 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500111
Dominik Laskowski66295432023-03-14 12:25:36 -0400112 mVsyncSchedule->disableHardwareVsync(true /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500113}
114
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500115TEST_F(VsyncScheduleTest, EnableWorksWhenDisabled) {
116 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400117 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500118
Dominik Laskowski66295432023-03-14 12:25:36 -0400119 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500120}
121
122TEST_F(VsyncScheduleTest, EnableWorksOnce) {
123 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400124 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500125
Dominik Laskowski66295432023-03-14 12:25:36 -0400126 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500127
Dominik Laskowski66295432023-03-14 12:25:36 -0400128 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
129 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500130}
131
132TEST_F(VsyncScheduleTest, AllowedIsSticky) {
133 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
134 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
135}
136
137TEST_F(VsyncScheduleTest, EnableDisable) {
138 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400139 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500140
Dominik Laskowski66295432023-03-14 12:25:36 -0400141 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500142
Dominik Laskowski66295432023-03-14 12:25:36 -0400143 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, false));
144 mVsyncSchedule->disableHardwareVsync(false /* disallow */);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500145}
146
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500147TEST_F(VsyncScheduleTest, EnableDisable2) {
148 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400149 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500150
Dominik Laskowski66295432023-03-14 12:25:36 -0400151 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500152
Dominik Laskowski66295432023-03-14 12:25:36 -0400153 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, false));
154 mVsyncSchedule->disableHardwareVsync(true /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500155}
156
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500157TEST_F(VsyncScheduleTest, StartPeriodTransition) {
158 // Note: startPeriodTransition is only called when hardware vsyncs are
159 // allowed.
160 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
161
Ady Abrahamc585dba2023-11-15 18:41:35 -0800162 const auto mode = ftl::as_non_null(createDisplayMode(DisplayModeId(0), 60_Hz));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500163
Dominik Laskowski66295432023-03-14 12:25:36 -0400164 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Ady Abrahamc585dba2023-11-15 18:41:35 -0800165 EXPECT_CALL(getController(), onDisplayModeChanged(mode, false));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500166
Ady Abrahamc585dba2023-11-15 18:41:35 -0800167 mVsyncSchedule->onDisplayModeChanged(mode, false);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500168}
169
170TEST_F(VsyncScheduleTest, StartPeriodTransitionAlreadyEnabled) {
171 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400172 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500173
Ady Abrahamc585dba2023-11-15 18:41:35 -0800174 const auto mode = ftl::as_non_null(createDisplayMode(DisplayModeId(0), 60_Hz));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500175
Dominik Laskowski66295432023-03-14 12:25:36 -0400176 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Ady Abrahamc585dba2023-11-15 18:41:35 -0800177 EXPECT_CALL(getController(), onDisplayModeChanged(mode, false));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500178
Ady Abrahamc585dba2023-11-15 18:41:35 -0800179 mVsyncSchedule->onDisplayModeChanged(mode, false);
Leon Scroggins III67388622023-02-06 20:36:20 -0500180}
181
182TEST_F(VsyncScheduleTest, StartPeriodTransitionForce) {
183 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
184
Ady Abrahamc585dba2023-11-15 18:41:35 -0800185 const auto mode = ftl::as_non_null(createDisplayMode(DisplayModeId(0), 60_Hz));
Leon Scroggins III67388622023-02-06 20:36:20 -0500186
Dominik Laskowski66295432023-03-14 12:25:36 -0400187 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, true));
Ady Abrahamc585dba2023-11-15 18:41:35 -0800188 EXPECT_CALL(getController(), onDisplayModeChanged(mode, true));
Leon Scroggins III67388622023-02-06 20:36:20 -0500189
Ady Abrahamc585dba2023-11-15 18:41:35 -0800190 mVsyncSchedule->onDisplayModeChanged(mode, true);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500191}
192
193TEST_F(VsyncScheduleTest, AddResyncSampleDisallowed) {
194 const Period period = (60_Hz).getPeriod();
195 const auto timestamp = TimePoint::now();
196
Dominik Laskowski66295432023-03-14 12:25:36 -0400197 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500198 EXPECT_CALL(getController(), addHwVsyncTimestamp(_, _, _)).Times(0);
199
Dominik Laskowski66295432023-03-14 12:25:36 -0400200 mVsyncSchedule->addResyncSample(timestamp, period);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500201}
202
203TEST_F(VsyncScheduleTest, AddResyncSampleDisabled) {
204 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
205 const Period period = (60_Hz).getPeriod();
206 const auto timestamp = TimePoint::now();
207
Dominik Laskowski66295432023-03-14 12:25:36 -0400208 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500209 EXPECT_CALL(getController(), addHwVsyncTimestamp(_, _, _)).Times(0);
210
Dominik Laskowski66295432023-03-14 12:25:36 -0400211 mVsyncSchedule->addResyncSample(timestamp, period);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500212}
213
214TEST_F(VsyncScheduleTest, AddResyncSampleReturnsTrue) {
215 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400216 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500217
218 const Period period = (60_Hz).getPeriod();
219 const auto timestamp = TimePoint::now();
220
Dominik Laskowski66295432023-03-14 12:25:36 -0400221 EXPECT_CALL(mRequestHardwareVsync, Call(_, _)).Times(0);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500222 EXPECT_CALL(getController(),
223 addHwVsyncTimestamp(timestamp.ns(), std::optional<nsecs_t>(period.ns()), _))
224 .WillOnce(Return(true));
225
Dominik Laskowski66295432023-03-14 12:25:36 -0400226 mVsyncSchedule->addResyncSample(timestamp, period);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500227}
228
229TEST_F(VsyncScheduleTest, AddResyncSampleReturnsFalse) {
230 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400231 mVsyncSchedule->enableHardwareVsync();
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500232
233 const Period period = (60_Hz).getPeriod();
234 const auto timestamp = TimePoint::now();
235
Dominik Laskowski66295432023-03-14 12:25:36 -0400236 EXPECT_CALL(mRequestHardwareVsync, Call(kDisplayId, false));
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500237 EXPECT_CALL(getController(),
238 addHwVsyncTimestamp(timestamp.ns(), std::optional<nsecs_t>(period.ns()), _))
239 .WillOnce(Return(false));
240
Dominik Laskowski66295432023-03-14 12:25:36 -0400241 mVsyncSchedule->addResyncSample(timestamp, period);
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500242}
243
244TEST_F(VsyncScheduleTest, PendingState) FTL_FAKE_GUARD(kMainThreadContext) {
245 ASSERT_FALSE(mVsyncSchedule->getPendingHardwareVsyncState());
246 mVsyncSchedule->setPendingHardwareVsyncState(true);
247 ASSERT_TRUE(mVsyncSchedule->getPendingHardwareVsyncState());
248
249 mVsyncSchedule->setPendingHardwareVsyncState(false);
250 ASSERT_FALSE(mVsyncSchedule->getPendingHardwareVsyncState());
251}
252
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500253TEST_F(VsyncScheduleTest, DisableDoesNotMakeAllowed) {
254 ASSERT_FALSE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400255 mVsyncSchedule->disableHardwareVsync(false /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500256 ASSERT_FALSE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
257}
258
259TEST_F(VsyncScheduleTest, DisallowMakesNotAllowed) {
260 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400261 mVsyncSchedule->disableHardwareVsync(true /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500262 ASSERT_FALSE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
263}
264
265TEST_F(VsyncScheduleTest, StillAllowedAfterDisable) {
266 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(true /* makeAllowed */));
Dominik Laskowski66295432023-03-14 12:25:36 -0400267 mVsyncSchedule->disableHardwareVsync(false /* disallow */);
Leon Scroggins IIIaadc62d2023-03-03 11:07:50 -0500268 ASSERT_TRUE(mVsyncSchedule->isHardwareVsyncAllowed(false /* makeAllowed */));
269}
270
Leon Scroggins III4d5db7a2023-02-13 15:24:20 -0500271} // namespace
272} // namespace android