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
22 #include <gmock/gmock.h>
23 #include <gtest/gtest.h>
24
25 namespace android {
26 namespace {
27
28 using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
29
30 class InitiateModeChangeTest : public DisplayTransactionTest {
31 public:
32 using Event = scheduler::RefreshRateConfigEvent;
33
SetUp()34 void SetUp() override {
35 injectFakeBufferQueueFactory();
36 injectFakeNativeWindowSurfaceFactory();
37
38 PrimaryDisplayVariant::setupHwcHotplugCallExpectations(this);
39 PrimaryDisplayVariant::setupFramebufferConsumerBufferQueueCallExpectations(this);
40 PrimaryDisplayVariant::setupFramebufferProducerBufferQueueCallExpectations(this);
41 PrimaryDisplayVariant::setupNativeWindowSurfaceCreationCallExpectations(this);
42 PrimaryDisplayVariant::setupHwcGetActiveConfigCallExpectations(this);
43
44 mFlinger.onComposerHalHotplug(PrimaryDisplayVariant::HWC_DISPLAY_ID, Connection::CONNECTED);
45
46 mDisplay = PrimaryDisplayVariant::makeFakeExistingDisplayInjector(this)
47 .setSupportedModes({kDisplayMode60, kDisplayMode90, kDisplayMode120})
48 .setActiveMode(kDisplayModeId60)
49 .inject();
50 }
51
52 protected:
53 sp<DisplayDevice> mDisplay;
54
55 const DisplayModeId kDisplayModeId60 = DisplayModeId(0);
56 const DisplayModePtr kDisplayMode60 =
57 DisplayMode::Builder(hal::HWConfigId(kDisplayModeId60.value()))
58 .setId(kDisplayModeId60)
59 .setPhysicalDisplayId(PrimaryDisplayVariant::DISPLAY_ID::get())
60 .setVsyncPeriod(int32_t(16'666'667))
61 .setGroup(0)
62 .setHeight(1000)
63 .setWidth(1000)
64 .build();
65
66 const DisplayModeId kDisplayModeId90 = DisplayModeId(1);
67 const DisplayModePtr kDisplayMode90 =
68 DisplayMode::Builder(hal::HWConfigId(kDisplayModeId90.value()))
69 .setId(kDisplayModeId90)
70 .setPhysicalDisplayId(PrimaryDisplayVariant::DISPLAY_ID::get())
71 .setVsyncPeriod(int32_t(11'111'111))
72 .setGroup(0)
73 .setHeight(1000)
74 .setWidth(1000)
75 .build();
76
77 const DisplayModeId kDisplayModeId120 = DisplayModeId(2);
78 const DisplayModePtr kDisplayMode120 =
79 DisplayMode::Builder(hal::HWConfigId(kDisplayModeId120.value()))
80 .setId(kDisplayModeId120)
81 .setPhysicalDisplayId(PrimaryDisplayVariant::DISPLAY_ID::get())
82 .setVsyncPeriod(int32_t(8'333'333))
83 .setGroup(0)
84 .setHeight(1000)
85 .setWidth(1000)
86 .build();
87 };
88
TEST_F(InitiateModeChangeTest,setDesiredActiveMode_setCurrentMode)89 TEST_F(InitiateModeChangeTest, setDesiredActiveMode_setCurrentMode) {
90 EXPECT_FALSE(mDisplay->setDesiredActiveMode({kDisplayMode60, Event::None}));
91 EXPECT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
92 }
93
TEST_F(InitiateModeChangeTest,setDesiredActiveMode_setNewMode)94 TEST_F(InitiateModeChangeTest, setDesiredActiveMode_setNewMode) {
95 EXPECT_TRUE(mDisplay->setDesiredActiveMode({kDisplayMode90, Event::None}));
96 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
97 EXPECT_EQ(kDisplayMode90, mDisplay->getDesiredActiveMode()->mode);
98 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
99
100 // Setting another mode should be cached but return false
101 EXPECT_FALSE(mDisplay->setDesiredActiveMode({kDisplayMode120, Event::None}));
102 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
103 EXPECT_EQ(kDisplayMode120, mDisplay->getDesiredActiveMode()->mode);
104 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
105 }
106
TEST_F(InitiateModeChangeTest,clearDesiredActiveModeState)107 TEST_F(InitiateModeChangeTest, clearDesiredActiveModeState) {
108 EXPECT_TRUE(mDisplay->setDesiredActiveMode({kDisplayMode90, Event::None}));
109 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
110
111 mDisplay->clearDesiredActiveModeState();
112 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
113 }
114
TEST_F(InitiateModeChangeTest,initiateModeChange)115 TEST_F(InitiateModeChangeTest, initiateModeChange) NO_THREAD_SAFETY_ANALYSIS {
116 EXPECT_TRUE(mDisplay->setDesiredActiveMode({kDisplayMode90, Event::None}));
117 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
118 EXPECT_EQ(kDisplayMode90, mDisplay->getDesiredActiveMode()->mode);
119 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
120
121 hal::VsyncPeriodChangeConstraints constraints{
122 .desiredTimeNanos = systemTime(),
123 .seamlessRequired = false,
124 };
125 hal::VsyncPeriodChangeTimeline timeline;
126 EXPECT_EQ(OK,
127 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
128 &timeline));
129 EXPECT_EQ(kDisplayMode90, mDisplay->getUpcomingActiveMode().mode);
130 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
131
132 mDisplay->clearDesiredActiveModeState();
133 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
134 }
135
TEST_F(InitiateModeChangeTest,getUpcomingActiveMode_desiredActiveModeChanged)136 TEST_F(InitiateModeChangeTest, getUpcomingActiveMode_desiredActiveModeChanged)
137 NO_THREAD_SAFETY_ANALYSIS {
138 EXPECT_TRUE(mDisplay->setDesiredActiveMode({kDisplayMode90, Event::None}));
139 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
140 EXPECT_EQ(kDisplayMode90, mDisplay->getDesiredActiveMode()->mode);
141 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
142
143 hal::VsyncPeriodChangeConstraints constraints{
144 .desiredTimeNanos = systemTime(),
145 .seamlessRequired = false,
146 };
147 hal::VsyncPeriodChangeTimeline timeline;
148 EXPECT_EQ(OK,
149 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
150 &timeline));
151 EXPECT_EQ(kDisplayMode90, mDisplay->getUpcomingActiveMode().mode);
152 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
153
154 EXPECT_FALSE(mDisplay->setDesiredActiveMode({kDisplayMode120, Event::None}));
155 ASSERT_NE(std::nullopt, mDisplay->getDesiredActiveMode());
156 EXPECT_EQ(kDisplayMode120, mDisplay->getDesiredActiveMode()->mode);
157 EXPECT_EQ(Event::None, mDisplay->getDesiredActiveMode()->event);
158
159 EXPECT_EQ(kDisplayMode90, mDisplay->getUpcomingActiveMode().mode);
160 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
161
162 EXPECT_EQ(OK,
163 mDisplay->initiateModeChange(*mDisplay->getDesiredActiveMode(), constraints,
164 &timeline));
165 EXPECT_EQ(kDisplayMode120, mDisplay->getUpcomingActiveMode().mode);
166 EXPECT_EQ(Event::None, mDisplay->getUpcomingActiveMode().event);
167
168 mDisplay->clearDesiredActiveModeState();
169 ASSERT_EQ(std::nullopt, mDisplay->getDesiredActiveMode());
170 }
171
172 } // namespace
173 } // namespace android
174