blob: ac63a0edbdb9e4265078738e3369783ae7ce5c0d [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 "Layer.h"
25#include "TestableSurfaceFlinger.h"
26#include "mock/DisplayHardware/MockComposer.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010027#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070028#include "mock/MockVsyncController.h"
Ana Krulecc84d09b2019-11-02 23:10:29 +010029
30namespace android {
31
32using testing::_;
33using testing::DoAll;
34using testing::Mock;
35using testing::Return;
36using testing::SetArgPointee;
37
38using android::Hwc2::IComposer;
39using android::Hwc2::IComposerClient;
40
41using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
42
43/**
44 * This class covers all the test that are related to refresh rate selection.
45 */
46class RefreshRateSelectionTest : public testing::Test {
47public:
48 RefreshRateSelectionTest();
49 ~RefreshRateSelectionTest() override;
50
51protected:
52 static constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
53 static constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
54 static constexpr uint32_t WIDTH = 100;
55 static constexpr uint32_t HEIGHT = 100;
56 static constexpr uint32_t LAYER_FLAGS = 0;
57 static constexpr int32_t PRIORITY_UNSET = -1;
58
59 void setupScheduler();
Patrick Williams83f36b22022-09-14 17:57:35 +000060 sp<Layer> createBufferStateLayer();
Patrick Williams46b61b92022-09-01 17:25:49 +000061 sp<Layer> createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +010062
63 void setParent(Layer* child, Layer* parent);
64 void commitTransaction(Layer* layer);
65
66 TestableSurfaceFlinger mFlinger;
Ana Krulecc84d09b2019-11-02 23:10:29 +010067
68 sp<Client> mClient;
69 sp<Layer> mParent;
70 sp<Layer> mChild;
71 sp<Layer> mGrandChild;
72};
73
74RefreshRateSelectionTest::RefreshRateSelectionTest() {
75 const ::testing::TestInfo* const test_info =
76 ::testing::UnitTest::GetInstance()->current_test_info();
77 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
78
79 setupScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080080 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ana Krulecc84d09b2019-11-02 23:10:29 +010081}
82
83RefreshRateSelectionTest::~RefreshRateSelectionTest() {
84 const ::testing::TestInfo* const test_info =
85 ::testing::UnitTest::GetInstance()->current_test_info();
86 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
87}
88
Patrick Williams83f36b22022-09-14 17:57:35 +000089sp<Layer> RefreshRateSelectionTest::createBufferStateLayer() {
Ana Krulecc84d09b2019-11-02 23:10:29 +010090 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080091 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-queue-layer", LAYER_FLAGS,
92 LayerMetadata());
Patrick Williams83f36b22022-09-14 17:57:35 +000093 return sp<Layer>::make(args);
Ana Krulecc84d09b2019-11-02 23:10:29 +010094}
95
Patrick Williams46b61b92022-09-01 17:25:49 +000096sp<Layer> RefreshRateSelectionTest::createEffectLayer() {
Ana Krulecc84d09b2019-11-02 23:10:29 +010097 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080098 LayerCreationArgs args(mFlinger.flinger(), client, "color-layer", LAYER_FLAGS, LayerMetadata());
Patrick Williams46b61b92022-09-01 17:25:49 +000099 return sp<Layer>::make(args);
Ana Krulecc84d09b2019-11-02 23:10:29 +0100100}
101
102void RefreshRateSelectionTest::setParent(Layer* child, Layer* parent) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700103 child->setParent(sp<Layer>::fromExisting(parent));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100104}
105
106void RefreshRateSelectionTest::commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -0700107 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800108 layer->commitTransaction(c);
Ana Krulecc84d09b2019-11-02 23:10:29 +0100109}
110
111void RefreshRateSelectionTest::setupScheduler() {
112 auto eventThread = std::make_unique<mock::EventThread>();
113 auto sfEventThread = std::make_unique<mock::EventThread>();
114
115 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
116 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -0700117 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
118 mock::EventThread::kCallingUid,
119 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100120
121 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
122 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -0700123 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
124 mock::EventThread::kCallingUid,
125 ResyncCallback())));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100126
Ady Abraham8cb21882020-08-26 18:22:05 -0700127 auto vsyncController = std::make_unique<mock::VsyncController>();
128 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100129
Ady Abraham8cb21882020-08-26 18:22:05 -0700130 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
131 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100132 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700133 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
134 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
135 std::move(eventThread), std::move(sfEventThread));
Ana Krulecc84d09b2019-11-02 23:10:29 +0100136}
137
Ana Krulecc84d09b2019-11-02 23:10:29 +0100138namespace {
139/* ------------------------------------------------------------------------
140 * Test cases
141 */
Ana Krulecc84d09b2019-11-02 23:10:29 +0100142TEST_F(RefreshRateSelectionTest, testPriorityOnBufferStateLayers) {
143 mParent = createBufferStateLayer();
144 mChild = createBufferStateLayer();
145 setParent(mChild.get(), mParent.get());
146 mGrandChild = createBufferStateLayer();
147 setParent(mGrandChild.get(), mChild.get());
148
149 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
150 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
151 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
152
153 // Child has its own priority.
154 mGrandChild->setFrameRateSelectionPriority(1);
155 commitTransaction(mGrandChild.get());
156 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
157 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
158 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
159
160 // Child inherits from his parent.
161 mChild->setFrameRateSelectionPriority(1);
162 commitTransaction(mChild.get());
163 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
164 commitTransaction(mGrandChild.get());
165 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
166 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
167 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
168
169 // Grandchild inherits from his grand parent.
170 mParent->setFrameRateSelectionPriority(1);
171 commitTransaction(mParent.get());
172 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
173 commitTransaction(mChild.get());
174 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
175 commitTransaction(mGrandChild.get());
176 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
177 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
178 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
179}
180
Vishnu Nairfa247b12020-02-11 08:58:26 -0800181TEST_F(RefreshRateSelectionTest, testPriorityOnEffectLayers) {
182 mParent = createEffectLayer();
183 mChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100184 setParent(mChild.get(), mParent.get());
Vishnu Nairfa247b12020-02-11 08:58:26 -0800185 mGrandChild = createEffectLayer();
Ana Krulecc84d09b2019-11-02 23:10:29 +0100186 setParent(mGrandChild.get(), mChild.get());
187
188 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
189 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
190 ASSERT_EQ(PRIORITY_UNSET, mGrandChild->getFrameRateSelectionPriority());
191
192 // Child has its own priority.
193 mGrandChild->setFrameRateSelectionPriority(1);
194 commitTransaction(mGrandChild.get());
195 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
196 ASSERT_EQ(PRIORITY_UNSET, mChild->getFrameRateSelectionPriority());
197 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
198
199 // Child inherits from his parent.
200 mChild->setFrameRateSelectionPriority(1);
201 commitTransaction(mChild.get());
202 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
203 commitTransaction(mGrandChild.get());
204 ASSERT_EQ(PRIORITY_UNSET, mParent->getFrameRateSelectionPriority());
205 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
206 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
207
208 // Grandchild inherits from his grand parent.
209 mParent->setFrameRateSelectionPriority(1);
210 commitTransaction(mParent.get());
211 mChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
212 commitTransaction(mChild.get());
213 mGrandChild->setFrameRateSelectionPriority(PRIORITY_UNSET);
214 commitTransaction(mGrandChild.get());
215 ASSERT_EQ(1, mParent->getFrameRateSelectionPriority());
216 ASSERT_EQ(1, mChild->getFrameRateSelectionPriority());
217 ASSERT_EQ(1, mGrandChild->getFrameRateSelectionPriority());
218}
219
220} // namespace
Ady Abraham2b55c3b2020-01-16 16:38:51 -0800221} // namespace android