blob: 29aa7171bae13b88b63f2d429a95831f0666b780 [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
Patrick Williams83f36b22022-09-14 17:57:35 +000056 sp<Layer> createLayer() {
Adithya Srinivasanac977e62021-05-21 22:50:56 +000057 sp<Client> client;
Patrick Williams83f36b22022-09-14 17:57:35 +000058 LayerCreationArgs args(mFlinger.flinger(), client, "layer", 0, LayerMetadata());
59 return sp<Layer>::make(args);
Adithya Srinivasanac977e62021-05-21 22:50:56 +000060 }
61
62 void setupScheduler() {
63 auto eventThread = std::make_unique<mock::EventThread>();
64 auto sfEventThread = std::make_unique<mock::EventThread>();
65
66 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
67 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070068 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
69 mock::EventThread::kCallingUid,
70 ResyncCallback())));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000071
72 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
73 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070074 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
75 mock::EventThread::kCallingUid,
76 ResyncCallback())));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000077
78 auto vsyncController = std::make_unique<mock::VsyncController>();
79 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
80
81 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
82 EXPECT_CALL(*vsyncTracker, currentPeriod())
83 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
84 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
85 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
86 std::move(eventThread), std::move(sfEventThread));
87 }
88
89 void setupComposer() {
90 mComposer = new Hwc2::mock::Composer();
91 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
92
93 Mock::VerifyAndClear(mComposer);
94 }
95
96 // Mocks the behavior of applying a transaction from WMShell
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070097 void setGameModeMetadata(sp<Layer> layer, GameMode gameMode) {
Huihong Luod3d8f8e2022-03-08 14:48:46 -080098 mLayerMetadata.setInt32(gui::METADATA_GAME_MODE, static_cast<int32_t>(gameMode));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000099 layer->setMetadata(mLayerMetadata);
100 layer->setGameModeForTree(gameMode);
101 }
102
103 TestableSurfaceFlinger mFlinger;
104 Hwc2::mock::Composer* mComposer = nullptr;
105 client_cache_t mClientCache;
106 LayerMetadata mLayerMetadata;
107};
108
109TEST_F(GameModeTest, SetGameModeSetsForAllCurrentChildren) {
Patrick Williams83f36b22022-09-14 17:57:35 +0000110 sp<Layer> rootLayer = createLayer();
111 sp<Layer> childLayer1 = createLayer();
112 sp<Layer> childLayer2 = createLayer();
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000113 rootLayer->addChild(childLayer1);
114 rootLayer->addChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700115 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000116
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700117 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
118 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Performance);
119 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000120}
121
122TEST_F(GameModeTest, AddChildAppliesGameModeFromParent) {
Patrick Williams83f36b22022-09-14 17:57:35 +0000123 sp<Layer> rootLayer = createLayer();
124 sp<Layer> childLayer = createLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700125 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000126 rootLayer->addChild(childLayer);
127
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700128 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
129 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000130}
131
132TEST_F(GameModeTest, RemoveChildResetsGameMode) {
Patrick Williams83f36b22022-09-14 17:57:35 +0000133 sp<Layer> rootLayer = createLayer();
134 sp<Layer> childLayer = createLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700135 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000136 rootLayer->addChild(childLayer);
137
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700138 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
139 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000140
141 rootLayer->removeChild(childLayer);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700142 EXPECT_EQ(childLayer->getGameMode(), GameMode::Unsupported);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000143}
144
145TEST_F(GameModeTest, ReparentingDoesNotOverrideMetadata) {
Patrick Williams83f36b22022-09-14 17:57:35 +0000146 sp<Layer> rootLayer = createLayer();
147 sp<Layer> childLayer1 = createLayer();
148 sp<Layer> childLayer2 = createLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700149 rootLayer->setGameModeForTree(GameMode::Standard);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000150 rootLayer->addChild(childLayer1);
151
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700152 setGameModeMetadata(childLayer2, GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000153 rootLayer->addChild(childLayer2);
154
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700155 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Standard);
156 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Standard);
157 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000158
159 rootLayer->removeChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700160 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000161}
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700162
163} // namespace android