blob: 6752a3938490be1de9f7782caaba8631ac12b176 [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
Ana Krulecc84d09b2019-11-02 23:10:29 +010024#include "BufferStateLayer.h"
Vishnu Nairfa247b12020-02-11 08:58:26 -080025#include "EffectLayer.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010026#include "Layer.h"
27#include "TestableSurfaceFlinger.h"
28#include "mock/DisplayHardware/MockComposer.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010029#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070030#include "mock/MockVsyncController.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010031
32namespace android {
33
34using testing::_;
35using testing::DoAll;
36using testing::Mock;
37using testing::Return;
38using testing::SetArgPointee;
39
40using android::Hwc2::IComposer;
41using android::Hwc2::IComposerClient;
42
43using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
44
45/**
46 * This class covers all the test that are related to refresh rate selection.
47 */
48class RefreshRateSelectionTest : public testing::Test {
49public:
50 RefreshRateSelectionTest();
51 ~RefreshRateSelectionTest() override;
52
53protected:
54 static constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
55 static constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
56 static constexpr uint32_t WIDTH = 100;
57 static constexpr uint32_t HEIGHT = 100;
58 static constexpr uint32_t LAYER_FLAGS = 0;
59 static constexpr int32_t PRIORITY_UNSET = -1;
60
61 void setupScheduler();
Ana Krulecc84d09b2019-11-02 23:10:29 +010062 sp<BufferStateLayer> createBufferStateLayer();
Vishnu Nairfa247b12020-02-11 08:58:26 -080063 sp<EffectLayer> createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +010064
65 void setParent(Layer* child, Layer* parent);
66 void commitTransaction(Layer* layer);
67
68 TestableSurfaceFlinger mFlinger;
Ana Krulecc84d09b2019-11-02 23:10:29 +010069
70 sp<Client> mClient;
71 sp<Layer> mParent;
72 sp<Layer> mChild;
73 sp<Layer> mGrandChild;
74};
75
76RefreshRateSelectionTest::RefreshRateSelectionTest() {
77 const ::testing::TestInfo* const test_info =
78 ::testing::UnitTest::GetInstance()->current_test_info();
79 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
80
81 setupScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080082 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ana Krulecc84d09b2019-11-02 23:10:29 +010083}
84
85RefreshRateSelectionTest::~RefreshRateSelectionTest() {
86 const ::testing::TestInfo* const test_info =
87 ::testing::UnitTest::GetInstance()->current_test_info();
88 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
89}
90
Ana Krulecc84d09b2019-11-02 23:10:29 +010091
92sp<BufferStateLayer> RefreshRateSelectionTest::createBufferStateLayer() {
93 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080094 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-queue-layer", LAYER_FLAGS,
95 LayerMetadata());
Ady Abrahamd11bade2022-08-01 16:18:03 -070096 return sp<BufferStateLayer>::make(args);
Ana Krulecc84d09b2019-11-02 23:10:29 +010097}
98
Vishnu Nairfa247b12020-02-11 08:58:26 -080099sp<EffectLayer> RefreshRateSelectionTest::createEffectLayer() {
Ana Krulecc84d09b2019-11-02 23:10:29 +0100100 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -0800101 LayerCreationArgs args(mFlinger.flinger(), client, "color-layer", LAYER_FLAGS, LayerMetadata());
Ady Abrahamd11bade2022-08-01 16:18:03 -0700102 return sp<EffectLayer>::make(args);
Ana Krulecc84d09b2019-11-02 23:10:29 +0100103}
104
105void RefreshRateSelectionTest::setParent(Layer* child, Layer* parent) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700106 child->setParent(sp<Layer>::fromExisting(parent));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100107}
108
109void RefreshRateSelectionTest::commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -0700110 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800111 layer->commitTransaction(c);
Ana Krulecc84d09b2019-11-02 23:10:29 +0100112}
113
114void RefreshRateSelectionTest::setupScheduler() {
115 auto eventThread = std::make_unique<mock::EventThread>();
116 auto sfEventThread = std::make_unique<mock::EventThread>();
117
118 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
119 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -0700120 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
121 mock::EventThread::kCallingUid,
122 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100123
124 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
125 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -0700126 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
127 mock::EventThread::kCallingUid,
128 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100129
Ady Abraham8cb21882020-08-26 18:22:05 -0700130 auto vsyncController = std::make_unique<mock::VsyncController>();
131 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100132
Ady Abraham8cb21882020-08-26 18:22:05 -0700133 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
134 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100135 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700136 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
137 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
138 std::move(eventThread), std::move(sfEventThread));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100139}
140
Ana Krulecc84d09b2019-11-02 23:10:29 +0100141namespace {
142/* ------------------------------------------------------------------------
143 * Test cases
144 */
Ana Krulecc84d09b2019-11-02 23:10:29 +0100145TEST_F(RefreshRateSelectionTest, testPriorityOnBufferStateLayers) {
146 mParent = createBufferStateLayer();
147 mChild = createBufferStateLayer();
148 setParent(mChild.get(), mParent.get());
149 mGrandChild = createBufferStateLayer();
150 setParent(mGrandChild.get(), mChild.get());
151
152 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
153 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
154 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
155
156 // Child has its own priority.
157 mGrandChild->setFrameRateSelectionPriority(1);
158 commitTransaction(mGrandChild.get());
159 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
160 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
161 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
162
163 // Child inherits from his parent.
164 mChild->setFrameRateSelectionPriority(1);
165 commitTransaction(mChild.get());
166 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
167 commitTransaction(mGrandChild.get());
168 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
169 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
170 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
171
172 // Grandchild inherits from his grand parent.
173 mParent->setFrameRateSelectionPriority(1);
174 commitTransaction(mParent.get());
175 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
176 commitTransaction(mChild.get());
177 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
178 commitTransaction(mGrandChild.get());
179 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
180 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
181 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
182}
183
Vishnu Nairfa247b12020-02-11 08:58:26 -0800184TEST_F(RefreshRateSelectionTest, testPriorityOnEffectLayers) {
185 mParent = createEffectLayer();
186 mChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100187 setParent(mChild.get(), mParent.get());
Vishnu Nairfa247b12020-02-11 08:58:26 -0800188 mGrandChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100189 setParent(mGrandChild.get(), mChild.get());
190
191 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
192 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
193 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
194
195 // Child has its own priority.
196 mGrandChild->setFrameRateSelectionPriority(1);
197 commitTransaction(mGrandChild.get());
198 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
199 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
200 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
201
202 // Child inherits from his parent.
203 mChild->setFrameRateSelectionPriority(1);
204 commitTransaction(mChild.get());
205 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
206 commitTransaction(mGrandChild.get());
207 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
208 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
209 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
210
211 // Grandchild inherits from his grand parent.
212 mParent->setFrameRateSelectionPriority(1);
213 commitTransaction(mParent.get());
214 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
215 commitTransaction(mChild.get());
216 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
217 commitTransaction(mGrandChild.get());
218 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
219 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
220 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
221}
222
223} // namespace
Ady Abraham2b55c3b2020-01-16 16:38:51 -0800224} // namespace android