blob: aef1c7576f829bf827909b46afd6fb9c66115bab [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
Chia-I Wuaab99f52016-10-05 12:59:58 +080020#include <log/log.h>
21
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -070022#include <algorithm>
23#include <cinttypes>
24
Chia-I Wuaab99f52016-10-05 12:59:58 +080025#include "ComposerHal.h"
26
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070027#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
28#include <gui/BufferQueue.h>
Wei Wangae211b42019-06-07 17:22:49 -070029#include <hidl/HidlTransportSupport.h>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070030#include <hidl/HidlTransportUtils.h>
31
Chia-I Wuaab99f52016-10-05 12:59:58 +080032namespace android {
33
34using hardware::Return;
35using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010036using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080037
38namespace Hwc2 {
39
Lloyd Piquea822d522017-12-20 16:42:57 -080040Composer::~Composer() = default;
41
Chia-I Wuaab99f52016-10-05 12:59:58 +080042namespace {
43
44class BufferHandle {
45public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080046 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080047 // nullptr is not a valid handle to HIDL
48 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
49 }
50
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080051 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080052 {
53 return mHandle;
54 }
55
56private:
57 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010058 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080059};
60
61class FenceHandle
62{
63public:
64 FenceHandle(int fd, bool owned)
65 : mOwned(owned)
66 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010067 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080068 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010069 handle = native_handle_init(mStorage, 1, 0);
70 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 } else {
72 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010075 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080076 }
77
78 ~FenceHandle()
79 {
80 if (mOwned) {
81 native_handle_close(mHandle);
82 }
83 }
84
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080085 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080086 {
87 return mHandle;
88 }
89
90private:
91 bool mOwned;
92 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010093 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080094};
95
96// assume NO_RESOURCES when Status::isOk returns false
97constexpr Error kDefaultError = Error::NO_RESOURCES;
Ady Abrahamf2e339e2019-10-16 18:23:35 -070098constexpr V2_4::Error kDefaultError_2_4 = V2_4::Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +080099
100template<typename T, typename U>
101T unwrapRet(Return<T>& ret, const U& default_val)
102{
Steven Moreland9d021002017-01-03 17:10:54 -0800103 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800104 static_cast<T>(default_val);
105}
106
107Error unwrapRet(Return<Error>& ret)
108{
109 return unwrapRet(ret, kDefaultError);
110}
111
Chia-I Wuaab99f52016-10-05 12:59:58 +0800112} // anonymous namespace
113
Lloyd Piquea822d522017-12-20 16:42:57 -0800114namespace impl {
115
mamik94e91f62019-08-19 09:11:33 -0700116#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500117Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
118 : CommandWriterBase(initialMaxSize) {}
119
120Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800121{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500122}
123
124void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
125{
126 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700127 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700128 IVrComposerClient::VrCommand::SET_LAYER_INFO),
129 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500130 write(type);
131 write(appId);
132 endCommand();
133}
134
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400135void Composer::CommandWriter::setClientTargetMetadata(
136 const IVrComposerClient::BufferMetadata& metadata)
137{
138 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700139 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700140 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
141 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400142 writeBufferMetadata(metadata);
143 endCommand();
144}
145
146void Composer::CommandWriter::setLayerBufferMetadata(
147 const IVrComposerClient::BufferMetadata& metadata)
148{
149 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700150 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700151 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
152 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400153 writeBufferMetadata(metadata);
154 endCommand();
155}
156
157void Composer::CommandWriter::writeBufferMetadata(
158 const IVrComposerClient::BufferMetadata& metadata)
159{
160 write(metadata.width);
161 write(metadata.height);
162 write(metadata.stride);
163 write(metadata.layerCount);
164 writeSigned(static_cast<int32_t>(metadata.format));
165 write64(metadata.usage);
166}
mamik94e91f62019-08-19 09:11:33 -0700167#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400168
Kalle Raitaa099a242017-01-11 11:17:29 -0800169Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800170 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800171 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500172{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700173 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500174
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800175 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800176 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
177 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800178
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700179 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
180 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -0700181 if (tmpError == V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700182 mClient = tmpClient;
183 mClient_2_2 = tmpClient;
184 mClient_2_3 = tmpClient;
185 mClient_2_4 = tmpClient;
186 }
187 });
188 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700189 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
190 if (tmpError == Error::NONE) {
191 mClient = tmpClient;
192 mClient_2_2 = tmpClient;
193 mClient_2_3 = tmpClient;
194 }
195 });
196 } else {
197 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
198 if (tmpError != Error::NONE) {
199 return;
200 }
201
202 mClient = tmpClient;
203 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
204 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
205 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
206 "IComposer 2.2 did not return IComposerClient 2.2");
207 }
208 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800209 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400210
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700211 if (mClient == nullptr) {
212 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700213 }
214
mamik94e91f62019-08-19 09:11:33 -0700215#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400216 if (mIsUsingVrComposer) {
217 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
218 if (vrClient == nullptr) {
219 LOG_ALWAYS_FATAL("failed to create vr composer client");
220 }
221 }
mamik94e91f62019-08-19 09:11:33 -0700222#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223}
224
Lloyd Piquea822d522017-12-20 16:42:57 -0800225Composer::~Composer() = default;
226
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800227std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800228{
229 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800230 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800231 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800232 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800234 return capabilities;
235}
236
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800237std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800238{
239 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800240 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800241 info = tmpInfo.c_str();
242 });
243
244 return info;
245}
246
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800247void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248{
Wei Wangae211b42019-06-07 17:22:49 -0700249 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800250 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800251 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252 ALOGE("failed to register IComposerCallback");
253 }
254}
255
Steven Thomasb02664d2017-07-26 18:48:28 -0700256bool Composer::isRemote() {
257 return mClient->isRemote();
258}
259
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700260void Composer::resetCommands() {
261 mWriter.reset();
262}
263
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700264Error Composer::executeCommands() {
265 return execute();
266}
267
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800268uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800269{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800270 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800271 return unwrapRet(ret, 0);
272}
273
274Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800275 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800276{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800277 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800278 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700279 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800280 mClient_2_2->createVirtualDisplay_2_2(width, height,
281 static_cast<types::V1_1::PixelFormat>(*format),
282 bufferSlotCount,
283 [&](const auto& tmpError, const auto& tmpDisplay,
284 const auto& tmpFormat) {
285 error = tmpError;
286 if (error != Error::NONE) {
287 return;
288 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800289
Kevin DuBois73d0f482019-01-25 11:18:03 -0800290 *outDisplay = tmpDisplay;
291 *format = static_cast<types::V1_2::PixelFormat>(
292 tmpFormat);
293 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700294 } else {
295 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700296 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700297 [&](const auto& tmpError, const auto& tmpDisplay,
298 const auto& tmpFormat) {
299 error = tmpError;
300 if (error != Error::NONE) {
301 return;
302 }
303
304 *outDisplay = tmpDisplay;
305 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700307 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800308
309 return error;
310}
311
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800312Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800314 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800315 return unwrapRet(ret);
316}
317
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800318Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800319{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800320 mWriter.selectDisplay(display);
321 mWriter.acceptDisplayChanges();
322 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323}
324
Chia-I Wu67e376d2016-12-19 11:36:22 +0800325Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326{
327 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800328 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800329 [&](const auto& tmpError, const auto& tmpLayer) {
330 error = tmpError;
331 if (error != Error::NONE) {
332 return;
333 }
334
Chia-I Wu67e376d2016-12-19 11:36:22 +0800335 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800336 });
337
338 return error;
339}
340
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800341Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800342{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800343 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800344 return unwrapRet(ret);
345}
346
Chia-I Wu67e376d2016-12-19 11:36:22 +0800347Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800348{
349 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800350 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800351 [&](const auto& tmpError, const auto& tmpConfig) {
352 error = tmpError;
353 if (error != Error::NONE) {
354 return;
355 }
356
Chia-I Wu67e376d2016-12-19 11:36:22 +0800357 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800358 });
359
360 return error;
361}
362
363Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800364 std::vector<Layer>* outLayers,
365 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800366{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800367 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800368 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800369}
370
371Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800372 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800373{
374 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800375
Valerie Hau9758ae02018-10-09 16:05:09 -0700376 if (mClient_2_3) {
377 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
378 error = tmpError;
379 if (error != Error::NONE) {
380 return;
381 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700382
Valerie Hau9758ae02018-10-09 16:05:09 -0700383 *outModes = tmpModes;
384 });
385 } else if (mClient_2_2) {
386 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
387 error = tmpError;
388 if (error != Error::NONE) {
389 return;
390 }
391
392 for (types::V1_1::ColorMode colorMode : tmpModes) {
393 outModes->push_back(static_cast<ColorMode>(colorMode));
394 }
395 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700396 } else {
397 mClient->getColorModes(display,
398 [&](const auto& tmpError, const auto& tmpModes) {
399 error = tmpError;
400 if (error != Error::NONE) {
401 return;
402 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700403 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700404 outModes->push_back(static_cast<ColorMode>(colorMode));
405 }
406 });
407 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800408
409 return error;
410}
411
412Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800413 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800414{
415 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800416 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800417 [&](const auto& tmpError, const auto& tmpValue) {
418 error = tmpError;
419 if (error != Error::NONE) {
420 return;
421 }
422
Chia-I Wu67e376d2016-12-19 11:36:22 +0800423 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800424 });
425
426 return error;
427}
428
429Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800430 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800431{
432 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800433 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800434 [&](const auto& tmpError, const auto& tmpConfigs) {
435 error = tmpError;
436 if (error != Error::NONE) {
437 return;
438 }
439
Chia-I Wu67e376d2016-12-19 11:36:22 +0800440 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800441 });
442
443 return error;
444}
445
Chia-I Wu67e376d2016-12-19 11:36:22 +0800446Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800447{
448 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800449 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800450 [&](const auto& tmpError, const auto& tmpName) {
451 error = tmpError;
452 if (error != Error::NONE) {
453 return;
454 }
455
Chia-I Wu67e376d2016-12-19 11:36:22 +0800456 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800457 });
458
459 return error;
460}
461
462Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800463 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
464 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800466 mReader.takeDisplayRequests(display, outDisplayRequestMask,
467 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800468 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469}
470
Chia-I Wu67e376d2016-12-19 11:36:22 +0800471Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472{
473 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800474 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800475 [&](const auto& tmpError, const auto& tmpSupport) {
476 error = tmpError;
477 if (error != Error::NONE) {
478 return;
479 }
480
Chia-I Wu67e376d2016-12-19 11:36:22 +0800481 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800482 });
483
484 return error;
485}
486
Chia-I Wu67e376d2016-12-19 11:36:22 +0800487Error Composer::getHdrCapabilities(Display display,
488 std::vector<Hdr>* outTypes, float* outMaxLuminance,
489 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800490{
491 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800492 if (mClient_2_3) {
493 mClient_2_3->getHdrCapabilities_2_3(display,
494 [&](const auto& tmpError, const auto& tmpTypes,
495 const auto& tmpMaxLuminance,
496 const auto& tmpMaxAverageLuminance,
497 const auto& tmpMinLuminance) {
498 error = tmpError;
499 if (error != Error::NONE) {
500 return;
501 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800502
Valerie Haue9e843a2018-12-18 13:39:23 -0800503 *outTypes = tmpTypes;
504 *outMaxLuminance = tmpMaxLuminance;
505 *outMaxAverageLuminance = tmpMaxAverageLuminance;
506 *outMinLuminance = tmpMinLuminance;
507 });
508 } else {
509 mClient->getHdrCapabilities(display,
510 [&](const auto& tmpError, const auto& tmpTypes,
511 const auto& tmpMaxLuminance,
512 const auto& tmpMaxAverageLuminance,
513 const auto& tmpMinLuminance) {
514 error = tmpError;
515 if (error != Error::NONE) {
516 return;
517 }
518
519 outTypes->clear();
520 for (auto type : tmpTypes) {
521 outTypes->push_back(static_cast<Hdr>(type));
522 }
523
524 *outMaxLuminance = tmpMaxLuminance;
525 *outMaxAverageLuminance = tmpMaxAverageLuminance;
526 *outMinLuminance = tmpMinLuminance;
527 });
528 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800529
530 return error;
531}
532
Chia-I Wu67e376d2016-12-19 11:36:22 +0800533Error Composer::getReleaseFences(Display display,
534 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800535{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800536 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800537 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538}
539
Chia-I Wu67e376d2016-12-19 11:36:22 +0800540Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800541{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 mWriter.selectDisplay(display);
543 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800544
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800545 Error error = execute();
546 if (error != Error::NONE) {
547 return error;
548 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800549
Chia-I Wu67e376d2016-12-19 11:36:22 +0800550 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800551
552 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553}
554
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800555Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800557 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800558 return unwrapRet(ret);
559}
560
Chia-I Wu06d63de2017-01-04 14:58:51 +0800561Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400562 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800564 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800565{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800566 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700567
568#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400569 if (mIsUsingVrComposer && target.get()) {
570 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700571 .width = target->getWidth(),
572 .height = target->getHeight(),
573 .stride = target->getStride(),
574 .layerCount = target->getLayerCount(),
575 .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()),
576 .usage = target->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400577 };
578 mWriter.setClientTargetMetadata(metadata);
579 }
mamik94e91f62019-08-19 09:11:33 -0700580#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400581
582 const native_handle_t* handle = nullptr;
583 if (target.get()) {
584 handle = target->getNativeBuffer()->handle;
585 }
586
587 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800588 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800589}
590
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700591Error Composer::setColorMode(Display display, ColorMode mode,
592 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800593{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700594 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700595 if (mClient_2_3) {
596 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
597 } else if (mClient_2_2) {
598 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
599 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700600 } else {
601 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700602 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700603 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800604 return unwrapRet(ret);
605}
606
607Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800608 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800609{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800610 mWriter.selectDisplay(display);
611 mWriter.setColorTransform(matrix, hint);
612 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800613}
614
615Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800616 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800617{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800618 mWriter.selectDisplay(display);
619 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
620 return Error::NONE;
621}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800622
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700623Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
624 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700625 if (mClient_2_2) {
626 ret = mClient_2_2->setPowerMode_2_2(display, mode);
627 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700628 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700629 }
630
Chia-I Wuaab99f52016-10-05 12:59:58 +0800631 return unwrapRet(ret);
632}
633
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800634Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800635{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800636 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800637 return unwrapRet(ret);
638}
639
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800640Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800641{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800642 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800643 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800644 return unwrapRet(ret);
645}
646
Chia-I Wu67e376d2016-12-19 11:36:22 +0800647Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
648 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800649{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800650 mWriter.selectDisplay(display);
651 mWriter.validateDisplay();
652
653 Error error = execute();
654 if (error != Error::NONE) {
655 return error;
656 }
657
Chia-I Wu67e376d2016-12-19 11:36:22 +0800658 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800659
660 return Error::NONE;
661}
662
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700663Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
664 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
665 mWriter.selectDisplay(display);
666 mWriter.presentOrvalidateDisplay();
667
668 Error error = execute();
669 if (error != Error::NONE) {
670 return error;
671 }
672
673 mReader.takePresentOrValidateStage(display, state);
674
675 if (*state == 1) { // Present succeeded
676 mReader.takePresentFence(display, outPresentFence);
677 }
678
679 if (*state == 0) { // Validate succeeded.
680 mReader.hasChanges(display, outNumTypes, outNumRequests);
681 }
682
683 return Error::NONE;
684}
685
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800686Error Composer::setCursorPosition(Display display, Layer layer,
687 int32_t x, int32_t y)
688{
689 mWriter.selectDisplay(display);
690 mWriter.selectLayer(layer);
691 mWriter.setLayerCursorPosition(x, y);
692 return Error::NONE;
693}
694
695Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400696 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800697{
698 mWriter.selectDisplay(display);
699 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700700
701#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400702 if (mIsUsingVrComposer && buffer.get()) {
703 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700704 .width = buffer->getWidth(),
705 .height = buffer->getHeight(),
706 .stride = buffer->getStride(),
707 .layerCount = buffer->getLayerCount(),
708 .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()),
709 .usage = buffer->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400710 };
711 mWriter.setLayerBufferMetadata(metadata);
712 }
mamik94e91f62019-08-19 09:11:33 -0700713#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400714
715 const native_handle_t* handle = nullptr;
716 if (buffer.get()) {
717 handle = buffer->getNativeBuffer()->handle;
718 }
719
720 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800721 return Error::NONE;
722}
723
724Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
725 const std::vector<IComposerClient::Rect>& damage)
726{
727 mWriter.selectDisplay(display);
728 mWriter.selectLayer(layer);
729 mWriter.setLayerSurfaceDamage(damage);
730 return Error::NONE;
731}
732
733Error Composer::setLayerBlendMode(Display display, Layer layer,
734 IComposerClient::BlendMode mode)
735{
736 mWriter.selectDisplay(display);
737 mWriter.selectLayer(layer);
738 mWriter.setLayerBlendMode(mode);
739 return Error::NONE;
740}
741
742Error Composer::setLayerColor(Display display, Layer layer,
743 const IComposerClient::Color& color)
744{
745 mWriter.selectDisplay(display);
746 mWriter.selectLayer(layer);
747 mWriter.setLayerColor(color);
748 return Error::NONE;
749}
750
751Error Composer::setLayerCompositionType(Display display, Layer layer,
752 IComposerClient::Composition type)
753{
754 mWriter.selectDisplay(display);
755 mWriter.selectLayer(layer);
756 mWriter.setLayerCompositionType(type);
757 return Error::NONE;
758}
759
760Error Composer::setLayerDataspace(Display display, Layer layer,
761 Dataspace dataspace)
762{
763 mWriter.selectDisplay(display);
764 mWriter.selectLayer(layer);
765 mWriter.setLayerDataspace(dataspace);
766 return Error::NONE;
767}
768
769Error Composer::setLayerDisplayFrame(Display display, Layer layer,
770 const IComposerClient::Rect& frame)
771{
772 mWriter.selectDisplay(display);
773 mWriter.selectLayer(layer);
774 mWriter.setLayerDisplayFrame(frame);
775 return Error::NONE;
776}
777
778Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
779 float alpha)
780{
781 mWriter.selectDisplay(display);
782 mWriter.selectLayer(layer);
783 mWriter.setLayerPlaneAlpha(alpha);
784 return Error::NONE;
785}
786
787Error Composer::setLayerSidebandStream(Display display, Layer layer,
788 const native_handle_t* stream)
789{
790 mWriter.selectDisplay(display);
791 mWriter.selectLayer(layer);
792 mWriter.setLayerSidebandStream(stream);
793 return Error::NONE;
794}
795
796Error Composer::setLayerSourceCrop(Display display, Layer layer,
797 const IComposerClient::FRect& crop)
798{
799 mWriter.selectDisplay(display);
800 mWriter.selectLayer(layer);
801 mWriter.setLayerSourceCrop(crop);
802 return Error::NONE;
803}
804
805Error Composer::setLayerTransform(Display display, Layer layer,
806 Transform transform)
807{
808 mWriter.selectDisplay(display);
809 mWriter.selectLayer(layer);
810 mWriter.setLayerTransform(transform);
811 return Error::NONE;
812}
813
814Error Composer::setLayerVisibleRegion(Display display, Layer layer,
815 const std::vector<IComposerClient::Rect>& visible)
816{
817 mWriter.selectDisplay(display);
818 mWriter.selectLayer(layer);
819 mWriter.setLayerVisibleRegion(visible);
820 return Error::NONE;
821}
822
823Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
824{
825 mWriter.selectDisplay(display);
826 mWriter.selectLayer(layer);
827 mWriter.setLayerZOrder(z);
828 return Error::NONE;
829}
830
mamik94e91f62019-08-19 09:11:33 -0700831#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500832Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
833 uint32_t appId)
834{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800835 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500836 mWriter.selectDisplay(display);
837 mWriter.selectLayer(layer);
838 mWriter.setLayerInfo(type, appId);
839 }
840 return Error::NONE;
841}
mamik94e91f62019-08-19 09:11:33 -0700842#else
843Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) {
844 if (mIsUsingVrComposer) {
845 mWriter.selectDisplay(display);
846 mWriter.selectLayer(layer);
847 }
848 return Error::NONE;
849}
850#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500851
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800852Error Composer::execute()
853{
854 // prepare input command queue
855 bool queueChanged = false;
856 uint32_t commandLength = 0;
857 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800858 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800859 mWriter.reset();
860 return Error::NO_RESOURCES;
861 }
862
863 // set up new input command queue if necessary
864 if (queueChanged) {
865 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
866 auto error = unwrapRet(ret);
867 if (error != Error::NONE) {
868 mWriter.reset();
869 return error;
870 }
871 }
872
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700873 if (commandLength == 0) {
874 mWriter.reset();
875 return Error::NONE;
876 }
877
Chia-I Wuaab99f52016-10-05 12:59:58 +0800878 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700879 hardware::Return<void> ret;
880 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
881 const auto& tmpOutLength, const auto& tmpOutHandles)
882 {
883 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800884
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700885 // set up new output command queue if necessary
886 if (error == Error::NONE && tmpOutChanged) {
887 error = kDefaultError;
888 mClient->getOutputCommandQueue(
889 [&](const auto& tmpError,
890 const auto& tmpDescriptor)
891 {
892 error = tmpError;
893 if (error != Error::NONE) {
894 return;
895 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800896
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700897 mReader.setMQDescriptor(tmpDescriptor);
898 });
899 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800900
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700901 if (error != Error::NONE) {
902 return;
903 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800904
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700905 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
906 error = mReader.parse();
907 mReader.reset();
908 } else {
909 error = Error::NO_RESOURCES;
910 }
911 };
912 if (mClient_2_2) {
913 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
914 } else {
915 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
916 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700917 // executeCommands can fail because of out-of-fd and we do not want to
918 // abort() in that case
919 if (!ret.isOk()) {
920 ALOGE("executeCommands failed because of %s", ret.description().c_str());
921 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800922
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800923 if (error == Error::NONE) {
924 std::vector<CommandReader::CommandError> commandErrors =
925 mReader.takeErrors();
926
927 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700928 auto command =
929 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800930
931 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700932 command == IComposerClient::Command::PRESENT_DISPLAY ||
933 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800934 error = cmdErr.error;
935 } else {
936 ALOGW("command 0x%x generated error %d",
937 command, cmdErr.error);
938 }
939 }
940 }
941
942 mWriter.reset();
943
Chia-I Wuaab99f52016-10-05 12:59:58 +0800944 return error;
945}
946
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700947// Composer HAL 2.2
948
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700949Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
950 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
951 if (!mClient_2_2) {
952 return Error::UNSUPPORTED;
953 }
954
955 mWriter.selectDisplay(display);
956 mWriter.selectLayer(layer);
957 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
958 return Error::NONE;
959}
960
Chia-I Wud7e01d72018-06-21 13:39:09 +0800961std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
962 Display display) {
963 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700964 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800965 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700966 }
967
968 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800969 if (mClient_2_3) {
970 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
971 [&](const auto& tmpError, const auto& tmpKeys) {
972 error = tmpError;
973 if (error != Error::NONE) {
974 ALOGW("getPerFrameMetadataKeys failed "
975 "with %d",
976 tmpError);
977 return;
978 }
979 keys = tmpKeys;
980 });
981 } else {
982 mClient_2_2
983 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
984 error = tmpError;
985 if (error != Error::NONE) {
986 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
987 return;
988 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700989
Valerie Haue9e843a2018-12-18 13:39:23 -0800990 keys.clear();
991 for (auto key : tmpKeys) {
992 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
993 }
994 });
995 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700996
Chia-I Wud7e01d72018-06-21 13:39:09 +0800997 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700998}
999
1000Error Composer::getRenderIntents(Display display, ColorMode colorMode,
1001 std::vector<RenderIntent>* outRenderIntents) {
1002 if (!mClient_2_2) {
1003 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1004 return Error::NONE;
1005 }
1006
1007 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001008
1009 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001010 error = tmpError;
1011 if (error != Error::NONE) {
1012 return;
1013 }
1014
1015 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001016 };
1017
1018 if (mClient_2_3) {
1019 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1020 } else {
1021 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1022 getRenderIntentsLambda);
1023 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001024
1025 return error;
1026}
1027
1028Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1029{
1030 if (!mClient_2_2) {
1031 *outMatrix = mat4();
1032 return Error::NONE;
1033 }
1034
1035 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001036 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1037 [&](const auto& tmpError, const auto& tmpMatrix) {
1038 error = tmpError;
1039 if (error != Error::NONE) {
1040 return;
1041 }
1042 *outMatrix = mat4(tmpMatrix.data());
1043 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001044
1045 return error;
1046}
1047
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001048// Composer HAL 2.3
1049
1050Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1051 std::vector<uint8_t>* outData) {
1052 if (!mClient_2_3) {
1053 return Error::UNSUPPORTED;
1054 }
1055
1056 Error error = kDefaultError;
1057 mClient_2_3->getDisplayIdentificationData(display,
1058 [&](const auto& tmpError, const auto& tmpPort,
1059 const auto& tmpData) {
1060 error = tmpError;
1061 if (error != Error::NONE) {
1062 return;
1063 }
1064
1065 *outPort = tmpPort;
1066 *outData = tmpData;
1067 });
1068
1069 return error;
1070}
1071
Peiyong Lin698147a2018-09-14 13:27:18 -07001072Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1073{
1074 if (!mClient_2_3) {
1075 return Error::UNSUPPORTED;
1076 }
1077
1078 mWriter.selectDisplay(display);
1079 mWriter.selectLayer(layer);
1080 mWriter.setLayerColorTransform(matrix);
1081 return Error::NONE;
1082}
1083
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001084Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1085 Dataspace* outDataspace,
1086 uint8_t* outComponentMask) {
1087 if (!outFormat || !outDataspace || !outComponentMask) {
1088 return Error::BAD_PARAMETER;
1089 }
1090 if (!mClient_2_3) {
1091 return Error::UNSUPPORTED;
1092 }
1093 Error error = kDefaultError;
1094 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1095 [&](const auto tmpError,
1096 const auto& tmpFormat,
1097 const auto& tmpDataspace,
1098 const auto& tmpComponentMask) {
1099 error = tmpError;
1100 if (error == Error::NONE) {
1101 *outFormat = tmpFormat;
1102 *outDataspace = tmpDataspace;
1103 *outComponentMask =
1104 static_cast<uint8_t>(
1105 tmpComponentMask);
1106 }
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::setDisplayBrightness(Display display, float brightness) {
1162 if (!mClient_2_3) {
1163 return Error::UNSUPPORTED;
1164 }
1165 return mClient_2_3->setDisplayBrightness(display, brightness);
1166}
1167
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001168// Composer HAL 2.4
1169
1170Error Composer::getDisplayCapabilities(Display display,
1171 std::vector<DisplayCapability>* outCapabilities) {
1172 if (!mClient_2_3) {
1173 return Error::UNSUPPORTED;
1174 }
1175
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001176 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001177 if (mClient_2_4) {
1178 mClient_2_4->getDisplayCapabilities_2_4(display,
1179 [&](const auto& tmpError, const auto& tmpCaps) {
1180 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001181 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001182 return;
1183 }
1184 *outCapabilities = tmpCaps;
1185 });
1186 } else {
1187 mClient_2_3
1188 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001189 error = static_cast<V2_4::Error>(tmpError);
1190 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001191 return;
1192 }
1193
1194 outCapabilities->resize(tmpCaps.size());
1195 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1196 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1197 });
1198 }
1199
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001200 return static_cast<Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001201}
1202
1203Error Composer::getDisplayConnectionType(Display display,
1204 IComposerClient::DisplayConnectionType* outType) {
1205 if (!mClient_2_4) {
1206 return Error::UNSUPPORTED;
1207 }
1208
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001209 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001210 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1211 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001212 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001213 return;
1214 }
1215
1216 *outType = tmpType;
1217 });
1218
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001219 return static_cast<V2_1::Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001220}
1221
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001222CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001223{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001224 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001225}
1226
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001227Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001228{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001229 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001230
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001231 IComposerClient::Command command;
1232 uint16_t length = 0;
1233
1234 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001235 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001236 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001237 break;
1238 }
1239
1240 bool parsed = false;
1241 switch (command) {
1242 case IComposerClient::Command::SELECT_DISPLAY:
1243 parsed = parseSelectDisplay(length);
1244 break;
1245 case IComposerClient::Command::SET_ERROR:
1246 parsed = parseSetError(length);
1247 break;
1248 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1249 parsed = parseSetChangedCompositionTypes(length);
1250 break;
1251 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1252 parsed = parseSetDisplayRequests(length);
1253 break;
1254 case IComposerClient::Command::SET_PRESENT_FENCE:
1255 parsed = parseSetPresentFence(length);
1256 break;
1257 case IComposerClient::Command::SET_RELEASE_FENCES:
1258 parsed = parseSetReleaseFences(length);
1259 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001260 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1261 parsed = parseSetPresentOrValidateDisplayResult(length);
1262 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001263 default:
1264 parsed = false;
1265 break;
1266 }
1267
1268 endCommand();
1269
1270 if (!parsed) {
1271 ALOGE("failed to parse command 0x%x length %" PRIu16,
1272 command, length);
1273 break;
1274 }
1275 }
1276
1277 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001278}
1279
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001280bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001281{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001282 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001283 return false;
1284 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001285
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001286 mCurrentReturnData = &mReturnData[read64()];
1287
1288 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001289}
1290
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001291bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001292{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001293 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001294 return false;
1295 }
1296
1297 auto location = read();
1298 auto error = static_cast<Error>(readSigned());
1299
1300 mErrors.emplace_back(CommandError{location, error});
1301
1302 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001303}
1304
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001305bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001306{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001307 // (layer id, composition type) pairs
1308 if (length % 3 != 0 || !mCurrentReturnData) {
1309 return false;
1310 }
1311
1312 uint32_t count = length / 3;
1313 mCurrentReturnData->changedLayers.reserve(count);
1314 mCurrentReturnData->compositionTypes.reserve(count);
1315 while (count > 0) {
1316 auto layer = read64();
1317 auto type = static_cast<IComposerClient::Composition>(readSigned());
1318
1319 mCurrentReturnData->changedLayers.push_back(layer);
1320 mCurrentReturnData->compositionTypes.push_back(type);
1321
1322 count--;
1323 }
1324
1325 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001326}
1327
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001328bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001329{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001330 // display requests followed by (layer id, layer requests) pairs
1331 if (length % 3 != 1 || !mCurrentReturnData) {
1332 return false;
1333 }
1334
1335 mCurrentReturnData->displayRequests = read();
1336
1337 uint32_t count = (length - 1) / 3;
1338 mCurrentReturnData->requestedLayers.reserve(count);
1339 mCurrentReturnData->requestMasks.reserve(count);
1340 while (count > 0) {
1341 auto layer = read64();
1342 auto layerRequestMask = read();
1343
1344 mCurrentReturnData->requestedLayers.push_back(layer);
1345 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1346
1347 count--;
1348 }
1349
1350 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001351}
1352
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001353bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001354{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001355 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001356 !mCurrentReturnData) {
1357 return false;
1358 }
1359
1360 if (mCurrentReturnData->presentFence >= 0) {
1361 close(mCurrentReturnData->presentFence);
1362 }
1363 mCurrentReturnData->presentFence = readFence();
1364
1365 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001366}
1367
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001368bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001369{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001370 // (layer id, release fence index) pairs
1371 if (length % 3 != 0 || !mCurrentReturnData) {
1372 return false;
1373 }
1374
1375 uint32_t count = length / 3;
1376 mCurrentReturnData->releasedLayers.reserve(count);
1377 mCurrentReturnData->releaseFences.reserve(count);
1378 while (count > 0) {
1379 auto layer = read64();
1380 auto fence = readFence();
1381
1382 mCurrentReturnData->releasedLayers.push_back(layer);
1383 mCurrentReturnData->releaseFences.push_back(fence);
1384
1385 count--;
1386 }
1387
1388 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001389}
1390
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001391bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1392{
1393 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1394 return false;
1395 }
1396 mCurrentReturnData->presentOrValidateState = read();
1397 return true;
1398}
1399
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001400void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001401{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001402 mErrors.clear();
1403
1404 for (auto& data : mReturnData) {
1405 if (data.second.presentFence >= 0) {
1406 close(data.second.presentFence);
1407 }
1408 for (auto fence : data.second.releaseFences) {
1409 if (fence >= 0) {
1410 close(fence);
1411 }
1412 }
1413 }
1414
1415 mReturnData.clear();
1416 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001417}
1418
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001419std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001420{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001421 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001422}
1423
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001424bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001425 uint32_t* outNumChangedCompositionTypes,
1426 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001427{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001428 auto found = mReturnData.find(display);
1429 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001430 *outNumChangedCompositionTypes = 0;
1431 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001432 return false;
1433 }
1434
1435 const ReturnData& data = found->second;
1436
Chia-I Wu67e376d2016-12-19 11:36:22 +08001437 *outNumChangedCompositionTypes = data.compositionTypes.size();
1438 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001439
1440 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001441}
1442
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001443void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001444 std::vector<Layer>* outLayers,
1445 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001446{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001447 auto found = mReturnData.find(display);
1448 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001449 outLayers->clear();
1450 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001451 return;
1452 }
1453
1454 ReturnData& data = found->second;
1455
Chia-I Wu67e376d2016-12-19 11:36:22 +08001456 *outLayers = std::move(data.changedLayers);
1457 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001458}
1459
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001460void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001461 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1462 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001463{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001464 auto found = mReturnData.find(display);
1465 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001466 *outDisplayRequestMask = 0;
1467 outLayers->clear();
1468 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001469 return;
1470 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001471
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001472 ReturnData& data = found->second;
1473
Chia-I Wu67e376d2016-12-19 11:36:22 +08001474 *outDisplayRequestMask = data.displayRequests;
1475 *outLayers = std::move(data.requestedLayers);
1476 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001477}
1478
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001479void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001480 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001481{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001482 auto found = mReturnData.find(display);
1483 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001484 outLayers->clear();
1485 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001486 return;
1487 }
1488
1489 ReturnData& data = found->second;
1490
Chia-I Wu67e376d2016-12-19 11:36:22 +08001491 *outLayers = std::move(data.releasedLayers);
1492 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001493}
1494
Chia-I Wu67e376d2016-12-19 11:36:22 +08001495void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001496{
1497 auto found = mReturnData.find(display);
1498 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001499 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001500 return;
1501 }
1502
1503 ReturnData& data = found->second;
1504
Chia-I Wu67e376d2016-12-19 11:36:22 +08001505 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001506 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001507}
1508
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001509void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1510 auto found = mReturnData.find(display);
1511 if (found == mReturnData.end()) {
1512 *state= -1;
1513 return;
1514 }
1515 ReturnData& data = found->second;
1516 *state = data.presentOrValidateState;
1517}
1518
Lloyd Piquea822d522017-12-20 16:42:57 -08001519} // namespace impl
1520
Chia-I Wuaab99f52016-10-05 12:59:58 +08001521} // namespace Hwc2
1522
1523} // namespace android