blob: 43a5378bfb869b06a10d1ee0f51f514440464a2c [file] [log] [blame]
Chia-I Wu8cc5a152017-02-24 14:34:02 -08001/*
2 * Copyright (C) 2017 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
Chia-I Wu96a098a2018-01-25 10:38:06 -080017#include <composer-vts/2.1/ComposerVts.h>
Chia-I Wu8cc5a152017-02-24 14:34:02 -080018
Chia-I Wu96a098a2018-01-25 10:38:06 -080019#include <VtsHalHidlTargetTestBase.h>
Chia-I Wu8cc5a152017-02-24 14:34:02 -080020
21namespace android {
22namespace hardware {
23namespace graphics {
24namespace composer {
25namespace V2_1 {
Chia-I Wu96a098a2018-01-25 10:38:06 -080026namespace vts {
Chia-I Wu8cc5a152017-02-24 14:34:02 -080027
Dominik Laskowski0c415582018-04-02 15:35:00 -070028Composer::Composer() : Composer(::testing::VtsHalHidlTargetTestBase::getService<IComposer>()) {}
Daniel Nicoarad47f4a92017-05-30 15:38:30 -040029
Dominik Laskowski0c415582018-04-02 15:35:00 -070030Composer::Composer(const std::string& name)
31 : Composer(::testing::VtsHalHidlTargetTestBase::getService<IComposer>(name)) {}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080032
Dominik Laskowski0c415582018-04-02 15:35:00 -070033Composer::Composer(const sp<IComposer>& composer) : mComposer(composer) {
34 // ASSERT_* can only be used in functions returning void.
35 [this] {
36 ASSERT_NE(nullptr, mComposer.get()) << "failed to get composer service";
Chia-I Wu8cc5a152017-02-24 14:34:02 -080037
Dominik Laskowski0c415582018-04-02 15:35:00 -070038 std::vector<IComposer::Capability> capabilities = getCapabilities();
39 mCapabilities.insert(capabilities.begin(), capabilities.end());
40 }();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080041}
42
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080043sp<IComposer> Composer::getRaw() const {
44 return mComposer;
45}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080046
47bool Composer::hasCapability(IComposer::Capability capability) const {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080048 return mCapabilities.count(capability) > 0;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080049}
50
51std::vector<IComposer::Capability> Composer::getCapabilities() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080052 std::vector<IComposer::Capability> capabilities;
53 mComposer->getCapabilities(
54 [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080055
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080056 return capabilities;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080057}
58
59std::string Composer::dumpDebugInfo() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080060 std::string debugInfo;
61 mComposer->dumpDebugInfo([&](const auto& tmpDebugInfo) { debugInfo = tmpDebugInfo.c_str(); });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080062
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080063 return debugInfo;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080064}
65
66std::unique_ptr<ComposerClient> Composer::createClient() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080067 std::unique_ptr<ComposerClient> client;
68 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
69 ASSERT_EQ(Error::NONE, tmpError) << "failed to create client";
70 client = std::make_unique<ComposerClient>(tmpClient);
71 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080072
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080073 return client;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080074}
75
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080076ComposerClient::ComposerClient(const sp<IComposerClient>& client) : mClient(client) {}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080077
78ComposerClient::~ComposerClient() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080079 for (auto it : mDisplayResources) {
80 Display display = it.first;
81 DisplayResource& resource = it.second;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080082
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080083 for (auto layer : resource.layers) {
84 EXPECT_EQ(Error::NONE, mClient->destroyLayer(display, layer))
85 << "failed to destroy layer " << layer;
86 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080087
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080088 if (resource.isVirtual) {
89 EXPECT_EQ(Error::NONE, mClient->destroyVirtualDisplay(display))
90 << "failed to destroy virtual display " << display;
91 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080092 }
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080093 mDisplayResources.clear();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080094}
95
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080096sp<IComposerClient> ComposerClient::getRaw() const {
97 return mClient;
98}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080099
100void ComposerClient::registerCallback(const sp<IComposerCallback>& callback) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800101 mClient->registerCallback(callback);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800102}
103
104uint32_t ComposerClient::getMaxVirtualDisplayCount() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800105 return mClient->getMaxVirtualDisplayCount();
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800106}
107
108Display ComposerClient::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800109 PixelFormat formatHint, uint32_t outputBufferSlotCount,
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800110 PixelFormat* outFormat) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800111 Display display = 0;
112 mClient->createVirtualDisplay(
113 width, height, formatHint, outputBufferSlotCount,
114 [&](const auto& tmpError, const auto& tmpDisplay, const auto& tmpFormat) {
115 ASSERT_EQ(Error::NONE, tmpError) << "failed to create virtual display";
116 display = tmpDisplay;
117 *outFormat = tmpFormat;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800118
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800119 ASSERT_TRUE(mDisplayResources.insert({display, DisplayResource(true)}).second)
120 << "duplicated virtual display id " << display;
121 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800122
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800123 return display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800124}
125
126void ComposerClient::destroyVirtualDisplay(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800127 Error error = mClient->destroyVirtualDisplay(display);
128 ASSERT_EQ(Error::NONE, error) << "failed to destroy virtual display " << display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800129
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800130 mDisplayResources.erase(display);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800131}
132
133Layer ComposerClient::createLayer(Display display, uint32_t bufferSlotCount) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800134 Layer layer = 0;
135 mClient->createLayer(display, bufferSlotCount, [&](const auto& tmpError, const auto& tmpLayer) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800136 ASSERT_EQ(Error::NONE, tmpError) << "failed to create layer";
137 layer = tmpLayer;
138
139 auto resourceIt = mDisplayResources.find(display);
140 if (resourceIt == mDisplayResources.end()) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800141 resourceIt = mDisplayResources.insert({display, DisplayResource(false)}).first;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800142 }
143
144 ASSERT_TRUE(resourceIt->second.layers.insert(layer).second)
145 << "duplicated layer id " << layer;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800146 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800147
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800148 return layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800149}
150
151void ComposerClient::destroyLayer(Display display, Layer layer) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800152 Error error = mClient->destroyLayer(display, layer);
153 ASSERT_EQ(Error::NONE, error) << "failed to destroy layer " << layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800154
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800155 auto resourceIt = mDisplayResources.find(display);
156 ASSERT_NE(mDisplayResources.end(), resourceIt);
157 resourceIt->second.layers.erase(layer);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800158}
159
160Config ComposerClient::getActiveConfig(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800161 Config config = 0;
162 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800163 ASSERT_EQ(Error::NONE, tmpError) << "failed to get active config";
164 config = tmpConfig;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800165 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800166
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800167 return config;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800168}
169
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800170bool ComposerClient::getClientTargetSupport(Display display, uint32_t width, uint32_t height,
171 PixelFormat format, Dataspace dataspace) {
172 Error error = mClient->getClientTargetSupport(display, width, height, format, dataspace);
173 return error == Error::NONE;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800174}
175
176std::vector<ColorMode> ComposerClient::getColorModes(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800177 std::vector<ColorMode> modes;
178 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpMode) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800179 ASSERT_EQ(Error::NONE, tmpError) << "failed to get color mode";
180 modes = tmpMode;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800181 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800182
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800183 return modes;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800184}
185
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800186int32_t ComposerClient::getDisplayAttribute(Display display, Config config,
187 IComposerClient::Attribute attribute) {
188 int32_t value = 0;
189 mClient->getDisplayAttribute(
190 display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) {
191 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display attribute";
192 value = tmpValue;
193 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800194
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800195 return value;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800196}
197
198std::vector<Config> ComposerClient::getDisplayConfigs(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800199 std::vector<Config> configs;
200 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800201 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display configs";
202 configs = tmpConfigs;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800203 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800204
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800205 return configs;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800206}
207
208std::string ComposerClient::getDisplayName(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800209 std::string name;
210 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800211 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display name";
212 name = tmpName.c_str();
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800213 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800214
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800215 return name;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800216}
217
218IComposerClient::DisplayType ComposerClient::getDisplayType(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800219 IComposerClient::DisplayType type = IComposerClient::DisplayType::INVALID;
220 mClient->getDisplayType(display, [&](const auto& tmpError, const auto& tmpType) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800221 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display type";
222 type = tmpType;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800223 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800224
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800225 return type;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800226}
227
228bool ComposerClient::getDozeSupport(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800229 bool support = false;
230 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800231 ASSERT_EQ(Error::NONE, tmpError) << "failed to get doze support";
232 support = tmpSupport;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800233 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800234
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800235 return support;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800236}
237
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800238std::vector<Hdr> ComposerClient::getHdrCapabilities(Display display, float* outMaxLuminance,
239 float* outMaxAverageLuminance,
240 float* outMinLuminance) {
241 std::vector<Hdr> types;
242 mClient->getHdrCapabilities(
243 display, [&](const auto& tmpError, const auto& tmpTypes, const auto& tmpMaxLuminance,
244 const auto& tmpMaxAverageLuminance, const auto& tmpMinLuminance) {
245 ASSERT_EQ(Error::NONE, tmpError) << "failed to get HDR capabilities";
246 types = tmpTypes;
247 *outMaxLuminance = tmpMaxLuminance;
248 *outMaxAverageLuminance = tmpMaxAverageLuminance;
249 *outMinLuminance = tmpMinLuminance;
250 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800251
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800252 return types;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800253}
254
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800255void ComposerClient::setClientTargetSlotCount(Display display, uint32_t clientTargetSlotCount) {
256 Error error = mClient->setClientTargetSlotCount(display, clientTargetSlotCount);
257 ASSERT_EQ(Error::NONE, error) << "failed to set client target slot count";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800258}
259
260void ComposerClient::setActiveConfig(Display display, Config config) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800261 Error error = mClient->setActiveConfig(display, config);
262 ASSERT_EQ(Error::NONE, error) << "failed to set active config";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800263}
264
265void ComposerClient::setColorMode(Display display, ColorMode mode) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800266 Error error = mClient->setColorMode(display, mode);
267 ASSERT_EQ(Error::NONE, error) << "failed to set color mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800268}
269
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800270void ComposerClient::setPowerMode(Display display, IComposerClient::PowerMode mode) {
271 Error error = mClient->setPowerMode(display, mode);
272 ASSERT_EQ(Error::NONE, error) << "failed to set power mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800273}
274
275void ComposerClient::setVsyncEnabled(Display display, bool enabled) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800276 IComposerClient::Vsync vsync =
277 (enabled) ? IComposerClient::Vsync::ENABLE : IComposerClient::Vsync::DISABLE;
278 Error error = mClient->setVsyncEnabled(display, vsync);
279 ASSERT_EQ(Error::NONE, error) << "failed to set vsync mode";
Chia-I Wu4f490382017-07-24 11:11:01 -0700280
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800281 // give the hwbinder thread some time to handle any pending vsync callback
282 if (!enabled) {
283 usleep(5 * 1000);
284 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800285}
286
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800287void ComposerClient::execute(TestCommandReader* reader, CommandWriterBase* writer) {
288 bool queueChanged = false;
289 uint32_t commandLength = 0;
290 hidl_vec<hidl_handle> commandHandles;
291 ASSERT_TRUE(writer->writeQueue(&queueChanged, &commandLength, &commandHandles));
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400292
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800293 if (queueChanged) {
294 auto ret = mClient->setInputCommandQueue(*writer->getMQDescriptor());
295 ASSERT_EQ(Error::NONE, static_cast<Error>(ret));
296 return;
297 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400298
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800299 mClient->executeCommands(commandLength, commandHandles,
300 [&](const auto& tmpError, const auto& tmpOutQueueChanged,
301 const auto& tmpOutLength, const auto& tmpOutHandles) {
302 ASSERT_EQ(Error::NONE, tmpError);
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400303
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800304 if (tmpOutQueueChanged) {
305 mClient->getOutputCommandQueue(
306 [&](const auto& tmpError, const auto& tmpDescriptor) {
307 ASSERT_EQ(Error::NONE, tmpError);
308 reader->setMQDescriptor(tmpDescriptor);
309 });
310 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400311
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800312 ASSERT_TRUE(reader->readQueue(tmpOutLength, tmpOutHandles));
313 reader->parse();
314 });
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400315}
316
Chia-I Wu96a098a2018-01-25 10:38:06 -0800317} // namespace vts
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800318} // namespace V2_1
319} // namespace composer
320} // namespace graphics
321} // namespace hardware
322} // namespace android