blob: 4603dd1b8c4120ffe71555e375d528a42ee1dcc3 [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 Wu8cc5a152017-02-24 14:34:02 -080019namespace android {
20namespace hardware {
21namespace graphics {
22namespace composer {
23namespace V2_1 {
Chia-I Wu96a098a2018-01-25 10:38:06 -080024namespace vts {
Chia-I Wu8cc5a152017-02-24 14:34:02 -080025
Dominik Laskowski0c415582018-04-02 15:35:00 -070026Composer::Composer(const sp<IComposer>& composer) : mComposer(composer) {
27 // ASSERT_* can only be used in functions returning void.
28 [this] {
29 ASSERT_NE(nullptr, mComposer.get()) << "failed to get composer service";
Chia-I Wu8cc5a152017-02-24 14:34:02 -080030
Dominik Laskowski0c415582018-04-02 15:35:00 -070031 std::vector<IComposer::Capability> capabilities = getCapabilities();
32 mCapabilities.insert(capabilities.begin(), capabilities.end());
33 }();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080034}
35
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080036sp<IComposer> Composer::getRaw() const {
37 return mComposer;
38}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080039
40bool Composer::hasCapability(IComposer::Capability capability) const {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080041 return mCapabilities.count(capability) > 0;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080042}
43
44std::vector<IComposer::Capability> Composer::getCapabilities() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080045 std::vector<IComposer::Capability> capabilities;
46 mComposer->getCapabilities(
47 [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080048
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080049 return capabilities;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080050}
51
52std::string Composer::dumpDebugInfo() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080053 std::string debugInfo;
54 mComposer->dumpDebugInfo([&](const auto& tmpDebugInfo) { debugInfo = tmpDebugInfo.c_str(); });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080055
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080056 return debugInfo;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080057}
58
59std::unique_ptr<ComposerClient> Composer::createClient() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080060 std::unique_ptr<ComposerClient> client;
61 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
62 ASSERT_EQ(Error::NONE, tmpError) << "failed to create client";
63 client = std::make_unique<ComposerClient>(tmpClient);
64 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -080065
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080066 return client;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080067}
68
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080069ComposerClient::ComposerClient(const sp<IComposerClient>& client) : mClient(client) {}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080070
71ComposerClient::~ComposerClient() {
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080072 for (const auto& it : mDisplayResources) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080073 Display display = it.first;
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080074 const DisplayResource& resource = it.second;
Chia-I Wu8cc5a152017-02-24 14:34:02 -080075
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080076 for (auto layer : resource.layers) {
77 EXPECT_EQ(Error::NONE, mClient->destroyLayer(display, layer))
78 << "failed to destroy layer " << layer;
79 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080080
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080081 if (resource.isVirtual) {
82 EXPECT_EQ(Error::NONE, mClient->destroyVirtualDisplay(display))
83 << "failed to destroy virtual display " << display;
84 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -080085 }
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080086 mDisplayResources.clear();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080087}
88
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080089sp<IComposerClient> ComposerClient::getRaw() const {
90 return mClient;
91}
Chia-I Wu8cc5a152017-02-24 14:34:02 -080092
93void ComposerClient::registerCallback(const sp<IComposerCallback>& callback) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080094 mClient->registerCallback(callback);
Chia-I Wu8cc5a152017-02-24 14:34:02 -080095}
96
97uint32_t ComposerClient::getMaxVirtualDisplayCount() {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080098 return mClient->getMaxVirtualDisplayCount();
Chia-I Wu8cc5a152017-02-24 14:34:02 -080099}
100
101Display ComposerClient::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800102 PixelFormat formatHint, uint32_t outputBufferSlotCount,
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800103 PixelFormat* outFormat) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800104 Display display = 0;
105 mClient->createVirtualDisplay(
106 width, height, formatHint, outputBufferSlotCount,
107 [&](const auto& tmpError, const auto& tmpDisplay, const auto& tmpFormat) {
108 ASSERT_EQ(Error::NONE, tmpError) << "failed to create virtual display";
109 display = tmpDisplay;
110 *outFormat = tmpFormat;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800111
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800112 ASSERT_TRUE(mDisplayResources.insert({display, DisplayResource(true)}).second)
113 << "duplicated virtual display id " << display;
114 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800115
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800116 return display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800117}
118
119void ComposerClient::destroyVirtualDisplay(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800120 Error error = mClient->destroyVirtualDisplay(display);
121 ASSERT_EQ(Error::NONE, error) << "failed to destroy virtual display " << display;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800122
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800123 mDisplayResources.erase(display);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800124}
125
126Layer ComposerClient::createLayer(Display display, uint32_t bufferSlotCount) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800127 Layer layer = 0;
128 mClient->createLayer(display, bufferSlotCount, [&](const auto& tmpError, const auto& tmpLayer) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800129 ASSERT_EQ(Error::NONE, tmpError) << "failed to create layer";
130 layer = tmpLayer;
131
132 auto resourceIt = mDisplayResources.find(display);
133 if (resourceIt == mDisplayResources.end()) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800134 resourceIt = mDisplayResources.insert({display, DisplayResource(false)}).first;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800135 }
136
137 ASSERT_TRUE(resourceIt->second.layers.insert(layer).second)
138 << "duplicated layer id " << layer;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800139 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800140
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800141 return layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800142}
143
144void ComposerClient::destroyLayer(Display display, Layer layer) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800145 Error error = mClient->destroyLayer(display, layer);
146 ASSERT_EQ(Error::NONE, error) << "failed to destroy layer " << layer;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800147
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800148 auto resourceIt = mDisplayResources.find(display);
149 ASSERT_NE(mDisplayResources.end(), resourceIt);
150 resourceIt->second.layers.erase(layer);
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800151}
152
153Config ComposerClient::getActiveConfig(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800154 Config config = 0;
155 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800156 ASSERT_EQ(Error::NONE, tmpError) << "failed to get active config";
157 config = tmpConfig;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800158 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800159
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800160 return config;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800161}
162
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800163bool ComposerClient::getClientTargetSupport(Display display, uint32_t width, uint32_t height,
164 PixelFormat format, Dataspace dataspace) {
165 Error error = mClient->getClientTargetSupport(display, width, height, format, dataspace);
166 return error == Error::NONE;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800167}
168
169std::vector<ColorMode> ComposerClient::getColorModes(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800170 std::vector<ColorMode> modes;
171 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpMode) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800172 ASSERT_EQ(Error::NONE, tmpError) << "failed to get color mode";
173 modes = tmpMode;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800174 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800175
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800176 return modes;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800177}
178
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800179int32_t ComposerClient::getDisplayAttribute(Display display, Config config,
180 IComposerClient::Attribute attribute) {
181 int32_t value = 0;
182 mClient->getDisplayAttribute(
183 display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) {
184 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display attribute";
185 value = tmpValue;
186 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800187
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800188 return value;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800189}
190
191std::vector<Config> ComposerClient::getDisplayConfigs(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800192 std::vector<Config> configs;
193 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800194 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display configs";
195 configs = tmpConfigs;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800196 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800197
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800198 return configs;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800199}
200
201std::string ComposerClient::getDisplayName(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800202 std::string name;
203 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800204 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display name";
205 name = tmpName.c_str();
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800206 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800207
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800208 return name;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800209}
210
211IComposerClient::DisplayType ComposerClient::getDisplayType(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800212 IComposerClient::DisplayType type = IComposerClient::DisplayType::INVALID;
213 mClient->getDisplayType(display, [&](const auto& tmpError, const auto& tmpType) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800214 ASSERT_EQ(Error::NONE, tmpError) << "failed to get display type";
215 type = tmpType;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800216 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800217
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800218 return type;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800219}
220
221bool ComposerClient::getDozeSupport(Display display) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800222 bool support = false;
223 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800224 ASSERT_EQ(Error::NONE, tmpError) << "failed to get doze support";
225 support = tmpSupport;
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800226 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800227
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800228 return support;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800229}
230
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800231std::vector<Hdr> ComposerClient::getHdrCapabilities(Display display, float* outMaxLuminance,
232 float* outMaxAverageLuminance,
233 float* outMinLuminance) {
234 std::vector<Hdr> types;
235 mClient->getHdrCapabilities(
236 display, [&](const auto& tmpError, const auto& tmpTypes, const auto& tmpMaxLuminance,
237 const auto& tmpMaxAverageLuminance, const auto& tmpMinLuminance) {
238 ASSERT_EQ(Error::NONE, tmpError) << "failed to get HDR capabilities";
239 types = tmpTypes;
240 *outMaxLuminance = tmpMaxLuminance;
241 *outMaxAverageLuminance = tmpMaxAverageLuminance;
242 *outMinLuminance = tmpMinLuminance;
243 });
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800244
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800245 return types;
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800246}
247
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800248void ComposerClient::setClientTargetSlotCount(Display display, uint32_t clientTargetSlotCount) {
249 Error error = mClient->setClientTargetSlotCount(display, clientTargetSlotCount);
250 ASSERT_EQ(Error::NONE, error) << "failed to set client target slot count";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800251}
252
253void ComposerClient::setActiveConfig(Display display, Config config) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800254 Error error = mClient->setActiveConfig(display, config);
255 ASSERT_EQ(Error::NONE, error) << "failed to set active config";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800256}
257
258void ComposerClient::setColorMode(Display display, ColorMode mode) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800259 Error error = mClient->setColorMode(display, mode);
260 ASSERT_EQ(Error::NONE, error) << "failed to set color mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800261}
262
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800263void ComposerClient::setPowerMode(Display display, IComposerClient::PowerMode mode) {
264 Error error = mClient->setPowerMode(display, mode);
265 ASSERT_EQ(Error::NONE, error) << "failed to set power mode";
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800266}
267
268void ComposerClient::setVsyncEnabled(Display display, bool enabled) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800269 IComposerClient::Vsync vsync =
270 (enabled) ? IComposerClient::Vsync::ENABLE : IComposerClient::Vsync::DISABLE;
271 Error error = mClient->setVsyncEnabled(display, vsync);
272 ASSERT_EQ(Error::NONE, error) << "failed to set vsync mode";
Chia-I Wu4f490382017-07-24 11:11:01 -0700273
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800274 // give the hwbinder thread some time to handle any pending vsync callback
275 if (!enabled) {
276 usleep(5 * 1000);
277 }
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800278}
279
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800280void ComposerClient::execute(TestCommandReader* reader, CommandWriterBase* writer) {
281 bool queueChanged = false;
282 uint32_t commandLength = 0;
283 hidl_vec<hidl_handle> commandHandles;
284 ASSERT_TRUE(writer->writeQueue(&queueChanged, &commandLength, &commandHandles));
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400285
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800286 if (queueChanged) {
287 auto ret = mClient->setInputCommandQueue(*writer->getMQDescriptor());
288 ASSERT_EQ(Error::NONE, static_cast<Error>(ret));
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800289 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400290
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800291 mClient->executeCommands(commandLength, commandHandles,
292 [&](const auto& tmpError, const auto& tmpOutQueueChanged,
293 const auto& tmpOutLength, const auto& tmpOutHandles) {
294 ASSERT_EQ(Error::NONE, tmpError);
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400295
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800296 if (tmpOutQueueChanged) {
297 mClient->getOutputCommandQueue(
298 [&](const auto& tmpError, const auto& tmpDescriptor) {
299 ASSERT_EQ(Error::NONE, tmpError);
300 reader->setMQDescriptor(tmpDescriptor);
301 });
302 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400303
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800304 ASSERT_TRUE(reader->readQueue(tmpOutLength, tmpOutHandles));
305 reader->parse();
306 });
Valerie Haucbe8e9a2018-09-17 10:58:03 -0700307 reader->reset();
308 writer->reset();
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400309}
310
Marin Shalamanov513ae732021-06-14 11:07:30 +0200311NativeHandleWrapper::~NativeHandleWrapper() {
312 if (mHandle) {
313 mGralloc.freeBuffer(mHandle);
314 }
315}
316
Valerie Hauc1dc3132019-06-13 09:49:44 -0700317Gralloc::Gralloc() {
318 [this] {
ramindanib2b747f2022-06-04 00:16:44 +0000319 ASSERT_NO_FATAL_FAILURE(mGralloc4 = std::make_shared<Gralloc4>(
320 /*aidlAllocatorServiceName*/ IAllocator::descriptor +
321 std::string("/default"),
322 /*hidlAllocatorServiceName*/ "default",
323 /*mapperServiceName*/ "default",
324 /*errOnFailure=*/false));
Alec Mouri38ccfd72022-05-16 20:20:28 +0000325 if (!mGralloc4->hasAllocator() || mGralloc4->getMapper() == nullptr) {
Marissa Wall53aff112019-06-20 13:49:21 -0700326 mGralloc4 = nullptr;
327 ASSERT_NO_FATAL_FAILURE(mGralloc3 = std::make_shared<Gralloc3>("default", "default",
328 /*errOnFailure=*/false));
329 if (mGralloc3->getAllocator() == nullptr || mGralloc3->getMapper() == nullptr) {
330 mGralloc3 = nullptr;
331 ASSERT_NO_FATAL_FAILURE(mGralloc2 = std::make_shared<Gralloc2>());
332 }
Valerie Hauc1dc3132019-06-13 09:49:44 -0700333 }
334 }();
335}
336
Marin Shalamanov513ae732021-06-14 11:07:30 +0200337const NativeHandleWrapper Gralloc::allocate(uint32_t width, uint32_t height, uint32_t layerCount,
338 PixelFormat format, uint64_t usage, bool import,
339 uint32_t* outStride) {
340 const native_handle_t* handle;
Marissa Wall53aff112019-06-20 13:49:21 -0700341 if (mGralloc4) {
342 IMapper4::BufferDescriptorInfo info{};
343 info.width = width;
344 info.height = height;
345 info.layerCount = layerCount;
346 info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
347 info.usage = usage;
Marin Shalamanov513ae732021-06-14 11:07:30 +0200348 handle = mGralloc4->allocate(info, import, outStride);
Marissa Wall53aff112019-06-20 13:49:21 -0700349 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700350 IMapper3::BufferDescriptorInfo info{};
351 info.width = width;
352 info.height = height;
353 info.layerCount = layerCount;
354 info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
355 info.usage = usage;
Marin Shalamanov513ae732021-06-14 11:07:30 +0200356 handle = mGralloc3->allocate(info, import, outStride);
Valerie Hauc1dc3132019-06-13 09:49:44 -0700357 } else {
358 IMapper2::BufferDescriptorInfo info{};
359 info.width = width;
360 info.height = height;
361 info.layerCount = layerCount;
362 info.format = format;
363 info.usage = usage;
Marin Shalamanov513ae732021-06-14 11:07:30 +0200364 handle = mGralloc2->allocate(info, import, outStride);
Valerie Hauc1dc3132019-06-13 09:49:44 -0700365 }
Marin Shalamanov513ae732021-06-14 11:07:30 +0200366 return NativeHandleWrapper(*this, handle);
Valerie Hauc1dc3132019-06-13 09:49:44 -0700367}
368
369void* Gralloc::lock(const native_handle_t* bufferHandle, uint64_t cpuUsage,
370 const AccessRegion& accessRegionRect, int acquireFence) {
Marissa Wall53aff112019-06-20 13:49:21 -0700371 if (mGralloc4) {
372 IMapper4::Rect accessRegion;
373 accessRegion.left = accessRegionRect.left;
374 accessRegion.top = accessRegionRect.top;
375 accessRegion.width = accessRegionRect.width;
376 accessRegion.height = accessRegionRect.height;
Marissa Wall9c5ebfc2019-11-05 14:59:27 -0800377 return mGralloc4->lock(bufferHandle, cpuUsage, accessRegion, acquireFence);
Marissa Wall53aff112019-06-20 13:49:21 -0700378 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700379 IMapper3::Rect accessRegion;
380 accessRegion.left = accessRegionRect.left;
381 accessRegion.top = accessRegionRect.top;
382 accessRegion.width = accessRegionRect.width;
383 accessRegion.height = accessRegionRect.height;
384 int32_t bytesPerPixel;
385 int32_t bytesPerStride;
386 return mGralloc3->lock(bufferHandle, cpuUsage, accessRegion, acquireFence, &bytesPerPixel,
387 &bytesPerStride);
388 } else {
389 IMapper2::Rect accessRegion;
390 accessRegion.left = accessRegionRect.left;
391 accessRegion.top = accessRegionRect.top;
392 accessRegion.width = accessRegionRect.width;
393 accessRegion.height = accessRegionRect.height;
394 return mGralloc2->lock(bufferHandle, cpuUsage, accessRegion, acquireFence);
395 }
396}
397
398int Gralloc::unlock(const native_handle_t* bufferHandle) {
Marissa Wall53aff112019-06-20 13:49:21 -0700399 if (mGralloc4) {
400 return mGralloc4->unlock(bufferHandle);
401 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700402 return mGralloc3->unlock(bufferHandle);
403 } else {
404 return mGralloc2->unlock(bufferHandle);
405 }
406}
407
408void Gralloc::freeBuffer(const native_handle_t* bufferHandle) {
Marissa Wall53aff112019-06-20 13:49:21 -0700409 if (mGralloc4) {
410 mGralloc4->freeBuffer(bufferHandle);
411 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700412 mGralloc3->freeBuffer(bufferHandle);
413 } else {
414 mGralloc2->freeBuffer(bufferHandle);
415 }
416}
417
Chia-I Wu96a098a2018-01-25 10:38:06 -0800418} // namespace vts
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800419} // namespace V2_1
420} // namespace composer
421} // namespace graphics
422} // namespace hardware
423} // namespace android