blob: 9cb43bccfa5259ab7b5b8afcfc7a91eff8eb95fa [file] [log] [blame]
Chia-I Wuaab99f52016-10-05 12:59:58 +08001/*
2 * Copyright 2016 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 "HwcComposer"
19
20#include <inttypes.h>
21#include <log/log.h>
22
23#include "ComposerHal.h"
24
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070025#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
26#include <gui/BufferQueue.h>
27#include <hidl/HidlTransportUtils.h>
28
Chia-I Wuaab99f52016-10-05 12:59:58 +080029namespace android {
30
31using hardware::Return;
32using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010033using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080034
35namespace Hwc2 {
36
Lloyd Piquea822d522017-12-20 16:42:57 -080037Composer::~Composer() = default;
38
Chia-I Wuaab99f52016-10-05 12:59:58 +080039namespace {
40
41class BufferHandle {
42public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080043 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080044 // nullptr is not a valid handle to HIDL
45 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
46 }
47
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080048 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080049 {
50 return mHandle;
51 }
52
53private:
54 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010055 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080056};
57
58class FenceHandle
59{
60public:
61 FenceHandle(int fd, bool owned)
62 : mOwned(owned)
63 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010064 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080065 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010066 handle = native_handle_init(mStorage, 1, 0);
67 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080068 } else {
69 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010070 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010072 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080073 }
74
75 ~FenceHandle()
76 {
77 if (mOwned) {
78 native_handle_close(mHandle);
79 }
80 }
81
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080082 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080083 {
84 return mHandle;
85 }
86
87private:
88 bool mOwned;
89 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010090 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080091};
92
93// assume NO_RESOURCES when Status::isOk returns false
94constexpr Error kDefaultError = Error::NO_RESOURCES;
95
96template<typename T, typename U>
97T unwrapRet(Return<T>& ret, const U& default_val)
98{
Steven Moreland9d021002017-01-03 17:10:54 -080099 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800100 static_cast<T>(default_val);
101}
102
103Error unwrapRet(Return<Error>& ret)
104{
105 return unwrapRet(ret, kDefaultError);
106}
107
Chia-I Wuaab99f52016-10-05 12:59:58 +0800108} // anonymous namespace
109
Lloyd Piquea822d522017-12-20 16:42:57 -0800110namespace impl {
111
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500112Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
113 : CommandWriterBase(initialMaxSize) {}
114
115Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800116{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500117}
118
119void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
120{
121 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700122 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700123 IVrComposerClient::VrCommand::SET_LAYER_INFO),
124 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500125 write(type);
126 write(appId);
127 endCommand();
128}
129
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400130void Composer::CommandWriter::setClientTargetMetadata(
131 const IVrComposerClient::BufferMetadata& metadata)
132{
133 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700134 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700135 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
136 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400137 writeBufferMetadata(metadata);
138 endCommand();
139}
140
141void Composer::CommandWriter::setLayerBufferMetadata(
142 const IVrComposerClient::BufferMetadata& metadata)
143{
144 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700145 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700146 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
147 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400148 writeBufferMetadata(metadata);
149 endCommand();
150}
151
152void Composer::CommandWriter::writeBufferMetadata(
153 const IVrComposerClient::BufferMetadata& metadata)
154{
155 write(metadata.width);
156 write(metadata.height);
157 write(metadata.stride);
158 write(metadata.layerCount);
159 writeSigned(static_cast<int32_t>(metadata.format));
160 write64(metadata.usage);
161}
162
Kalle Raitaa099a242017-01-11 11:17:29 -0800163Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800164 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800165 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500166{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700167 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500168
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800169 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800170 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
171 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800172
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700173 if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) {
174 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
175 if (tmpError == Error::NONE) {
176 mClient = tmpClient;
177 mClient_2_2 = tmpClient;
178 mClient_2_3 = tmpClient;
179 }
180 });
181 } else {
182 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
183 if (tmpError != Error::NONE) {
184 return;
185 }
186
187 mClient = tmpClient;
188 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
189 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
190 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
191 "IComposer 2.2 did not return IComposerClient 2.2");
192 }
193 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800194 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400195
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700196 if (mClient == nullptr) {
197 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700198 }
199
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400200 if (mIsUsingVrComposer) {
201 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
202 if (vrClient == nullptr) {
203 LOG_ALWAYS_FATAL("failed to create vr composer client");
204 }
205 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800206}
207
Lloyd Piquea822d522017-12-20 16:42:57 -0800208Composer::~Composer() = default;
209
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211{
212 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800213 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800215 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800216 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800217 return capabilities;
218}
219
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800220std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800221{
222 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800223 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800224 info = tmpInfo.c_str();
225 });
226
227 return info;
228}
229
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800230void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800231{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800232 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800233 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800234 ALOGE("failed to register IComposerCallback");
235 }
236}
237
Steven Thomasb02664d2017-07-26 18:48:28 -0700238bool Composer::isRemote() {
239 return mClient->isRemote();
240}
241
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700242void Composer::resetCommands() {
243 mWriter.reset();
244}
245
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700246Error Composer::executeCommands() {
247 return execute();
248}
249
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800250uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800252 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800253 return unwrapRet(ret, 0);
254}
255
256Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800257 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800258{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800259 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800260 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700261 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800262 mClient_2_2->createVirtualDisplay_2_2(width, height,
263 static_cast<types::V1_1::PixelFormat>(*format),
264 bufferSlotCount,
265 [&](const auto& tmpError, const auto& tmpDisplay,
266 const auto& tmpFormat) {
267 error = tmpError;
268 if (error != Error::NONE) {
269 return;
270 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800271
Kevin DuBois73d0f482019-01-25 11:18:03 -0800272 *outDisplay = tmpDisplay;
273 *format = static_cast<types::V1_2::PixelFormat>(
274 tmpFormat);
275 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700276 } else {
277 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700278 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700279 [&](const auto& tmpError, const auto& tmpDisplay,
280 const auto& tmpFormat) {
281 error = tmpError;
282 if (error != Error::NONE) {
283 return;
284 }
285
286 *outDisplay = tmpDisplay;
287 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700289 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800290
291 return error;
292}
293
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800294Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800296 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800297 return unwrapRet(ret);
298}
299
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800300Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800301{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800302 mWriter.selectDisplay(display);
303 mWriter.acceptDisplayChanges();
304 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800305}
306
Chia-I Wu67e376d2016-12-19 11:36:22 +0800307Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800308{
309 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800310 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800311 [&](const auto& tmpError, const auto& tmpLayer) {
312 error = tmpError;
313 if (error != Error::NONE) {
314 return;
315 }
316
Chia-I Wu67e376d2016-12-19 11:36:22 +0800317 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800318 });
319
320 return error;
321}
322
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800323Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800325 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326 return unwrapRet(ret);
327}
328
Chia-I Wu67e376d2016-12-19 11:36:22 +0800329Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800330{
331 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800332 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800333 [&](const auto& tmpError, const auto& tmpConfig) {
334 error = tmpError;
335 if (error != Error::NONE) {
336 return;
337 }
338
Chia-I Wu67e376d2016-12-19 11:36:22 +0800339 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800340 });
341
342 return error;
343}
344
345Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800346 std::vector<Layer>* outLayers,
347 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800348{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800349 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800350 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800351}
352
353Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800354 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355{
356 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357
Valerie Hau9758ae02018-10-09 16:05:09 -0700358 if (mClient_2_3) {
359 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
360 error = tmpError;
361 if (error != Error::NONE) {
362 return;
363 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700364
Valerie Hau9758ae02018-10-09 16:05:09 -0700365 *outModes = tmpModes;
366 });
367 } else if (mClient_2_2) {
368 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
369 error = tmpError;
370 if (error != Error::NONE) {
371 return;
372 }
373
374 for (types::V1_1::ColorMode colorMode : tmpModes) {
375 outModes->push_back(static_cast<ColorMode>(colorMode));
376 }
377 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700378 } else {
379 mClient->getColorModes(display,
380 [&](const auto& tmpError, const auto& tmpModes) {
381 error = tmpError;
382 if (error != Error::NONE) {
383 return;
384 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700385 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700386 outModes->push_back(static_cast<ColorMode>(colorMode));
387 }
388 });
389 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800390
391 return error;
392}
393
394Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800395 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800396{
397 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800398 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800399 [&](const auto& tmpError, const auto& tmpValue) {
400 error = tmpError;
401 if (error != Error::NONE) {
402 return;
403 }
404
Chia-I Wu67e376d2016-12-19 11:36:22 +0800405 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800406 });
407
408 return error;
409}
410
411Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800412 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800413{
414 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800415 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800416 [&](const auto& tmpError, const auto& tmpConfigs) {
417 error = tmpError;
418 if (error != Error::NONE) {
419 return;
420 }
421
Chia-I Wu67e376d2016-12-19 11:36:22 +0800422 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423 });
424
425 return error;
426}
427
Chia-I Wu67e376d2016-12-19 11:36:22 +0800428Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800429{
430 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800431 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800432 [&](const auto& tmpError, const auto& tmpName) {
433 error = tmpError;
434 if (error != Error::NONE) {
435 return;
436 }
437
Chia-I Wu67e376d2016-12-19 11:36:22 +0800438 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800439 });
440
441 return error;
442}
443
444Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800445 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
446 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800447{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800448 mReader.takeDisplayRequests(display, outDisplayRequestMask,
449 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800450 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800451}
452
Chia-I Wu67e376d2016-12-19 11:36:22 +0800453Error Composer::getDisplayType(Display display,
454 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800455{
456 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800457 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800458 [&](const auto& tmpError, const auto& tmpType) {
459 error = tmpError;
460 if (error != Error::NONE) {
461 return;
462 }
463
Chia-I Wu67e376d2016-12-19 11:36:22 +0800464 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465 });
466
467 return error;
468}
469
Chia-I Wu67e376d2016-12-19 11:36:22 +0800470Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800471{
472 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800473 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800474 [&](const auto& tmpError, const auto& tmpSupport) {
475 error = tmpError;
476 if (error != Error::NONE) {
477 return;
478 }
479
Chia-I Wu67e376d2016-12-19 11:36:22 +0800480 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800481 });
482
483 return error;
484}
485
Chia-I Wu67e376d2016-12-19 11:36:22 +0800486Error Composer::getHdrCapabilities(Display display,
487 std::vector<Hdr>* outTypes, float* outMaxLuminance,
488 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800489{
490 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800491 if (mClient_2_3) {
492 mClient_2_3->getHdrCapabilities_2_3(display,
493 [&](const auto& tmpError, const auto& tmpTypes,
494 const auto& tmpMaxLuminance,
495 const auto& tmpMaxAverageLuminance,
496 const auto& tmpMinLuminance) {
497 error = tmpError;
498 if (error != Error::NONE) {
499 return;
500 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501
Valerie Haue9e843a2018-12-18 13:39:23 -0800502 *outTypes = tmpTypes;
503 *outMaxLuminance = tmpMaxLuminance;
504 *outMaxAverageLuminance = tmpMaxAverageLuminance;
505 *outMinLuminance = tmpMinLuminance;
506 });
507 } else {
508 mClient->getHdrCapabilities(display,
509 [&](const auto& tmpError, const auto& tmpTypes,
510 const auto& tmpMaxLuminance,
511 const auto& tmpMaxAverageLuminance,
512 const auto& tmpMinLuminance) {
513 error = tmpError;
514 if (error != Error::NONE) {
515 return;
516 }
517
518 outTypes->clear();
519 for (auto type : tmpTypes) {
520 outTypes->push_back(static_cast<Hdr>(type));
521 }
522
523 *outMaxLuminance = tmpMaxLuminance;
524 *outMaxAverageLuminance = tmpMaxAverageLuminance;
525 *outMinLuminance = tmpMinLuminance;
526 });
527 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800528
529 return error;
530}
531
Chia-I Wu67e376d2016-12-19 11:36:22 +0800532Error Composer::getReleaseFences(Display display,
533 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800535 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800536 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800537}
538
Chia-I Wu67e376d2016-12-19 11:36:22 +0800539Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800540{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800541 mWriter.selectDisplay(display);
542 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800543
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800544 Error error = execute();
545 if (error != Error::NONE) {
546 return error;
547 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800548
Chia-I Wu67e376d2016-12-19 11:36:22 +0800549 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800550
551 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800552}
553
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800554Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800555{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800557 return unwrapRet(ret);
558}
559
Chia-I Wu06d63de2017-01-04 14:58:51 +0800560Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400561 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800562 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800563 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800564{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800565 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400566 if (mIsUsingVrComposer && target.get()) {
567 IVrComposerClient::BufferMetadata metadata = {
568 .width = target->getWidth(),
569 .height = target->getHeight(),
570 .stride = target->getStride(),
571 .layerCount = target->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700572 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400573 .usage = target->getUsage(),
574 };
575 mWriter.setClientTargetMetadata(metadata);
576 }
577
578 const native_handle_t* handle = nullptr;
579 if (target.get()) {
580 handle = target->getNativeBuffer()->handle;
581 }
582
583 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800584 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800585}
586
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700587Error Composer::setColorMode(Display display, ColorMode mode,
588 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800589{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700590 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700591 if (mClient_2_3) {
592 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
593 } else if (mClient_2_2) {
594 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
595 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700596 } else {
597 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700598 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700599 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800600 return unwrapRet(ret);
601}
602
603Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800604 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800605{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800606 mWriter.selectDisplay(display);
607 mWriter.setColorTransform(matrix, hint);
608 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800609}
610
611Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800612 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800613{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800614 mWriter.selectDisplay(display);
615 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
616 return Error::NONE;
617}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800618
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700619Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
620 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700621 if (mClient_2_2) {
622 ret = mClient_2_2->setPowerMode_2_2(display, mode);
623 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700624 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700625 }
626
Chia-I Wuaab99f52016-10-05 12:59:58 +0800627 return unwrapRet(ret);
628}
629
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800630Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800631{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800632 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800633 return unwrapRet(ret);
634}
635
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800636Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800637{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800638 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800639 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800640 return unwrapRet(ret);
641}
642
Chia-I Wu67e376d2016-12-19 11:36:22 +0800643Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
644 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800645{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800646 mWriter.selectDisplay(display);
647 mWriter.validateDisplay();
648
649 Error error = execute();
650 if (error != Error::NONE) {
651 return error;
652 }
653
Chia-I Wu67e376d2016-12-19 11:36:22 +0800654 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800655
656 return Error::NONE;
657}
658
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700659Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
660 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
661 mWriter.selectDisplay(display);
662 mWriter.presentOrvalidateDisplay();
663
664 Error error = execute();
665 if (error != Error::NONE) {
666 return error;
667 }
668
669 mReader.takePresentOrValidateStage(display, state);
670
671 if (*state == 1) { // Present succeeded
672 mReader.takePresentFence(display, outPresentFence);
673 }
674
675 if (*state == 0) { // Validate succeeded.
676 mReader.hasChanges(display, outNumTypes, outNumRequests);
677 }
678
679 return Error::NONE;
680}
681
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800682Error Composer::setCursorPosition(Display display, Layer layer,
683 int32_t x, int32_t y)
684{
685 mWriter.selectDisplay(display);
686 mWriter.selectLayer(layer);
687 mWriter.setLayerCursorPosition(x, y);
688 return Error::NONE;
689}
690
691Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400692 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800693{
694 mWriter.selectDisplay(display);
695 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400696 if (mIsUsingVrComposer && buffer.get()) {
697 IVrComposerClient::BufferMetadata metadata = {
698 .width = buffer->getWidth(),
699 .height = buffer->getHeight(),
700 .stride = buffer->getStride(),
701 .layerCount = buffer->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700702 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400703 .usage = buffer->getUsage(),
704 };
705 mWriter.setLayerBufferMetadata(metadata);
706 }
707
708 const native_handle_t* handle = nullptr;
709 if (buffer.get()) {
710 handle = buffer->getNativeBuffer()->handle;
711 }
712
713 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800714 return Error::NONE;
715}
716
717Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
718 const std::vector<IComposerClient::Rect>& damage)
719{
720 mWriter.selectDisplay(display);
721 mWriter.selectLayer(layer);
722 mWriter.setLayerSurfaceDamage(damage);
723 return Error::NONE;
724}
725
726Error Composer::setLayerBlendMode(Display display, Layer layer,
727 IComposerClient::BlendMode mode)
728{
729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731 mWriter.setLayerBlendMode(mode);
732 return Error::NONE;
733}
734
735Error Composer::setLayerColor(Display display, Layer layer,
736 const IComposerClient::Color& color)
737{
738 mWriter.selectDisplay(display);
739 mWriter.selectLayer(layer);
740 mWriter.setLayerColor(color);
741 return Error::NONE;
742}
743
744Error Composer::setLayerCompositionType(Display display, Layer layer,
745 IComposerClient::Composition type)
746{
747 mWriter.selectDisplay(display);
748 mWriter.selectLayer(layer);
749 mWriter.setLayerCompositionType(type);
750 return Error::NONE;
751}
752
753Error Composer::setLayerDataspace(Display display, Layer layer,
754 Dataspace dataspace)
755{
756 mWriter.selectDisplay(display);
757 mWriter.selectLayer(layer);
758 mWriter.setLayerDataspace(dataspace);
759 return Error::NONE;
760}
761
762Error Composer::setLayerDisplayFrame(Display display, Layer layer,
763 const IComposerClient::Rect& frame)
764{
765 mWriter.selectDisplay(display);
766 mWriter.selectLayer(layer);
767 mWriter.setLayerDisplayFrame(frame);
768 return Error::NONE;
769}
770
771Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
772 float alpha)
773{
774 mWriter.selectDisplay(display);
775 mWriter.selectLayer(layer);
776 mWriter.setLayerPlaneAlpha(alpha);
777 return Error::NONE;
778}
779
780Error Composer::setLayerSidebandStream(Display display, Layer layer,
781 const native_handle_t* stream)
782{
783 mWriter.selectDisplay(display);
784 mWriter.selectLayer(layer);
785 mWriter.setLayerSidebandStream(stream);
786 return Error::NONE;
787}
788
789Error Composer::setLayerSourceCrop(Display display, Layer layer,
790 const IComposerClient::FRect& crop)
791{
792 mWriter.selectDisplay(display);
793 mWriter.selectLayer(layer);
794 mWriter.setLayerSourceCrop(crop);
795 return Error::NONE;
796}
797
798Error Composer::setLayerTransform(Display display, Layer layer,
799 Transform transform)
800{
801 mWriter.selectDisplay(display);
802 mWriter.selectLayer(layer);
803 mWriter.setLayerTransform(transform);
804 return Error::NONE;
805}
806
807Error Composer::setLayerVisibleRegion(Display display, Layer layer,
808 const std::vector<IComposerClient::Rect>& visible)
809{
810 mWriter.selectDisplay(display);
811 mWriter.selectLayer(layer);
812 mWriter.setLayerVisibleRegion(visible);
813 return Error::NONE;
814}
815
816Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
817{
818 mWriter.selectDisplay(display);
819 mWriter.selectLayer(layer);
820 mWriter.setLayerZOrder(z);
821 return Error::NONE;
822}
823
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500824Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
825 uint32_t appId)
826{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800827 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500828 mWriter.selectDisplay(display);
829 mWriter.selectLayer(layer);
830 mWriter.setLayerInfo(type, appId);
831 }
832 return Error::NONE;
833}
834
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800835Error Composer::execute()
836{
837 // prepare input command queue
838 bool queueChanged = false;
839 uint32_t commandLength = 0;
840 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800841 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800842 mWriter.reset();
843 return Error::NO_RESOURCES;
844 }
845
846 // set up new input command queue if necessary
847 if (queueChanged) {
848 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
849 auto error = unwrapRet(ret);
850 if (error != Error::NONE) {
851 mWriter.reset();
852 return error;
853 }
854 }
855
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700856 if (commandLength == 0) {
857 mWriter.reset();
858 return Error::NONE;
859 }
860
Chia-I Wuaab99f52016-10-05 12:59:58 +0800861 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700862 hardware::Return<void> ret;
863 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
864 const auto& tmpOutLength, const auto& tmpOutHandles)
865 {
866 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800867
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700868 // set up new output command queue if necessary
869 if (error == Error::NONE && tmpOutChanged) {
870 error = kDefaultError;
871 mClient->getOutputCommandQueue(
872 [&](const auto& tmpError,
873 const auto& tmpDescriptor)
874 {
875 error = tmpError;
876 if (error != Error::NONE) {
877 return;
878 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800879
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700880 mReader.setMQDescriptor(tmpDescriptor);
881 });
882 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800883
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700884 if (error != Error::NONE) {
885 return;
886 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800887
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700888 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
889 error = mReader.parse();
890 mReader.reset();
891 } else {
892 error = Error::NO_RESOURCES;
893 }
894 };
895 if (mClient_2_2) {
896 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
897 } else {
898 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
899 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700900 // executeCommands can fail because of out-of-fd and we do not want to
901 // abort() in that case
902 if (!ret.isOk()) {
903 ALOGE("executeCommands failed because of %s", ret.description().c_str());
904 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800905
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800906 if (error == Error::NONE) {
907 std::vector<CommandReader::CommandError> commandErrors =
908 mReader.takeErrors();
909
910 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700911 auto command =
912 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800913
914 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700915 command == IComposerClient::Command::PRESENT_DISPLAY ||
916 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800917 error = cmdErr.error;
918 } else {
919 ALOGW("command 0x%x generated error %d",
920 command, cmdErr.error);
921 }
922 }
923 }
924
925 mWriter.reset();
926
Chia-I Wuaab99f52016-10-05 12:59:58 +0800927 return error;
928}
929
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700930// Composer HAL 2.2
931
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700932Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
933 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
934 if (!mClient_2_2) {
935 return Error::UNSUPPORTED;
936 }
937
938 mWriter.selectDisplay(display);
939 mWriter.selectLayer(layer);
940 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
941 return Error::NONE;
942}
943
Chia-I Wud7e01d72018-06-21 13:39:09 +0800944std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
945 Display display) {
946 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700947 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800948 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700949 }
950
951 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800952 if (mClient_2_3) {
953 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
954 [&](const auto& tmpError, const auto& tmpKeys) {
955 error = tmpError;
956 if (error != Error::NONE) {
957 ALOGW("getPerFrameMetadataKeys failed "
958 "with %d",
959 tmpError);
960 return;
961 }
962 keys = tmpKeys;
963 });
964 } else {
965 mClient_2_2
966 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
967 error = tmpError;
968 if (error != Error::NONE) {
969 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
970 return;
971 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700972
Valerie Haue9e843a2018-12-18 13:39:23 -0800973 keys.clear();
974 for (auto key : tmpKeys) {
975 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
976 }
977 });
978 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700979
Chia-I Wud7e01d72018-06-21 13:39:09 +0800980 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700981}
982
983Error Composer::getRenderIntents(Display display, ColorMode colorMode,
984 std::vector<RenderIntent>* outRenderIntents) {
985 if (!mClient_2_2) {
986 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
987 return Error::NONE;
988 }
989
990 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700991
992 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700993 error = tmpError;
994 if (error != Error::NONE) {
995 return;
996 }
997
998 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -0700999 };
1000
1001 if (mClient_2_3) {
1002 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1003 } else {
1004 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1005 getRenderIntentsLambda);
1006 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001007
1008 return error;
1009}
1010
1011Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1012{
1013 if (!mClient_2_2) {
1014 *outMatrix = mat4();
1015 return Error::NONE;
1016 }
1017
1018 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001019 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1020 [&](const auto& tmpError, const auto& tmpMatrix) {
1021 error = tmpError;
1022 if (error != Error::NONE) {
1023 return;
1024 }
1025 *outMatrix = mat4(tmpMatrix.data());
1026 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001027
1028 return error;
1029}
1030
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001031// Composer HAL 2.3
1032
1033Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1034 std::vector<uint8_t>* outData) {
1035 if (!mClient_2_3) {
1036 return Error::UNSUPPORTED;
1037 }
1038
1039 Error error = kDefaultError;
1040 mClient_2_3->getDisplayIdentificationData(display,
1041 [&](const auto& tmpError, const auto& tmpPort,
1042 const auto& tmpData) {
1043 error = tmpError;
1044 if (error != Error::NONE) {
1045 return;
1046 }
1047
1048 *outPort = tmpPort;
1049 *outData = tmpData;
1050 });
1051
1052 return error;
1053}
1054
Peiyong Lin698147a2018-09-14 13:27:18 -07001055Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1056{
1057 if (!mClient_2_3) {
1058 return Error::UNSUPPORTED;
1059 }
1060
1061 mWriter.selectDisplay(display);
1062 mWriter.selectLayer(layer);
1063 mWriter.setLayerColorTransform(matrix);
1064 return Error::NONE;
1065}
1066
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001067Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1068 Dataspace* outDataspace,
1069 uint8_t* outComponentMask) {
1070 if (!outFormat || !outDataspace || !outComponentMask) {
1071 return Error::BAD_PARAMETER;
1072 }
1073 if (!mClient_2_3) {
1074 return Error::UNSUPPORTED;
1075 }
1076 Error error = kDefaultError;
1077 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1078 [&](const auto tmpError,
1079 const auto& tmpFormat,
1080 const auto& tmpDataspace,
1081 const auto& tmpComponentMask) {
1082 error = tmpError;
1083 if (error == Error::NONE) {
1084 *outFormat = tmpFormat;
1085 *outDataspace = tmpDataspace;
1086 *outComponentMask =
1087 static_cast<uint8_t>(
1088 tmpComponentMask);
1089 }
1090 });
1091 return error;
1092}
1093
Peiyong Lined531a32018-10-26 18:27:56 -07001094Error Composer::getDisplayCapabilities(Display display,
1095 std::vector<DisplayCapability>* outCapabilities) {
1096 if (!mClient_2_3) {
1097 return Error::UNSUPPORTED;
1098 }
1099 Error error = kDefaultError;
1100 mClient_2_3->getDisplayCapabilities(display,
1101 [&](const auto& tmpError, const auto& tmpCapabilities) {
1102 error = tmpError;
1103 if (error != Error::NONE) {
1104 return;
1105 }
1106 *outCapabilities = tmpCapabilities;
1107 });
1108 return error;
1109}
1110
Kevin DuBois74e53772018-11-19 10:52:38 -08001111Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1112 uint8_t componentMask, uint64_t maxFrames) {
1113 if (!mClient_2_3) {
1114 return Error::UNSUPPORTED;
1115 }
1116
1117 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1118 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1119 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1120 maxFrames);
1121}
1122
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001123Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1124 DisplayedFrameStats* outStats) {
1125 if (!outStats) {
1126 return Error::BAD_PARAMETER;
1127 }
1128 if (!mClient_2_3) {
1129 return Error::UNSUPPORTED;
1130 }
1131 Error error = kDefaultError;
1132 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1133 [&](const auto tmpError, auto tmpNumFrames,
1134 const auto& tmpSamples0, const auto& tmpSamples1,
1135 const auto& tmpSamples2, const auto& tmpSamples3) {
1136 error = tmpError;
1137 if (error == Error::NONE) {
1138 outStats->numFrames = tmpNumFrames;
1139 outStats->component_0_sample = tmpSamples0;
1140 outStats->component_1_sample = tmpSamples1;
1141 outStats->component_2_sample = tmpSamples2;
1142 outStats->component_3_sample = tmpSamples3;
1143 }
1144 });
1145 return error;
1146}
1147
Valerie Haue9e843a2018-12-18 13:39:23 -08001148Error Composer::setLayerPerFrameMetadataBlobs(
1149 Display display, Layer layer,
1150 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1151 if (!mClient_2_3) {
1152 return Error::UNSUPPORTED;
1153 }
1154
1155 mWriter.selectDisplay(display);
1156 mWriter.selectLayer(layer);
1157 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1158 return Error::NONE;
1159}
1160
Dan Gittik57e63c52019-01-18 16:37:54 +00001161Error Composer::getDisplayBrightnessSupport(Display display, bool* outSupport) {
1162 if (!mClient_2_3) {
1163 return Error::UNSUPPORTED;
1164 }
1165 Error error = kDefaultError;
1166 mClient_2_3->getDisplayBrightnessSupport(display,
1167 [&](const auto& tmpError, const auto& tmpSupport) {
1168 error = tmpError;
1169 if (error != Error::NONE) {
1170 return;
1171 }
1172
1173 *outSupport = tmpSupport;
1174 });
1175 return error;
1176}
1177
1178Error Composer::setDisplayBrightness(Display display, float brightness) {
1179 if (!mClient_2_3) {
1180 return Error::UNSUPPORTED;
1181 }
1182 return mClient_2_3->setDisplayBrightness(display, brightness);
1183}
1184
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001185CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001186{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001187 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001188}
1189
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001190Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001191{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001192 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001193
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001194 IComposerClient::Command command;
1195 uint16_t length = 0;
1196
1197 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001198 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001199 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001200 break;
1201 }
1202
1203 bool parsed = false;
1204 switch (command) {
1205 case IComposerClient::Command::SELECT_DISPLAY:
1206 parsed = parseSelectDisplay(length);
1207 break;
1208 case IComposerClient::Command::SET_ERROR:
1209 parsed = parseSetError(length);
1210 break;
1211 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1212 parsed = parseSetChangedCompositionTypes(length);
1213 break;
1214 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1215 parsed = parseSetDisplayRequests(length);
1216 break;
1217 case IComposerClient::Command::SET_PRESENT_FENCE:
1218 parsed = parseSetPresentFence(length);
1219 break;
1220 case IComposerClient::Command::SET_RELEASE_FENCES:
1221 parsed = parseSetReleaseFences(length);
1222 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001223 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1224 parsed = parseSetPresentOrValidateDisplayResult(length);
1225 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001226 default:
1227 parsed = false;
1228 break;
1229 }
1230
1231 endCommand();
1232
1233 if (!parsed) {
1234 ALOGE("failed to parse command 0x%x length %" PRIu16,
1235 command, length);
1236 break;
1237 }
1238 }
1239
1240 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001241}
1242
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001243bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001244{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001245 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001246 return false;
1247 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001248
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001249 mCurrentReturnData = &mReturnData[read64()];
1250
1251 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001252}
1253
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001254bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001255{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001256 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001257 return false;
1258 }
1259
1260 auto location = read();
1261 auto error = static_cast<Error>(readSigned());
1262
1263 mErrors.emplace_back(CommandError{location, error});
1264
1265 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001266}
1267
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001268bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001269{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001270 // (layer id, composition type) pairs
1271 if (length % 3 != 0 || !mCurrentReturnData) {
1272 return false;
1273 }
1274
1275 uint32_t count = length / 3;
1276 mCurrentReturnData->changedLayers.reserve(count);
1277 mCurrentReturnData->compositionTypes.reserve(count);
1278 while (count > 0) {
1279 auto layer = read64();
1280 auto type = static_cast<IComposerClient::Composition>(readSigned());
1281
1282 mCurrentReturnData->changedLayers.push_back(layer);
1283 mCurrentReturnData->compositionTypes.push_back(type);
1284
1285 count--;
1286 }
1287
1288 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001289}
1290
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001291bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001292{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001293 // display requests followed by (layer id, layer requests) pairs
1294 if (length % 3 != 1 || !mCurrentReturnData) {
1295 return false;
1296 }
1297
1298 mCurrentReturnData->displayRequests = read();
1299
1300 uint32_t count = (length - 1) / 3;
1301 mCurrentReturnData->requestedLayers.reserve(count);
1302 mCurrentReturnData->requestMasks.reserve(count);
1303 while (count > 0) {
1304 auto layer = read64();
1305 auto layerRequestMask = read();
1306
1307 mCurrentReturnData->requestedLayers.push_back(layer);
1308 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1309
1310 count--;
1311 }
1312
1313 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001314}
1315
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001316bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001317{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001318 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001319 !mCurrentReturnData) {
1320 return false;
1321 }
1322
1323 if (mCurrentReturnData->presentFence >= 0) {
1324 close(mCurrentReturnData->presentFence);
1325 }
1326 mCurrentReturnData->presentFence = readFence();
1327
1328 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001329}
1330
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001331bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001332{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001333 // (layer id, release fence index) pairs
1334 if (length % 3 != 0 || !mCurrentReturnData) {
1335 return false;
1336 }
1337
1338 uint32_t count = length / 3;
1339 mCurrentReturnData->releasedLayers.reserve(count);
1340 mCurrentReturnData->releaseFences.reserve(count);
1341 while (count > 0) {
1342 auto layer = read64();
1343 auto fence = readFence();
1344
1345 mCurrentReturnData->releasedLayers.push_back(layer);
1346 mCurrentReturnData->releaseFences.push_back(fence);
1347
1348 count--;
1349 }
1350
1351 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001352}
1353
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001354bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1355{
1356 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1357 return false;
1358 }
1359 mCurrentReturnData->presentOrValidateState = read();
1360 return true;
1361}
1362
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001363void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001364{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001365 mErrors.clear();
1366
1367 for (auto& data : mReturnData) {
1368 if (data.second.presentFence >= 0) {
1369 close(data.second.presentFence);
1370 }
1371 for (auto fence : data.second.releaseFences) {
1372 if (fence >= 0) {
1373 close(fence);
1374 }
1375 }
1376 }
1377
1378 mReturnData.clear();
1379 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001380}
1381
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001382std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001383{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001384 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001385}
1386
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001387bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001388 uint32_t* outNumChangedCompositionTypes,
1389 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001390{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001391 auto found = mReturnData.find(display);
1392 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001393 *outNumChangedCompositionTypes = 0;
1394 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001395 return false;
1396 }
1397
1398 const ReturnData& data = found->second;
1399
Chia-I Wu67e376d2016-12-19 11:36:22 +08001400 *outNumChangedCompositionTypes = data.compositionTypes.size();
1401 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001402
1403 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001404}
1405
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001406void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001407 std::vector<Layer>* outLayers,
1408 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001409{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001410 auto found = mReturnData.find(display);
1411 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001412 outLayers->clear();
1413 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001414 return;
1415 }
1416
1417 ReturnData& data = found->second;
1418
Chia-I Wu67e376d2016-12-19 11:36:22 +08001419 *outLayers = std::move(data.changedLayers);
1420 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001421}
1422
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001423void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001424 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1425 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001426{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001427 auto found = mReturnData.find(display);
1428 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001429 *outDisplayRequestMask = 0;
1430 outLayers->clear();
1431 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001432 return;
1433 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001434
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001435 ReturnData& data = found->second;
1436
Chia-I Wu67e376d2016-12-19 11:36:22 +08001437 *outDisplayRequestMask = data.displayRequests;
1438 *outLayers = std::move(data.requestedLayers);
1439 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001440}
1441
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001442void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001443 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001444{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001445 auto found = mReturnData.find(display);
1446 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001447 outLayers->clear();
1448 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001449 return;
1450 }
1451
1452 ReturnData& data = found->second;
1453
Chia-I Wu67e376d2016-12-19 11:36:22 +08001454 *outLayers = std::move(data.releasedLayers);
1455 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001456}
1457
Chia-I Wu67e376d2016-12-19 11:36:22 +08001458void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001459{
1460 auto found = mReturnData.find(display);
1461 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001462 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001463 return;
1464 }
1465
1466 ReturnData& data = found->second;
1467
Chia-I Wu67e376d2016-12-19 11:36:22 +08001468 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001469 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001470}
1471
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001472void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1473 auto found = mReturnData.find(display);
1474 if (found == mReturnData.end()) {
1475 *state= -1;
1476 return;
1477 }
1478 ReturnData& data = found->second;
1479 *state = data.presentOrValidateState;
1480}
1481
Lloyd Piquea822d522017-12-20 16:42:57 -08001482} // namespace impl
1483
Chia-I Wuaab99f52016-10-05 12:59:58 +08001484} // namespace Hwc2
1485
1486} // namespace android