blob: cd857c3d3446ecc8d168a3b644125c3d85f31819 [file] [log] [blame]
Adithya Srinivasanac977e62021-05-21 22:50:56 +00001/*
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 <gmock/gmock.h>
21#include <gtest/gtest.h>
22#include <gui/LayerMetadata.h>
23#include <gui/SurfaceComposerClient.h>
24#include <log/log.h>
25
26#include "TestableSurfaceFlinger.h"
27#include "mock/DisplayHardware/MockComposer.h"
28#include "mock/MockEventThread.h"
29#include "mock/MockVsyncController.h"
30
31namespace android {
32
33using testing::_;
34using testing::Mock;
35using testing::Return;
36using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
Huihong Luod3d8f8e2022-03-08 14:48:46 -080037using gui::GameMode;
38using gui::LayerMetadata;
Adithya Srinivasanac977e62021-05-21 22:50:56 +000039
40class GameModeTest : public testing::Test {
41public:
42 GameModeTest() {
43 const ::testing::TestInfo* const test_info =
44 ::testing::UnitTest::GetInstance()->current_test_info();
45 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
46 setupScheduler();
47 setupComposer();
48 }
49
50 ~GameModeTest() {
51 const ::testing::TestInfo* const test_info =
52 ::testing::UnitTest::GetInstance()->current_test_info();
53 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
54 }
55
56 sp<BufferStateLayer> createBufferStateLayer() {
57 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080058 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 0,
Adithya Srinivasanac977e62021-05-21 22:50:56 +000059 LayerMetadata());
Ady Abrahamd11bade2022-08-01 16:18:03 -070060 return sp<BufferStateLayer>::make(args);
Adithya Srinivasanac977e62021-05-21 22:50:56 +000061 }
62
63 void setupScheduler() {
64 auto eventThread = std::make_unique<mock::EventThread>();
65 auto sfEventThread = std::make_unique<mock::EventThread>();
66
67 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
68 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070069 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
70 mock::EventThread::kCallingUid,
71 ResyncCallback())));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000072
73 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
74 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070075 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
76 mock::EventThread::kCallingUid,
77 ResyncCallback())));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000078
79 auto vsyncController = std::make_unique<mock::VsyncController>();
80 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
81
82 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
83 EXPECT_CALL(*vsyncTracker, currentPeriod())
84 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
85 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
86 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
87 std::move(eventThread), std::move(sfEventThread));
88 }
89
90 void setupComposer() {
91 mComposer = new Hwc2::mock::Composer();
92 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
93
94 Mock::VerifyAndClear(mComposer);
95 }
96
97 // Mocks the behavior of applying a transaction from WMShell
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070098 void setGameModeMetadata(sp<Layer> layer, GameMode gameMode) {
Huihong Luod3d8f8e2022-03-08 14:48:46 -080099 mLayerMetadata.setInt32(gui::METADATA_GAME_MODE, static_cast<int32_t>(gameMode));
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000100 layer->setMetadata(mLayerMetadata);
101 layer->setGameModeForTree(gameMode);
102 }
103
104 TestableSurfaceFlinger mFlinger;
105 Hwc2::mock::Composer* mComposer = nullptr;
106 client_cache_t mClientCache;
107 LayerMetadata mLayerMetadata;
108};
109
110TEST_F(GameModeTest, SetGameModeSetsForAllCurrentChildren) {
111 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
112 sp<BufferStateLayer> childLayer1 = createBufferStateLayer();
113 sp<BufferStateLayer> childLayer2 = createBufferStateLayer();
114 rootLayer->addChild(childLayer1);
115 rootLayer->addChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700116 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000117
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700118 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
119 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Performance);
120 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000121}
122
123TEST_F(GameModeTest, AddChildAppliesGameModeFromParent) {
124 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
125 sp<BufferStateLayer> childLayer = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700126 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000127 rootLayer->addChild(childLayer);
128
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700129 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
130 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000131}
132
133TEST_F(GameModeTest, RemoveChildResetsGameMode) {
134 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
135 sp<BufferStateLayer> childLayer = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700136 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000137 rootLayer->addChild(childLayer);
138
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700139 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
140 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000141
142 rootLayer->removeChild(childLayer);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700143 EXPECT_EQ(childLayer->getGameMode(), GameMode::Unsupported);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000144}
145
146TEST_F(GameModeTest, ReparentingDoesNotOverrideMetadata) {
147 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
148 sp<BufferStateLayer> childLayer1 = createBufferStateLayer();
149 sp<BufferStateLayer> childLayer2 = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700150 rootLayer->setGameModeForTree(GameMode::Standard);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000151 rootLayer->addChild(childLayer1);
152
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700153 setGameModeMetadata(childLayer2, GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000154 rootLayer->addChild(childLayer2);
155
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700156 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Standard);
157 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Standard);
158 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000159
160 rootLayer->removeChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700161 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000162}
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700163
164} // namespace android