blob: 1cbcf592db4f871d9c75baf64297e4e428379e87 [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>
Wei Wangae211b42019-06-07 17:22:49 -070028#include <hidl/HidlTransportSupport.h>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070029#include <hidl/HidlTransportUtils.h>
Midas Chien243b6452021-03-30 19:55:12 +080030#include <log/log.h>
31#include <utils/Trace.h>
32
33#include <algorithm>
34#include <cinttypes>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070035
Chia-I Wuaab99f52016-10-05 12:59:58 +080036namespace android {
37
38using hardware::Return;
39using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010040using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080041
42namespace Hwc2 {
43
Lloyd Piquea822d522017-12-20 16:42:57 -080044Composer::~Composer() = default;
45
Chia-I Wuaab99f52016-10-05 12:59:58 +080046namespace {
47
48class BufferHandle {
49public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080050 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080051 // nullptr is not a valid handle to HIDL
52 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
53 }
54
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080055 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080056 {
57 return mHandle;
58 }
59
60private:
61 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010062 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080063};
64
65class FenceHandle
66{
67public:
68 FenceHandle(int fd, bool owned)
69 : mOwned(owned)
70 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010071 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080072 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 handle = native_handle_init(mStorage, 1, 0);
74 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080075 } else {
76 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010077 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080078 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010079 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080080 }
81
82 ~FenceHandle()
83 {
84 if (mOwned) {
85 native_handle_close(mHandle);
86 }
87 }
88
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080089 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080090 {
91 return mHandle;
92 }
93
94private:
95 bool mOwned;
96 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010097 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080098};
99
100// assume NO_RESOURCES when Status::isOk returns false
101constexpr Error kDefaultError = Error::NO_RESOURCES;
Ady Abraham7159f572019-10-11 11:10:18 -0700102constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800103
104template<typename T, typename U>
105T unwrapRet(Return<T>& ret, const U& default_val)
106{
Steven Moreland9d021002017-01-03 17:10:54 -0800107 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800108 static_cast<T>(default_val);
109}
110
111Error unwrapRet(Return<Error>& ret)
112{
113 return unwrapRet(ret, kDefaultError);
114}
115
Chia-I Wuaab99f52016-10-05 12:59:58 +0800116} // anonymous namespace
117
Lloyd Piquea822d522017-12-20 16:42:57 -0800118namespace impl {
119
Alec Mouri9c58bcd2020-09-09 18:57:07 -0700120Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700121 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500122
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800123 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800124 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
125 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800126
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700127 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
128 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -0700129 if (tmpError == V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700130 mClient = tmpClient;
131 mClient_2_2 = tmpClient;
132 mClient_2_3 = tmpClient;
133 mClient_2_4 = tmpClient;
134 }
135 });
136 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700137 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
138 if (tmpError == Error::NONE) {
139 mClient = tmpClient;
140 mClient_2_2 = tmpClient;
141 mClient_2_3 = tmpClient;
142 }
143 });
144 } else {
145 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
146 if (tmpError != Error::NONE) {
147 return;
148 }
149
150 mClient = tmpClient;
151 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
152 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
153 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
154 "IComposer 2.2 did not return IComposerClient 2.2");
155 }
156 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800157 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400158
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700159 if (mClient == nullptr) {
160 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700161 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800162}
163
Lloyd Piquea822d522017-12-20 16:42:57 -0800164Composer::~Composer() = default;
165
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800166std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800167{
168 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800169 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800170 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800171 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800172 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800173 return capabilities;
174}
175
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800176std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800177{
178 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800179 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800180 info = tmpInfo.c_str();
181 });
182
183 return info;
184}
185
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800186void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800187{
Wei Wangae211b42019-06-07 17:22:49 -0700188 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Ady Abraham7159f572019-10-11 11:10:18 -0700189 auto ret = [&]() {
190 if (mClient_2_4) {
191 return mClient_2_4->registerCallback_2_4(callback);
192 }
193 return mClient->registerCallback(callback);
194 }();
Steven Moreland9d021002017-01-03 17:10:54 -0800195 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800196 ALOGE("failed to register IComposerCallback");
197 }
198}
199
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700200void Composer::resetCommands() {
201 mWriter.reset();
202}
203
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700204Error Composer::executeCommands() {
205 return execute();
206}
207
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800208uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800209{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211 return unwrapRet(ret, 0);
212}
213
214Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800215 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800216{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800217 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800218 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700219 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800220 mClient_2_2->createVirtualDisplay_2_2(width, height,
221 static_cast<types::V1_1::PixelFormat>(*format),
222 bufferSlotCount,
223 [&](const auto& tmpError, const auto& tmpDisplay,
224 const auto& tmpFormat) {
225 error = tmpError;
226 if (error != Error::NONE) {
227 return;
228 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800229
Kevin DuBois73d0f482019-01-25 11:18:03 -0800230 *outDisplay = tmpDisplay;
231 *format = static_cast<types::V1_2::PixelFormat>(
232 tmpFormat);
233 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700234 } else {
235 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700236 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700237 [&](const auto& tmpError, const auto& tmpDisplay,
238 const auto& tmpFormat) {
239 error = tmpError;
240 if (error != Error::NONE) {
241 return;
242 }
243
244 *outDisplay = tmpDisplay;
245 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800246 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700247 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248
249 return error;
250}
251
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800252Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800253{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800254 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800255 return unwrapRet(ret);
256}
257
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800258Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800260 mWriter.selectDisplay(display);
261 mWriter.acceptDisplayChanges();
262 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800263}
264
Chia-I Wu67e376d2016-12-19 11:36:22 +0800265Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800266{
267 Error error = kDefaultError;
Alec Mourie7cc1c22021-04-27 15:23:26 -0700268 mClient->createLayer(display, kMaxLayerBufferCount,
269 [&](const auto& tmpError, const auto& tmpLayer) {
270 error = tmpError;
271 if (error != Error::NONE) {
272 return;
273 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800274
Alec Mourie7cc1c22021-04-27 15:23:26 -0700275 *outLayer = tmpLayer;
276 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277
278 return error;
279}
280
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800281Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800282{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800283 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800284 return unwrapRet(ret);
285}
286
Chia-I Wu67e376d2016-12-19 11:36:22 +0800287Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288{
289 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800290 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291 [&](const auto& tmpError, const auto& tmpConfig) {
292 error = tmpError;
293 if (error != Error::NONE) {
294 return;
295 }
296
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298 });
299
300 return error;
301}
302
303Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800304 std::vector<Layer>* outLayers,
305 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800307 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800308 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309}
310
311Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800312 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313{
314 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800315
Valerie Hau9758ae02018-10-09 16:05:09 -0700316 if (mClient_2_3) {
317 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
318 error = tmpError;
319 if (error != Error::NONE) {
320 return;
321 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700322
Valerie Hau9758ae02018-10-09 16:05:09 -0700323 *outModes = tmpModes;
324 });
325 } else if (mClient_2_2) {
326 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
327 error = tmpError;
328 if (error != Error::NONE) {
329 return;
330 }
331
332 for (types::V1_1::ColorMode colorMode : tmpModes) {
333 outModes->push_back(static_cast<ColorMode>(colorMode));
334 }
335 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700336 } else {
337 mClient->getColorModes(display,
338 [&](const auto& tmpError, const auto& tmpModes) {
339 error = tmpError;
340 if (error != Error::NONE) {
341 return;
342 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700343 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700344 outModes->push_back(static_cast<ColorMode>(colorMode));
345 }
346 });
347 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800348
349 return error;
350}
351
352Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800353 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800354{
355 Error error = kDefaultError;
Ady Abraham7159f572019-10-11 11:10:18 -0700356 if (mClient_2_4) {
357 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
358 [&](const auto& tmpError, const auto& tmpValue) {
359 error = static_cast<Error>(tmpError);
360 if (error != Error::NONE) {
361 return;
362 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800363
Ady Abraham7159f572019-10-11 11:10:18 -0700364 *outValue = tmpValue;
365 });
366 } else {
367 mClient->getDisplayAttribute(display, config,
368 static_cast<V2_1::IComposerClient::Attribute>(attribute),
369 [&](const auto& tmpError, const auto& tmpValue) {
370 error = tmpError;
371 if (error != Error::NONE) {
372 return;
373 }
374
375 *outValue = tmpValue;
376 });
377 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378
379 return error;
380}
381
382Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800383 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800384{
385 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800386 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800387 [&](const auto& tmpError, const auto& tmpConfigs) {
388 error = tmpError;
389 if (error != Error::NONE) {
390 return;
391 }
392
Chia-I Wu67e376d2016-12-19 11:36:22 +0800393 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800394 });
395
396 return error;
397}
398
Chia-I Wu67e376d2016-12-19 11:36:22 +0800399Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800400{
401 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800402 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800403 [&](const auto& tmpError, const auto& tmpName) {
404 error = tmpError;
405 if (error != Error::NONE) {
406 return;
407 }
408
Chia-I Wu67e376d2016-12-19 11:36:22 +0800409 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800410 });
411
412 return error;
413}
414
415Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800416 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
417 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800418{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800419 mReader.takeDisplayRequests(display, outDisplayRequestMask,
420 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800421 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800422}
423
Chia-I Wu67e376d2016-12-19 11:36:22 +0800424Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800425{
426 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800427 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800428 [&](const auto& tmpError, const auto& tmpSupport) {
429 error = tmpError;
430 if (error != Error::NONE) {
431 return;
432 }
433
Chia-I Wu67e376d2016-12-19 11:36:22 +0800434 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800435 });
436
437 return error;
438}
439
Chia-I Wu67e376d2016-12-19 11:36:22 +0800440Error Composer::getHdrCapabilities(Display display,
441 std::vector<Hdr>* outTypes, float* outMaxLuminance,
442 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800443{
444 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800445 if (mClient_2_3) {
446 mClient_2_3->getHdrCapabilities_2_3(display,
447 [&](const auto& tmpError, const auto& tmpTypes,
448 const auto& tmpMaxLuminance,
449 const auto& tmpMaxAverageLuminance,
450 const auto& tmpMinLuminance) {
451 error = tmpError;
452 if (error != Error::NONE) {
453 return;
454 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800455
Valerie Haue9e843a2018-12-18 13:39:23 -0800456 *outTypes = tmpTypes;
457 *outMaxLuminance = tmpMaxLuminance;
458 *outMaxAverageLuminance = tmpMaxAverageLuminance;
459 *outMinLuminance = tmpMinLuminance;
460 });
461 } else {
462 mClient->getHdrCapabilities(display,
463 [&](const auto& tmpError, const auto& tmpTypes,
464 const auto& tmpMaxLuminance,
465 const auto& tmpMaxAverageLuminance,
466 const auto& tmpMinLuminance) {
467 error = tmpError;
468 if (error != Error::NONE) {
469 return;
470 }
471
472 outTypes->clear();
473 for (auto type : tmpTypes) {
474 outTypes->push_back(static_cast<Hdr>(type));
475 }
476
477 *outMaxLuminance = tmpMaxLuminance;
478 *outMaxAverageLuminance = tmpMaxAverageLuminance;
479 *outMinLuminance = tmpMinLuminance;
480 });
481 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800482
483 return error;
484}
485
Chia-I Wu67e376d2016-12-19 11:36:22 +0800486Error Composer::getReleaseFences(Display display,
487 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800488{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800489 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800490 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800491}
492
Chia-I Wu67e376d2016-12-19 11:36:22 +0800493Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800494{
Midas Chien243b6452021-03-30 19:55:12 +0800495 ATRACE_NAME("HwcPresentDisplay");
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800496 mWriter.selectDisplay(display);
497 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800498
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800499 Error error = execute();
500 if (error != Error::NONE) {
501 return error;
502 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800503
Chia-I Wu67e376d2016-12-19 11:36:22 +0800504 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800505
506 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507}
508
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800509Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800510{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800511 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800512 return unwrapRet(ret);
513}
514
Chia-I Wu06d63de2017-01-04 14:58:51 +0800515Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400516 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800519{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800520 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700521
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400522 const native_handle_t* handle = nullptr;
523 if (target.get()) {
524 handle = target->getNativeBuffer()->handle;
525 }
526
527 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800528 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800529}
530
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700531Error Composer::setColorMode(Display display, ColorMode mode,
532 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800533{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700534 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700535 if (mClient_2_3) {
536 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
537 } else if (mClient_2_2) {
538 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
539 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700540 } else {
541 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700542 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700543 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800544 return unwrapRet(ret);
545}
546
547Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800548 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800549{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800550 mWriter.selectDisplay(display);
551 mWriter.setColorTransform(matrix, hint);
552 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553}
554
555Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800557{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800558 mWriter.selectDisplay(display);
559 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
560 return Error::NONE;
561}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800562
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700563Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
564 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700565 if (mClient_2_2) {
566 ret = mClient_2_2->setPowerMode_2_2(display, mode);
567 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700568 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700569 }
570
Chia-I Wuaab99f52016-10-05 12:59:58 +0800571 return unwrapRet(ret);
572}
573
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800574Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800575{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800576 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800577 return unwrapRet(ret);
578}
579
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800580Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800581{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800582 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800583 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800584 return unwrapRet(ret);
585}
586
Chia-I Wu67e376d2016-12-19 11:36:22 +0800587Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
588 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800589{
Midas Chien243b6452021-03-30 19:55:12 +0800590 ATRACE_NAME("HwcValidateDisplay");
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800591 mWriter.selectDisplay(display);
592 mWriter.validateDisplay();
593
594 Error error = execute();
595 if (error != Error::NONE) {
596 return error;
597 }
598
Chia-I Wu67e376d2016-12-19 11:36:22 +0800599 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800600
601 return Error::NONE;
602}
603
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700604Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
605 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
Midas Chien243b6452021-03-30 19:55:12 +0800606 ATRACE_NAME("HwcPresentOrValidateDisplay");
607 mWriter.selectDisplay(display);
608 mWriter.presentOrvalidateDisplay();
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700609
Midas Chien243b6452021-03-30 19:55:12 +0800610 Error error = execute();
611 if (error != Error::NONE) {
612 return error;
613 }
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700614
615 mReader.takePresentOrValidateStage(display, state);
616
617 if (*state == 1) { // Present succeeded
618 mReader.takePresentFence(display, outPresentFence);
619 }
620
621 if (*state == 0) { // Validate succeeded.
622 mReader.hasChanges(display, outNumTypes, outNumRequests);
623 }
624
625 return Error::NONE;
626}
627
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800628Error Composer::setCursorPosition(Display display, Layer layer,
629 int32_t x, int32_t y)
630{
631 mWriter.selectDisplay(display);
632 mWriter.selectLayer(layer);
633 mWriter.setLayerCursorPosition(x, y);
634 return Error::NONE;
635}
636
637Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400638 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800639{
640 mWriter.selectDisplay(display);
641 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700642
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400643 const native_handle_t* handle = nullptr;
644 if (buffer.get()) {
645 handle = buffer->getNativeBuffer()->handle;
646 }
647
648 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800649 return Error::NONE;
650}
651
652Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
653 const std::vector<IComposerClient::Rect>& damage)
654{
655 mWriter.selectDisplay(display);
656 mWriter.selectLayer(layer);
657 mWriter.setLayerSurfaceDamage(damage);
658 return Error::NONE;
659}
660
661Error Composer::setLayerBlendMode(Display display, Layer layer,
662 IComposerClient::BlendMode mode)
663{
664 mWriter.selectDisplay(display);
665 mWriter.selectLayer(layer);
666 mWriter.setLayerBlendMode(mode);
667 return Error::NONE;
668}
669
670Error Composer::setLayerColor(Display display, Layer layer,
671 const IComposerClient::Color& color)
672{
673 mWriter.selectDisplay(display);
674 mWriter.selectLayer(layer);
675 mWriter.setLayerColor(color);
676 return Error::NONE;
677}
678
679Error Composer::setLayerCompositionType(Display display, Layer layer,
680 IComposerClient::Composition type)
681{
682 mWriter.selectDisplay(display);
683 mWriter.selectLayer(layer);
684 mWriter.setLayerCompositionType(type);
685 return Error::NONE;
686}
687
688Error Composer::setLayerDataspace(Display display, Layer layer,
689 Dataspace dataspace)
690{
691 mWriter.selectDisplay(display);
692 mWriter.selectLayer(layer);
693 mWriter.setLayerDataspace(dataspace);
694 return Error::NONE;
695}
696
697Error Composer::setLayerDisplayFrame(Display display, Layer layer,
698 const IComposerClient::Rect& frame)
699{
700 mWriter.selectDisplay(display);
701 mWriter.selectLayer(layer);
702 mWriter.setLayerDisplayFrame(frame);
703 return Error::NONE;
704}
705
706Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
707 float alpha)
708{
709 mWriter.selectDisplay(display);
710 mWriter.selectLayer(layer);
711 mWriter.setLayerPlaneAlpha(alpha);
712 return Error::NONE;
713}
714
715Error Composer::setLayerSidebandStream(Display display, Layer layer,
716 const native_handle_t* stream)
717{
718 mWriter.selectDisplay(display);
719 mWriter.selectLayer(layer);
720 mWriter.setLayerSidebandStream(stream);
721 return Error::NONE;
722}
723
724Error Composer::setLayerSourceCrop(Display display, Layer layer,
725 const IComposerClient::FRect& crop)
726{
727 mWriter.selectDisplay(display);
728 mWriter.selectLayer(layer);
729 mWriter.setLayerSourceCrop(crop);
730 return Error::NONE;
731}
732
733Error Composer::setLayerTransform(Display display, Layer layer,
734 Transform transform)
735{
736 mWriter.selectDisplay(display);
737 mWriter.selectLayer(layer);
738 mWriter.setLayerTransform(transform);
739 return Error::NONE;
740}
741
742Error Composer::setLayerVisibleRegion(Display display, Layer layer,
743 const std::vector<IComposerClient::Rect>& visible)
744{
745 mWriter.selectDisplay(display);
746 mWriter.selectLayer(layer);
747 mWriter.setLayerVisibleRegion(visible);
748 return Error::NONE;
749}
750
751Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
752{
753 mWriter.selectDisplay(display);
754 mWriter.selectLayer(layer);
755 mWriter.setLayerZOrder(z);
756 return Error::NONE;
757}
758
759Error Composer::execute()
760{
761 // prepare input command queue
762 bool queueChanged = false;
763 uint32_t commandLength = 0;
764 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800765 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800766 mWriter.reset();
767 return Error::NO_RESOURCES;
768 }
769
770 // set up new input command queue if necessary
771 if (queueChanged) {
772 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
773 auto error = unwrapRet(ret);
774 if (error != Error::NONE) {
775 mWriter.reset();
776 return error;
777 }
778 }
779
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700780 if (commandLength == 0) {
781 mWriter.reset();
782 return Error::NONE;
783 }
784
Chia-I Wuaab99f52016-10-05 12:59:58 +0800785 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700786 hardware::Return<void> ret;
787 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
788 const auto& tmpOutLength, const auto& tmpOutHandles)
789 {
790 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800791
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700792 // set up new output command queue if necessary
793 if (error == Error::NONE && tmpOutChanged) {
794 error = kDefaultError;
795 mClient->getOutputCommandQueue(
796 [&](const auto& tmpError,
797 const auto& tmpDescriptor)
798 {
799 error = tmpError;
800 if (error != Error::NONE) {
801 return;
802 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800803
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700804 mReader.setMQDescriptor(tmpDescriptor);
805 });
806 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800807
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700808 if (error != Error::NONE) {
809 return;
810 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800811
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700812 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
813 error = mReader.parse();
814 mReader.reset();
815 } else {
816 error = Error::NO_RESOURCES;
817 }
818 };
819 if (mClient_2_2) {
820 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
821 } else {
822 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
823 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700824 // executeCommands can fail because of out-of-fd and we do not want to
825 // abort() in that case
826 if (!ret.isOk()) {
827 ALOGE("executeCommands failed because of %s", ret.description().c_str());
828 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800829
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800830 if (error == Error::NONE) {
831 std::vector<CommandReader::CommandError> commandErrors =
832 mReader.takeErrors();
833
834 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700835 auto command =
836 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800837
838 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700839 command == IComposerClient::Command::PRESENT_DISPLAY ||
840 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800841 error = cmdErr.error;
842 } else {
843 ALOGW("command 0x%x generated error %d",
844 command, cmdErr.error);
845 }
846 }
847 }
848
849 mWriter.reset();
850
Chia-I Wuaab99f52016-10-05 12:59:58 +0800851 return error;
852}
853
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700854// Composer HAL 2.2
855
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700856Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
857 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
858 if (!mClient_2_2) {
859 return Error::UNSUPPORTED;
860 }
861
862 mWriter.selectDisplay(display);
863 mWriter.selectLayer(layer);
864 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
865 return Error::NONE;
866}
867
Chia-I Wud7e01d72018-06-21 13:39:09 +0800868std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
869 Display display) {
870 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700871 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800872 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700873 }
874
875 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800876 if (mClient_2_3) {
877 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
878 [&](const auto& tmpError, const auto& tmpKeys) {
879 error = tmpError;
880 if (error != Error::NONE) {
881 ALOGW("getPerFrameMetadataKeys failed "
882 "with %d",
883 tmpError);
884 return;
885 }
886 keys = tmpKeys;
887 });
888 } else {
889 mClient_2_2
890 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
891 error = tmpError;
892 if (error != Error::NONE) {
893 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
894 return;
895 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700896
Valerie Haue9e843a2018-12-18 13:39:23 -0800897 keys.clear();
898 for (auto key : tmpKeys) {
899 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
900 }
901 });
902 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700903
Chia-I Wud7e01d72018-06-21 13:39:09 +0800904 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700905}
906
907Error Composer::getRenderIntents(Display display, ColorMode colorMode,
908 std::vector<RenderIntent>* outRenderIntents) {
909 if (!mClient_2_2) {
910 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
911 return Error::NONE;
912 }
913
914 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700915
916 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700917 error = tmpError;
918 if (error != Error::NONE) {
919 return;
920 }
921
922 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -0700923 };
924
925 if (mClient_2_3) {
926 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
927 } else {
928 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
929 getRenderIntentsLambda);
930 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700931
932 return error;
933}
934
935Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
936{
937 if (!mClient_2_2) {
938 *outMatrix = mat4();
939 return Error::NONE;
940 }
941
942 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700943 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
944 [&](const auto& tmpError, const auto& tmpMatrix) {
945 error = tmpError;
946 if (error != Error::NONE) {
947 return;
948 }
949 *outMatrix = mat4(tmpMatrix.data());
950 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700951
952 return error;
953}
954
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700955// Composer HAL 2.3
956
957Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
958 std::vector<uint8_t>* outData) {
959 if (!mClient_2_3) {
960 return Error::UNSUPPORTED;
961 }
962
963 Error error = kDefaultError;
964 mClient_2_3->getDisplayIdentificationData(display,
965 [&](const auto& tmpError, const auto& tmpPort,
966 const auto& tmpData) {
967 error = tmpError;
968 if (error != Error::NONE) {
969 return;
970 }
971
972 *outPort = tmpPort;
973 *outData = tmpData;
974 });
975
976 return error;
977}
978
Peiyong Lin698147a2018-09-14 13:27:18 -0700979Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
980{
981 if (!mClient_2_3) {
982 return Error::UNSUPPORTED;
983 }
984
985 mWriter.selectDisplay(display);
986 mWriter.selectLayer(layer);
987 mWriter.setLayerColorTransform(matrix);
988 return Error::NONE;
989}
990
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700991Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
992 Dataspace* outDataspace,
993 uint8_t* outComponentMask) {
994 if (!outFormat || !outDataspace || !outComponentMask) {
995 return Error::BAD_PARAMETER;
996 }
997 if (!mClient_2_3) {
998 return Error::UNSUPPORTED;
999 }
1000 Error error = kDefaultError;
1001 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1002 [&](const auto tmpError,
1003 const auto& tmpFormat,
1004 const auto& tmpDataspace,
1005 const auto& tmpComponentMask) {
1006 error = tmpError;
1007 if (error == Error::NONE) {
1008 *outFormat = tmpFormat;
1009 *outDataspace = tmpDataspace;
1010 *outComponentMask =
1011 static_cast<uint8_t>(
1012 tmpComponentMask);
1013 }
1014 });
1015 return error;
1016}
1017
Kevin DuBois74e53772018-11-19 10:52:38 -08001018Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1019 uint8_t componentMask, uint64_t maxFrames) {
1020 if (!mClient_2_3) {
1021 return Error::UNSUPPORTED;
1022 }
1023
1024 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1025 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1026 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1027 maxFrames);
1028}
1029
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001030Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1031 DisplayedFrameStats* outStats) {
1032 if (!outStats) {
1033 return Error::BAD_PARAMETER;
1034 }
1035 if (!mClient_2_3) {
1036 return Error::UNSUPPORTED;
1037 }
1038 Error error = kDefaultError;
1039 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1040 [&](const auto tmpError, auto tmpNumFrames,
1041 const auto& tmpSamples0, const auto& tmpSamples1,
1042 const auto& tmpSamples2, const auto& tmpSamples3) {
1043 error = tmpError;
1044 if (error == Error::NONE) {
1045 outStats->numFrames = tmpNumFrames;
1046 outStats->component_0_sample = tmpSamples0;
1047 outStats->component_1_sample = tmpSamples1;
1048 outStats->component_2_sample = tmpSamples2;
1049 outStats->component_3_sample = tmpSamples3;
1050 }
1051 });
1052 return error;
1053}
1054
Valerie Haue9e843a2018-12-18 13:39:23 -08001055Error Composer::setLayerPerFrameMetadataBlobs(
1056 Display display, Layer layer,
1057 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1058 if (!mClient_2_3) {
1059 return Error::UNSUPPORTED;
1060 }
1061
1062 mWriter.selectDisplay(display);
1063 mWriter.selectLayer(layer);
1064 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1065 return Error::NONE;
1066}
1067
Dan Gittik57e63c52019-01-18 16:37:54 +00001068Error Composer::setDisplayBrightness(Display display, float brightness) {
1069 if (!mClient_2_3) {
1070 return Error::UNSUPPORTED;
1071 }
1072 return mClient_2_3->setDisplayBrightness(display, brightness);
1073}
1074
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001075// Composer HAL 2.4
1076
1077Error Composer::getDisplayCapabilities(Display display,
1078 std::vector<DisplayCapability>* outCapabilities) {
1079 if (!mClient_2_3) {
1080 return Error::UNSUPPORTED;
1081 }
1082
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001083 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001084 if (mClient_2_4) {
1085 mClient_2_4->getDisplayCapabilities_2_4(display,
1086 [&](const auto& tmpError, const auto& tmpCaps) {
1087 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001088 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001089 return;
1090 }
1091 *outCapabilities = tmpCaps;
1092 });
1093 } else {
1094 mClient_2_3
1095 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001096 error = static_cast<V2_4::Error>(tmpError);
1097 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001098 return;
1099 }
1100
1101 outCapabilities->resize(tmpCaps.size());
1102 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1103 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1104 });
1105 }
1106
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001107 return static_cast<Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001108}
1109
Ady Abraham7159f572019-10-11 11:10:18 -07001110V2_4::Error Composer::getDisplayConnectionType(Display display,
1111 IComposerClient::DisplayConnectionType* outType) {
1112 using Error = V2_4::Error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001113 if (!mClient_2_4) {
1114 return Error::UNSUPPORTED;
1115 }
1116
Ady Abraham7159f572019-10-11 11:10:18 -07001117 Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001118 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1119 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001120 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001121 return;
1122 }
1123
1124 *outType = tmpType;
1125 });
1126
Ady Abraham7159f572019-10-11 11:10:18 -07001127 return error;
1128}
1129
1130V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1131 using Error = V2_4::Error;
1132 if (!mClient_2_4) {
1133 return Error::UNSUPPORTED;
1134 }
1135
1136 Error error = kDefaultError_2_4;
1137 mClient_2_4->getDisplayVsyncPeriod(display,
1138 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1139 error = tmpError;
1140 if (error != Error::NONE) {
1141 return;
1142 }
1143
1144 *outVsyncPeriod = tmpVsyncPeriod;
1145 });
1146
1147 return error;
1148}
1149
1150V2_4::Error Composer::setActiveConfigWithConstraints(
1151 Display display, Config config,
1152 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1153 VsyncPeriodChangeTimeline* outTimeline) {
1154 using Error = V2_4::Error;
1155 if (!mClient_2_4) {
1156 return Error::UNSUPPORTED;
1157 }
1158
1159 Error error = kDefaultError_2_4;
1160 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1161 [&](const auto& tmpError, const auto& tmpTimeline) {
1162 error = tmpError;
1163 if (error != Error::NONE) {
1164 return;
1165 }
1166
1167 *outTimeline = tmpTimeline;
1168 });
1169
1170 return error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001171}
1172
Galia Peycheva5492cb52019-10-30 14:13:16 +01001173V2_4::Error Composer::setAutoLowLatencyMode(Display display, bool on) {
1174 using Error = V2_4::Error;
1175 if (!mClient_2_4) {
1176 return Error::UNSUPPORTED;
1177 }
1178
1179 return mClient_2_4->setAutoLowLatencyMode(display, on);
1180}
1181
1182V2_4::Error Composer::getSupportedContentTypes(
1183 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1184 using Error = V2_4::Error;
1185 if (!mClient_2_4) {
1186 return Error::UNSUPPORTED;
1187 }
1188
1189 Error error = kDefaultError_2_4;
1190 mClient_2_4->getSupportedContentTypes(displayId,
1191 [&](const auto& tmpError,
1192 const auto& tmpSupportedContentTypes) {
1193 error = tmpError;
1194 if (error != Error::NONE) {
1195 return;
1196 }
1197
1198 *outSupportedContentTypes = tmpSupportedContentTypes;
1199 });
1200 return error;
1201}
1202
1203V2_4::Error Composer::setContentType(Display display, IComposerClient::ContentType contentType) {
1204 using Error = V2_4::Error;
1205 if (!mClient_2_4) {
1206 return Error::UNSUPPORTED;
1207 }
1208
1209 return mClient_2_4->setContentType(display, contentType);
1210}
1211
Dan Stoza18d48cb2019-10-21 15:39:24 -07001212V2_4::Error Composer::setLayerGenericMetadata(Display display, Layer layer, const std::string& key,
1213 bool mandatory, const std::vector<uint8_t>& value) {
1214 using Error = V2_4::Error;
1215 if (!mClient_2_4) {
1216 return Error::UNSUPPORTED;
1217 }
1218 mWriter.selectDisplay(display);
1219 mWriter.selectLayer(layer);
1220 mWriter.setLayerGenericMetadata(key, mandatory, value);
1221 return Error::NONE;
1222}
1223
1224V2_4::Error Composer::getLayerGenericMetadataKeys(
1225 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1226 using Error = V2_4::Error;
1227 if (!mClient_2_4) {
1228 return Error::UNSUPPORTED;
1229 }
1230 Error error = kDefaultError_2_4;
1231 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1232 error = tmpError;
1233 if (error != Error::NONE) {
1234 return;
1235 }
1236
1237 *outKeys = tmpKeys;
1238 });
1239 return error;
1240}
1241
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001242Error Composer::getClientTargetProperty(
1243 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1244 mReader.takeClientTargetProperty(display, outClientTargetProperty);
1245 return Error::NONE;
1246}
1247
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001248CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001249{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001250 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001251}
1252
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001253Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001254{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001255 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001256
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001257 IComposerClient::Command command;
1258 uint16_t length = 0;
1259
1260 while (!isEmpty()) {
Peiyong Linafa0f572020-01-13 16:35:02 -08001261 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001262 break;
1263 }
1264
1265 bool parsed = false;
1266 switch (command) {
1267 case IComposerClient::Command::SELECT_DISPLAY:
1268 parsed = parseSelectDisplay(length);
1269 break;
1270 case IComposerClient::Command::SET_ERROR:
1271 parsed = parseSetError(length);
1272 break;
1273 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1274 parsed = parseSetChangedCompositionTypes(length);
1275 break;
1276 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1277 parsed = parseSetDisplayRequests(length);
1278 break;
1279 case IComposerClient::Command::SET_PRESENT_FENCE:
1280 parsed = parseSetPresentFence(length);
1281 break;
1282 case IComposerClient::Command::SET_RELEASE_FENCES:
1283 parsed = parseSetReleaseFences(length);
1284 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001285 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1286 parsed = parseSetPresentOrValidateDisplayResult(length);
1287 break;
Peiyong Linafa0f572020-01-13 16:35:02 -08001288 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1289 parsed = parseSetClientTargetProperty(length);
1290 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001291 default:
1292 parsed = false;
1293 break;
1294 }
1295
1296 endCommand();
1297
1298 if (!parsed) {
1299 ALOGE("failed to parse command 0x%x length %" PRIu16,
1300 command, length);
1301 break;
1302 }
1303 }
1304
1305 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001306}
1307
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001308bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001309{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001310 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001311 return false;
1312 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001313
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001314 mCurrentReturnData = &mReturnData[read64()];
1315
1316 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001317}
1318
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001319bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001320{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001321 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001322 return false;
1323 }
1324
1325 auto location = read();
1326 auto error = static_cast<Error>(readSigned());
1327
1328 mErrors.emplace_back(CommandError{location, error});
1329
1330 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001331}
1332
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001333bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001334{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001335 // (layer id, composition type) pairs
1336 if (length % 3 != 0 || !mCurrentReturnData) {
1337 return false;
1338 }
1339
1340 uint32_t count = length / 3;
1341 mCurrentReturnData->changedLayers.reserve(count);
1342 mCurrentReturnData->compositionTypes.reserve(count);
1343 while (count > 0) {
1344 auto layer = read64();
1345 auto type = static_cast<IComposerClient::Composition>(readSigned());
1346
1347 mCurrentReturnData->changedLayers.push_back(layer);
1348 mCurrentReturnData->compositionTypes.push_back(type);
1349
1350 count--;
1351 }
1352
1353 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001354}
1355
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001356bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001357{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001358 // display requests followed by (layer id, layer requests) pairs
1359 if (length % 3 != 1 || !mCurrentReturnData) {
1360 return false;
1361 }
1362
1363 mCurrentReturnData->displayRequests = read();
1364
1365 uint32_t count = (length - 1) / 3;
1366 mCurrentReturnData->requestedLayers.reserve(count);
1367 mCurrentReturnData->requestMasks.reserve(count);
1368 while (count > 0) {
1369 auto layer = read64();
1370 auto layerRequestMask = read();
1371
1372 mCurrentReturnData->requestedLayers.push_back(layer);
1373 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1374
1375 count--;
1376 }
1377
1378 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001379}
1380
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001381bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001382{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001383 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001384 !mCurrentReturnData) {
1385 return false;
1386 }
1387
1388 if (mCurrentReturnData->presentFence >= 0) {
1389 close(mCurrentReturnData->presentFence);
1390 }
1391 mCurrentReturnData->presentFence = readFence();
1392
1393 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001394}
1395
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001396bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001397{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001398 // (layer id, release fence index) pairs
1399 if (length % 3 != 0 || !mCurrentReturnData) {
1400 return false;
1401 }
1402
1403 uint32_t count = length / 3;
1404 mCurrentReturnData->releasedLayers.reserve(count);
1405 mCurrentReturnData->releaseFences.reserve(count);
1406 while (count > 0) {
1407 auto layer = read64();
1408 auto fence = readFence();
1409
1410 mCurrentReturnData->releasedLayers.push_back(layer);
1411 mCurrentReturnData->releaseFences.push_back(fence);
1412
1413 count--;
1414 }
1415
1416 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001417}
1418
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001419bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1420{
1421 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1422 return false;
1423 }
1424 mCurrentReturnData->presentOrValidateState = read();
1425 return true;
1426}
1427
Peiyong Linafa0f572020-01-13 16:35:02 -08001428bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1429 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1430 return false;
1431 }
1432 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1433 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1434 return true;
1435}
1436
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001437void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001438{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001439 mErrors.clear();
1440
1441 for (auto& data : mReturnData) {
1442 if (data.second.presentFence >= 0) {
1443 close(data.second.presentFence);
1444 }
1445 for (auto fence : data.second.releaseFences) {
1446 if (fence >= 0) {
1447 close(fence);
1448 }
1449 }
1450 }
1451
1452 mReturnData.clear();
1453 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001454}
1455
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001456std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001457{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001458 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001459}
1460
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001461bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001462 uint32_t* outNumChangedCompositionTypes,
1463 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001464{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001465 auto found = mReturnData.find(display);
1466 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001467 *outNumChangedCompositionTypes = 0;
1468 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001469 return false;
1470 }
1471
1472 const ReturnData& data = found->second;
1473
Chia-I Wu67e376d2016-12-19 11:36:22 +08001474 *outNumChangedCompositionTypes = data.compositionTypes.size();
1475 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001476
1477 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001478}
1479
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001480void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001481 std::vector<Layer>* outLayers,
1482 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001483{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001484 auto found = mReturnData.find(display);
1485 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001486 outLayers->clear();
1487 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001488 return;
1489 }
1490
1491 ReturnData& data = found->second;
1492
Chia-I Wu67e376d2016-12-19 11:36:22 +08001493 *outLayers = std::move(data.changedLayers);
1494 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001495}
1496
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001497void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001498 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1499 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001500{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001501 auto found = mReturnData.find(display);
1502 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001503 *outDisplayRequestMask = 0;
1504 outLayers->clear();
1505 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001506 return;
1507 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001508
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001509 ReturnData& data = found->second;
1510
Chia-I Wu67e376d2016-12-19 11:36:22 +08001511 *outDisplayRequestMask = data.displayRequests;
1512 *outLayers = std::move(data.requestedLayers);
1513 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001514}
1515
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001516void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001517 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001518{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001519 auto found = mReturnData.find(display);
1520 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001521 outLayers->clear();
1522 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001523 return;
1524 }
1525
1526 ReturnData& data = found->second;
1527
Chia-I Wu67e376d2016-12-19 11:36:22 +08001528 *outLayers = std::move(data.releasedLayers);
1529 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001530}
1531
Chia-I Wu67e376d2016-12-19 11:36:22 +08001532void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001533{
1534 auto found = mReturnData.find(display);
1535 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001536 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001537 return;
1538 }
1539
1540 ReturnData& data = found->second;
1541
Chia-I Wu67e376d2016-12-19 11:36:22 +08001542 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001543 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001544}
1545
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001546void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1547 auto found = mReturnData.find(display);
1548 if (found == mReturnData.end()) {
1549 *state= -1;
1550 return;
1551 }
1552 ReturnData& data = found->second;
1553 *state = data.presentOrValidateState;
1554}
1555
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001556void CommandReader::takeClientTargetProperty(
1557 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1558 auto found = mReturnData.find(display);
1559
1560 // If not found, return the default values.
1561 if (found == mReturnData.end()) {
1562 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1563 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
Yichi Chen1d5146d2020-06-12 18:50:11 +08001564 return;
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001565 }
1566
1567 ReturnData& data = found->second;
1568 *outClientTargetProperty = data.clientTargetProperty;
1569}
1570
Lloyd Piquea822d522017-12-20 16:42:57 -08001571} // namespace impl
Chia-I Wuaab99f52016-10-05 12:59:58 +08001572} // namespace Hwc2
Chia-I Wuaab99f52016-10-05 12:59:58 +08001573} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001574
1575// TODO(b/129481165): remove the #pragma below and fix conversion issues
1576#pragma clang diagnostic pop // ignored "-Wconversion"