blob: e53d09949c26f9c76621c8171ea0722b3476d029 [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>
Wei Wangae211b42019-06-07 17:22:49 -070027#include <hidl/HidlTransportSupport.h>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070028#include <hidl/HidlTransportUtils.h>
29
Chia-I Wuaab99f52016-10-05 12:59:58 +080030namespace android {
31
32using hardware::Return;
33using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010034using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080035
36namespace Hwc2 {
37
Lloyd Piquea822d522017-12-20 16:42:57 -080038Composer::~Composer() = default;
39
Chia-I Wuaab99f52016-10-05 12:59:58 +080040namespace {
41
42class BufferHandle {
43public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080044 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080045 // nullptr is not a valid handle to HIDL
46 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
47 }
48
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080049 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080050 {
51 return mHandle;
52 }
53
54private:
55 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010056 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080057};
58
59class FenceHandle
60{
61public:
62 FenceHandle(int fd, bool owned)
63 : mOwned(owned)
64 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010065 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080066 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010067 handle = native_handle_init(mStorage, 1, 0);
68 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 } else {
70 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010071 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080072 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 }
75
76 ~FenceHandle()
77 {
78 if (mOwned) {
79 native_handle_close(mHandle);
80 }
81 }
82
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080083 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080084 {
85 return mHandle;
86 }
87
88private:
89 bool mOwned;
90 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010091 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080092};
93
94// assume NO_RESOURCES when Status::isOk returns false
95constexpr Error kDefaultError = Error::NO_RESOURCES;
96
97template<typename T, typename U>
98T unwrapRet(Return<T>& ret, const U& default_val)
99{
Steven Moreland9d021002017-01-03 17:10:54 -0800100 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800101 static_cast<T>(default_val);
102}
103
104Error unwrapRet(Return<Error>& ret)
105{
106 return unwrapRet(ret, kDefaultError);
107}
108
Chia-I Wuaab99f52016-10-05 12:59:58 +0800109} // anonymous namespace
110
Lloyd Piquea822d522017-12-20 16:42:57 -0800111namespace impl {
112
mamik94e91f62019-08-19 09:11:33 -0700113#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500114Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
115 : CommandWriterBase(initialMaxSize) {}
116
117Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800118{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500119}
120
121void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
122{
123 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700124 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700125 IVrComposerClient::VrCommand::SET_LAYER_INFO),
126 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500127 write(type);
128 write(appId);
129 endCommand();
130}
131
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400132void Composer::CommandWriter::setClientTargetMetadata(
133 const IVrComposerClient::BufferMetadata& metadata)
134{
135 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700136 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700137 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
138 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400139 writeBufferMetadata(metadata);
140 endCommand();
141}
142
143void Composer::CommandWriter::setLayerBufferMetadata(
144 const IVrComposerClient::BufferMetadata& metadata)
145{
146 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700147 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700148 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
149 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400150 writeBufferMetadata(metadata);
151 endCommand();
152}
153
154void Composer::CommandWriter::writeBufferMetadata(
155 const IVrComposerClient::BufferMetadata& metadata)
156{
157 write(metadata.width);
158 write(metadata.height);
159 write(metadata.stride);
160 write(metadata.layerCount);
161 writeSigned(static_cast<int32_t>(metadata.format));
162 write64(metadata.usage);
163}
mamik94e91f62019-08-19 09:11:33 -0700164#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400165
Kalle Raitaa099a242017-01-11 11:17:29 -0800166Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800167 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800168 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500169{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700170 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500171
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800172 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800173 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
174 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800175
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700176 if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) {
177 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
178 if (tmpError == Error::NONE) {
179 mClient = tmpClient;
180 mClient_2_2 = tmpClient;
181 mClient_2_3 = tmpClient;
182 }
183 });
184 } else {
185 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
186 if (tmpError != Error::NONE) {
187 return;
188 }
189
190 mClient = tmpClient;
191 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
192 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
193 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
194 "IComposer 2.2 did not return IComposerClient 2.2");
195 }
196 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800197 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400198
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700199 if (mClient == nullptr) {
200 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700201 }
202
mamik94e91f62019-08-19 09:11:33 -0700203#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400204 if (mIsUsingVrComposer) {
205 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
206 if (vrClient == nullptr) {
207 LOG_ALWAYS_FATAL("failed to create vr composer client");
208 }
209 }
mamik94e91f62019-08-19 09:11:33 -0700210#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211}
212
Lloyd Piquea822d522017-12-20 16:42:57 -0800213Composer::~Composer() = default;
214
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800215std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800216{
217 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800218 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800219 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800220 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800221 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800222 return capabilities;
223}
224
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800225std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800226{
227 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800228 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800229 info = tmpInfo.c_str();
230 });
231
232 return info;
233}
234
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800235void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800236{
Wei Wangae211b42019-06-07 17:22:49 -0700237 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800238 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800239 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800240 ALOGE("failed to register IComposerCallback");
241 }
242}
243
Steven Thomasb02664d2017-07-26 18:48:28 -0700244bool Composer::isRemote() {
245 return mClient->isRemote();
246}
247
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700248void Composer::resetCommands() {
249 mWriter.reset();
250}
251
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700252Error Composer::executeCommands() {
253 return execute();
254}
255
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800256uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800258 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259 return unwrapRet(ret, 0);
260}
261
262Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800263 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800264{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800265 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800266 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700267 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800268 mClient_2_2->createVirtualDisplay_2_2(width, height,
269 static_cast<types::V1_1::PixelFormat>(*format),
270 bufferSlotCount,
271 [&](const auto& tmpError, const auto& tmpDisplay,
272 const auto& tmpFormat) {
273 error = tmpError;
274 if (error != Error::NONE) {
275 return;
276 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277
Kevin DuBois73d0f482019-01-25 11:18:03 -0800278 *outDisplay = tmpDisplay;
279 *format = static_cast<types::V1_2::PixelFormat>(
280 tmpFormat);
281 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700282 } else {
283 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700284 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700285 [&](const auto& tmpError, const auto& tmpDisplay,
286 const auto& tmpFormat) {
287 error = tmpError;
288 if (error != Error::NONE) {
289 return;
290 }
291
292 *outDisplay = tmpDisplay;
293 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800294 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700295 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800296
297 return error;
298}
299
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800300Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800301{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800302 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800303 return unwrapRet(ret);
304}
305
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800306Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800307{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800308 mWriter.selectDisplay(display);
309 mWriter.acceptDisplayChanges();
310 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800311}
312
Chia-I Wu67e376d2016-12-19 11:36:22 +0800313Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800314{
315 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800316 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800317 [&](const auto& tmpError, const auto& tmpLayer) {
318 error = tmpError;
319 if (error != Error::NONE) {
320 return;
321 }
322
Chia-I Wu67e376d2016-12-19 11:36:22 +0800323 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324 });
325
326 return error;
327}
328
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800329Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800330{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800331 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800332 return unwrapRet(ret);
333}
334
Chia-I Wu67e376d2016-12-19 11:36:22 +0800335Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800336{
337 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800338 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800339 [&](const auto& tmpError, const auto& tmpConfig) {
340 error = tmpError;
341 if (error != Error::NONE) {
342 return;
343 }
344
Chia-I Wu67e376d2016-12-19 11:36:22 +0800345 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800346 });
347
348 return error;
349}
350
351Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800352 std::vector<Layer>* outLayers,
353 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800354{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800355 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800356 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357}
358
359Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800360 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800361{
362 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800363
Valerie Hau9758ae02018-10-09 16:05:09 -0700364 if (mClient_2_3) {
365 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
366 error = tmpError;
367 if (error != Error::NONE) {
368 return;
369 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700370
Valerie Hau9758ae02018-10-09 16:05:09 -0700371 *outModes = tmpModes;
372 });
373 } else if (mClient_2_2) {
374 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
375 error = tmpError;
376 if (error != Error::NONE) {
377 return;
378 }
379
380 for (types::V1_1::ColorMode colorMode : tmpModes) {
381 outModes->push_back(static_cast<ColorMode>(colorMode));
382 }
383 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700384 } else {
385 mClient->getColorModes(display,
386 [&](const auto& tmpError, const auto& tmpModes) {
387 error = tmpError;
388 if (error != Error::NONE) {
389 return;
390 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700391 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700392 outModes->push_back(static_cast<ColorMode>(colorMode));
393 }
394 });
395 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800396
397 return error;
398}
399
400Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800401 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800402{
403 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800404 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800405 [&](const auto& tmpError, const auto& tmpValue) {
406 error = tmpError;
407 if (error != Error::NONE) {
408 return;
409 }
410
Chia-I Wu67e376d2016-12-19 11:36:22 +0800411 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800412 });
413
414 return error;
415}
416
417Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800418 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419{
420 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800421 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800422 [&](const auto& tmpError, const auto& tmpConfigs) {
423 error = tmpError;
424 if (error != Error::NONE) {
425 return;
426 }
427
Chia-I Wu67e376d2016-12-19 11:36:22 +0800428 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800429 });
430
431 return error;
432}
433
Chia-I Wu67e376d2016-12-19 11:36:22 +0800434Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800435{
436 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800437 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800438 [&](const auto& tmpError, const auto& tmpName) {
439 error = tmpError;
440 if (error != Error::NONE) {
441 return;
442 }
443
Chia-I Wu67e376d2016-12-19 11:36:22 +0800444 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445 });
446
447 return error;
448}
449
450Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800451 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
452 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800454 mReader.takeDisplayRequests(display, outDisplayRequestMask,
455 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800456 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800457}
458
Chia-I Wu67e376d2016-12-19 11:36:22 +0800459Error Composer::getDisplayType(Display display,
460 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800461{
462 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800463 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464 [&](const auto& tmpError, const auto& tmpType) {
465 error = tmpError;
466 if (error != Error::NONE) {
467 return;
468 }
469
Chia-I Wu67e376d2016-12-19 11:36:22 +0800470 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800471 });
472
473 return error;
474}
475
Chia-I Wu67e376d2016-12-19 11:36:22 +0800476Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800477{
478 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800479 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800480 [&](const auto& tmpError, const auto& tmpSupport) {
481 error = tmpError;
482 if (error != Error::NONE) {
483 return;
484 }
485
Chia-I Wu67e376d2016-12-19 11:36:22 +0800486 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800487 });
488
489 return error;
490}
491
Chia-I Wu67e376d2016-12-19 11:36:22 +0800492Error Composer::getHdrCapabilities(Display display,
493 std::vector<Hdr>* outTypes, float* outMaxLuminance,
494 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800495{
496 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800497 if (mClient_2_3) {
498 mClient_2_3->getHdrCapabilities_2_3(display,
499 [&](const auto& tmpError, const auto& tmpTypes,
500 const auto& tmpMaxLuminance,
501 const auto& tmpMaxAverageLuminance,
502 const auto& tmpMinLuminance) {
503 error = tmpError;
504 if (error != Error::NONE) {
505 return;
506 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507
Valerie Haue9e843a2018-12-18 13:39:23 -0800508 *outTypes = tmpTypes;
509 *outMaxLuminance = tmpMaxLuminance;
510 *outMaxAverageLuminance = tmpMaxAverageLuminance;
511 *outMinLuminance = tmpMinLuminance;
512 });
513 } else {
514 mClient->getHdrCapabilities(display,
515 [&](const auto& tmpError, const auto& tmpTypes,
516 const auto& tmpMaxLuminance,
517 const auto& tmpMaxAverageLuminance,
518 const auto& tmpMinLuminance) {
519 error = tmpError;
520 if (error != Error::NONE) {
521 return;
522 }
523
524 outTypes->clear();
525 for (auto type : tmpTypes) {
526 outTypes->push_back(static_cast<Hdr>(type));
527 }
528
529 *outMaxLuminance = tmpMaxLuminance;
530 *outMaxAverageLuminance = tmpMaxAverageLuminance;
531 *outMinLuminance = tmpMinLuminance;
532 });
533 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534
535 return error;
536}
537
Chia-I Wu67e376d2016-12-19 11:36:22 +0800538Error Composer::getReleaseFences(Display display,
539 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800540{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800541 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800543}
544
Chia-I Wu67e376d2016-12-19 11:36:22 +0800545Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800546{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800547 mWriter.selectDisplay(display);
548 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800549
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800550 Error error = execute();
551 if (error != Error::NONE) {
552 return error;
553 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800554
Chia-I Wu67e376d2016-12-19 11:36:22 +0800555 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556
557 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800558}
559
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800560Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800561{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800562 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563 return unwrapRet(ret);
564}
565
Chia-I Wu06d63de2017-01-04 14:58:51 +0800566Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400567 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800568 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800569 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800570{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800571 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700572
573#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400574 if (mIsUsingVrComposer && target.get()) {
575 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700576 .width = target->getWidth(),
577 .height = target->getHeight(),
578 .stride = target->getStride(),
579 .layerCount = target->getLayerCount(),
580 .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()),
581 .usage = target->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400582 };
583 mWriter.setClientTargetMetadata(metadata);
584 }
mamik94e91f62019-08-19 09:11:33 -0700585#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400586
587 const native_handle_t* handle = nullptr;
588 if (target.get()) {
589 handle = target->getNativeBuffer()->handle;
590 }
591
592 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800593 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800594}
595
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700596Error Composer::setColorMode(Display display, ColorMode mode,
597 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800598{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700599 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700600 if (mClient_2_3) {
601 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
602 } else if (mClient_2_2) {
603 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
604 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700605 } else {
606 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700607 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700608 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800609 return unwrapRet(ret);
610}
611
612Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800613 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800614{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800615 mWriter.selectDisplay(display);
616 mWriter.setColorTransform(matrix, hint);
617 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800618}
619
620Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800621 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800622{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800623 mWriter.selectDisplay(display);
624 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
625 return Error::NONE;
626}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800627
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700628Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
629 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700630 if (mClient_2_2) {
631 ret = mClient_2_2->setPowerMode_2_2(display, mode);
632 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700633 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700634 }
635
Chia-I Wuaab99f52016-10-05 12:59:58 +0800636 return unwrapRet(ret);
637}
638
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800639Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800640{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800641 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800642 return unwrapRet(ret);
643}
644
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800645Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800646{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800647 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800648 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800649 return unwrapRet(ret);
650}
651
Chia-I Wu67e376d2016-12-19 11:36:22 +0800652Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
653 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800654{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800655 mWriter.selectDisplay(display);
656 mWriter.validateDisplay();
657
658 Error error = execute();
659 if (error != Error::NONE) {
660 return error;
661 }
662
Chia-I Wu67e376d2016-12-19 11:36:22 +0800663 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800664
665 return Error::NONE;
666}
667
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700668Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
669 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
670 mWriter.selectDisplay(display);
671 mWriter.presentOrvalidateDisplay();
672
673 Error error = execute();
674 if (error != Error::NONE) {
675 return error;
676 }
677
678 mReader.takePresentOrValidateStage(display, state);
679
680 if (*state == 1) { // Present succeeded
681 mReader.takePresentFence(display, outPresentFence);
682 }
683
684 if (*state == 0) { // Validate succeeded.
685 mReader.hasChanges(display, outNumTypes, outNumRequests);
686 }
687
688 return Error::NONE;
689}
690
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800691Error Composer::setCursorPosition(Display display, Layer layer,
692 int32_t x, int32_t y)
693{
694 mWriter.selectDisplay(display);
695 mWriter.selectLayer(layer);
696 mWriter.setLayerCursorPosition(x, y);
697 return Error::NONE;
698}
699
700Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400701 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800702{
703 mWriter.selectDisplay(display);
704 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700705
706#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400707 if (mIsUsingVrComposer && buffer.get()) {
708 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700709 .width = buffer->getWidth(),
710 .height = buffer->getHeight(),
711 .stride = buffer->getStride(),
712 .layerCount = buffer->getLayerCount(),
713 .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()),
714 .usage = buffer->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400715 };
716 mWriter.setLayerBufferMetadata(metadata);
717 }
mamik94e91f62019-08-19 09:11:33 -0700718#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400719
720 const native_handle_t* handle = nullptr;
721 if (buffer.get()) {
722 handle = buffer->getNativeBuffer()->handle;
723 }
724
725 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800726 return Error::NONE;
727}
728
729Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
730 const std::vector<IComposerClient::Rect>& damage)
731{
732 mWriter.selectDisplay(display);
733 mWriter.selectLayer(layer);
734 mWriter.setLayerSurfaceDamage(damage);
735 return Error::NONE;
736}
737
738Error Composer::setLayerBlendMode(Display display, Layer layer,
739 IComposerClient::BlendMode mode)
740{
741 mWriter.selectDisplay(display);
742 mWriter.selectLayer(layer);
743 mWriter.setLayerBlendMode(mode);
744 return Error::NONE;
745}
746
747Error Composer::setLayerColor(Display display, Layer layer,
748 const IComposerClient::Color& color)
749{
750 mWriter.selectDisplay(display);
751 mWriter.selectLayer(layer);
752 mWriter.setLayerColor(color);
753 return Error::NONE;
754}
755
756Error Composer::setLayerCompositionType(Display display, Layer layer,
757 IComposerClient::Composition type)
758{
759 mWriter.selectDisplay(display);
760 mWriter.selectLayer(layer);
761 mWriter.setLayerCompositionType(type);
762 return Error::NONE;
763}
764
765Error Composer::setLayerDataspace(Display display, Layer layer,
766 Dataspace dataspace)
767{
768 mWriter.selectDisplay(display);
769 mWriter.selectLayer(layer);
770 mWriter.setLayerDataspace(dataspace);
771 return Error::NONE;
772}
773
774Error Composer::setLayerDisplayFrame(Display display, Layer layer,
775 const IComposerClient::Rect& frame)
776{
777 mWriter.selectDisplay(display);
778 mWriter.selectLayer(layer);
779 mWriter.setLayerDisplayFrame(frame);
780 return Error::NONE;
781}
782
783Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
784 float alpha)
785{
786 mWriter.selectDisplay(display);
787 mWriter.selectLayer(layer);
788 mWriter.setLayerPlaneAlpha(alpha);
789 return Error::NONE;
790}
791
792Error Composer::setLayerSidebandStream(Display display, Layer layer,
793 const native_handle_t* stream)
794{
795 mWriter.selectDisplay(display);
796 mWriter.selectLayer(layer);
797 mWriter.setLayerSidebandStream(stream);
798 return Error::NONE;
799}
800
801Error Composer::setLayerSourceCrop(Display display, Layer layer,
802 const IComposerClient::FRect& crop)
803{
804 mWriter.selectDisplay(display);
805 mWriter.selectLayer(layer);
806 mWriter.setLayerSourceCrop(crop);
807 return Error::NONE;
808}
809
810Error Composer::setLayerTransform(Display display, Layer layer,
811 Transform transform)
812{
813 mWriter.selectDisplay(display);
814 mWriter.selectLayer(layer);
815 mWriter.setLayerTransform(transform);
816 return Error::NONE;
817}
818
819Error Composer::setLayerVisibleRegion(Display display, Layer layer,
820 const std::vector<IComposerClient::Rect>& visible)
821{
822 mWriter.selectDisplay(display);
823 mWriter.selectLayer(layer);
824 mWriter.setLayerVisibleRegion(visible);
825 return Error::NONE;
826}
827
828Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
829{
830 mWriter.selectDisplay(display);
831 mWriter.selectLayer(layer);
832 mWriter.setLayerZOrder(z);
833 return Error::NONE;
834}
835
mamik94e91f62019-08-19 09:11:33 -0700836#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500837Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
838 uint32_t appId)
839{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800840 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500841 mWriter.selectDisplay(display);
842 mWriter.selectLayer(layer);
843 mWriter.setLayerInfo(type, appId);
844 }
845 return Error::NONE;
846}
mamik94e91f62019-08-19 09:11:33 -0700847#else
848Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) {
849 if (mIsUsingVrComposer) {
850 mWriter.selectDisplay(display);
851 mWriter.selectLayer(layer);
852 }
853 return Error::NONE;
854}
855#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500856
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800857Error Composer::execute()
858{
859 // prepare input command queue
860 bool queueChanged = false;
861 uint32_t commandLength = 0;
862 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800863 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800864 mWriter.reset();
865 return Error::NO_RESOURCES;
866 }
867
868 // set up new input command queue if necessary
869 if (queueChanged) {
870 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
871 auto error = unwrapRet(ret);
872 if (error != Error::NONE) {
873 mWriter.reset();
874 return error;
875 }
876 }
877
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700878 if (commandLength == 0) {
879 mWriter.reset();
880 return Error::NONE;
881 }
882
Chia-I Wuaab99f52016-10-05 12:59:58 +0800883 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700884 hardware::Return<void> ret;
885 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
886 const auto& tmpOutLength, const auto& tmpOutHandles)
887 {
888 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800889
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700890 // set up new output command queue if necessary
891 if (error == Error::NONE && tmpOutChanged) {
892 error = kDefaultError;
893 mClient->getOutputCommandQueue(
894 [&](const auto& tmpError,
895 const auto& tmpDescriptor)
896 {
897 error = tmpError;
898 if (error != Error::NONE) {
899 return;
900 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800901
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700902 mReader.setMQDescriptor(tmpDescriptor);
903 });
904 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800905
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700906 if (error != Error::NONE) {
907 return;
908 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800909
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700910 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
911 error = mReader.parse();
912 mReader.reset();
913 } else {
914 error = Error::NO_RESOURCES;
915 }
916 };
917 if (mClient_2_2) {
918 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
919 } else {
920 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
921 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700922 // executeCommands can fail because of out-of-fd and we do not want to
923 // abort() in that case
924 if (!ret.isOk()) {
925 ALOGE("executeCommands failed because of %s", ret.description().c_str());
926 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800927
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800928 if (error == Error::NONE) {
929 std::vector<CommandReader::CommandError> commandErrors =
930 mReader.takeErrors();
931
932 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700933 auto command =
934 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800935
936 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700937 command == IComposerClient::Command::PRESENT_DISPLAY ||
938 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800939 error = cmdErr.error;
940 } else {
941 ALOGW("command 0x%x generated error %d",
942 command, cmdErr.error);
943 }
944 }
945 }
946
947 mWriter.reset();
948
Chia-I Wuaab99f52016-10-05 12:59:58 +0800949 return error;
950}
951
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700952// Composer HAL 2.2
953
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700954Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
955 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
956 if (!mClient_2_2) {
957 return Error::UNSUPPORTED;
958 }
959
960 mWriter.selectDisplay(display);
961 mWriter.selectLayer(layer);
962 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
963 return Error::NONE;
964}
965
Chia-I Wud7e01d72018-06-21 13:39:09 +0800966std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
967 Display display) {
968 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700969 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800970 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700971 }
972
973 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800974 if (mClient_2_3) {
975 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
976 [&](const auto& tmpError, const auto& tmpKeys) {
977 error = tmpError;
978 if (error != Error::NONE) {
979 ALOGW("getPerFrameMetadataKeys failed "
980 "with %d",
981 tmpError);
982 return;
983 }
984 keys = tmpKeys;
985 });
986 } else {
987 mClient_2_2
988 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
989 error = tmpError;
990 if (error != Error::NONE) {
991 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
992 return;
993 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700994
Valerie Haue9e843a2018-12-18 13:39:23 -0800995 keys.clear();
996 for (auto key : tmpKeys) {
997 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
998 }
999 });
1000 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001001
Chia-I Wud7e01d72018-06-21 13:39:09 +08001002 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001003}
1004
1005Error Composer::getRenderIntents(Display display, ColorMode colorMode,
1006 std::vector<RenderIntent>* outRenderIntents) {
1007 if (!mClient_2_2) {
1008 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1009 return Error::NONE;
1010 }
1011
1012 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001013
1014 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001015 error = tmpError;
1016 if (error != Error::NONE) {
1017 return;
1018 }
1019
1020 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001021 };
1022
1023 if (mClient_2_3) {
1024 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1025 } else {
1026 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1027 getRenderIntentsLambda);
1028 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001029
1030 return error;
1031}
1032
1033Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1034{
1035 if (!mClient_2_2) {
1036 *outMatrix = mat4();
1037 return Error::NONE;
1038 }
1039
1040 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001041 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1042 [&](const auto& tmpError, const auto& tmpMatrix) {
1043 error = tmpError;
1044 if (error != Error::NONE) {
1045 return;
1046 }
1047 *outMatrix = mat4(tmpMatrix.data());
1048 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001049
1050 return error;
1051}
1052
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001053// Composer HAL 2.3
1054
1055Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1056 std::vector<uint8_t>* outData) {
1057 if (!mClient_2_3) {
1058 return Error::UNSUPPORTED;
1059 }
1060
1061 Error error = kDefaultError;
1062 mClient_2_3->getDisplayIdentificationData(display,
1063 [&](const auto& tmpError, const auto& tmpPort,
1064 const auto& tmpData) {
1065 error = tmpError;
1066 if (error != Error::NONE) {
1067 return;
1068 }
1069
1070 *outPort = tmpPort;
1071 *outData = tmpData;
1072 });
1073
1074 return error;
1075}
1076
Peiyong Lin698147a2018-09-14 13:27:18 -07001077Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1078{
1079 if (!mClient_2_3) {
1080 return Error::UNSUPPORTED;
1081 }
1082
1083 mWriter.selectDisplay(display);
1084 mWriter.selectLayer(layer);
1085 mWriter.setLayerColorTransform(matrix);
1086 return Error::NONE;
1087}
1088
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001089Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1090 Dataspace* outDataspace,
1091 uint8_t* outComponentMask) {
1092 if (!outFormat || !outDataspace || !outComponentMask) {
1093 return Error::BAD_PARAMETER;
1094 }
1095 if (!mClient_2_3) {
1096 return Error::UNSUPPORTED;
1097 }
1098 Error error = kDefaultError;
1099 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1100 [&](const auto tmpError,
1101 const auto& tmpFormat,
1102 const auto& tmpDataspace,
1103 const auto& tmpComponentMask) {
1104 error = tmpError;
1105 if (error == Error::NONE) {
1106 *outFormat = tmpFormat;
1107 *outDataspace = tmpDataspace;
1108 *outComponentMask =
1109 static_cast<uint8_t>(
1110 tmpComponentMask);
1111 }
1112 });
1113 return error;
1114}
1115
Peiyong Lined531a32018-10-26 18:27:56 -07001116Error Composer::getDisplayCapabilities(Display display,
1117 std::vector<DisplayCapability>* outCapabilities) {
1118 if (!mClient_2_3) {
1119 return Error::UNSUPPORTED;
1120 }
1121 Error error = kDefaultError;
1122 mClient_2_3->getDisplayCapabilities(display,
1123 [&](const auto& tmpError, const auto& tmpCapabilities) {
1124 error = tmpError;
1125 if (error != Error::NONE) {
1126 return;
1127 }
1128 *outCapabilities = tmpCapabilities;
1129 });
1130 return error;
1131}
1132
Kevin DuBois74e53772018-11-19 10:52:38 -08001133Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1134 uint8_t componentMask, uint64_t maxFrames) {
1135 if (!mClient_2_3) {
1136 return Error::UNSUPPORTED;
1137 }
1138
1139 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1140 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1141 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1142 maxFrames);
1143}
1144
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001145Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1146 DisplayedFrameStats* outStats) {
1147 if (!outStats) {
1148 return Error::BAD_PARAMETER;
1149 }
1150 if (!mClient_2_3) {
1151 return Error::UNSUPPORTED;
1152 }
1153 Error error = kDefaultError;
1154 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1155 [&](const auto tmpError, auto tmpNumFrames,
1156 const auto& tmpSamples0, const auto& tmpSamples1,
1157 const auto& tmpSamples2, const auto& tmpSamples3) {
1158 error = tmpError;
1159 if (error == Error::NONE) {
1160 outStats->numFrames = tmpNumFrames;
1161 outStats->component_0_sample = tmpSamples0;
1162 outStats->component_1_sample = tmpSamples1;
1163 outStats->component_2_sample = tmpSamples2;
1164 outStats->component_3_sample = tmpSamples3;
1165 }
1166 });
1167 return error;
1168}
1169
Valerie Haue9e843a2018-12-18 13:39:23 -08001170Error Composer::setLayerPerFrameMetadataBlobs(
1171 Display display, Layer layer,
1172 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1173 if (!mClient_2_3) {
1174 return Error::UNSUPPORTED;
1175 }
1176
1177 mWriter.selectDisplay(display);
1178 mWriter.selectLayer(layer);
1179 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1180 return Error::NONE;
1181}
1182
Dan Gittik57e63c52019-01-18 16:37:54 +00001183Error Composer::setDisplayBrightness(Display display, float brightness) {
1184 if (!mClient_2_3) {
1185 return Error::UNSUPPORTED;
1186 }
1187 return mClient_2_3->setDisplayBrightness(display, brightness);
1188}
1189
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001190CommandReader::~CommandReader()
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}
1194
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001195Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001196{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001197 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001198
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001199 IComposerClient::Command command;
1200 uint16_t length = 0;
1201
1202 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001203 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001204 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001205 break;
1206 }
1207
1208 bool parsed = false;
1209 switch (command) {
1210 case IComposerClient::Command::SELECT_DISPLAY:
1211 parsed = parseSelectDisplay(length);
1212 break;
1213 case IComposerClient::Command::SET_ERROR:
1214 parsed = parseSetError(length);
1215 break;
1216 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1217 parsed = parseSetChangedCompositionTypes(length);
1218 break;
1219 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1220 parsed = parseSetDisplayRequests(length);
1221 break;
1222 case IComposerClient::Command::SET_PRESENT_FENCE:
1223 parsed = parseSetPresentFence(length);
1224 break;
1225 case IComposerClient::Command::SET_RELEASE_FENCES:
1226 parsed = parseSetReleaseFences(length);
1227 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001228 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1229 parsed = parseSetPresentOrValidateDisplayResult(length);
1230 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001231 default:
1232 parsed = false;
1233 break;
1234 }
1235
1236 endCommand();
1237
1238 if (!parsed) {
1239 ALOGE("failed to parse command 0x%x length %" PRIu16,
1240 command, length);
1241 break;
1242 }
1243 }
1244
1245 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001246}
1247
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001248bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001249{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001250 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001251 return false;
1252 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001253
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001254 mCurrentReturnData = &mReturnData[read64()];
1255
1256 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001257}
1258
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001259bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001260{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001261 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001262 return false;
1263 }
1264
1265 auto location = read();
1266 auto error = static_cast<Error>(readSigned());
1267
1268 mErrors.emplace_back(CommandError{location, error});
1269
1270 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001271}
1272
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001273bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001274{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001275 // (layer id, composition type) pairs
1276 if (length % 3 != 0 || !mCurrentReturnData) {
1277 return false;
1278 }
1279
1280 uint32_t count = length / 3;
1281 mCurrentReturnData->changedLayers.reserve(count);
1282 mCurrentReturnData->compositionTypes.reserve(count);
1283 while (count > 0) {
1284 auto layer = read64();
1285 auto type = static_cast<IComposerClient::Composition>(readSigned());
1286
1287 mCurrentReturnData->changedLayers.push_back(layer);
1288 mCurrentReturnData->compositionTypes.push_back(type);
1289
1290 count--;
1291 }
1292
1293 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001294}
1295
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001296bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001297{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001298 // display requests followed by (layer id, layer requests) pairs
1299 if (length % 3 != 1 || !mCurrentReturnData) {
1300 return false;
1301 }
1302
1303 mCurrentReturnData->displayRequests = read();
1304
1305 uint32_t count = (length - 1) / 3;
1306 mCurrentReturnData->requestedLayers.reserve(count);
1307 mCurrentReturnData->requestMasks.reserve(count);
1308 while (count > 0) {
1309 auto layer = read64();
1310 auto layerRequestMask = read();
1311
1312 mCurrentReturnData->requestedLayers.push_back(layer);
1313 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1314
1315 count--;
1316 }
1317
1318 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001319}
1320
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001321bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001322{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001323 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001324 !mCurrentReturnData) {
1325 return false;
1326 }
1327
1328 if (mCurrentReturnData->presentFence >= 0) {
1329 close(mCurrentReturnData->presentFence);
1330 }
1331 mCurrentReturnData->presentFence = readFence();
1332
1333 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001334}
1335
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001336bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001337{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001338 // (layer id, release fence index) pairs
1339 if (length % 3 != 0 || !mCurrentReturnData) {
1340 return false;
1341 }
1342
1343 uint32_t count = length / 3;
1344 mCurrentReturnData->releasedLayers.reserve(count);
1345 mCurrentReturnData->releaseFences.reserve(count);
1346 while (count > 0) {
1347 auto layer = read64();
1348 auto fence = readFence();
1349
1350 mCurrentReturnData->releasedLayers.push_back(layer);
1351 mCurrentReturnData->releaseFences.push_back(fence);
1352
1353 count--;
1354 }
1355
1356 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001357}
1358
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001359bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1360{
1361 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1362 return false;
1363 }
1364 mCurrentReturnData->presentOrValidateState = read();
1365 return true;
1366}
1367
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001368void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001369{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001370 mErrors.clear();
1371
1372 for (auto& data : mReturnData) {
1373 if (data.second.presentFence >= 0) {
1374 close(data.second.presentFence);
1375 }
1376 for (auto fence : data.second.releaseFences) {
1377 if (fence >= 0) {
1378 close(fence);
1379 }
1380 }
1381 }
1382
1383 mReturnData.clear();
1384 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001385}
1386
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001387std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001388{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001389 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001390}
1391
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001392bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001393 uint32_t* outNumChangedCompositionTypes,
1394 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001395{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001396 auto found = mReturnData.find(display);
1397 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001398 *outNumChangedCompositionTypes = 0;
1399 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001400 return false;
1401 }
1402
1403 const ReturnData& data = found->second;
1404
Chia-I Wu67e376d2016-12-19 11:36:22 +08001405 *outNumChangedCompositionTypes = data.compositionTypes.size();
1406 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001407
1408 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001409}
1410
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001411void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001412 std::vector<Layer>* outLayers,
1413 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001414{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001415 auto found = mReturnData.find(display);
1416 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001417 outLayers->clear();
1418 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001419 return;
1420 }
1421
1422 ReturnData& data = found->second;
1423
Chia-I Wu67e376d2016-12-19 11:36:22 +08001424 *outLayers = std::move(data.changedLayers);
1425 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001426}
1427
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001428void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001429 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1430 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001431{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001432 auto found = mReturnData.find(display);
1433 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001434 *outDisplayRequestMask = 0;
1435 outLayers->clear();
1436 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001437 return;
1438 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001439
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001440 ReturnData& data = found->second;
1441
Chia-I Wu67e376d2016-12-19 11:36:22 +08001442 *outDisplayRequestMask = data.displayRequests;
1443 *outLayers = std::move(data.requestedLayers);
1444 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001445}
1446
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001447void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001448 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001449{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001450 auto found = mReturnData.find(display);
1451 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001452 outLayers->clear();
1453 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001454 return;
1455 }
1456
1457 ReturnData& data = found->second;
1458
Chia-I Wu67e376d2016-12-19 11:36:22 +08001459 *outLayers = std::move(data.releasedLayers);
1460 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001461}
1462
Chia-I Wu67e376d2016-12-19 11:36:22 +08001463void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001464{
1465 auto found = mReturnData.find(display);
1466 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001467 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001468 return;
1469 }
1470
1471 ReturnData& data = found->second;
1472
Chia-I Wu67e376d2016-12-19 11:36:22 +08001473 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001474 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001475}
1476
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001477void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1478 auto found = mReturnData.find(display);
1479 if (found == mReturnData.end()) {
1480 *state= -1;
1481 return;
1482 }
1483 ReturnData& data = found->second;
1484 *state = data.presentOrValidateState;
1485}
1486
Lloyd Piquea822d522017-12-20 16:42:57 -08001487} // namespace impl
1488
Chia-I Wuaab99f52016-10-05 12:59:58 +08001489} // namespace Hwc2
1490
1491} // namespace android