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