blob: a0745cef60d00c34280089f84834f66367b7f413 [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() {
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080079 for (const auto& it : mDisplayResources) {
Chia-I Wu8b20c5c2018-01-25 11:18:10 -080080 Display display = it.first;
Chih-Hung Hsieh65ab6732018-12-12 14:13:48 -080081 const 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));
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800296 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400297
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800298 mClient->executeCommands(commandLength, commandHandles,
299 [&](const auto& tmpError, const auto& tmpOutQueueChanged,
300 const auto& tmpOutLength, const auto& tmpOutHandles) {
301 ASSERT_EQ(Error::NONE, tmpError);
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400302
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800303 if (tmpOutQueueChanged) {
304 mClient->getOutputCommandQueue(
305 [&](const auto& tmpError, const auto& tmpDescriptor) {
306 ASSERT_EQ(Error::NONE, tmpError);
307 reader->setMQDescriptor(tmpDescriptor);
308 });
309 }
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400310
Chia-I Wu8b20c5c2018-01-25 11:18:10 -0800311 ASSERT_TRUE(reader->readQueue(tmpOutLength, tmpOutHandles));
312 reader->parse();
313 });
Valerie Haucbe8e9a2018-09-17 10:58:03 -0700314 reader->reset();
315 writer->reset();
Daniel Nicoarad47f4a92017-05-30 15:38:30 -0400316}
317
Valerie Hauc1dc3132019-06-13 09:49:44 -0700318Gralloc::Gralloc() {
319 [this] {
Marissa Wall53aff112019-06-20 13:49:21 -0700320 ASSERT_NO_FATAL_FAILURE(mGralloc4 = std::make_shared<Gralloc4>("default", "default",
Valerie Hauc1dc3132019-06-13 09:49:44 -0700321 /*errOnFailure=*/false));
Marissa Wall53aff112019-06-20 13:49:21 -0700322 if (mGralloc4->getAllocator() == nullptr || mGralloc4->getMapper() == nullptr) {
323 mGralloc4 = nullptr;
324 ASSERT_NO_FATAL_FAILURE(mGralloc3 = std::make_shared<Gralloc3>("default", "default",
325 /*errOnFailure=*/false));
326 if (mGralloc3->getAllocator() == nullptr || mGralloc3->getMapper() == nullptr) {
327 mGralloc3 = nullptr;
328 ASSERT_NO_FATAL_FAILURE(mGralloc2 = std::make_shared<Gralloc2>());
329 }
Valerie Hauc1dc3132019-06-13 09:49:44 -0700330 }
331 }();
332}
333
334const native_handle_t* Gralloc::allocate(uint32_t width, uint32_t height, uint32_t layerCount,
335 PixelFormat format, uint64_t usage, bool import,
336 uint32_t* outStride) {
Marissa Wall53aff112019-06-20 13:49:21 -0700337 if (mGralloc4) {
338 IMapper4::BufferDescriptorInfo info{};
339 info.width = width;
340 info.height = height;
341 info.layerCount = layerCount;
342 info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
343 info.usage = usage;
344 return mGralloc4->allocate(info, import, outStride);
345 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700346 IMapper3::BufferDescriptorInfo info{};
347 info.width = width;
348 info.height = height;
349 info.layerCount = layerCount;
350 info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
351 info.usage = usage;
352 return mGralloc3->allocate(info, import, outStride);
353 } else {
354 IMapper2::BufferDescriptorInfo info{};
355 info.width = width;
356 info.height = height;
357 info.layerCount = layerCount;
358 info.format = format;
359 info.usage = usage;
360 return mGralloc2->allocate(info, import, outStride);
361 }
362}
363
364void* Gralloc::lock(const native_handle_t* bufferHandle, uint64_t cpuUsage,
365 const AccessRegion& accessRegionRect, int acquireFence) {
Marissa Wall53aff112019-06-20 13:49:21 -0700366 if (mGralloc4) {
367 IMapper4::Rect accessRegion;
368 accessRegion.left = accessRegionRect.left;
369 accessRegion.top = accessRegionRect.top;
370 accessRegion.width = accessRegionRect.width;
371 accessRegion.height = accessRegionRect.height;
372 int32_t bytesPerPixel;
373 int32_t bytesPerStride;
374 return mGralloc4->lock(bufferHandle, cpuUsage, accessRegion, acquireFence, &bytesPerPixel,
375 &bytesPerStride);
376 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700377 IMapper3::Rect accessRegion;
378 accessRegion.left = accessRegionRect.left;
379 accessRegion.top = accessRegionRect.top;
380 accessRegion.width = accessRegionRect.width;
381 accessRegion.height = accessRegionRect.height;
382 int32_t bytesPerPixel;
383 int32_t bytesPerStride;
384 return mGralloc3->lock(bufferHandle, cpuUsage, accessRegion, acquireFence, &bytesPerPixel,
385 &bytesPerStride);
386 } else {
387 IMapper2::Rect accessRegion;
388 accessRegion.left = accessRegionRect.left;
389 accessRegion.top = accessRegionRect.top;
390 accessRegion.width = accessRegionRect.width;
391 accessRegion.height = accessRegionRect.height;
392 return mGralloc2->lock(bufferHandle, cpuUsage, accessRegion, acquireFence);
393 }
394}
395
396int Gralloc::unlock(const native_handle_t* bufferHandle) {
Marissa Wall53aff112019-06-20 13:49:21 -0700397 if (mGralloc4) {
398 return mGralloc4->unlock(bufferHandle);
399 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700400 return mGralloc3->unlock(bufferHandle);
401 } else {
402 return mGralloc2->unlock(bufferHandle);
403 }
404}
405
406void Gralloc::freeBuffer(const native_handle_t* bufferHandle) {
Marissa Wall53aff112019-06-20 13:49:21 -0700407 if (mGralloc4) {
408 mGralloc4->freeBuffer(bufferHandle);
409 } else if (mGralloc3) {
Valerie Hauc1dc3132019-06-13 09:49:44 -0700410 mGralloc3->freeBuffer(bufferHandle);
411 } else {
412 mGralloc2->freeBuffer(bufferHandle);
413 }
414}
415
Chia-I Wu96a098a2018-01-25 10:38:06 -0800416} // namespace vts
Chia-I Wu8cc5a152017-02-24 14:34:02 -0800417} // namespace V2_1
418} // namespace composer
419} // namespace graphics
420} // namespace hardware
421} // namespace android