blob: fd7098869d2cc49ca2c4e63a50fa600a719051d5 [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
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
Chia-I Wuaab99f52016-10-05 12:59:58 +080021#undef LOG_TAG
22#define LOG_TAG "HwcComposer"
Midas Chien243b6452021-03-30 19:55:12 +080023#define ATRACE_TAG ATRACE_TAG_GRAPHICS
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -070024
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>
Midas Chien243b6452021-03-30 19:55:12 +080031#include <log/log.h>
32#include <utils/Trace.h>
33
34#include <algorithm>
35#include <cinttypes>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070036
Chia-I Wuaab99f52016-10-05 12:59:58 +080037namespace android {
38
39using hardware::Return;
40using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010041using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080042
43namespace Hwc2 {
44
Lloyd Piquea822d522017-12-20 16:42:57 -080045Composer::~Composer() = default;
46
Chia-I Wuaab99f52016-10-05 12:59:58 +080047namespace {
48
49class BufferHandle {
50public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080051 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080052 // nullptr is not a valid handle to HIDL
53 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
54 }
55
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080056 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080057 {
58 return mHandle;
59 }
60
61private:
62 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010063 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080064};
65
66class FenceHandle
67{
68public:
69 FenceHandle(int fd, bool owned)
70 : mOwned(owned)
71 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010072 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080073 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010074 handle = native_handle_init(mStorage, 1, 0);
75 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080076 } else {
77 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010078 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080079 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010080 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080081 }
82
83 ~FenceHandle()
84 {
85 if (mOwned) {
86 native_handle_close(mHandle);
87 }
88 }
89
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080090 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080091 {
92 return mHandle;
93 }
94
95private:
96 bool mOwned;
97 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010098 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080099};
100
101// assume NO_RESOURCES when Status::isOk returns false
102constexpr Error kDefaultError = Error::NO_RESOURCES;
Ady Abraham7159f572019-10-11 11:10:18 -0700103constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800104
105template<typename T, typename U>
106T unwrapRet(Return<T>& ret, const U& default_val)
107{
Steven Moreland9d021002017-01-03 17:10:54 -0800108 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800109 static_cast<T>(default_val);
110}
111
112Error unwrapRet(Return<Error>& ret)
113{
114 return unwrapRet(ret, kDefaultError);
115}
116
Chia-I Wuaab99f52016-10-05 12:59:58 +0800117} // anonymous namespace
118
Lloyd Piquea822d522017-12-20 16:42:57 -0800119namespace impl {
120
Alec Mouri9c58bcd2020-09-09 18:57:07 -0700121Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700122 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500123
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800124 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800125 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
126 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800127
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700128 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
129 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -0700130 if (tmpError == V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700131 mClient = tmpClient;
132 mClient_2_2 = tmpClient;
133 mClient_2_3 = tmpClient;
134 mClient_2_4 = tmpClient;
135 }
136 });
137 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700138 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
139 if (tmpError == Error::NONE) {
140 mClient = tmpClient;
141 mClient_2_2 = tmpClient;
142 mClient_2_3 = tmpClient;
143 }
144 });
145 } else {
146 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
147 if (tmpError != Error::NONE) {
148 return;
149 }
150
151 mClient = tmpClient;
152 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
153 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
154 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
155 "IComposer 2.2 did not return IComposerClient 2.2");
156 }
157 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800158 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400159
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700160 if (mClient == nullptr) {
161 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700162 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800163}
164
Lloyd Piquea822d522017-12-20 16:42:57 -0800165Composer::~Composer() = default;
166
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800167std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800168{
169 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800170 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800171 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800172 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800173 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800174 return capabilities;
175}
176
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800177std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800178{
179 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800180 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800181 info = tmpInfo.c_str();
182 });
183
184 return info;
185}
186
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800187void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800188{
Wei Wangae211b42019-06-07 17:22:49 -0700189 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Ady Abraham7159f572019-10-11 11:10:18 -0700190 auto ret = [&]() {
191 if (mClient_2_4) {
192 return mClient_2_4->registerCallback_2_4(callback);
193 }
194 return mClient->registerCallback(callback);
195 }();
Steven Moreland9d021002017-01-03 17:10:54 -0800196 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800197 ALOGE("failed to register IComposerCallback");
198 }
199}
200
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700201void Composer::resetCommands() {
202 mWriter.reset();
203}
204
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700205Error Composer::executeCommands() {
206 return execute();
207}
208
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800209uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800210{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800211 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800212 return unwrapRet(ret, 0);
213}
214
215Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800216 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800217{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800218 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800219 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700220 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800221 mClient_2_2->createVirtualDisplay_2_2(width, height,
222 static_cast<types::V1_1::PixelFormat>(*format),
223 bufferSlotCount,
224 [&](const auto& tmpError, const auto& tmpDisplay,
225 const auto& tmpFormat) {
226 error = tmpError;
227 if (error != Error::NONE) {
228 return;
229 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800230
Kevin DuBois73d0f482019-01-25 11:18:03 -0800231 *outDisplay = tmpDisplay;
232 *format = static_cast<types::V1_2::PixelFormat>(
233 tmpFormat);
234 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700235 } else {
236 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700237 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700238 [&](const auto& tmpError, const auto& tmpDisplay,
239 const auto& tmpFormat) {
240 error = tmpError;
241 if (error != Error::NONE) {
242 return;
243 }
244
245 *outDisplay = tmpDisplay;
246 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800247 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700248 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800249
250 return error;
251}
252
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800253Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800254{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800255 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800256 return unwrapRet(ret);
257}
258
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800259Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800260{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800261 mWriter.selectDisplay(display);
262 mWriter.acceptDisplayChanges();
263 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800264}
265
Chia-I Wu67e376d2016-12-19 11:36:22 +0800266Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800267{
268 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800269 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800270 [&](const auto& tmpError, const auto& tmpLayer) {
271 error = tmpError;
272 if (error != Error::NONE) {
273 return;
274 }
275
Chia-I Wu67e376d2016-12-19 11:36:22 +0800276 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277 });
278
279 return error;
280}
281
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800282Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800283{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800284 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800285 return unwrapRet(ret);
286}
287
Chia-I Wu67e376d2016-12-19 11:36:22 +0800288Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800289{
290 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800291 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800292 [&](const auto& tmpError, const auto& tmpConfig) {
293 error = tmpError;
294 if (error != Error::NONE) {
295 return;
296 }
297
Chia-I Wu67e376d2016-12-19 11:36:22 +0800298 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800299 });
300
301 return error;
302}
303
304Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800305 std::vector<Layer>* outLayers,
306 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800307{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800308 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800309 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800310}
311
312Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800313 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800314{
315 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316
Valerie Hau9758ae02018-10-09 16:05:09 -0700317 if (mClient_2_3) {
318 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
319 error = tmpError;
320 if (error != Error::NONE) {
321 return;
322 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700323
Valerie Hau9758ae02018-10-09 16:05:09 -0700324 *outModes = tmpModes;
325 });
326 } else if (mClient_2_2) {
327 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
328 error = tmpError;
329 if (error != Error::NONE) {
330 return;
331 }
332
333 for (types::V1_1::ColorMode colorMode : tmpModes) {
334 outModes->push_back(static_cast<ColorMode>(colorMode));
335 }
336 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700337 } else {
338 mClient->getColorModes(display,
339 [&](const auto& tmpError, const auto& tmpModes) {
340 error = tmpError;
341 if (error != Error::NONE) {
342 return;
343 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700344 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700345 outModes->push_back(static_cast<ColorMode>(colorMode));
346 }
347 });
348 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800349
350 return error;
351}
352
353Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800354 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355{
356 Error error = kDefaultError;
Ady Abraham7159f572019-10-11 11:10:18 -0700357 if (mClient_2_4) {
358 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
359 [&](const auto& tmpError, const auto& tmpValue) {
360 error = static_cast<Error>(tmpError);
361 if (error != Error::NONE) {
362 return;
363 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800364
Ady Abraham7159f572019-10-11 11:10:18 -0700365 *outValue = tmpValue;
366 });
367 } else {
368 mClient->getDisplayAttribute(display, config,
369 static_cast<V2_1::IComposerClient::Attribute>(attribute),
370 [&](const auto& tmpError, const auto& tmpValue) {
371 error = tmpError;
372 if (error != Error::NONE) {
373 return;
374 }
375
376 *outValue = tmpValue;
377 });
378 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800379
380 return error;
381}
382
383Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800384 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385{
386 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800387 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388 [&](const auto& tmpError, const auto& tmpConfigs) {
389 error = tmpError;
390 if (error != Error::NONE) {
391 return;
392 }
393
Chia-I Wu67e376d2016-12-19 11:36:22 +0800394 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395 });
396
397 return error;
398}
399
Chia-I Wu67e376d2016-12-19 11:36:22 +0800400Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800401{
402 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800403 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 [&](const auto& tmpError, const auto& tmpName) {
405 error = tmpError;
406 if (error != Error::NONE) {
407 return;
408 }
409
Chia-I Wu67e376d2016-12-19 11:36:22 +0800410 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800411 });
412
413 return error;
414}
415
416Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800417 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
418 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800420 mReader.takeDisplayRequests(display, outDisplayRequestMask,
421 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800422 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423}
424
Chia-I Wu67e376d2016-12-19 11:36:22 +0800425Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800426{
427 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800428 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800429 [&](const auto& tmpError, const auto& tmpSupport) {
430 error = tmpError;
431 if (error != Error::NONE) {
432 return;
433 }
434
Chia-I Wu67e376d2016-12-19 11:36:22 +0800435 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800436 });
437
438 return error;
439}
440
Chia-I Wu67e376d2016-12-19 11:36:22 +0800441Error Composer::getHdrCapabilities(Display display,
442 std::vector<Hdr>* outTypes, float* outMaxLuminance,
443 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800444{
445 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800446 if (mClient_2_3) {
447 mClient_2_3->getHdrCapabilities_2_3(display,
448 [&](const auto& tmpError, const auto& tmpTypes,
449 const auto& tmpMaxLuminance,
450 const auto& tmpMaxAverageLuminance,
451 const auto& tmpMinLuminance) {
452 error = tmpError;
453 if (error != Error::NONE) {
454 return;
455 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456
Valerie Haue9e843a2018-12-18 13:39:23 -0800457 *outTypes = tmpTypes;
458 *outMaxLuminance = tmpMaxLuminance;
459 *outMaxAverageLuminance = tmpMaxAverageLuminance;
460 *outMinLuminance = tmpMinLuminance;
461 });
462 } else {
463 mClient->getHdrCapabilities(display,
464 [&](const auto& tmpError, const auto& tmpTypes,
465 const auto& tmpMaxLuminance,
466 const auto& tmpMaxAverageLuminance,
467 const auto& tmpMinLuminance) {
468 error = tmpError;
469 if (error != Error::NONE) {
470 return;
471 }
472
473 outTypes->clear();
474 for (auto type : tmpTypes) {
475 outTypes->push_back(static_cast<Hdr>(type));
476 }
477
478 *outMaxLuminance = tmpMaxLuminance;
479 *outMaxAverageLuminance = tmpMaxAverageLuminance;
480 *outMinLuminance = tmpMinLuminance;
481 });
482 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800483
484 return error;
485}
486
Chia-I Wu67e376d2016-12-19 11:36:22 +0800487Error Composer::getReleaseFences(Display display,
488 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800489{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800490 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800491 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800492}
493
Chia-I Wu67e376d2016-12-19 11:36:22 +0800494Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800495{
Midas Chien243b6452021-03-30 19:55:12 +0800496 ATRACE_NAME("HwcPresentDisplay");
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800497 mWriter.selectDisplay(display);
498 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800499
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800500 Error error = execute();
501 if (error != Error::NONE) {
502 return error;
503 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504
Chia-I Wu67e376d2016-12-19 11:36:22 +0800505 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800506
507 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800508}
509
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800510Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800511{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800512 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800513 return unwrapRet(ret);
514}
515
Chia-I Wu06d63de2017-01-04 14:58:51 +0800516Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400517 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800518 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800519 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800520{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800521 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700522
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400523 const native_handle_t* handle = nullptr;
524 if (target.get()) {
525 handle = target->getNativeBuffer()->handle;
526 }
527
528 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800529 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800530}
531
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700532Error Composer::setColorMode(Display display, ColorMode mode,
533 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700535 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700536 if (mClient_2_3) {
537 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
538 } else if (mClient_2_2) {
539 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
540 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700541 } else {
542 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700543 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700544 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800545 return unwrapRet(ret);
546}
547
548Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800549 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800550{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800551 mWriter.selectDisplay(display);
552 mWriter.setColorTransform(matrix, hint);
553 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800554}
555
556Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800557 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800558{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800559 mWriter.selectDisplay(display);
560 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
561 return Error::NONE;
562}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700564Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
565 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700566 if (mClient_2_2) {
567 ret = mClient_2_2->setPowerMode_2_2(display, mode);
568 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700569 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700570 }
571
Chia-I Wuaab99f52016-10-05 12:59:58 +0800572 return unwrapRet(ret);
573}
574
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800575Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800576{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800577 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800578 return unwrapRet(ret);
579}
580
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800581Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800582{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800583 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800584 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800585 return unwrapRet(ret);
586}
587
Chia-I Wu67e376d2016-12-19 11:36:22 +0800588Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
589 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800590{
Midas Chien243b6452021-03-30 19:55:12 +0800591 ATRACE_NAME("HwcValidateDisplay");
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800592 mWriter.selectDisplay(display);
593 mWriter.validateDisplay();
594
595 Error error = execute();
596 if (error != Error::NONE) {
597 return error;
598 }
599
Chia-I Wu67e376d2016-12-19 11:36:22 +0800600 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800601
602 return Error::NONE;
603}
604
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700605Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
606 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
Midas Chien243b6452021-03-30 19:55:12 +0800607 ATRACE_NAME("HwcPresentOrValidateDisplay");
608 mWriter.selectDisplay(display);
609 mWriter.presentOrvalidateDisplay();
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700610
Midas Chien243b6452021-03-30 19:55:12 +0800611 Error error = execute();
612 if (error != Error::NONE) {
613 return error;
614 }
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700615
616 mReader.takePresentOrValidateStage(display, state);
617
618 if (*state == 1) { // Present succeeded
619 mReader.takePresentFence(display, outPresentFence);
620 }
621
622 if (*state == 0) { // Validate succeeded.
623 mReader.hasChanges(display, outNumTypes, outNumRequests);
624 }
625
626 return Error::NONE;
627}
628
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800629Error Composer::setCursorPosition(Display display, Layer layer,
630 int32_t x, int32_t y)
631{
632 mWriter.selectDisplay(display);
633 mWriter.selectLayer(layer);
634 mWriter.setLayerCursorPosition(x, y);
635 return Error::NONE;
636}
637
638Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400639 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800640{
641 mWriter.selectDisplay(display);
642 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700643
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400644 const native_handle_t* handle = nullptr;
645 if (buffer.get()) {
646 handle = buffer->getNativeBuffer()->handle;
647 }
648
649 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800650 return Error::NONE;
651}
652
653Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
654 const std::vector<IComposerClient::Rect>& damage)
655{
656 mWriter.selectDisplay(display);
657 mWriter.selectLayer(layer);
658 mWriter.setLayerSurfaceDamage(damage);
659 return Error::NONE;
660}
661
662Error Composer::setLayerBlendMode(Display display, Layer layer,
663 IComposerClient::BlendMode mode)
664{
665 mWriter.selectDisplay(display);
666 mWriter.selectLayer(layer);
667 mWriter.setLayerBlendMode(mode);
668 return Error::NONE;
669}
670
671Error Composer::setLayerColor(Display display, Layer layer,
672 const IComposerClient::Color& color)
673{
674 mWriter.selectDisplay(display);
675 mWriter.selectLayer(layer);
676 mWriter.setLayerColor(color);
677 return Error::NONE;
678}
679
680Error Composer::setLayerCompositionType(Display display, Layer layer,
681 IComposerClient::Composition type)
682{
683 mWriter.selectDisplay(display);
684 mWriter.selectLayer(layer);
685 mWriter.setLayerCompositionType(type);
686 return Error::NONE;
687}
688
689Error Composer::setLayerDataspace(Display display, Layer layer,
690 Dataspace dataspace)
691{
692 mWriter.selectDisplay(display);
693 mWriter.selectLayer(layer);
694 mWriter.setLayerDataspace(dataspace);
695 return Error::NONE;
696}
697
698Error Composer::setLayerDisplayFrame(Display display, Layer layer,
699 const IComposerClient::Rect& frame)
700{
701 mWriter.selectDisplay(display);
702 mWriter.selectLayer(layer);
703 mWriter.setLayerDisplayFrame(frame);
704 return Error::NONE;
705}
706
707Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
708 float alpha)
709{
710 mWriter.selectDisplay(display);
711 mWriter.selectLayer(layer);
712 mWriter.setLayerPlaneAlpha(alpha);
713 return Error::NONE;
714}
715
716Error Composer::setLayerSidebandStream(Display display, Layer layer,
717 const native_handle_t* stream)
718{
719 mWriter.selectDisplay(display);
720 mWriter.selectLayer(layer);
721 mWriter.setLayerSidebandStream(stream);
722 return Error::NONE;
723}
724
725Error Composer::setLayerSourceCrop(Display display, Layer layer,
726 const IComposerClient::FRect& crop)
727{
728 mWriter.selectDisplay(display);
729 mWriter.selectLayer(layer);
730 mWriter.setLayerSourceCrop(crop);
731 return Error::NONE;
732}
733
734Error Composer::setLayerTransform(Display display, Layer layer,
735 Transform transform)
736{
737 mWriter.selectDisplay(display);
738 mWriter.selectLayer(layer);
739 mWriter.setLayerTransform(transform);
740 return Error::NONE;
741}
742
743Error Composer::setLayerVisibleRegion(Display display, Layer layer,
744 const std::vector<IComposerClient::Rect>& visible)
745{
746 mWriter.selectDisplay(display);
747 mWriter.selectLayer(layer);
748 mWriter.setLayerVisibleRegion(visible);
749 return Error::NONE;
750}
751
752Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
753{
754 mWriter.selectDisplay(display);
755 mWriter.selectLayer(layer);
756 mWriter.setLayerZOrder(z);
757 return Error::NONE;
758}
759
760Error Composer::execute()
761{
762 // prepare input command queue
763 bool queueChanged = false;
764 uint32_t commandLength = 0;
765 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800766 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800767 mWriter.reset();
768 return Error::NO_RESOURCES;
769 }
770
771 // set up new input command queue if necessary
772 if (queueChanged) {
773 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
774 auto error = unwrapRet(ret);
775 if (error != Error::NONE) {
776 mWriter.reset();
777 return error;
778 }
779 }
780
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700781 if (commandLength == 0) {
782 mWriter.reset();
783 return Error::NONE;
784 }
785
Chia-I Wuaab99f52016-10-05 12:59:58 +0800786 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700787 hardware::Return<void> ret;
788 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
789 const auto& tmpOutLength, const auto& tmpOutHandles)
790 {
791 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800792
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700793 // set up new output command queue if necessary
794 if (error == Error::NONE && tmpOutChanged) {
795 error = kDefaultError;
796 mClient->getOutputCommandQueue(
797 [&](const auto& tmpError,
798 const auto& tmpDescriptor)
799 {
800 error = tmpError;
801 if (error != Error::NONE) {
802 return;
803 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800804
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700805 mReader.setMQDescriptor(tmpDescriptor);
806 });
807 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800808
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700809 if (error != Error::NONE) {
810 return;
811 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800812
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700813 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
814 error = mReader.parse();
815 mReader.reset();
816 } else {
817 error = Error::NO_RESOURCES;
818 }
819 };
820 if (mClient_2_2) {
821 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
822 } else {
823 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
824 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700825 // executeCommands can fail because of out-of-fd and we do not want to
826 // abort() in that case
827 if (!ret.isOk()) {
828 ALOGE("executeCommands failed because of %s", ret.description().c_str());
829 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800830
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800831 if (error == Error::NONE) {
832 std::vector<CommandReader::CommandError> commandErrors =
833 mReader.takeErrors();
834
835 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700836 auto command =
837 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800838
839 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700840 command == IComposerClient::Command::PRESENT_DISPLAY ||
841 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800842 error = cmdErr.error;
843 } else {
844 ALOGW("command 0x%x generated error %d",
845 command, cmdErr.error);
846 }
847 }
848 }
849
850 mWriter.reset();
851
Chia-I Wuaab99f52016-10-05 12:59:58 +0800852 return error;
853}
854
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700855// Composer HAL 2.2
856
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700857Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
858 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
859 if (!mClient_2_2) {
860 return Error::UNSUPPORTED;
861 }
862
863 mWriter.selectDisplay(display);
864 mWriter.selectLayer(layer);
865 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
866 return Error::NONE;
867}
868
Chia-I Wud7e01d72018-06-21 13:39:09 +0800869std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
870 Display display) {
871 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700872 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800873 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700874 }
875
876 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800877 if (mClient_2_3) {
878 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
879 [&](const auto& tmpError, const auto& tmpKeys) {
880 error = tmpError;
881 if (error != Error::NONE) {
882 ALOGW("getPerFrameMetadataKeys failed "
883 "with %d",
884 tmpError);
885 return;
886 }
887 keys = tmpKeys;
888 });
889 } else {
890 mClient_2_2
891 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
892 error = tmpError;
893 if (error != Error::NONE) {
894 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
895 return;
896 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700897
Valerie Haue9e843a2018-12-18 13:39:23 -0800898 keys.clear();
899 for (auto key : tmpKeys) {
900 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
901 }
902 });
903 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700904
Chia-I Wud7e01d72018-06-21 13:39:09 +0800905 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700906}
907
908Error Composer::getRenderIntents(Display display, ColorMode colorMode,
909 std::vector<RenderIntent>* outRenderIntents) {
910 if (!mClient_2_2) {
911 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
912 return Error::NONE;
913 }
914
915 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700916
917 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700918 error = tmpError;
919 if (error != Error::NONE) {
920 return;
921 }
922
923 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -0700924 };
925
926 if (mClient_2_3) {
927 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
928 } else {
929 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
930 getRenderIntentsLambda);
931 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700932
933 return error;
934}
935
936Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
937{
938 if (!mClient_2_2) {
939 *outMatrix = mat4();
940 return Error::NONE;
941 }
942
943 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700944 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
945 [&](const auto& tmpError, const auto& tmpMatrix) {
946 error = tmpError;
947 if (error != Error::NONE) {
948 return;
949 }
950 *outMatrix = mat4(tmpMatrix.data());
951 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700952
953 return error;
954}
955
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700956// Composer HAL 2.3
957
958Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
959 std::vector<uint8_t>* outData) {
960 if (!mClient_2_3) {
961 return Error::UNSUPPORTED;
962 }
963
964 Error error = kDefaultError;
965 mClient_2_3->getDisplayIdentificationData(display,
966 [&](const auto& tmpError, const auto& tmpPort,
967 const auto& tmpData) {
968 error = tmpError;
969 if (error != Error::NONE) {
970 return;
971 }
972
973 *outPort = tmpPort;
974 *outData = tmpData;
975 });
976
977 return error;
978}
979
Peiyong Lin698147a2018-09-14 13:27:18 -0700980Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
981{
982 if (!mClient_2_3) {
983 return Error::UNSUPPORTED;
984 }
985
986 mWriter.selectDisplay(display);
987 mWriter.selectLayer(layer);
988 mWriter.setLayerColorTransform(matrix);
989 return Error::NONE;
990}
991
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700992Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
993 Dataspace* outDataspace,
994 uint8_t* outComponentMask) {
995 if (!outFormat || !outDataspace || !outComponentMask) {
996 return Error::BAD_PARAMETER;
997 }
998 if (!mClient_2_3) {
999 return Error::UNSUPPORTED;
1000 }
1001 Error error = kDefaultError;
1002 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1003 [&](const auto tmpError,
1004 const auto& tmpFormat,
1005 const auto& tmpDataspace,
1006 const auto& tmpComponentMask) {
1007 error = tmpError;
1008 if (error == Error::NONE) {
1009 *outFormat = tmpFormat;
1010 *outDataspace = tmpDataspace;
1011 *outComponentMask =
1012 static_cast<uint8_t>(
1013 tmpComponentMask);
1014 }
1015 });
1016 return error;
1017}
1018
Kevin DuBois74e53772018-11-19 10:52:38 -08001019Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1020 uint8_t componentMask, uint64_t maxFrames) {
1021 if (!mClient_2_3) {
1022 return Error::UNSUPPORTED;
1023 }
1024
1025 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1026 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1027 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1028 maxFrames);
1029}
1030
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001031Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1032 DisplayedFrameStats* outStats) {
1033 if (!outStats) {
1034 return Error::BAD_PARAMETER;
1035 }
1036 if (!mClient_2_3) {
1037 return Error::UNSUPPORTED;
1038 }
1039 Error error = kDefaultError;
1040 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1041 [&](const auto tmpError, auto tmpNumFrames,
1042 const auto& tmpSamples0, const auto& tmpSamples1,
1043 const auto& tmpSamples2, const auto& tmpSamples3) {
1044 error = tmpError;
1045 if (error == Error::NONE) {
1046 outStats->numFrames = tmpNumFrames;
1047 outStats->component_0_sample = tmpSamples0;
1048 outStats->component_1_sample = tmpSamples1;
1049 outStats->component_2_sample = tmpSamples2;
1050 outStats->component_3_sample = tmpSamples3;
1051 }
1052 });
1053 return error;
1054}
1055
Valerie Haue9e843a2018-12-18 13:39:23 -08001056Error Composer::setLayerPerFrameMetadataBlobs(
1057 Display display, Layer layer,
1058 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1059 if (!mClient_2_3) {
1060 return Error::UNSUPPORTED;
1061 }
1062
1063 mWriter.selectDisplay(display);
1064 mWriter.selectLayer(layer);
1065 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1066 return Error::NONE;
1067}
1068
Dan Gittik57e63c52019-01-18 16:37:54 +00001069Error Composer::setDisplayBrightness(Display display, float brightness) {
1070 if (!mClient_2_3) {
1071 return Error::UNSUPPORTED;
1072 }
1073 return mClient_2_3->setDisplayBrightness(display, brightness);
1074}
1075
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001076// Composer HAL 2.4
1077
1078Error Composer::getDisplayCapabilities(Display display,
1079 std::vector<DisplayCapability>* outCapabilities) {
1080 if (!mClient_2_3) {
1081 return Error::UNSUPPORTED;
1082 }
1083
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001084 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001085 if (mClient_2_4) {
1086 mClient_2_4->getDisplayCapabilities_2_4(display,
1087 [&](const auto& tmpError, const auto& tmpCaps) {
1088 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001089 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001090 return;
1091 }
1092 *outCapabilities = tmpCaps;
1093 });
1094 } else {
1095 mClient_2_3
1096 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001097 error = static_cast<V2_4::Error>(tmpError);
1098 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001099 return;
1100 }
1101
1102 outCapabilities->resize(tmpCaps.size());
1103 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1104 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1105 });
1106 }
1107
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001108 return static_cast<Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001109}
1110
Ady Abraham7159f572019-10-11 11:10:18 -07001111V2_4::Error Composer::getDisplayConnectionType(Display display,
1112 IComposerClient::DisplayConnectionType* outType) {
1113 using Error = V2_4::Error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001114 if (!mClient_2_4) {
1115 return Error::UNSUPPORTED;
1116 }
1117
Ady Abraham7159f572019-10-11 11:10:18 -07001118 Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001119 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1120 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001121 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001122 return;
1123 }
1124
1125 *outType = tmpType;
1126 });
1127
Ady Abraham7159f572019-10-11 11:10:18 -07001128 return error;
1129}
1130
1131V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1132 using Error = V2_4::Error;
1133 if (!mClient_2_4) {
1134 return Error::UNSUPPORTED;
1135 }
1136
1137 Error error = kDefaultError_2_4;
1138 mClient_2_4->getDisplayVsyncPeriod(display,
1139 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1140 error = tmpError;
1141 if (error != Error::NONE) {
1142 return;
1143 }
1144
1145 *outVsyncPeriod = tmpVsyncPeriod;
1146 });
1147
1148 return error;
1149}
1150
1151V2_4::Error Composer::setActiveConfigWithConstraints(
1152 Display display, Config config,
1153 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1154 VsyncPeriodChangeTimeline* outTimeline) {
1155 using Error = V2_4::Error;
1156 if (!mClient_2_4) {
1157 return Error::UNSUPPORTED;
1158 }
1159
1160 Error error = kDefaultError_2_4;
1161 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1162 [&](const auto& tmpError, const auto& tmpTimeline) {
1163 error = tmpError;
1164 if (error != Error::NONE) {
1165 return;
1166 }
1167
1168 *outTimeline = tmpTimeline;
1169 });
1170
1171 return error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001172}
1173
Galia Peycheva5492cb52019-10-30 14:13:16 +01001174V2_4::Error Composer::setAutoLowLatencyMode(Display display, bool on) {
1175 using Error = V2_4::Error;
1176 if (!mClient_2_4) {
1177 return Error::UNSUPPORTED;
1178 }
1179
1180 return mClient_2_4->setAutoLowLatencyMode(display, on);
1181}
1182
1183V2_4::Error Composer::getSupportedContentTypes(
1184 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1185 using Error = V2_4::Error;
1186 if (!mClient_2_4) {
1187 return Error::UNSUPPORTED;
1188 }
1189
1190 Error error = kDefaultError_2_4;
1191 mClient_2_4->getSupportedContentTypes(displayId,
1192 [&](const auto& tmpError,
1193 const auto& tmpSupportedContentTypes) {
1194 error = tmpError;
1195 if (error != Error::NONE) {
1196 return;
1197 }
1198
1199 *outSupportedContentTypes = tmpSupportedContentTypes;
1200 });
1201 return error;
1202}
1203
1204V2_4::Error Composer::setContentType(Display display, IComposerClient::ContentType contentType) {
1205 using Error = V2_4::Error;
1206 if (!mClient_2_4) {
1207 return Error::UNSUPPORTED;
1208 }
1209
1210 return mClient_2_4->setContentType(display, contentType);
1211}
1212
Dan Stoza18d48cb2019-10-21 15:39:24 -07001213V2_4::Error Composer::setLayerGenericMetadata(Display display, Layer layer, const std::string& key,
1214 bool mandatory, const std::vector<uint8_t>& value) {
1215 using Error = V2_4::Error;
1216 if (!mClient_2_4) {
1217 return Error::UNSUPPORTED;
1218 }
1219 mWriter.selectDisplay(display);
1220 mWriter.selectLayer(layer);
1221 mWriter.setLayerGenericMetadata(key, mandatory, value);
1222 return Error::NONE;
1223}
1224
1225V2_4::Error Composer::getLayerGenericMetadataKeys(
1226 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1227 using Error = V2_4::Error;
1228 if (!mClient_2_4) {
1229 return Error::UNSUPPORTED;
1230 }
1231 Error error = kDefaultError_2_4;
1232 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1233 error = tmpError;
1234 if (error != Error::NONE) {
1235 return;
1236 }
1237
1238 *outKeys = tmpKeys;
1239 });
1240 return error;
1241}
1242
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001243Error Composer::getClientTargetProperty(
1244 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1245 mReader.takeClientTargetProperty(display, outClientTargetProperty);
1246 return Error::NONE;
1247}
1248
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001249CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001250{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001251 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001252}
1253
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001254Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001255{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001256 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001257
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001258 IComposerClient::Command command;
1259 uint16_t length = 0;
1260
1261 while (!isEmpty()) {
Peiyong Linafa0f572020-01-13 16:35:02 -08001262 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001263 break;
1264 }
1265
1266 bool parsed = false;
1267 switch (command) {
1268 case IComposerClient::Command::SELECT_DISPLAY:
1269 parsed = parseSelectDisplay(length);
1270 break;
1271 case IComposerClient::Command::SET_ERROR:
1272 parsed = parseSetError(length);
1273 break;
1274 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1275 parsed = parseSetChangedCompositionTypes(length);
1276 break;
1277 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1278 parsed = parseSetDisplayRequests(length);
1279 break;
1280 case IComposerClient::Command::SET_PRESENT_FENCE:
1281 parsed = parseSetPresentFence(length);
1282 break;
1283 case IComposerClient::Command::SET_RELEASE_FENCES:
1284 parsed = parseSetReleaseFences(length);
1285 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001286 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1287 parsed = parseSetPresentOrValidateDisplayResult(length);
1288 break;
Peiyong Linafa0f572020-01-13 16:35:02 -08001289 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1290 parsed = parseSetClientTargetProperty(length);
1291 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001292 default:
1293 parsed = false;
1294 break;
1295 }
1296
1297 endCommand();
1298
1299 if (!parsed) {
1300 ALOGE("failed to parse command 0x%x length %" PRIu16,
1301 command, length);
1302 break;
1303 }
1304 }
1305
1306 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001307}
1308
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001309bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001310{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001311 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001312 return false;
1313 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001314
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001315 mCurrentReturnData = &mReturnData[read64()];
1316
1317 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001318}
1319
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001320bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001321{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001322 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001323 return false;
1324 }
1325
1326 auto location = read();
1327 auto error = static_cast<Error>(readSigned());
1328
1329 mErrors.emplace_back(CommandError{location, error});
1330
1331 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001332}
1333
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001334bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001335{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001336 // (layer id, composition type) pairs
1337 if (length % 3 != 0 || !mCurrentReturnData) {
1338 return false;
1339 }
1340
1341 uint32_t count = length / 3;
1342 mCurrentReturnData->changedLayers.reserve(count);
1343 mCurrentReturnData->compositionTypes.reserve(count);
1344 while (count > 0) {
1345 auto layer = read64();
1346 auto type = static_cast<IComposerClient::Composition>(readSigned());
1347
1348 mCurrentReturnData->changedLayers.push_back(layer);
1349 mCurrentReturnData->compositionTypes.push_back(type);
1350
1351 count--;
1352 }
1353
1354 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001355}
1356
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001357bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001358{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001359 // display requests followed by (layer id, layer requests) pairs
1360 if (length % 3 != 1 || !mCurrentReturnData) {
1361 return false;
1362 }
1363
1364 mCurrentReturnData->displayRequests = read();
1365
1366 uint32_t count = (length - 1) / 3;
1367 mCurrentReturnData->requestedLayers.reserve(count);
1368 mCurrentReturnData->requestMasks.reserve(count);
1369 while (count > 0) {
1370 auto layer = read64();
1371 auto layerRequestMask = read();
1372
1373 mCurrentReturnData->requestedLayers.push_back(layer);
1374 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1375
1376 count--;
1377 }
1378
1379 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001380}
1381
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001382bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001383{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001384 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001385 !mCurrentReturnData) {
1386 return false;
1387 }
1388
1389 if (mCurrentReturnData->presentFence >= 0) {
1390 close(mCurrentReturnData->presentFence);
1391 }
1392 mCurrentReturnData->presentFence = readFence();
1393
1394 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001395}
1396
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001397bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001398{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001399 // (layer id, release fence index) pairs
1400 if (length % 3 != 0 || !mCurrentReturnData) {
1401 return false;
1402 }
1403
1404 uint32_t count = length / 3;
1405 mCurrentReturnData->releasedLayers.reserve(count);
1406 mCurrentReturnData->releaseFences.reserve(count);
1407 while (count > 0) {
1408 auto layer = read64();
1409 auto fence = readFence();
1410
1411 mCurrentReturnData->releasedLayers.push_back(layer);
1412 mCurrentReturnData->releaseFences.push_back(fence);
1413
1414 count--;
1415 }
1416
1417 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001418}
1419
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001420bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1421{
1422 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1423 return false;
1424 }
1425 mCurrentReturnData->presentOrValidateState = read();
1426 return true;
1427}
1428
Peiyong Linafa0f572020-01-13 16:35:02 -08001429bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1430 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1431 return false;
1432 }
1433 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1434 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1435 return true;
1436}
1437
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001438void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001439{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001440 mErrors.clear();
1441
1442 for (auto& data : mReturnData) {
1443 if (data.second.presentFence >= 0) {
1444 close(data.second.presentFence);
1445 }
1446 for (auto fence : data.second.releaseFences) {
1447 if (fence >= 0) {
1448 close(fence);
1449 }
1450 }
1451 }
1452
1453 mReturnData.clear();
1454 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001455}
1456
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001457std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001458{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001459 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001460}
1461
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001462bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001463 uint32_t* outNumChangedCompositionTypes,
1464 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001465{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001466 auto found = mReturnData.find(display);
1467 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001468 *outNumChangedCompositionTypes = 0;
1469 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001470 return false;
1471 }
1472
1473 const ReturnData& data = found->second;
1474
Chia-I Wu67e376d2016-12-19 11:36:22 +08001475 *outNumChangedCompositionTypes = data.compositionTypes.size();
1476 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001477
1478 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001479}
1480
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001481void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001482 std::vector<Layer>* outLayers,
1483 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001484{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001485 auto found = mReturnData.find(display);
1486 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001487 outLayers->clear();
1488 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001489 return;
1490 }
1491
1492 ReturnData& data = found->second;
1493
Chia-I Wu67e376d2016-12-19 11:36:22 +08001494 *outLayers = std::move(data.changedLayers);
1495 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001496}
1497
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001498void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001499 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1500 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001501{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001502 auto found = mReturnData.find(display);
1503 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001504 *outDisplayRequestMask = 0;
1505 outLayers->clear();
1506 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001507 return;
1508 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001509
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001510 ReturnData& data = found->second;
1511
Chia-I Wu67e376d2016-12-19 11:36:22 +08001512 *outDisplayRequestMask = data.displayRequests;
1513 *outLayers = std::move(data.requestedLayers);
1514 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001515}
1516
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001517void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001518 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001519{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001520 auto found = mReturnData.find(display);
1521 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001522 outLayers->clear();
1523 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001524 return;
1525 }
1526
1527 ReturnData& data = found->second;
1528
Chia-I Wu67e376d2016-12-19 11:36:22 +08001529 *outLayers = std::move(data.releasedLayers);
1530 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001531}
1532
Chia-I Wu67e376d2016-12-19 11:36:22 +08001533void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001534{
1535 auto found = mReturnData.find(display);
1536 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001537 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001538 return;
1539 }
1540
1541 ReturnData& data = found->second;
1542
Chia-I Wu67e376d2016-12-19 11:36:22 +08001543 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001544 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001545}
1546
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001547void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1548 auto found = mReturnData.find(display);
1549 if (found == mReturnData.end()) {
1550 *state= -1;
1551 return;
1552 }
1553 ReturnData& data = found->second;
1554 *state = data.presentOrValidateState;
1555}
1556
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001557void CommandReader::takeClientTargetProperty(
1558 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1559 auto found = mReturnData.find(display);
1560
1561 // If not found, return the default values.
1562 if (found == mReturnData.end()) {
1563 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1564 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
Yichi Chen1d5146d2020-06-12 18:50:11 +08001565 return;
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001566 }
1567
1568 ReturnData& data = found->second;
1569 *outClientTargetProperty = data.clientTargetProperty;
1570}
1571
Lloyd Piquea822d522017-12-20 16:42:57 -08001572} // namespace impl
Chia-I Wuaab99f52016-10-05 12:59:58 +08001573} // namespace Hwc2
Chia-I Wuaab99f52016-10-05 12:59:58 +08001574} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001575
1576// TODO(b/129481165): remove the #pragma below and fix conversion issues
1577#pragma clang diagnostic pop // ignored "-Wconversion"