blob: c5deb7ca074a6b8d940c63e1cb5b5348ec26be4a [file] [log] [blame]
Ana Krulecc84d09b2019-11-02 23:10:29 +01001/*
2 * Copyright 2020 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 <gmock/gmock.h>
21#include <gtest/gtest.h>
22#include <gui/LayerMetadata.h>
23
24#include "BufferQueueLayer.h"
25#include "BufferStateLayer.h"
Vishnu Nairfa247b12020-02-11 08:58:26 -080026#include "EffectLayer.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010027#include "Layer.h"
28#include "TestableSurfaceFlinger.h"
29#include "mock/DisplayHardware/MockComposer.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010030#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070031#include "mock/MockVsyncController.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010032
33namespace android {
34
35using testing::_;
36using testing::DoAll;
37using testing::Mock;
38using testing::Return;
39using testing::SetArgPointee;
40
41using android::Hwc2::IComposer;
42using android::Hwc2::IComposerClient;
43
44using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
45
46/**
47 * This class covers all the test that are related to refresh rate selection.
48 */
49class RefreshRateSelectionTest : public testing::Test {
50public:
51 RefreshRateSelectionTest();
52 ~RefreshRateSelectionTest() override;
53
54protected:
55 static constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
56 static constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
57 static constexpr uint32_t WIDTH = 100;
58 static constexpr uint32_t HEIGHT = 100;
59 static constexpr uint32_t LAYER_FLAGS = 0;
60 static constexpr int32_t PRIORITY_UNSET = -1;
61
62 void setupScheduler();
Ady Abraham8cb21882020-08-26 18:22:05 -070063 void setupComposer(uint32_t virtualDisplayCount);
Ana Krulecc84d09b2019-11-02 23:10:29 +010064 sp<BufferQueueLayer> createBufferQueueLayer();
65 sp<BufferStateLayer> createBufferStateLayer();
Vishnu Nairfa247b12020-02-11 08:58:26 -080066 sp<EffectLayer> createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +010067
68 void setParent(Layer* child, Layer* parent);
69 void commitTransaction(Layer* layer);
70
71 TestableSurfaceFlinger mFlinger;
72 Hwc2::mock::Composer* mComposer = nullptr;
73
74 sp<Client> mClient;
75 sp<Layer> mParent;
76 sp<Layer> mChild;
77 sp<Layer> mGrandChild;
78};
79
80RefreshRateSelectionTest::RefreshRateSelectionTest() {
81 const ::testing::TestInfo* const test_info =
82 ::testing::UnitTest::GetInstance()->current_test_info();
83 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
84
85 setupScheduler();
86 setupComposer(0);
87}
88
89RefreshRateSelectionTest::~RefreshRateSelectionTest() {
90 const ::testing::TestInfo* const test_info =
91 ::testing::UnitTest::GetInstance()->current_test_info();
92 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
93}
94
95sp<BufferQueueLayer> RefreshRateSelectionTest::createBufferQueueLayer() {
96 sp<Client> client;
97 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-queue-layer", WIDTH, HEIGHT,
98 LAYER_FLAGS, LayerMetadata());
99 return new BufferQueueLayer(args);
100}
101
102sp<BufferStateLayer> RefreshRateSelectionTest::createBufferStateLayer() {
103 sp<Client> client;
104 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-queue-layer", WIDTH, HEIGHT,
105 LAYER_FLAGS, LayerMetadata());
106 return new BufferStateLayer(args);
107}
108
Vishnu Nairfa247b12020-02-11 08:58:26 -0800109sp<EffectLayer> RefreshRateSelectionTest::createEffectLayer() {
Ana Krulecc84d09b2019-11-02 23:10:29 +0100110 sp<Client> client;
111 LayerCreationArgs args(mFlinger.flinger(), client, "color-layer", WIDTH, HEIGHT, LAYER_FLAGS,
112 LayerMetadata());
Vishnu Nairfa247b12020-02-11 08:58:26 -0800113 return new EffectLayer(args);
Ana Krulecc84d09b2019-11-02 23:10:29 +0100114}
115
116void RefreshRateSelectionTest::setParent(Layer* child, Layer* parent) {
117 child->setParent(parent);
118}
119
120void RefreshRateSelectionTest::commitTransaction(Layer* layer) {
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700121 layer->pushPendingState();
122 auto c = layer->getCurrentState();
123 if (layer->applyPendingStates(&c)) {
124 layer->commitTransaction(c);
125 }
Ana Krulecc84d09b2019-11-02 23:10:29 +0100126}
127
128void RefreshRateSelectionTest::setupScheduler() {
129 auto eventThread = std::make_unique<mock::EventThread>();
130 auto sfEventThread = std::make_unique<mock::EventThread>();
131
132 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
133 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700134 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700135 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100136
137 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
138 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700139 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700140 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100141
Ady Abraham8cb21882020-08-26 18:22:05 -0700142 auto vsyncController = std::make_unique<mock::VsyncController>();
143 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100144
Ady Abraham8cb21882020-08-26 18:22:05 -0700145 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
146 EXPECT_CALL(*vsyncTracker, currentPeriod())
Ana Krulecc84d09b2019-11-02 23:10:29 +0100147 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE));
Ady Abraham8cb21882020-08-26 18:22:05 -0700148 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
149 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
150 std::move(eventThread), std::move(sfEventThread));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100151}
152
Ady Abraham8cb21882020-08-26 18:22:05 -0700153void RefreshRateSelectionTest::setupComposer(uint32_t virtualDisplayCount) {
Ana Krulecc84d09b2019-11-02 23:10:29 +0100154 mComposer = new Hwc2::mock::Composer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100155 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
156 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
157
158 Mock::VerifyAndClear(mComposer);
159}
160
161namespace {
162/* ------------------------------------------------------------------------
163 * Test cases
164 */
165TEST_F(RefreshRateSelectionTest, testPriorityOnBufferQueueLayers) {
166 mParent = createBufferQueueLayer();
167 mChild = createBufferQueueLayer();
168 setParent(mChild.get(), mParent.get());
169 mGrandChild = createBufferQueueLayer();
170 setParent(mGrandChild.get(), mChild.get());
171
172 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
173 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
174 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
175
176 // Child has its own priority.
177 mGrandChild->setFrameRateSelectionPriority(1);
178 commitTransaction(mGrandChild.get());
179 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
180 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
181 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
182
183 // Child inherits from his parent.
184 mChild->setFrameRateSelectionPriority(1);
185 commitTransaction(mChild.get());
186 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
187 commitTransaction(mGrandChild.get());
188
189 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
190 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
191 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
192
193 // Grandchild inherits from his grand parent.
194 mParent->setFrameRateSelectionPriority(1);
195 commitTransaction(mParent.get());
196 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
197 commitTransaction(mChild.get());
198 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
199 commitTransaction(mGrandChild.get());
200 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
201 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
202 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
203}
204
205TEST_F(RefreshRateSelectionTest, testPriorityOnBufferStateLayers) {
206 mParent = createBufferStateLayer();
207 mChild = createBufferStateLayer();
208 setParent(mChild.get(), mParent.get());
209 mGrandChild = createBufferStateLayer();
210 setParent(mGrandChild.get(), mChild.get());
211
212 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
213 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
214 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
215
216 // Child has its own priority.
217 mGrandChild->setFrameRateSelectionPriority(1);
218 commitTransaction(mGrandChild.get());
219 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
220 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
221 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
222
223 // Child inherits from his parent.
224 mChild->setFrameRateSelectionPriority(1);
225 commitTransaction(mChild.get());
226 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
227 commitTransaction(mGrandChild.get());
228 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
229 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
230 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
231
232 // Grandchild inherits from his grand parent.
233 mParent->setFrameRateSelectionPriority(1);
234 commitTransaction(mParent.get());
235 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
236 commitTransaction(mChild.get());
237 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
238 commitTransaction(mGrandChild.get());
239 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
240 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
241 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
242}
243
Vishnu Nairfa247b12020-02-11 08:58:26 -0800244TEST_F(RefreshRateSelectionTest, testPriorityOnEffectLayers) {
245 mParent = createEffectLayer();
246 mChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100247 setParent(mChild.get(), mParent.get());
Vishnu Nairfa247b12020-02-11 08:58:26 -0800248 mGrandChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100249 setParent(mGrandChild.get(), mChild.get());
250
251 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
252 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
253 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
254
255 // Child has its own priority.
256 mGrandChild->setFrameRateSelectionPriority(1);
257 commitTransaction(mGrandChild.get());
258 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
259 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
260 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
261
262 // Child inherits from his parent.
263 mChild->setFrameRateSelectionPriority(1);
264 commitTransaction(mChild.get());
265 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
266 commitTransaction(mGrandChild.get());
267 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
268 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
269 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
270
271 // Grandchild inherits from his grand parent.
272 mParent->setFrameRateSelectionPriority(1);
273 commitTransaction(mParent.get());
274 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
275 commitTransaction(mChild.get());
276 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
277 commitTransaction(mGrandChild.get());
278 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
279 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
280 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
281}
282
283} // namespace
Ady Abraham2b55c3b2020-01-16 16:38:51 -0800284} // namespace android