blob: 6e668afdca067c313d1c0cb21160f49f12105451 [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
Daniel Nicoarad47f4a92017-05-30 15:38:30 -040028Composer::Composer() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080029 mComposer = ::testing::VtsHalHidlTargetTestBase::getService<IComposer>();
30 init();
Daniel Nicoarad47f4a92017-05-30 15:38:30 -040031}
32
33Composer::Composer(const std::string& name) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080034 mComposer = ::testing::VtsHalHidlTargetTestBase::getService<IComposer>(name);
35 init();
Daniel Nicoarad47f4a92017-05-30 15:38:30 -040036}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080037
38void Composer::init() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080039 ASSERT_NE(nullptr, mComposer.get()) << "failed to get composer service";
Chia-I Wu8cc5a152017-02-24 14:34:02 -080040
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080041 std::vector<IComposer::Capability> capabilities = getCapabilities();
42 mCapabilities.insert(capabilities.begin(), capabilities.end());
Chia-I Wu8cc5a152017-02-24 14:34:02 -080043}
44
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080045sp<IComposer> Composer::getRaw() const {
46 return mComposer;
47}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080048
49bool Composer::hasCapability(IComposer::Capability capability) const {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080050 return mCapabilities.count(capability) > 0;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080051}
52
53std::vector<IComposer::Capability> Composer::getCapabilities() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080054 std::vector<IComposer::Capability> capabilities;
55 mComposer->getCapabilities(
56 [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080057
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080058 return capabilities;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080059}
60
61std::string Composer::dumpDebugInfo() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080062 std::string debugInfo;
63 mComposer->dumpDebugInfo([&](const auto& tmpDebugInfo) { debugInfo = tmpDebugInfo.c_str(); });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080064
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080065 return debugInfo;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080066}
67
68std::unique_ptr<ComposerClient> Composer::createClient() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080069 std::unique_ptr<ComposerClient> client;
70 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
71 ASSERT_EQ(Error::NONE, tmpError) << "failed to create client";
72 client = std::make_unique<ComposerClient>(tmpClient);
73 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080074
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080075 return client;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080076}
77
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080078ComposerClient::ComposerClient(const sp<IComposerClient>& client) : mClient(client) {}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080079
80ComposerClient::~ComposerClient() {
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080081 for (const auto& it : mDisplayResources) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080082 Display display = it.first;
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080083 const DisplayResource& resource = it.second;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080084
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080085 for (auto layer : resource.layers) {
86 EXPECT_EQ(Error::NONE, mClient->destroyLayer(display, layer))
87 << "failed to destroy layer " << layer;
88 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080089
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080090 if (resource.isVirtual) {
91 EXPECT_EQ(Error::NONE, mClient->destroyVirtualDisplay(display))
92 << "failed to destroy virtual display " << display;
93 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080094 }
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080095 mDisplayResources.clear();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080096}
97
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080098sp<IComposerClient> ComposerClient::getRaw() const {
99 return mClient;
100}
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800101
102void ComposerClient::registerCallback(const sp<IComposerCallback>& callback) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800103 mClient->registerCallback(callback);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800104}
105
106uint32_t ComposerClient::getMaxVirtualDisplayCount() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800107 return mClient->getMaxVirtualDisplayCount();
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800108}
109
110Display ComposerClient::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800111 PixelFormat formatHint, uint32_t outputBufferSlotCount,
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800112 PixelFormat* outFormat) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800113 Display display = 0;
114 mClient->createVirtualDisplay(
115 width, height, formatHint, outputBufferSlotCount,
116 [&](const auto& tmpError, const auto& tmpDisplay, const auto& tmpFormat) {
117 ASSERT_EQ(Error::NONE, tmpError) << "failed to create virtual display";
118 display = tmpDisplay;
119 *outFormat = tmpFormat;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800120
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800121 ASSERT_TRUE(mDisplayResources.insert({display, DisplayResource(true)}).second)
122 << "duplicated virtual display id " << display;
123 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800124
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800125 return display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800126}
127
128void ComposerClient::destroyVirtualDisplay(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800129 Error error = mClient->destroyVirtualDisplay(display);
130 ASSERT_EQ(Error::NONE, error) << "failed to destroy virtual display " << display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800131
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800132 mDisplayResources.erase(display);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800133}
134
135Layer ComposerClient::createLayer(Display display, uint32_t bufferSlotCount) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800136 Layer layer = 0;
137 mClient->createLayer(display, bufferSlotCount, [&](const auto& tmpError, const auto& tmpLayer) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800138 ASSERT_EQ(Error::NONE, tmpError) << "failed to create layer";
139 layer = tmpLayer;
140
141 auto resourceIt = mDisplayResources.find(display);
142 if (resourceIt == mDisplayResources.end()) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800143 resourceIt = mDisplayResources.insert({display, DisplayResource(false)}).first;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800144 }
145
146 ASSERT_TRUE(resourceIt->second.layers.insert(layer).second)
147 << "duplicated layer id " << layer;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800148 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800149
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800150 return layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800151}
152
153void ComposerClient::destroyLayer(Display display, Layer layer) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800154 Error error = mClient->destroyLayer(display, layer);
155 ASSERT_EQ(Error::NONE, error) << "failed to destroy layer " << layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800156
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800157 auto resourceIt = mDisplayResources.find(display);
158 ASSERT_NE(mDisplayResources.end(), resourceIt);
159 resourceIt->second.layers.erase(layer);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800160}
161
162Config ComposerClient::getActiveConfig(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800163 Config config = 0;
164 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800165 ASSERT_EQ(Error::NONE, tmpError) << "failed to get active config";
166 config = tmpConfig;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800167 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800168
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800169 return config;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800170}
171
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800172bool ComposerClient::getClientTargetSupport(Display display, uint32_t width, uint32_t height,
173 PixelFormat format, Dataspace dataspace) {
174 Error error = mClient->getClientTargetSupport(display, width, height, format, dataspace);
175 return error == Error::NONE;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800176}
177
178std::vector<ColorMode> ComposerClient::getColorModes(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800179 std::vector<ColorMode> modes;
180 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpMode) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800181 ASSERT_EQ(Error::NONE, tmpError) << "failed to get color mode";
182 modes = tmpMode;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800183 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800184
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800185 return modes;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800186}
187
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800188int32_t ComposerClient::getDisplayAttribute(Display display, Config config,
189 IComposerClient::Attribute attribute) {
190 int32_t value = 0;
191 mClient->getDisplayAttribute(
192 display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) {
193 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display attribute";
194 value = tmpValue;
195 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800196
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800197 return value;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800198}
199
200std::vector<Config> ComposerClient::getDisplayConfigs(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800201 std::vector<Config> configs;
202 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800203 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display configs";
204 configs = tmpConfigs;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800205 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800206
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800207 return configs;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800208}
209
210std::string ComposerClient::getDisplayName(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800211 std::string name;
212 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800213 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display name";
214 name = tmpName.c_str();
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800215 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800216
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800217 return name;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800218}
219
220IComposerClient::DisplayType ComposerClient::getDisplayType(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800221 IComposerClient::DisplayType type = IComposerClient::DisplayType::INVALID;
222 mClient->getDisplayType(display, [&](const auto& tmpError, const auto& tmpType) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800223 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display type";
224 type = tmpType;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800225 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800226
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800227 return type;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800228}
229
230bool ComposerClient::getDozeSupport(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800231 bool support = false;
232 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800233 ASSERT_EQ(Error::NONE, tmpError) << "failed to get doze support";
234 support = tmpSupport;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800235 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800236
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800237 return support;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800238}
239
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800240std::vector<Hdr> ComposerClient::getHdrCapabilities(Display display, float* outMaxLuminance,
241 float* outMaxAverageLuminance,
242 float* outMinLuminance) {
243 std::vector<Hdr> types;
244 mClient->getHdrCapabilities(
245 display, [&](const auto& tmpError, const auto& tmpTypes, const auto& tmpMaxLuminance,
246 const auto& tmpMaxAverageLuminance, const auto& tmpMinLuminance) {
247 ASSERT_EQ(Error::NONE, tmpError) << "failed to get HDR capabilities";
248 types = tmpTypes;
249 *outMaxLuminance = tmpMaxLuminance;
250 *outMaxAverageLuminance = tmpMaxAverageLuminance;
251 *outMinLuminance = tmpMinLuminance;
252 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800253
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800254 return types;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800255}
256
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800257void ComposerClient::setClientTargetSlotCount(Display display, uint32_t clientTargetSlotCount) {
258 Error error = mClient->setClientTargetSlotCount(display, clientTargetSlotCount);
259 ASSERT_EQ(Error::NONE, error) << "failed to set client target slot count";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800260}
261
262void ComposerClient::setActiveConfig(Display display, Config config) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800263 Error error = mClient->setActiveConfig(display, config);
264 ASSERT_EQ(Error::NONE, error) << "failed to set active config";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800265}
266
267void ComposerClient::setColorMode(Display display, ColorMode mode) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800268 Error error = mClient->setColorMode(display, mode);
269 ASSERT_EQ(Error::NONE, error) << "failed to set color mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800270}
271
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800272void ComposerClient::setPowerMode(Display display, IComposerClient::PowerMode mode) {
273 Error error = mClient->setPowerMode(display, mode);
274 ASSERT_EQ(Error::NONE, error) << "failed to set power mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800275}
276
277void ComposerClient::setVsyncEnabled(Display display, bool enabled) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800278 IComposerClient::Vsync vsync =
279 (enabled) ? IComposerClient::Vsync::ENABLE : IComposerClient::Vsync::DISABLE;
280 Error error = mClient->setVsyncEnabled(display, vsync);
281 ASSERT_EQ(Error::NONE, error) << "failed to set vsync mode";
Chia-I Wu4f490382017-07-24 11:11:01 -0700282
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800283 // give the hwbinder thread some time to handle any pending vsync callback
284 if (!enabled) {
285 usleep(5 * 1000);
286 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800287}
288
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800289void ComposerClient::execute(TestCommandReader* reader, CommandWriterBase* writer) {
290 bool queueChanged = false;
291 uint32_t commandLength = 0;
292 hidl_vec<hidl_handle> commandHandles;
293 ASSERT_TRUE(writer->writeQueue(&queueChanged, &commandLength, &commandHandles));
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400294
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800295 if (queueChanged) {
296 auto ret = mClient->setInputCommandQueue(*writer->getMQDescriptor());
297 ASSERT_EQ(Error::NONE, static_cast<Error>(ret));
298 return;
299 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400300
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800301 mClient->executeCommands(commandLength, commandHandles,
302 [&](const auto& tmpError, const auto& tmpOutQueueChanged,
303 const auto& tmpOutLength, const auto& tmpOutHandles) {
304 ASSERT_EQ(Error::NONE, tmpError);
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400305
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800306 if (tmpOutQueueChanged) {
307 mClient->getOutputCommandQueue(
308 [&](const auto& tmpError, const auto& tmpDescriptor) {
309 ASSERT_EQ(Error::NONE, tmpError);
310 reader->setMQDescriptor(tmpDescriptor);
311 });
312 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400313
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800314 ASSERT_TRUE(reader->readQueue(tmpOutLength, tmpOutHandles));
315 reader->parse();
316 });
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400317}
318
Chia-I Wu96a098a2018-01-25 10:38:06 -0800319} // namespace vts
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800320} // namespace V2_1
321} // namespace composer
322} // namespace graphics
323} // namespace hardware
324} // namespace android