blob: dbdffecf0abe3891bdf32b28729f34ba016731e9 [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"
23
Chia-I Wuaab99f52016-10-05 12:59:58 +080024#include <log/log.h>
25
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -070026#include <algorithm>
27#include <cinttypes>
28
Chia-I Wuaab99f52016-10-05 12:59:58 +080029#include "ComposerHal.h"
30
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070031#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
32#include <gui/BufferQueue.h>
Wei Wangae211b42019-06-07 17:22:49 -070033#include <hidl/HidlTransportSupport.h>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070034#include <hidl/HidlTransportUtils.h>
35
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
mamik94e91f62019-08-19 09:11:33 -0700120#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500121Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
122 : CommandWriterBase(initialMaxSize) {}
123
124Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800125{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500126}
127
128void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
129{
130 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700131 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700132 IVrComposerClient::VrCommand::SET_LAYER_INFO),
133 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500134 write(type);
135 write(appId);
136 endCommand();
137}
138
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400139void Composer::CommandWriter::setClientTargetMetadata(
140 const IVrComposerClient::BufferMetadata& metadata)
141{
142 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700143 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700144 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
145 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400146 writeBufferMetadata(metadata);
147 endCommand();
148}
149
150void Composer::CommandWriter::setLayerBufferMetadata(
151 const IVrComposerClient::BufferMetadata& metadata)
152{
153 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700154 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700155 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
156 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400157 writeBufferMetadata(metadata);
158 endCommand();
159}
160
161void Composer::CommandWriter::writeBufferMetadata(
162 const IVrComposerClient::BufferMetadata& metadata)
163{
164 write(metadata.width);
165 write(metadata.height);
166 write(metadata.stride);
167 write(metadata.layerCount);
168 writeSigned(static_cast<int32_t>(metadata.format));
169 write64(metadata.usage);
170}
mamik94e91f62019-08-19 09:11:33 -0700171#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400172
Kalle Raitaa099a242017-01-11 11:17:29 -0800173Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800174 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800175 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500176{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700177 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500178
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800179 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800180 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
181 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800182
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700183 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
184 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -0700185 if (tmpError == V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700186 mClient = tmpClient;
187 mClient_2_2 = tmpClient;
188 mClient_2_3 = tmpClient;
189 mClient_2_4 = tmpClient;
190 }
191 });
192 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700193 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
194 if (tmpError == Error::NONE) {
195 mClient = tmpClient;
196 mClient_2_2 = tmpClient;
197 mClient_2_3 = tmpClient;
198 }
199 });
200 } else {
201 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
202 if (tmpError != Error::NONE) {
203 return;
204 }
205
206 mClient = tmpClient;
207 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
208 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
209 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
210 "IComposer 2.2 did not return IComposerClient 2.2");
211 }
212 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800213 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400214
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700215 if (mClient == nullptr) {
216 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700217 }
218
mamik94e91f62019-08-19 09:11:33 -0700219#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400220 if (mIsUsingVrComposer) {
221 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
222 if (vrClient == nullptr) {
223 LOG_ALWAYS_FATAL("failed to create vr composer client");
224 }
225 }
mamik94e91f62019-08-19 09:11:33 -0700226#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227}
228
Lloyd Piquea822d522017-12-20 16:42:57 -0800229Composer::~Composer() = default;
230
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800231std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800232{
233 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800234 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800235 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800236 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800237 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800238 return capabilities;
239}
240
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800241std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800242{
243 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800244 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800245 info = tmpInfo.c_str();
246 });
247
248 return info;
249}
250
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800251void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252{
Wei Wangae211b42019-06-07 17:22:49 -0700253 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Ady Abraham7159f572019-10-11 11:10:18 -0700254 auto ret = [&]() {
255 if (mClient_2_4) {
256 return mClient_2_4->registerCallback_2_4(callback);
257 }
258 return mClient->registerCallback(callback);
259 }();
Steven Moreland9d021002017-01-03 17:10:54 -0800260 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800261 ALOGE("failed to register IComposerCallback");
262 }
263}
264
Steven Thomasb02664d2017-07-26 18:48:28 -0700265bool Composer::isRemote() {
266 return mClient->isRemote();
267}
268
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700269void Composer::resetCommands() {
270 mWriter.reset();
271}
272
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700273Error Composer::executeCommands() {
274 return execute();
275}
276
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800277uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800278{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800279 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800280 return unwrapRet(ret, 0);
281}
282
283Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800284 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800285{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800286 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800287 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700288 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800289 mClient_2_2->createVirtualDisplay_2_2(width, height,
290 static_cast<types::V1_1::PixelFormat>(*format),
291 bufferSlotCount,
292 [&](const auto& tmpError, const auto& tmpDisplay,
293 const auto& tmpFormat) {
294 error = tmpError;
295 if (error != Error::NONE) {
296 return;
297 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298
Kevin DuBois73d0f482019-01-25 11:18:03 -0800299 *outDisplay = tmpDisplay;
300 *format = static_cast<types::V1_2::PixelFormat>(
301 tmpFormat);
302 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700303 } else {
304 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700305 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700306 [&](const auto& tmpError, const auto& tmpDisplay,
307 const auto& tmpFormat) {
308 error = tmpError;
309 if (error != Error::NONE) {
310 return;
311 }
312
313 *outDisplay = tmpDisplay;
314 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800315 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700316 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800317
318 return error;
319}
320
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800321Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800322{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800323 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324 return unwrapRet(ret);
325}
326
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800327Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800328{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800329 mWriter.selectDisplay(display);
330 mWriter.acceptDisplayChanges();
331 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800332}
333
Chia-I Wu67e376d2016-12-19 11:36:22 +0800334Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800335{
336 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800337 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800338 [&](const auto& tmpError, const auto& tmpLayer) {
339 error = tmpError;
340 if (error != Error::NONE) {
341 return;
342 }
343
Chia-I Wu67e376d2016-12-19 11:36:22 +0800344 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800345 });
346
347 return error;
348}
349
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800350Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800351{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800352 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800353 return unwrapRet(ret);
354}
355
Chia-I Wu67e376d2016-12-19 11:36:22 +0800356Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357{
358 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800359 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800360 [&](const auto& tmpError, const auto& tmpConfig) {
361 error = tmpError;
362 if (error != Error::NONE) {
363 return;
364 }
365
Chia-I Wu67e376d2016-12-19 11:36:22 +0800366 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800367 });
368
369 return error;
370}
371
372Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800373 std::vector<Layer>* outLayers,
374 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800375{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800376 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800377 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378}
379
380Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800381 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800382{
383 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800384
Valerie Hau9758ae02018-10-09 16:05:09 -0700385 if (mClient_2_3) {
386 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
387 error = tmpError;
388 if (error != Error::NONE) {
389 return;
390 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700391
Valerie Hau9758ae02018-10-09 16:05:09 -0700392 *outModes = tmpModes;
393 });
394 } else if (mClient_2_2) {
395 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
396 error = tmpError;
397 if (error != Error::NONE) {
398 return;
399 }
400
401 for (types::V1_1::ColorMode colorMode : tmpModes) {
402 outModes->push_back(static_cast<ColorMode>(colorMode));
403 }
404 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700405 } else {
406 mClient->getColorModes(display,
407 [&](const auto& tmpError, const auto& tmpModes) {
408 error = tmpError;
409 if (error != Error::NONE) {
410 return;
411 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700412 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700413 outModes->push_back(static_cast<ColorMode>(colorMode));
414 }
415 });
416 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800417
418 return error;
419}
420
421Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800422 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423{
424 Error error = kDefaultError;
Ady Abraham7159f572019-10-11 11:10:18 -0700425 if (mClient_2_4) {
426 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
427 [&](const auto& tmpError, const auto& tmpValue) {
428 error = static_cast<Error>(tmpError);
429 if (error != Error::NONE) {
430 return;
431 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800432
Ady Abraham7159f572019-10-11 11:10:18 -0700433 *outValue = tmpValue;
434 });
435 } else {
436 mClient->getDisplayAttribute(display, config,
437 static_cast<V2_1::IComposerClient::Attribute>(attribute),
438 [&](const auto& tmpError, const auto& tmpValue) {
439 error = tmpError;
440 if (error != Error::NONE) {
441 return;
442 }
443
444 *outValue = tmpValue;
445 });
446 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800447
448 return error;
449}
450
451Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800452 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453{
454 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800455 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456 [&](const auto& tmpError, const auto& tmpConfigs) {
457 error = tmpError;
458 if (error != Error::NONE) {
459 return;
460 }
461
Chia-I Wu67e376d2016-12-19 11:36:22 +0800462 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800463 });
464
465 return error;
466}
467
Chia-I Wu67e376d2016-12-19 11:36:22 +0800468Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469{
470 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800471 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472 [&](const auto& tmpError, const auto& tmpName) {
473 error = tmpError;
474 if (error != Error::NONE) {
475 return;
476 }
477
Chia-I Wu67e376d2016-12-19 11:36:22 +0800478 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800479 });
480
481 return error;
482}
483
484Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800485 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
486 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800487{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800488 mReader.takeDisplayRequests(display, outDisplayRequestMask,
489 outLayers, outLayerRequestMasks);
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::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800494{
495 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800496 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800497 [&](const auto& tmpError, const auto& tmpSupport) {
498 error = tmpError;
499 if (error != Error::NONE) {
500 return;
501 }
502
Chia-I Wu67e376d2016-12-19 11:36:22 +0800503 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504 });
505
506 return error;
507}
508
Chia-I Wu67e376d2016-12-19 11:36:22 +0800509Error Composer::getHdrCapabilities(Display display,
510 std::vector<Hdr>* outTypes, float* outMaxLuminance,
511 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800512{
513 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800514 if (mClient_2_3) {
515 mClient_2_3->getHdrCapabilities_2_3(display,
516 [&](const auto& tmpError, const auto& tmpTypes,
517 const auto& tmpMaxLuminance,
518 const auto& tmpMaxAverageLuminance,
519 const auto& tmpMinLuminance) {
520 error = tmpError;
521 if (error != Error::NONE) {
522 return;
523 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800524
Valerie Haue9e843a2018-12-18 13:39:23 -0800525 *outTypes = tmpTypes;
526 *outMaxLuminance = tmpMaxLuminance;
527 *outMaxAverageLuminance = tmpMaxAverageLuminance;
528 *outMinLuminance = tmpMinLuminance;
529 });
530 } else {
531 mClient->getHdrCapabilities(display,
532 [&](const auto& tmpError, const auto& tmpTypes,
533 const auto& tmpMaxLuminance,
534 const auto& tmpMaxAverageLuminance,
535 const auto& tmpMinLuminance) {
536 error = tmpError;
537 if (error != Error::NONE) {
538 return;
539 }
540
541 outTypes->clear();
542 for (auto type : tmpTypes) {
543 outTypes->push_back(static_cast<Hdr>(type));
544 }
545
546 *outMaxLuminance = tmpMaxLuminance;
547 *outMaxAverageLuminance = tmpMaxAverageLuminance;
548 *outMinLuminance = tmpMinLuminance;
549 });
550 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800551
552 return error;
553}
554
Chia-I Wu67e376d2016-12-19 11:36:22 +0800555Error Composer::getReleaseFences(Display display,
556 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800557{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800558 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800559 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800560}
561
Chia-I Wu67e376d2016-12-19 11:36:22 +0800562Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800564 mWriter.selectDisplay(display);
565 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800566
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800567 Error error = execute();
568 if (error != Error::NONE) {
569 return error;
570 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800571
Chia-I Wu67e376d2016-12-19 11:36:22 +0800572 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800573
574 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800575}
576
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800577Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800578{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800579 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800580 return unwrapRet(ret);
581}
582
Chia-I Wu06d63de2017-01-04 14:58:51 +0800583Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400584 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800585 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800586 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800587{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800588 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700589
590#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400591 if (mIsUsingVrComposer && target.get()) {
592 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700593 .width = target->getWidth(),
594 .height = target->getHeight(),
595 .stride = target->getStride(),
596 .layerCount = target->getLayerCount(),
597 .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()),
598 .usage = target->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400599 };
600 mWriter.setClientTargetMetadata(metadata);
601 }
mamik94e91f62019-08-19 09:11:33 -0700602#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400603
604 const native_handle_t* handle = nullptr;
605 if (target.get()) {
606 handle = target->getNativeBuffer()->handle;
607 }
608
609 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800610 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800611}
612
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700613Error Composer::setColorMode(Display display, ColorMode mode,
614 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800615{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700616 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700617 if (mClient_2_3) {
618 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
619 } else if (mClient_2_2) {
620 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
621 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700622 } else {
623 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700624 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700625 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800626 return unwrapRet(ret);
627}
628
629Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800630 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800631{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800632 mWriter.selectDisplay(display);
633 mWriter.setColorTransform(matrix, hint);
634 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800635}
636
637Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800638 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800639{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800640 mWriter.selectDisplay(display);
641 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
642 return Error::NONE;
643}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800644
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700645Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
646 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700647 if (mClient_2_2) {
648 ret = mClient_2_2->setPowerMode_2_2(display, mode);
649 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700650 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700651 }
652
Chia-I Wuaab99f52016-10-05 12:59:58 +0800653 return unwrapRet(ret);
654}
655
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800656Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800657{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800658 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800659 return unwrapRet(ret);
660}
661
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800662Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800663{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800664 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800665 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800666 return unwrapRet(ret);
667}
668
Chia-I Wu67e376d2016-12-19 11:36:22 +0800669Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
670 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800671{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800672 mWriter.selectDisplay(display);
673 mWriter.validateDisplay();
674
675 Error error = execute();
676 if (error != Error::NONE) {
677 return error;
678 }
679
Chia-I Wu67e376d2016-12-19 11:36:22 +0800680 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800681
682 return Error::NONE;
683}
684
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700685Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
686 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
687 mWriter.selectDisplay(display);
688 mWriter.presentOrvalidateDisplay();
689
690 Error error = execute();
691 if (error != Error::NONE) {
692 return error;
693 }
694
695 mReader.takePresentOrValidateStage(display, state);
696
697 if (*state == 1) { // Present succeeded
698 mReader.takePresentFence(display, outPresentFence);
699 }
700
701 if (*state == 0) { // Validate succeeded.
702 mReader.hasChanges(display, outNumTypes, outNumRequests);
703 }
704
705 return Error::NONE;
706}
707
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800708Error Composer::setCursorPosition(Display display, Layer layer,
709 int32_t x, int32_t y)
710{
711 mWriter.selectDisplay(display);
712 mWriter.selectLayer(layer);
713 mWriter.setLayerCursorPosition(x, y);
714 return Error::NONE;
715}
716
717Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400718 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800719{
720 mWriter.selectDisplay(display);
721 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700722
723#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400724 if (mIsUsingVrComposer && buffer.get()) {
725 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700726 .width = buffer->getWidth(),
727 .height = buffer->getHeight(),
728 .stride = buffer->getStride(),
729 .layerCount = buffer->getLayerCount(),
730 .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()),
731 .usage = buffer->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400732 };
733 mWriter.setLayerBufferMetadata(metadata);
734 }
mamik94e91f62019-08-19 09:11:33 -0700735#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400736
737 const native_handle_t* handle = nullptr;
738 if (buffer.get()) {
739 handle = buffer->getNativeBuffer()->handle;
740 }
741
742 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800743 return Error::NONE;
744}
745
746Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
747 const std::vector<IComposerClient::Rect>& damage)
748{
749 mWriter.selectDisplay(display);
750 mWriter.selectLayer(layer);
751 mWriter.setLayerSurfaceDamage(damage);
752 return Error::NONE;
753}
754
755Error Composer::setLayerBlendMode(Display display, Layer layer,
756 IComposerClient::BlendMode mode)
757{
758 mWriter.selectDisplay(display);
759 mWriter.selectLayer(layer);
760 mWriter.setLayerBlendMode(mode);
761 return Error::NONE;
762}
763
764Error Composer::setLayerColor(Display display, Layer layer,
765 const IComposerClient::Color& color)
766{
767 mWriter.selectDisplay(display);
768 mWriter.selectLayer(layer);
769 mWriter.setLayerColor(color);
770 return Error::NONE;
771}
772
773Error Composer::setLayerCompositionType(Display display, Layer layer,
774 IComposerClient::Composition type)
775{
776 mWriter.selectDisplay(display);
777 mWriter.selectLayer(layer);
778 mWriter.setLayerCompositionType(type);
779 return Error::NONE;
780}
781
782Error Composer::setLayerDataspace(Display display, Layer layer,
783 Dataspace dataspace)
784{
785 mWriter.selectDisplay(display);
786 mWriter.selectLayer(layer);
787 mWriter.setLayerDataspace(dataspace);
788 return Error::NONE;
789}
790
791Error Composer::setLayerDisplayFrame(Display display, Layer layer,
792 const IComposerClient::Rect& frame)
793{
794 mWriter.selectDisplay(display);
795 mWriter.selectLayer(layer);
796 mWriter.setLayerDisplayFrame(frame);
797 return Error::NONE;
798}
799
800Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
801 float alpha)
802{
803 mWriter.selectDisplay(display);
804 mWriter.selectLayer(layer);
805 mWriter.setLayerPlaneAlpha(alpha);
806 return Error::NONE;
807}
808
809Error Composer::setLayerSidebandStream(Display display, Layer layer,
810 const native_handle_t* stream)
811{
812 mWriter.selectDisplay(display);
813 mWriter.selectLayer(layer);
814 mWriter.setLayerSidebandStream(stream);
815 return Error::NONE;
816}
817
818Error Composer::setLayerSourceCrop(Display display, Layer layer,
819 const IComposerClient::FRect& crop)
820{
821 mWriter.selectDisplay(display);
822 mWriter.selectLayer(layer);
823 mWriter.setLayerSourceCrop(crop);
824 return Error::NONE;
825}
826
827Error Composer::setLayerTransform(Display display, Layer layer,
828 Transform transform)
829{
830 mWriter.selectDisplay(display);
831 mWriter.selectLayer(layer);
832 mWriter.setLayerTransform(transform);
833 return Error::NONE;
834}
835
836Error Composer::setLayerVisibleRegion(Display display, Layer layer,
837 const std::vector<IComposerClient::Rect>& visible)
838{
839 mWriter.selectDisplay(display);
840 mWriter.selectLayer(layer);
841 mWriter.setLayerVisibleRegion(visible);
842 return Error::NONE;
843}
844
845Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
846{
847 mWriter.selectDisplay(display);
848 mWriter.selectLayer(layer);
849 mWriter.setLayerZOrder(z);
850 return Error::NONE;
851}
852
mamik94e91f62019-08-19 09:11:33 -0700853#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500854Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
855 uint32_t appId)
856{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800857 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500858 mWriter.selectDisplay(display);
859 mWriter.selectLayer(layer);
860 mWriter.setLayerInfo(type, appId);
861 }
862 return Error::NONE;
863}
mamik94e91f62019-08-19 09:11:33 -0700864#else
865Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) {
866 if (mIsUsingVrComposer) {
867 mWriter.selectDisplay(display);
868 mWriter.selectLayer(layer);
869 }
870 return Error::NONE;
871}
872#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500873
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800874Error Composer::execute()
875{
876 // prepare input command queue
877 bool queueChanged = false;
878 uint32_t commandLength = 0;
879 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800880 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800881 mWriter.reset();
882 return Error::NO_RESOURCES;
883 }
884
885 // set up new input command queue if necessary
886 if (queueChanged) {
887 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
888 auto error = unwrapRet(ret);
889 if (error != Error::NONE) {
890 mWriter.reset();
891 return error;
892 }
893 }
894
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700895 if (commandLength == 0) {
896 mWriter.reset();
897 return Error::NONE;
898 }
899
Chia-I Wuaab99f52016-10-05 12:59:58 +0800900 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700901 hardware::Return<void> ret;
902 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
903 const auto& tmpOutLength, const auto& tmpOutHandles)
904 {
905 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800906
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700907 // set up new output command queue if necessary
908 if (error == Error::NONE && tmpOutChanged) {
909 error = kDefaultError;
910 mClient->getOutputCommandQueue(
911 [&](const auto& tmpError,
912 const auto& tmpDescriptor)
913 {
914 error = tmpError;
915 if (error != Error::NONE) {
916 return;
917 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700919 mReader.setMQDescriptor(tmpDescriptor);
920 });
921 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800922
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700923 if (error != Error::NONE) {
924 return;
925 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800926
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700927 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
928 error = mReader.parse();
929 mReader.reset();
930 } else {
931 error = Error::NO_RESOURCES;
932 }
933 };
934 if (mClient_2_2) {
935 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
936 } else {
937 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
938 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700939 // executeCommands can fail because of out-of-fd and we do not want to
940 // abort() in that case
941 if (!ret.isOk()) {
942 ALOGE("executeCommands failed because of %s", ret.description().c_str());
943 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800944
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800945 if (error == Error::NONE) {
946 std::vector<CommandReader::CommandError> commandErrors =
947 mReader.takeErrors();
948
949 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700950 auto command =
951 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800952
953 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700954 command == IComposerClient::Command::PRESENT_DISPLAY ||
955 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800956 error = cmdErr.error;
957 } else {
958 ALOGW("command 0x%x generated error %d",
959 command, cmdErr.error);
960 }
961 }
962 }
963
964 mWriter.reset();
965
Chia-I Wuaab99f52016-10-05 12:59:58 +0800966 return error;
967}
968
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700969// Composer HAL 2.2
970
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700971Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
972 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
973 if (!mClient_2_2) {
974 return Error::UNSUPPORTED;
975 }
976
977 mWriter.selectDisplay(display);
978 mWriter.selectLayer(layer);
979 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
980 return Error::NONE;
981}
982
Chia-I Wud7e01d72018-06-21 13:39:09 +0800983std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
984 Display display) {
985 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700986 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800987 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700988 }
989
990 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800991 if (mClient_2_3) {
992 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
993 [&](const auto& tmpError, const auto& tmpKeys) {
994 error = tmpError;
995 if (error != Error::NONE) {
996 ALOGW("getPerFrameMetadataKeys failed "
997 "with %d",
998 tmpError);
999 return;
1000 }
1001 keys = tmpKeys;
1002 });
1003 } else {
1004 mClient_2_2
1005 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
1006 error = tmpError;
1007 if (error != Error::NONE) {
1008 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
1009 return;
1010 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001011
Valerie Haue9e843a2018-12-18 13:39:23 -08001012 keys.clear();
1013 for (auto key : tmpKeys) {
1014 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
1015 }
1016 });
1017 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001018
Chia-I Wud7e01d72018-06-21 13:39:09 +08001019 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001020}
1021
1022Error Composer::getRenderIntents(Display display, ColorMode colorMode,
1023 std::vector<RenderIntent>* outRenderIntents) {
1024 if (!mClient_2_2) {
1025 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1026 return Error::NONE;
1027 }
1028
1029 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001030
1031 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001032 error = tmpError;
1033 if (error != Error::NONE) {
1034 return;
1035 }
1036
1037 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001038 };
1039
1040 if (mClient_2_3) {
1041 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1042 } else {
1043 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1044 getRenderIntentsLambda);
1045 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001046
1047 return error;
1048}
1049
1050Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1051{
1052 if (!mClient_2_2) {
1053 *outMatrix = mat4();
1054 return Error::NONE;
1055 }
1056
1057 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001058 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1059 [&](const auto& tmpError, const auto& tmpMatrix) {
1060 error = tmpError;
1061 if (error != Error::NONE) {
1062 return;
1063 }
1064 *outMatrix = mat4(tmpMatrix.data());
1065 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001066
1067 return error;
1068}
1069
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001070// Composer HAL 2.3
1071
1072Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1073 std::vector<uint8_t>* outData) {
1074 if (!mClient_2_3) {
1075 return Error::UNSUPPORTED;
1076 }
1077
1078 Error error = kDefaultError;
1079 mClient_2_3->getDisplayIdentificationData(display,
1080 [&](const auto& tmpError, const auto& tmpPort,
1081 const auto& tmpData) {
1082 error = tmpError;
1083 if (error != Error::NONE) {
1084 return;
1085 }
1086
1087 *outPort = tmpPort;
1088 *outData = tmpData;
1089 });
1090
1091 return error;
1092}
1093
Peiyong Lin698147a2018-09-14 13:27:18 -07001094Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1095{
1096 if (!mClient_2_3) {
1097 return Error::UNSUPPORTED;
1098 }
1099
1100 mWriter.selectDisplay(display);
1101 mWriter.selectLayer(layer);
1102 mWriter.setLayerColorTransform(matrix);
1103 return Error::NONE;
1104}
1105
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001106Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1107 Dataspace* outDataspace,
1108 uint8_t* outComponentMask) {
1109 if (!outFormat || !outDataspace || !outComponentMask) {
1110 return Error::BAD_PARAMETER;
1111 }
1112 if (!mClient_2_3) {
1113 return Error::UNSUPPORTED;
1114 }
1115 Error error = kDefaultError;
1116 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1117 [&](const auto tmpError,
1118 const auto& tmpFormat,
1119 const auto& tmpDataspace,
1120 const auto& tmpComponentMask) {
1121 error = tmpError;
1122 if (error == Error::NONE) {
1123 *outFormat = tmpFormat;
1124 *outDataspace = tmpDataspace;
1125 *outComponentMask =
1126 static_cast<uint8_t>(
1127 tmpComponentMask);
1128 }
1129 });
1130 return error;
1131}
1132
Kevin DuBois74e53772018-11-19 10:52:38 -08001133Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1134 uint8_t componentMask, uint64_t maxFrames) {
1135 if (!mClient_2_3) {
1136 return Error::UNSUPPORTED;
1137 }
1138
1139 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1140 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1141 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1142 maxFrames);
1143}
1144
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001145Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1146 DisplayedFrameStats* outStats) {
1147 if (!outStats) {
1148 return Error::BAD_PARAMETER;
1149 }
1150 if (!mClient_2_3) {
1151 return Error::UNSUPPORTED;
1152 }
1153 Error error = kDefaultError;
1154 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1155 [&](const auto tmpError, auto tmpNumFrames,
1156 const auto& tmpSamples0, const auto& tmpSamples1,
1157 const auto& tmpSamples2, const auto& tmpSamples3) {
1158 error = tmpError;
1159 if (error == Error::NONE) {
1160 outStats->numFrames = tmpNumFrames;
1161 outStats->component_0_sample = tmpSamples0;
1162 outStats->component_1_sample = tmpSamples1;
1163 outStats->component_2_sample = tmpSamples2;
1164 outStats->component_3_sample = tmpSamples3;
1165 }
1166 });
1167 return error;
1168}
1169
Valerie Haue9e843a2018-12-18 13:39:23 -08001170Error Composer::setLayerPerFrameMetadataBlobs(
1171 Display display, Layer layer,
1172 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1173 if (!mClient_2_3) {
1174 return Error::UNSUPPORTED;
1175 }
1176
1177 mWriter.selectDisplay(display);
1178 mWriter.selectLayer(layer);
1179 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1180 return Error::NONE;
1181}
1182
Dan Gittik57e63c52019-01-18 16:37:54 +00001183Error Composer::setDisplayBrightness(Display display, float brightness) {
1184 if (!mClient_2_3) {
1185 return Error::UNSUPPORTED;
1186 }
1187 return mClient_2_3->setDisplayBrightness(display, brightness);
1188}
1189
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001190// Composer HAL 2.4
1191
1192Error Composer::getDisplayCapabilities(Display display,
1193 std::vector<DisplayCapability>* outCapabilities) {
1194 if (!mClient_2_3) {
1195 return Error::UNSUPPORTED;
1196 }
1197
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001198 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001199 if (mClient_2_4) {
1200 mClient_2_4->getDisplayCapabilities_2_4(display,
1201 [&](const auto& tmpError, const auto& tmpCaps) {
1202 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001203 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001204 return;
1205 }
1206 *outCapabilities = tmpCaps;
1207 });
1208 } else {
1209 mClient_2_3
1210 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001211 error = static_cast<V2_4::Error>(tmpError);
1212 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001213 return;
1214 }
1215
1216 outCapabilities->resize(tmpCaps.size());
1217 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1218 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1219 });
1220 }
1221
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001222 return static_cast<Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001223}
1224
Ady Abraham7159f572019-10-11 11:10:18 -07001225V2_4::Error Composer::getDisplayConnectionType(Display display,
1226 IComposerClient::DisplayConnectionType* outType) {
1227 using Error = V2_4::Error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001228 if (!mClient_2_4) {
1229 return Error::UNSUPPORTED;
1230 }
1231
Ady Abraham7159f572019-10-11 11:10:18 -07001232 Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001233 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1234 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001235 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001236 return;
1237 }
1238
1239 *outType = tmpType;
1240 });
1241
Ady Abraham7159f572019-10-11 11:10:18 -07001242 return error;
1243}
1244
1245V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1246 using Error = V2_4::Error;
1247 if (!mClient_2_4) {
1248 return Error::UNSUPPORTED;
1249 }
1250
1251 Error error = kDefaultError_2_4;
1252 mClient_2_4->getDisplayVsyncPeriod(display,
1253 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1254 error = tmpError;
1255 if (error != Error::NONE) {
1256 return;
1257 }
1258
1259 *outVsyncPeriod = tmpVsyncPeriod;
1260 });
1261
1262 return error;
1263}
1264
1265V2_4::Error Composer::setActiveConfigWithConstraints(
1266 Display display, Config config,
1267 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1268 VsyncPeriodChangeTimeline* outTimeline) {
1269 using Error = V2_4::Error;
1270 if (!mClient_2_4) {
1271 return Error::UNSUPPORTED;
1272 }
1273
1274 Error error = kDefaultError_2_4;
1275 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1276 [&](const auto& tmpError, const auto& tmpTimeline) {
1277 error = tmpError;
1278 if (error != Error::NONE) {
1279 return;
1280 }
1281
1282 *outTimeline = tmpTimeline;
1283 });
1284
1285 return error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001286}
1287
Galia Peycheva5492cb52019-10-30 14:13:16 +01001288V2_4::Error Composer::setAutoLowLatencyMode(Display display, bool on) {
1289 using Error = V2_4::Error;
1290 if (!mClient_2_4) {
1291 return Error::UNSUPPORTED;
1292 }
1293
1294 return mClient_2_4->setAutoLowLatencyMode(display, on);
1295}
1296
1297V2_4::Error Composer::getSupportedContentTypes(
1298 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1299 using Error = V2_4::Error;
1300 if (!mClient_2_4) {
1301 return Error::UNSUPPORTED;
1302 }
1303
1304 Error error = kDefaultError_2_4;
1305 mClient_2_4->getSupportedContentTypes(displayId,
1306 [&](const auto& tmpError,
1307 const auto& tmpSupportedContentTypes) {
1308 error = tmpError;
1309 if (error != Error::NONE) {
1310 return;
1311 }
1312
1313 *outSupportedContentTypes = tmpSupportedContentTypes;
1314 });
1315 return error;
1316}
1317
1318V2_4::Error Composer::setContentType(Display display, IComposerClient::ContentType contentType) {
1319 using Error = V2_4::Error;
1320 if (!mClient_2_4) {
1321 return Error::UNSUPPORTED;
1322 }
1323
1324 return mClient_2_4->setContentType(display, contentType);
1325}
1326
Dan Stoza18d48cb2019-10-21 15:39:24 -07001327V2_4::Error Composer::setLayerGenericMetadata(Display display, Layer layer, const std::string& key,
1328 bool mandatory, const std::vector<uint8_t>& value) {
1329 using Error = V2_4::Error;
1330 if (!mClient_2_4) {
1331 return Error::UNSUPPORTED;
1332 }
1333 mWriter.selectDisplay(display);
1334 mWriter.selectLayer(layer);
1335 mWriter.setLayerGenericMetadata(key, mandatory, value);
1336 return Error::NONE;
1337}
1338
1339V2_4::Error Composer::getLayerGenericMetadataKeys(
1340 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1341 using Error = V2_4::Error;
1342 if (!mClient_2_4) {
1343 return Error::UNSUPPORTED;
1344 }
1345 Error error = kDefaultError_2_4;
1346 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1347 error = tmpError;
1348 if (error != Error::NONE) {
1349 return;
1350 }
1351
1352 *outKeys = tmpKeys;
1353 });
1354 return error;
1355}
1356
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001357Error Composer::getClientTargetProperty(
1358 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1359 mReader.takeClientTargetProperty(display, outClientTargetProperty);
1360 return Error::NONE;
1361}
1362
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001363CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001364{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001365 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001366}
1367
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001368Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001369{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001370 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001371
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001372 IComposerClient::Command command;
1373 uint16_t length = 0;
1374
1375 while (!isEmpty()) {
Peiyong Linafa0f572020-01-13 16:35:02 -08001376 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001377 break;
1378 }
1379
1380 bool parsed = false;
1381 switch (command) {
1382 case IComposerClient::Command::SELECT_DISPLAY:
1383 parsed = parseSelectDisplay(length);
1384 break;
1385 case IComposerClient::Command::SET_ERROR:
1386 parsed = parseSetError(length);
1387 break;
1388 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1389 parsed = parseSetChangedCompositionTypes(length);
1390 break;
1391 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1392 parsed = parseSetDisplayRequests(length);
1393 break;
1394 case IComposerClient::Command::SET_PRESENT_FENCE:
1395 parsed = parseSetPresentFence(length);
1396 break;
1397 case IComposerClient::Command::SET_RELEASE_FENCES:
1398 parsed = parseSetReleaseFences(length);
1399 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001400 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1401 parsed = parseSetPresentOrValidateDisplayResult(length);
1402 break;
Peiyong Linafa0f572020-01-13 16:35:02 -08001403 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1404 parsed = parseSetClientTargetProperty(length);
1405 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001406 default:
1407 parsed = false;
1408 break;
1409 }
1410
1411 endCommand();
1412
1413 if (!parsed) {
1414 ALOGE("failed to parse command 0x%x length %" PRIu16,
1415 command, length);
1416 break;
1417 }
1418 }
1419
1420 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001421}
1422
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001423bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001424{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001425 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001426 return false;
1427 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001428
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001429 mCurrentReturnData = &mReturnData[read64()];
1430
1431 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001432}
1433
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001434bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001435{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001436 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001437 return false;
1438 }
1439
1440 auto location = read();
1441 auto error = static_cast<Error>(readSigned());
1442
1443 mErrors.emplace_back(CommandError{location, error});
1444
1445 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001446}
1447
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001448bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001449{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001450 // (layer id, composition type) pairs
1451 if (length % 3 != 0 || !mCurrentReturnData) {
1452 return false;
1453 }
1454
1455 uint32_t count = length / 3;
1456 mCurrentReturnData->changedLayers.reserve(count);
1457 mCurrentReturnData->compositionTypes.reserve(count);
1458 while (count > 0) {
1459 auto layer = read64();
1460 auto type = static_cast<IComposerClient::Composition>(readSigned());
1461
1462 mCurrentReturnData->changedLayers.push_back(layer);
1463 mCurrentReturnData->compositionTypes.push_back(type);
1464
1465 count--;
1466 }
1467
1468 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001469}
1470
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001471bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001472{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001473 // display requests followed by (layer id, layer requests) pairs
1474 if (length % 3 != 1 || !mCurrentReturnData) {
1475 return false;
1476 }
1477
1478 mCurrentReturnData->displayRequests = read();
1479
1480 uint32_t count = (length - 1) / 3;
1481 mCurrentReturnData->requestedLayers.reserve(count);
1482 mCurrentReturnData->requestMasks.reserve(count);
1483 while (count > 0) {
1484 auto layer = read64();
1485 auto layerRequestMask = read();
1486
1487 mCurrentReturnData->requestedLayers.push_back(layer);
1488 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1489
1490 count--;
1491 }
1492
1493 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001494}
1495
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001496bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001497{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001498 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001499 !mCurrentReturnData) {
1500 return false;
1501 }
1502
1503 if (mCurrentReturnData->presentFence >= 0) {
1504 close(mCurrentReturnData->presentFence);
1505 }
1506 mCurrentReturnData->presentFence = readFence();
1507
1508 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001509}
1510
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001511bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001512{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001513 // (layer id, release fence index) pairs
1514 if (length % 3 != 0 || !mCurrentReturnData) {
1515 return false;
1516 }
1517
1518 uint32_t count = length / 3;
1519 mCurrentReturnData->releasedLayers.reserve(count);
1520 mCurrentReturnData->releaseFences.reserve(count);
1521 while (count > 0) {
1522 auto layer = read64();
1523 auto fence = readFence();
1524
1525 mCurrentReturnData->releasedLayers.push_back(layer);
1526 mCurrentReturnData->releaseFences.push_back(fence);
1527
1528 count--;
1529 }
1530
1531 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001532}
1533
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001534bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1535{
1536 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1537 return false;
1538 }
1539 mCurrentReturnData->presentOrValidateState = read();
1540 return true;
1541}
1542
Peiyong Linafa0f572020-01-13 16:35:02 -08001543bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1544 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1545 return false;
1546 }
1547 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1548 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1549 return true;
1550}
1551
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001552void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001553{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001554 mErrors.clear();
1555
1556 for (auto& data : mReturnData) {
1557 if (data.second.presentFence >= 0) {
1558 close(data.second.presentFence);
1559 }
1560 for (auto fence : data.second.releaseFences) {
1561 if (fence >= 0) {
1562 close(fence);
1563 }
1564 }
1565 }
1566
1567 mReturnData.clear();
1568 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001569}
1570
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001571std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001572{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001573 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001574}
1575
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001576bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001577 uint32_t* outNumChangedCompositionTypes,
1578 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001579{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001580 auto found = mReturnData.find(display);
1581 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001582 *outNumChangedCompositionTypes = 0;
1583 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001584 return false;
1585 }
1586
1587 const ReturnData& data = found->second;
1588
Chia-I Wu67e376d2016-12-19 11:36:22 +08001589 *outNumChangedCompositionTypes = data.compositionTypes.size();
1590 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001591
1592 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001593}
1594
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001595void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001596 std::vector<Layer>* outLayers,
1597 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001598{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001599 auto found = mReturnData.find(display);
1600 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001601 outLayers->clear();
1602 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001603 return;
1604 }
1605
1606 ReturnData& data = found->second;
1607
Chia-I Wu67e376d2016-12-19 11:36:22 +08001608 *outLayers = std::move(data.changedLayers);
1609 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001610}
1611
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001612void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001613 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1614 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001615{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001616 auto found = mReturnData.find(display);
1617 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001618 *outDisplayRequestMask = 0;
1619 outLayers->clear();
1620 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001621 return;
1622 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001623
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001624 ReturnData& data = found->second;
1625
Chia-I Wu67e376d2016-12-19 11:36:22 +08001626 *outDisplayRequestMask = data.displayRequests;
1627 *outLayers = std::move(data.requestedLayers);
1628 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001629}
1630
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001631void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001632 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001633{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001634 auto found = mReturnData.find(display);
1635 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001636 outLayers->clear();
1637 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001638 return;
1639 }
1640
1641 ReturnData& data = found->second;
1642
Chia-I Wu67e376d2016-12-19 11:36:22 +08001643 *outLayers = std::move(data.releasedLayers);
1644 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001645}
1646
Chia-I Wu67e376d2016-12-19 11:36:22 +08001647void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001648{
1649 auto found = mReturnData.find(display);
1650 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001651 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001652 return;
1653 }
1654
1655 ReturnData& data = found->second;
1656
Chia-I Wu67e376d2016-12-19 11:36:22 +08001657 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001658 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001659}
1660
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001661void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1662 auto found = mReturnData.find(display);
1663 if (found == mReturnData.end()) {
1664 *state= -1;
1665 return;
1666 }
1667 ReturnData& data = found->second;
1668 *state = data.presentOrValidateState;
1669}
1670
Peiyong Lindfc3f7c2020-05-07 20:15:50 -07001671void CommandReader::takeClientTargetProperty(
1672 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1673 auto found = mReturnData.find(display);
1674
1675 // If not found, return the default values.
1676 if (found == mReturnData.end()) {
1677 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1678 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1679 }
1680
1681 ReturnData& data = found->second;
1682 *outClientTargetProperty = data.clientTargetProperty;
1683}
1684
Lloyd Piquea822d522017-12-20 16:42:57 -08001685} // namespace impl
Chia-I Wuaab99f52016-10-05 12:59:58 +08001686} // namespace Hwc2
Chia-I Wuaab99f52016-10-05 12:59:58 +08001687} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001688
1689// TODO(b/129481165): remove the #pragma below and fix conversion issues
1690#pragma clang diagnostic pop // ignored "-Wconversion"