1 /*
2 * Copyright 2021 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 "DisplayTransactionTestHelpers.h"
21 #include "mock/MockFrameRateMode.h"
22
23 #include <gmock/gmock.h>
24 #include <gtest/gtest.h>
25
26 namespace android {
27 namespace {
28
29 using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
30
31 class InitiateModeChangeTest : public DisplayTransactionTest {
32 public:
33 using Action = DisplayDevice::DesiredActiveModeAction;
34 using Event = scheduler::DisplayModeEvent;
35
SetUp()36 void SetUp() override {
37 injectFakeBufferQueueFactory();
38 injectFakeNativeWindowSurfaceFactory();
39
40 PrimaryDisplayVariant::setupHwcHotplugCallExpectations(this);
41 PrimaryDisplayVariant::setupFramebufferConsumerBufferQueueCallExpectations(this);
42 PrimaryDisplayVariant::setupFramebufferProducerBufferQueueCallExpectations(this);
43 PrimaryDisplayVariant::setupNativeWindowSurfaceCreationCallExpectations(this);
44 PrimaryDisplayVariant::setupHwcGetActiveConfigCallExpectations(this);
45
46 mFlinger.onComposerHalHotplug(PrimaryDisplayVariant::HWC_DISPLAY_ID, Connection::CONNECTED);
47 mFlinger.configureAndCommit();
48
49 mDisplay = PrimaryDisplayVariant::makeFakeExistingDisplayInjector(this)
50 .setDisplayModes(makeModes(kMode60, kMode90, kMode120), kModeId60)
51 .inject();
52 }
53
54 protected:
55 sp<DisplayDevice> mDisplay;
56
57 static constexpr DisplayModeId kModeId60{0};
58 static constexpr DisplayModeId kModeId90{1};
59 static constexpr DisplayModeId kModeId120{2};
60
61 static inline const ftl::NonNull<DisplayModePtr> kMode60 =
62 ftl::as_non_null(createDisplayMode(kModeId60, 60_Hz));
63 static inline const ftl::NonNull<DisplayModePtr> kMode90 =
64 ftl::as_non_null(createDisplayMode(kModeId90, 90_Hz));
65 static inline const ftl::NonNull<DisplayModePtr> kMode120 =
66 ftl::as_non_null(createDisplayMode(kModeId120, 120_Hz));
67 };
68
TEST_F(InitiateModeChangeTest,setDesiredActiveMode_setCurrentMode)69 TEST_F(InitiateModeChangeTest, setDesiredActiveMode_setCurrentMode) {
70 EXPECT_EQ(Action::None,
71 mDisplay->setDesiredActiveMode(
72 {scheduler::FrameRateMode{60_Hz, kMode60}, Event::None}));
73 EXPECT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
74 }
75
TEST_F(InitiateModeChangeTest,setDesiredActiveMode_setNewMode)76 TEST_F(InitiateModeChangeTest, setDesiredActiveMode_setNewMode) {
77 EXPECT_EQ(Action::InitiateDisplayModeSwitch,
78 mDisplay->setDesiredActiveMode(
79 {scheduler::FrameRateMode{90_Hz, kMode90}, Event::None}));
80 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
81 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getDesiredActiveMode()->modeOpt);
82 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
83
84 // Setting another mode should be cached but return None
85 EXPECT_EQ(Action::None,
86 mDisplay->setDesiredActiveMode(
87 {scheduler::FrameRateMode{120_Hz, kMode120}, Event::None}));
88 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
89 EXPECT_FRAME_RATE_MODE(kMode120, 120_Hz, *mDisplay->getDesiredActiveMode()->modeOpt);
90 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
91 }
92
TEST_F(InitiateModeChangeTest,clearDesiredActiveModeState)93 TEST_F(InitiateModeChangeTest, clearDesiredActiveModeState) {
94 EXPECT_EQ(Action::InitiateDisplayModeSwitch,
95 mDisplay->setDesiredActiveMode(
96 {scheduler::FrameRateMode{90_Hz, kMode90}, Event::None}));
97 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
98
99 mDisplay->clearDesiredActiveModeState();
100 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
101 }
102
TEST_F(InitiateModeChangeTest,initiateModeChange)103 TEST_F(InitiateModeChangeTest, initiateModeChange) NO_THREAD_SAFETY_ANALYSIS {
104 EXPECT_EQ(Action::InitiateDisplayModeSwitch,
105 mDisplay->setDesiredActiveMode(
106 {scheduler::FrameRateMode{90_Hz, kMode90}, Event::None}));
107 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
108 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getDesiredActiveMode()->modeOpt);
109 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
110
111 hal::VsyncPeriodChangeConstraints constraints{
112 .desiredTimeNanos = systemTime(),
113 .seamlessRequired = false,
114 };
115 hal::VsyncPeriodChangeTimeline timeline;
116 EXPECT_EQ(OK,
117 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
118 &timeline));
119 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getUpcomingActiveMode().modeOpt);
120 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
121
122 mDisplay->clearDesiredActiveModeState();
123 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
124 }
125
TEST_F(InitiateModeChangeTest,initiateRenderRateChange)126 TEST_F(InitiateModeChangeTest, initiateRenderRateChange) {
127 EXPECT_EQ(Action::InitiateRenderRateSwitch,
128 mDisplay->setDesiredActiveMode(
129 {scheduler::FrameRateMode{30_Hz, kMode60}, Event::None}));
130 EXPECT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
131 }
132
TEST_F(InitiateModeChangeTest,getUpcomingActiveMode_desiredActiveModeChanged)133 TEST_F(InitiateModeChangeTest, getUpcomingActiveMode_desiredActiveModeChanged)
134 NO_THREAD_SAFETY_ANALYSIS {
135 EXPECT_EQ(Action::InitiateDisplayModeSwitch,
136 mDisplay->setDesiredActiveMode(
137 {scheduler::FrameRateMode{90_Hz, kMode90}, Event::None}));
138 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
139 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getDesiredActiveMode()->modeOpt);
140 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
141
142 hal::VsyncPeriodChangeConstraints constraints{
143 .desiredTimeNanos = systemTime(),
144 .seamlessRequired = false,
145 };
146 hal::VsyncPeriodChangeTimeline timeline;
147 EXPECT_EQ(OK,
148 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
149 &timeline));
150 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getUpcomingActiveMode().modeOpt);
151 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
152
153 EXPECT_EQ(Action::None,
154 mDisplay->setDesiredActiveMode(
155 {scheduler::FrameRateMode{120_Hz, kMode120}, Event::None}));
156 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
157 EXPECT_FRAME_RATE_MODE(kMode120, 120_Hz, *mDisplay->getDesiredActiveMode()->modeOpt);
158 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
159
160 EXPECT_FRAME_RATE_MODE(kMode90, 90_Hz, *mDisplay->getUpcomingActiveMode().modeOpt);
161 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
162
163 EXPECT_EQ(OK,
164 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
165 &timeline));
166 EXPECT_FRAME_RATE_MODE(kMode120, 120_Hz, *mDisplay->getUpcomingActiveMode().modeOpt);
167 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
168
169 mDisplay->clearDesiredActiveModeState();
170 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
171 }
172
173 } // namespace
174 } // namespace android
175