blob: b79909ad9da28389c08d62ee6c3ac68f32c470e0 [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());
60 return new BufferStateLayer(args);
61 }
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(_, _))
69 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
70 ResyncCallback())));
71
72 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
73 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
74 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
75 ResyncCallback())));
76
77 auto vsyncController = std::make_unique<mock::VsyncController>();
78 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
79
80 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
81 EXPECT_CALL(*vsyncTracker, currentPeriod())
82 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
83 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
84 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
85 std::move(eventThread), std::move(sfEventThread));
86 }
87
88 void setupComposer() {
89 mComposer = new Hwc2::mock::Composer();
90 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
91
92 Mock::VerifyAndClear(mComposer);
93 }
94
95 // Mocks the behavior of applying a transaction from WMShell
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070096 void setGameModeMetadata(sp<Layer> layer, GameMode gameMode) {
Huihong Luod3d8f8e2022-03-08 14:48:46 -080097 mLayerMetadata.setInt32(gui::METADATA_GAME_MODE, static_cast<int32_t>(gameMode));
Adithya Srinivasanac977e62021-05-21 22:50:56 +000098 layer->setMetadata(mLayerMetadata);
99 layer->setGameModeForTree(gameMode);
100 }
101
102 TestableSurfaceFlinger mFlinger;
103 Hwc2::mock::Composer* mComposer = nullptr;
104 client_cache_t mClientCache;
105 LayerMetadata mLayerMetadata;
106};
107
108TEST_F(GameModeTest, SetGameModeSetsForAllCurrentChildren) {
109 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
110 sp<BufferStateLayer> childLayer1 = createBufferStateLayer();
111 sp<BufferStateLayer> childLayer2 = createBufferStateLayer();
112 rootLayer->addChild(childLayer1);
113 rootLayer->addChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700114 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000115
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700116 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
117 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Performance);
118 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000119}
120
121TEST_F(GameModeTest, AddChildAppliesGameModeFromParent) {
122 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
123 sp<BufferStateLayer> childLayer = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700124 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000125 rootLayer->addChild(childLayer);
126
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700127 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
128 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000129}
130
131TEST_F(GameModeTest, RemoveChildResetsGameMode) {
132 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
133 sp<BufferStateLayer> childLayer = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700134 rootLayer->setGameModeForTree(GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000135 rootLayer->addChild(childLayer);
136
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700137 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Performance);
138 EXPECT_EQ(childLayer->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000139
140 rootLayer->removeChild(childLayer);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700141 EXPECT_EQ(childLayer->getGameMode(), GameMode::Unsupported);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000142}
143
144TEST_F(GameModeTest, ReparentingDoesNotOverrideMetadata) {
145 sp<BufferStateLayer> rootLayer = createBufferStateLayer();
146 sp<BufferStateLayer> childLayer1 = createBufferStateLayer();
147 sp<BufferStateLayer> childLayer2 = createBufferStateLayer();
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700148 rootLayer->setGameModeForTree(GameMode::Standard);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000149 rootLayer->addChild(childLayer1);
150
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700151 setGameModeMetadata(childLayer2, GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000152 rootLayer->addChild(childLayer2);
153
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700154 EXPECT_EQ(rootLayer->getGameMode(), GameMode::Standard);
155 EXPECT_EQ(childLayer1->getGameMode(), GameMode::Standard);
156 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000157
158 rootLayer->removeChild(childLayer2);
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700159 EXPECT_EQ(childLayer2->getGameMode(), GameMode::Performance);
Adithya Srinivasanac977e62021-05-21 22:50:56 +0000160}
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -0700161
162} // namespace android