• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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