blob: eb032f3fe856f2fd330fddb160cf32bbbb29bb40 [file] [log] [blame]
Chia-I Wuaab99f52016-10-05 12:59:58 +08001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "HwcComposer"
19
Chia-I Wuaab99f52016-10-05 12:59:58 +080020#include <log/log.h>
21
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -070022#include <algorithm>
23#include <cinttypes>
24
Chia-I Wuaab99f52016-10-05 12:59:58 +080025#include "ComposerHal.h"
26
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070027#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
28#include <gui/BufferQueue.h>
Wei Wangae211b42019-06-07 17:22:49 -070029#include <hidl/HidlTransportSupport.h>
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070030#include <hidl/HidlTransportUtils.h>
31
Chia-I Wuaab99f52016-10-05 12:59:58 +080032namespace android {
33
34using hardware::Return;
35using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010036using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080037
38namespace Hwc2 {
39
Lloyd Piquea822d522017-12-20 16:42:57 -080040Composer::~Composer() = default;
41
Chia-I Wuaab99f52016-10-05 12:59:58 +080042namespace {
43
44class BufferHandle {
45public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080046 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080047 // nullptr is not a valid handle to HIDL
48 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
49 }
50
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080051 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080052 {
53 return mHandle;
54 }
55
56private:
57 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010058 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080059};
60
61class FenceHandle
62{
63public:
64 FenceHandle(int fd, bool owned)
65 : mOwned(owned)
66 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010067 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080068 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010069 handle = native_handle_init(mStorage, 1, 0);
70 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 } else {
72 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010075 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080076 }
77
78 ~FenceHandle()
79 {
80 if (mOwned) {
81 native_handle_close(mHandle);
82 }
83 }
84
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080085 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080086 {
87 return mHandle;
88 }
89
90private:
91 bool mOwned;
92 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010093 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080094};
95
96// assume NO_RESOURCES when Status::isOk returns false
97constexpr Error kDefaultError = Error::NO_RESOURCES;
Ady Abraham7159f572019-10-11 11:10:18 -070098constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
Chia-I Wuaab99f52016-10-05 12:59:58 +080099
100template<typename T, typename U>
101T unwrapRet(Return<T>& ret, const U& default_val)
102{
Steven Moreland9d021002017-01-03 17:10:54 -0800103 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800104 static_cast<T>(default_val);
105}
106
107Error unwrapRet(Return<Error>& ret)
108{
109 return unwrapRet(ret, kDefaultError);
110}
111
Chia-I Wuaab99f52016-10-05 12:59:58 +0800112} // anonymous namespace
113
Lloyd Piquea822d522017-12-20 16:42:57 -0800114namespace impl {
115
mamik94e91f62019-08-19 09:11:33 -0700116#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500117Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
118 : CommandWriterBase(initialMaxSize) {}
119
120Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800121{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500122}
123
124void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
125{
126 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700127 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700128 IVrComposerClient::VrCommand::SET_LAYER_INFO),
129 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500130 write(type);
131 write(appId);
132 endCommand();
133}
134
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400135void Composer::CommandWriter::setClientTargetMetadata(
136 const IVrComposerClient::BufferMetadata& metadata)
137{
138 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700139 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700140 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
141 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400142 writeBufferMetadata(metadata);
143 endCommand();
144}
145
146void Composer::CommandWriter::setLayerBufferMetadata(
147 const IVrComposerClient::BufferMetadata& metadata)
148{
149 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700150 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700151 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
152 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400153 writeBufferMetadata(metadata);
154 endCommand();
155}
156
157void Composer::CommandWriter::writeBufferMetadata(
158 const IVrComposerClient::BufferMetadata& metadata)
159{
160 write(metadata.width);
161 write(metadata.height);
162 write(metadata.stride);
163 write(metadata.layerCount);
164 writeSigned(static_cast<int32_t>(metadata.format));
165 write64(metadata.usage);
166}
mamik94e91f62019-08-19 09:11:33 -0700167#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400168
Kalle Raitaa099a242017-01-11 11:17:29 -0800169Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800170 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800171 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500172{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700173 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500174
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800175 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800176 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
177 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800178
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700179 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
180 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -0700181 if (tmpError == V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700182 mClient = tmpClient;
183 mClient_2_2 = tmpClient;
184 mClient_2_3 = tmpClient;
185 mClient_2_4 = tmpClient;
186 }
187 });
188 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700189 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
190 if (tmpError == Error::NONE) {
191 mClient = tmpClient;
192 mClient_2_2 = tmpClient;
193 mClient_2_3 = tmpClient;
194 }
195 });
196 } else {
197 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
198 if (tmpError != Error::NONE) {
199 return;
200 }
201
202 mClient = tmpClient;
203 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
204 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
205 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
206 "IComposer 2.2 did not return IComposerClient 2.2");
207 }
208 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800209 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400210
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700211 if (mClient == nullptr) {
212 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700213 }
214
mamik94e91f62019-08-19 09:11:33 -0700215#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400216 if (mIsUsingVrComposer) {
217 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
218 if (vrClient == nullptr) {
219 LOG_ALWAYS_FATAL("failed to create vr composer client");
220 }
221 }
mamik94e91f62019-08-19 09:11:33 -0700222#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223}
224
Lloyd Piquea822d522017-12-20 16:42:57 -0800225Composer::~Composer() = default;
226
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800227std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800228{
229 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800230 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800231 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800232 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800234 return capabilities;
235}
236
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800237std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800238{
239 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800240 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800241 info = tmpInfo.c_str();
242 });
243
244 return info;
245}
246
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800247void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248{
Wei Wangae211b42019-06-07 17:22:49 -0700249 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Ady Abraham7159f572019-10-11 11:10:18 -0700250 auto ret = [&]() {
251 if (mClient_2_4) {
252 return mClient_2_4->registerCallback_2_4(callback);
253 }
254 return mClient->registerCallback(callback);
255 }();
Steven Moreland9d021002017-01-03 17:10:54 -0800256 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257 ALOGE("failed to register IComposerCallback");
258 }
259}
260
Steven Thomasb02664d2017-07-26 18:48:28 -0700261bool Composer::isRemote() {
262 return mClient->isRemote();
263}
264
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700265void Composer::resetCommands() {
266 mWriter.reset();
267}
268
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700269Error Composer::executeCommands() {
270 return execute();
271}
272
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800273uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800274{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800275 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800276 return unwrapRet(ret, 0);
277}
278
279Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800280 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800281{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800282 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800283 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700284 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800285 mClient_2_2->createVirtualDisplay_2_2(width, height,
286 static_cast<types::V1_1::PixelFormat>(*format),
287 bufferSlotCount,
288 [&](const auto& tmpError, const auto& tmpDisplay,
289 const auto& tmpFormat) {
290 error = tmpError;
291 if (error != Error::NONE) {
292 return;
293 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800294
Kevin DuBois73d0f482019-01-25 11:18:03 -0800295 *outDisplay = tmpDisplay;
296 *format = static_cast<types::V1_2::PixelFormat>(
297 tmpFormat);
298 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700299 } else {
300 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700301 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700302 [&](const auto& tmpError, const auto& tmpDisplay,
303 const auto& tmpFormat) {
304 error = tmpError;
305 if (error != Error::NONE) {
306 return;
307 }
308
309 *outDisplay = tmpDisplay;
310 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800311 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700312 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313
314 return error;
315}
316
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800317Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800318{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800319 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800320 return unwrapRet(ret);
321}
322
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800323Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800325 mWriter.selectDisplay(display);
326 mWriter.acceptDisplayChanges();
327 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800328}
329
Chia-I Wu67e376d2016-12-19 11:36:22 +0800330Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800331{
332 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800333 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800334 [&](const auto& tmpError, const auto& tmpLayer) {
335 error = tmpError;
336 if (error != Error::NONE) {
337 return;
338 }
339
Chia-I Wu67e376d2016-12-19 11:36:22 +0800340 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800341 });
342
343 return error;
344}
345
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800346Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800348 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800349 return unwrapRet(ret);
350}
351
Chia-I Wu67e376d2016-12-19 11:36:22 +0800352Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800353{
354 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800355 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800356 [&](const auto& tmpError, const auto& tmpConfig) {
357 error = tmpError;
358 if (error != Error::NONE) {
359 return;
360 }
361
Chia-I Wu67e376d2016-12-19 11:36:22 +0800362 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800363 });
364
365 return error;
366}
367
368Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800369 std::vector<Layer>* outLayers,
370 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800371{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800372 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800373 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800374}
375
376Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800377 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378{
379 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800380
Valerie Hau9758ae02018-10-09 16:05:09 -0700381 if (mClient_2_3) {
382 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
383 error = tmpError;
384 if (error != Error::NONE) {
385 return;
386 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700387
Valerie Hau9758ae02018-10-09 16:05:09 -0700388 *outModes = tmpModes;
389 });
390 } else if (mClient_2_2) {
391 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
392 error = tmpError;
393 if (error != Error::NONE) {
394 return;
395 }
396
397 for (types::V1_1::ColorMode colorMode : tmpModes) {
398 outModes->push_back(static_cast<ColorMode>(colorMode));
399 }
400 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700401 } else {
402 mClient->getColorModes(display,
403 [&](const auto& tmpError, const auto& tmpModes) {
404 error = tmpError;
405 if (error != Error::NONE) {
406 return;
407 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700408 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700409 outModes->push_back(static_cast<ColorMode>(colorMode));
410 }
411 });
412 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800413
414 return error;
415}
416
417Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800418 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419{
420 Error error = kDefaultError;
Ady Abraham7159f572019-10-11 11:10:18 -0700421 if (mClient_2_4) {
422 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
423 [&](const auto& tmpError, const auto& tmpValue) {
424 error = static_cast<Error>(tmpError);
425 if (error != Error::NONE) {
426 return;
427 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800428
Ady Abraham7159f572019-10-11 11:10:18 -0700429 *outValue = tmpValue;
430 });
431 } else {
432 mClient->getDisplayAttribute(display, config,
433 static_cast<V2_1::IComposerClient::Attribute>(attribute),
434 [&](const auto& tmpError, const auto& tmpValue) {
435 error = tmpError;
436 if (error != Error::NONE) {
437 return;
438 }
439
440 *outValue = tmpValue;
441 });
442 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800443
444 return error;
445}
446
447Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800448 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449{
450 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800451 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800452 [&](const auto& tmpError, const auto& tmpConfigs) {
453 error = tmpError;
454 if (error != Error::NONE) {
455 return;
456 }
457
Chia-I Wu67e376d2016-12-19 11:36:22 +0800458 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800459 });
460
461 return error;
462}
463
Chia-I Wu67e376d2016-12-19 11:36:22 +0800464Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465{
466 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800467 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800468 [&](const auto& tmpError, const auto& tmpName) {
469 error = tmpError;
470 if (error != Error::NONE) {
471 return;
472 }
473
Chia-I Wu67e376d2016-12-19 11:36:22 +0800474 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800475 });
476
477 return error;
478}
479
480Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800481 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
482 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800483{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800484 mReader.takeDisplayRequests(display, outDisplayRequestMask,
485 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800486 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800487}
488
Chia-I Wu67e376d2016-12-19 11:36:22 +0800489Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800490{
491 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800492 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800493 [&](const auto& tmpError, const auto& tmpSupport) {
494 error = tmpError;
495 if (error != Error::NONE) {
496 return;
497 }
498
Chia-I Wu67e376d2016-12-19 11:36:22 +0800499 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800500 });
501
502 return error;
503}
504
Chia-I Wu67e376d2016-12-19 11:36:22 +0800505Error Composer::getHdrCapabilities(Display display,
506 std::vector<Hdr>* outTypes, float* outMaxLuminance,
507 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800508{
509 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800510 if (mClient_2_3) {
511 mClient_2_3->getHdrCapabilities_2_3(display,
512 [&](const auto& tmpError, const auto& tmpTypes,
513 const auto& tmpMaxLuminance,
514 const auto& tmpMaxAverageLuminance,
515 const auto& tmpMinLuminance) {
516 error = tmpError;
517 if (error != Error::NONE) {
518 return;
519 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800520
Valerie Haue9e843a2018-12-18 13:39:23 -0800521 *outTypes = tmpTypes;
522 *outMaxLuminance = tmpMaxLuminance;
523 *outMaxAverageLuminance = tmpMaxAverageLuminance;
524 *outMinLuminance = tmpMinLuminance;
525 });
526 } else {
527 mClient->getHdrCapabilities(display,
528 [&](const auto& tmpError, const auto& tmpTypes,
529 const auto& tmpMaxLuminance,
530 const auto& tmpMaxAverageLuminance,
531 const auto& tmpMinLuminance) {
532 error = tmpError;
533 if (error != Error::NONE) {
534 return;
535 }
536
537 outTypes->clear();
538 for (auto type : tmpTypes) {
539 outTypes->push_back(static_cast<Hdr>(type));
540 }
541
542 *outMaxLuminance = tmpMaxLuminance;
543 *outMaxAverageLuminance = tmpMaxAverageLuminance;
544 *outMinLuminance = tmpMinLuminance;
545 });
546 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800547
548 return error;
549}
550
Chia-I Wu67e376d2016-12-19 11:36:22 +0800551Error Composer::getReleaseFences(Display display,
552 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800554 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800555 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556}
557
Chia-I Wu67e376d2016-12-19 11:36:22 +0800558Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800559{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800560 mWriter.selectDisplay(display);
561 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800562
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800563 Error error = execute();
564 if (error != Error::NONE) {
565 return error;
566 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800567
Chia-I Wu67e376d2016-12-19 11:36:22 +0800568 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800569
570 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800571}
572
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800573Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800574{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800575 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800576 return unwrapRet(ret);
577}
578
Chia-I Wu06d63de2017-01-04 14:58:51 +0800579Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400580 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800581 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800582 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800583{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800584 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700585
586#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400587 if (mIsUsingVrComposer && target.get()) {
588 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700589 .width = target->getWidth(),
590 .height = target->getHeight(),
591 .stride = target->getStride(),
592 .layerCount = target->getLayerCount(),
593 .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()),
594 .usage = target->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400595 };
596 mWriter.setClientTargetMetadata(metadata);
597 }
mamik94e91f62019-08-19 09:11:33 -0700598#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400599
600 const native_handle_t* handle = nullptr;
601 if (target.get()) {
602 handle = target->getNativeBuffer()->handle;
603 }
604
605 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800606 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800607}
608
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700609Error Composer::setColorMode(Display display, ColorMode mode,
610 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800611{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700612 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700613 if (mClient_2_3) {
614 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
615 } else if (mClient_2_2) {
616 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
617 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700618 } else {
619 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700620 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700621 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800622 return unwrapRet(ret);
623}
624
625Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800626 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800627{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800628 mWriter.selectDisplay(display);
629 mWriter.setColorTransform(matrix, hint);
630 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800631}
632
633Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800634 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800635{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800636 mWriter.selectDisplay(display);
637 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
638 return Error::NONE;
639}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800640
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700641Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
642 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700643 if (mClient_2_2) {
644 ret = mClient_2_2->setPowerMode_2_2(display, mode);
645 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700646 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700647 }
648
Chia-I Wuaab99f52016-10-05 12:59:58 +0800649 return unwrapRet(ret);
650}
651
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800652Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800653{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800654 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800655 return unwrapRet(ret);
656}
657
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800658Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800659{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800660 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800661 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800662 return unwrapRet(ret);
663}
664
Chia-I Wu67e376d2016-12-19 11:36:22 +0800665Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
666 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800667{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800668 mWriter.selectDisplay(display);
669 mWriter.validateDisplay();
670
671 Error error = execute();
672 if (error != Error::NONE) {
673 return error;
674 }
675
Chia-I Wu67e376d2016-12-19 11:36:22 +0800676 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800677
678 return Error::NONE;
679}
680
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700681Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
682 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
683 mWriter.selectDisplay(display);
684 mWriter.presentOrvalidateDisplay();
685
686 Error error = execute();
687 if (error != Error::NONE) {
688 return error;
689 }
690
691 mReader.takePresentOrValidateStage(display, state);
692
693 if (*state == 1) { // Present succeeded
694 mReader.takePresentFence(display, outPresentFence);
695 }
696
697 if (*state == 0) { // Validate succeeded.
698 mReader.hasChanges(display, outNumTypes, outNumRequests);
699 }
700
701 return Error::NONE;
702}
703
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800704Error Composer::setCursorPosition(Display display, Layer layer,
705 int32_t x, int32_t y)
706{
707 mWriter.selectDisplay(display);
708 mWriter.selectLayer(layer);
709 mWriter.setLayerCursorPosition(x, y);
710 return Error::NONE;
711}
712
713Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400714 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800715{
716 mWriter.selectDisplay(display);
717 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700718
719#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400720 if (mIsUsingVrComposer && buffer.get()) {
721 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700722 .width = buffer->getWidth(),
723 .height = buffer->getHeight(),
724 .stride = buffer->getStride(),
725 .layerCount = buffer->getLayerCount(),
726 .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()),
727 .usage = buffer->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400728 };
729 mWriter.setLayerBufferMetadata(metadata);
730 }
mamik94e91f62019-08-19 09:11:33 -0700731#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400732
733 const native_handle_t* handle = nullptr;
734 if (buffer.get()) {
735 handle = buffer->getNativeBuffer()->handle;
736 }
737
738 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800739 return Error::NONE;
740}
741
742Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
743 const std::vector<IComposerClient::Rect>& damage)
744{
745 mWriter.selectDisplay(display);
746 mWriter.selectLayer(layer);
747 mWriter.setLayerSurfaceDamage(damage);
748 return Error::NONE;
749}
750
751Error Composer::setLayerBlendMode(Display display, Layer layer,
752 IComposerClient::BlendMode mode)
753{
754 mWriter.selectDisplay(display);
755 mWriter.selectLayer(layer);
756 mWriter.setLayerBlendMode(mode);
757 return Error::NONE;
758}
759
760Error Composer::setLayerColor(Display display, Layer layer,
761 const IComposerClient::Color& color)
762{
763 mWriter.selectDisplay(display);
764 mWriter.selectLayer(layer);
765 mWriter.setLayerColor(color);
766 return Error::NONE;
767}
768
769Error Composer::setLayerCompositionType(Display display, Layer layer,
770 IComposerClient::Composition type)
771{
772 mWriter.selectDisplay(display);
773 mWriter.selectLayer(layer);
774 mWriter.setLayerCompositionType(type);
775 return Error::NONE;
776}
777
778Error Composer::setLayerDataspace(Display display, Layer layer,
779 Dataspace dataspace)
780{
781 mWriter.selectDisplay(display);
782 mWriter.selectLayer(layer);
783 mWriter.setLayerDataspace(dataspace);
784 return Error::NONE;
785}
786
787Error Composer::setLayerDisplayFrame(Display display, Layer layer,
788 const IComposerClient::Rect& frame)
789{
790 mWriter.selectDisplay(display);
791 mWriter.selectLayer(layer);
792 mWriter.setLayerDisplayFrame(frame);
793 return Error::NONE;
794}
795
796Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
797 float alpha)
798{
799 mWriter.selectDisplay(display);
800 mWriter.selectLayer(layer);
801 mWriter.setLayerPlaneAlpha(alpha);
802 return Error::NONE;
803}
804
805Error Composer::setLayerSidebandStream(Display display, Layer layer,
806 const native_handle_t* stream)
807{
808 mWriter.selectDisplay(display);
809 mWriter.selectLayer(layer);
810 mWriter.setLayerSidebandStream(stream);
811 return Error::NONE;
812}
813
814Error Composer::setLayerSourceCrop(Display display, Layer layer,
815 const IComposerClient::FRect& crop)
816{
817 mWriter.selectDisplay(display);
818 mWriter.selectLayer(layer);
819 mWriter.setLayerSourceCrop(crop);
820 return Error::NONE;
821}
822
823Error Composer::setLayerTransform(Display display, Layer layer,
824 Transform transform)
825{
826 mWriter.selectDisplay(display);
827 mWriter.selectLayer(layer);
828 mWriter.setLayerTransform(transform);
829 return Error::NONE;
830}
831
832Error Composer::setLayerVisibleRegion(Display display, Layer layer,
833 const std::vector<IComposerClient::Rect>& visible)
834{
835 mWriter.selectDisplay(display);
836 mWriter.selectLayer(layer);
837 mWriter.setLayerVisibleRegion(visible);
838 return Error::NONE;
839}
840
841Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
842{
843 mWriter.selectDisplay(display);
844 mWriter.selectLayer(layer);
845 mWriter.setLayerZOrder(z);
846 return Error::NONE;
847}
848
mamik94e91f62019-08-19 09:11:33 -0700849#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500850Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
851 uint32_t appId)
852{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800853 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500854 mWriter.selectDisplay(display);
855 mWriter.selectLayer(layer);
856 mWriter.setLayerInfo(type, appId);
857 }
858 return Error::NONE;
859}
mamik94e91f62019-08-19 09:11:33 -0700860#else
861Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) {
862 if (mIsUsingVrComposer) {
863 mWriter.selectDisplay(display);
864 mWriter.selectLayer(layer);
865 }
866 return Error::NONE;
867}
868#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500869
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800870Error Composer::execute()
871{
872 // prepare input command queue
873 bool queueChanged = false;
874 uint32_t commandLength = 0;
875 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800876 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800877 mWriter.reset();
878 return Error::NO_RESOURCES;
879 }
880
881 // set up new input command queue if necessary
882 if (queueChanged) {
883 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
884 auto error = unwrapRet(ret);
885 if (error != Error::NONE) {
886 mWriter.reset();
887 return error;
888 }
889 }
890
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700891 if (commandLength == 0) {
892 mWriter.reset();
893 return Error::NONE;
894 }
895
Chia-I Wuaab99f52016-10-05 12:59:58 +0800896 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700897 hardware::Return<void> ret;
898 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
899 const auto& tmpOutLength, const auto& tmpOutHandles)
900 {
901 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800902
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700903 // set up new output command queue if necessary
904 if (error == Error::NONE && tmpOutChanged) {
905 error = kDefaultError;
906 mClient->getOutputCommandQueue(
907 [&](const auto& tmpError,
908 const auto& tmpDescriptor)
909 {
910 error = tmpError;
911 if (error != Error::NONE) {
912 return;
913 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800914
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700915 mReader.setMQDescriptor(tmpDescriptor);
916 });
917 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700919 if (error != Error::NONE) {
920 return;
921 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800922
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700923 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
924 error = mReader.parse();
925 mReader.reset();
926 } else {
927 error = Error::NO_RESOURCES;
928 }
929 };
930 if (mClient_2_2) {
931 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
932 } else {
933 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
934 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700935 // executeCommands can fail because of out-of-fd and we do not want to
936 // abort() in that case
937 if (!ret.isOk()) {
938 ALOGE("executeCommands failed because of %s", ret.description().c_str());
939 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800940
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800941 if (error == Error::NONE) {
942 std::vector<CommandReader::CommandError> commandErrors =
943 mReader.takeErrors();
944
945 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700946 auto command =
947 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800948
949 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700950 command == IComposerClient::Command::PRESENT_DISPLAY ||
951 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800952 error = cmdErr.error;
953 } else {
954 ALOGW("command 0x%x generated error %d",
955 command, cmdErr.error);
956 }
957 }
958 }
959
960 mWriter.reset();
961
Chia-I Wuaab99f52016-10-05 12:59:58 +0800962 return error;
963}
964
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700965// Composer HAL 2.2
966
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700967Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
968 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
969 if (!mClient_2_2) {
970 return Error::UNSUPPORTED;
971 }
972
973 mWriter.selectDisplay(display);
974 mWriter.selectLayer(layer);
975 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
976 return Error::NONE;
977}
978
Chia-I Wud7e01d72018-06-21 13:39:09 +0800979std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
980 Display display) {
981 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700982 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800983 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700984 }
985
986 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800987 if (mClient_2_3) {
988 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
989 [&](const auto& tmpError, const auto& tmpKeys) {
990 error = tmpError;
991 if (error != Error::NONE) {
992 ALOGW("getPerFrameMetadataKeys failed "
993 "with %d",
994 tmpError);
995 return;
996 }
997 keys = tmpKeys;
998 });
999 } else {
1000 mClient_2_2
1001 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
1002 error = tmpError;
1003 if (error != Error::NONE) {
1004 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
1005 return;
1006 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001007
Valerie Haue9e843a2018-12-18 13:39:23 -08001008 keys.clear();
1009 for (auto key : tmpKeys) {
1010 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
1011 }
1012 });
1013 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001014
Chia-I Wud7e01d72018-06-21 13:39:09 +08001015 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001016}
1017
1018Error Composer::getRenderIntents(Display display, ColorMode colorMode,
1019 std::vector<RenderIntent>* outRenderIntents) {
1020 if (!mClient_2_2) {
1021 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1022 return Error::NONE;
1023 }
1024
1025 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001026
1027 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001028 error = tmpError;
1029 if (error != Error::NONE) {
1030 return;
1031 }
1032
1033 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001034 };
1035
1036 if (mClient_2_3) {
1037 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1038 } else {
1039 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1040 getRenderIntentsLambda);
1041 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001042
1043 return error;
1044}
1045
1046Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1047{
1048 if (!mClient_2_2) {
1049 *outMatrix = mat4();
1050 return Error::NONE;
1051 }
1052
1053 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001054 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1055 [&](const auto& tmpError, const auto& tmpMatrix) {
1056 error = tmpError;
1057 if (error != Error::NONE) {
1058 return;
1059 }
1060 *outMatrix = mat4(tmpMatrix.data());
1061 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001062
1063 return error;
1064}
1065
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001066// Composer HAL 2.3
1067
1068Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1069 std::vector<uint8_t>* outData) {
1070 if (!mClient_2_3) {
1071 return Error::UNSUPPORTED;
1072 }
1073
1074 Error error = kDefaultError;
1075 mClient_2_3->getDisplayIdentificationData(display,
1076 [&](const auto& tmpError, const auto& tmpPort,
1077 const auto& tmpData) {
1078 error = tmpError;
1079 if (error != Error::NONE) {
1080 return;
1081 }
1082
1083 *outPort = tmpPort;
1084 *outData = tmpData;
1085 });
1086
1087 return error;
1088}
1089
Peiyong Lin698147a2018-09-14 13:27:18 -07001090Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1091{
1092 if (!mClient_2_3) {
1093 return Error::UNSUPPORTED;
1094 }
1095
1096 mWriter.selectDisplay(display);
1097 mWriter.selectLayer(layer);
1098 mWriter.setLayerColorTransform(matrix);
1099 return Error::NONE;
1100}
1101
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001102Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1103 Dataspace* outDataspace,
1104 uint8_t* outComponentMask) {
1105 if (!outFormat || !outDataspace || !outComponentMask) {
1106 return Error::BAD_PARAMETER;
1107 }
1108 if (!mClient_2_3) {
1109 return Error::UNSUPPORTED;
1110 }
1111 Error error = kDefaultError;
1112 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1113 [&](const auto tmpError,
1114 const auto& tmpFormat,
1115 const auto& tmpDataspace,
1116 const auto& tmpComponentMask) {
1117 error = tmpError;
1118 if (error == Error::NONE) {
1119 *outFormat = tmpFormat;
1120 *outDataspace = tmpDataspace;
1121 *outComponentMask =
1122 static_cast<uint8_t>(
1123 tmpComponentMask);
1124 }
1125 });
1126 return error;
1127}
1128
Kevin DuBois74e53772018-11-19 10:52:38 -08001129Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1130 uint8_t componentMask, uint64_t maxFrames) {
1131 if (!mClient_2_3) {
1132 return Error::UNSUPPORTED;
1133 }
1134
1135 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1136 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1137 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1138 maxFrames);
1139}
1140
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001141Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1142 DisplayedFrameStats* outStats) {
1143 if (!outStats) {
1144 return Error::BAD_PARAMETER;
1145 }
1146 if (!mClient_2_3) {
1147 return Error::UNSUPPORTED;
1148 }
1149 Error error = kDefaultError;
1150 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1151 [&](const auto tmpError, auto tmpNumFrames,
1152 const auto& tmpSamples0, const auto& tmpSamples1,
1153 const auto& tmpSamples2, const auto& tmpSamples3) {
1154 error = tmpError;
1155 if (error == Error::NONE) {
1156 outStats->numFrames = tmpNumFrames;
1157 outStats->component_0_sample = tmpSamples0;
1158 outStats->component_1_sample = tmpSamples1;
1159 outStats->component_2_sample = tmpSamples2;
1160 outStats->component_3_sample = tmpSamples3;
1161 }
1162 });
1163 return error;
1164}
1165
Valerie Haue9e843a2018-12-18 13:39:23 -08001166Error Composer::setLayerPerFrameMetadataBlobs(
1167 Display display, Layer layer,
1168 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1169 if (!mClient_2_3) {
1170 return Error::UNSUPPORTED;
1171 }
1172
1173 mWriter.selectDisplay(display);
1174 mWriter.selectLayer(layer);
1175 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1176 return Error::NONE;
1177}
1178
Dan Gittik57e63c52019-01-18 16:37:54 +00001179Error Composer::setDisplayBrightness(Display display, float brightness) {
1180 if (!mClient_2_3) {
1181 return Error::UNSUPPORTED;
1182 }
1183 return mClient_2_3->setDisplayBrightness(display, brightness);
1184}
1185
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001186// Composer HAL 2.4
1187
1188Error Composer::getDisplayCapabilities(Display display,
1189 std::vector<DisplayCapability>* outCapabilities) {
1190 if (!mClient_2_3) {
1191 return Error::UNSUPPORTED;
1192 }
1193
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001194 V2_4::Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001195 if (mClient_2_4) {
1196 mClient_2_4->getDisplayCapabilities_2_4(display,
1197 [&](const auto& tmpError, const auto& tmpCaps) {
1198 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001199 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001200 return;
1201 }
1202 *outCapabilities = tmpCaps;
1203 });
1204 } else {
1205 mClient_2_3
1206 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001207 error = static_cast<V2_4::Error>(tmpError);
1208 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001209 return;
1210 }
1211
1212 outCapabilities->resize(tmpCaps.size());
1213 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1214 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1215 });
1216 }
1217
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001218 return static_cast<Error>(error);
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001219}
1220
Ady Abraham7159f572019-10-11 11:10:18 -07001221V2_4::Error Composer::getDisplayConnectionType(Display display,
1222 IComposerClient::DisplayConnectionType* outType) {
1223 using Error = V2_4::Error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001224 if (!mClient_2_4) {
1225 return Error::UNSUPPORTED;
1226 }
1227
Ady Abraham7159f572019-10-11 11:10:18 -07001228 Error error = kDefaultError_2_4;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001229 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1230 error = tmpError;
Ady Abrahamf2e339e2019-10-16 18:23:35 -07001231 if (error != V2_4::Error::NONE) {
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001232 return;
1233 }
1234
1235 *outType = tmpType;
1236 });
1237
Ady Abraham7159f572019-10-11 11:10:18 -07001238 return error;
1239}
1240
1241V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1242 using Error = V2_4::Error;
1243 if (!mClient_2_4) {
1244 return Error::UNSUPPORTED;
1245 }
1246
1247 Error error = kDefaultError_2_4;
1248 mClient_2_4->getDisplayVsyncPeriod(display,
1249 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1250 error = tmpError;
1251 if (error != Error::NONE) {
1252 return;
1253 }
1254
1255 *outVsyncPeriod = tmpVsyncPeriod;
1256 });
1257
1258 return error;
1259}
1260
1261V2_4::Error Composer::setActiveConfigWithConstraints(
1262 Display display, Config config,
1263 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1264 VsyncPeriodChangeTimeline* outTimeline) {
1265 using Error = V2_4::Error;
1266 if (!mClient_2_4) {
1267 return Error::UNSUPPORTED;
1268 }
1269
1270 Error error = kDefaultError_2_4;
1271 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1272 [&](const auto& tmpError, const auto& tmpTimeline) {
1273 error = tmpError;
1274 if (error != Error::NONE) {
1275 return;
1276 }
1277
1278 *outTimeline = tmpTimeline;
1279 });
1280
1281 return error;
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001282}
1283
Galia Peycheva5492cb52019-10-30 14:13:16 +01001284V2_4::Error Composer::setAutoLowLatencyMode(Display display, bool on) {
1285 using Error = V2_4::Error;
1286 if (!mClient_2_4) {
1287 return Error::UNSUPPORTED;
1288 }
1289
1290 return mClient_2_4->setAutoLowLatencyMode(display, on);
1291}
1292
1293V2_4::Error Composer::getSupportedContentTypes(
1294 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1295 using Error = V2_4::Error;
1296 if (!mClient_2_4) {
1297 return Error::UNSUPPORTED;
1298 }
1299
1300 Error error = kDefaultError_2_4;
1301 mClient_2_4->getSupportedContentTypes(displayId,
1302 [&](const auto& tmpError,
1303 const auto& tmpSupportedContentTypes) {
1304 error = tmpError;
1305 if (error != Error::NONE) {
1306 return;
1307 }
1308
1309 *outSupportedContentTypes = tmpSupportedContentTypes;
1310 });
1311 return error;
1312}
1313
1314V2_4::Error Composer::setContentType(Display display, IComposerClient::ContentType contentType) {
1315 using Error = V2_4::Error;
1316 if (!mClient_2_4) {
1317 return Error::UNSUPPORTED;
1318 }
1319
1320 return mClient_2_4->setContentType(display, contentType);
1321}
1322
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001323CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001324{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001325 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001326}
1327
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001328Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001329{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001330 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001331
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001332 IComposerClient::Command command;
1333 uint16_t length = 0;
1334
1335 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001336 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001337 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001338 break;
1339 }
1340
1341 bool parsed = false;
1342 switch (command) {
1343 case IComposerClient::Command::SELECT_DISPLAY:
1344 parsed = parseSelectDisplay(length);
1345 break;
1346 case IComposerClient::Command::SET_ERROR:
1347 parsed = parseSetError(length);
1348 break;
1349 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1350 parsed = parseSetChangedCompositionTypes(length);
1351 break;
1352 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1353 parsed = parseSetDisplayRequests(length);
1354 break;
1355 case IComposerClient::Command::SET_PRESENT_FENCE:
1356 parsed = parseSetPresentFence(length);
1357 break;
1358 case IComposerClient::Command::SET_RELEASE_FENCES:
1359 parsed = parseSetReleaseFences(length);
1360 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001361 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1362 parsed = parseSetPresentOrValidateDisplayResult(length);
1363 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001364 default:
1365 parsed = false;
1366 break;
1367 }
1368
1369 endCommand();
1370
1371 if (!parsed) {
1372 ALOGE("failed to parse command 0x%x length %" PRIu16,
1373 command, length);
1374 break;
1375 }
1376 }
1377
1378 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001379}
1380
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001381bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001382{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001383 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001384 return false;
1385 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001386
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001387 mCurrentReturnData = &mReturnData[read64()];
1388
1389 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001390}
1391
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001392bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001393{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001394 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001395 return false;
1396 }
1397
1398 auto location = read();
1399 auto error = static_cast<Error>(readSigned());
1400
1401 mErrors.emplace_back(CommandError{location, error});
1402
1403 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001404}
1405
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001406bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001407{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001408 // (layer id, composition type) pairs
1409 if (length % 3 != 0 || !mCurrentReturnData) {
1410 return false;
1411 }
1412
1413 uint32_t count = length / 3;
1414 mCurrentReturnData->changedLayers.reserve(count);
1415 mCurrentReturnData->compositionTypes.reserve(count);
1416 while (count > 0) {
1417 auto layer = read64();
1418 auto type = static_cast<IComposerClient::Composition>(readSigned());
1419
1420 mCurrentReturnData->changedLayers.push_back(layer);
1421 mCurrentReturnData->compositionTypes.push_back(type);
1422
1423 count--;
1424 }
1425
1426 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001427}
1428
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001429bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001430{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001431 // display requests followed by (layer id, layer requests) pairs
1432 if (length % 3 != 1 || !mCurrentReturnData) {
1433 return false;
1434 }
1435
1436 mCurrentReturnData->displayRequests = read();
1437
1438 uint32_t count = (length - 1) / 3;
1439 mCurrentReturnData->requestedLayers.reserve(count);
1440 mCurrentReturnData->requestMasks.reserve(count);
1441 while (count > 0) {
1442 auto layer = read64();
1443 auto layerRequestMask = read();
1444
1445 mCurrentReturnData->requestedLayers.push_back(layer);
1446 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1447
1448 count--;
1449 }
1450
1451 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001452}
1453
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001454bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001455{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001456 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001457 !mCurrentReturnData) {
1458 return false;
1459 }
1460
1461 if (mCurrentReturnData->presentFence >= 0) {
1462 close(mCurrentReturnData->presentFence);
1463 }
1464 mCurrentReturnData->presentFence = readFence();
1465
1466 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001467}
1468
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001469bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001470{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001471 // (layer id, release fence index) pairs
1472 if (length % 3 != 0 || !mCurrentReturnData) {
1473 return false;
1474 }
1475
1476 uint32_t count = length / 3;
1477 mCurrentReturnData->releasedLayers.reserve(count);
1478 mCurrentReturnData->releaseFences.reserve(count);
1479 while (count > 0) {
1480 auto layer = read64();
1481 auto fence = readFence();
1482
1483 mCurrentReturnData->releasedLayers.push_back(layer);
1484 mCurrentReturnData->releaseFences.push_back(fence);
1485
1486 count--;
1487 }
1488
1489 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001490}
1491
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001492bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1493{
1494 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1495 return false;
1496 }
1497 mCurrentReturnData->presentOrValidateState = read();
1498 return true;
1499}
1500
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001501void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001502{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001503 mErrors.clear();
1504
1505 for (auto& data : mReturnData) {
1506 if (data.second.presentFence >= 0) {
1507 close(data.second.presentFence);
1508 }
1509 for (auto fence : data.second.releaseFences) {
1510 if (fence >= 0) {
1511 close(fence);
1512 }
1513 }
1514 }
1515
1516 mReturnData.clear();
1517 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001518}
1519
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001520std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001521{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001522 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001523}
1524
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001525bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001526 uint32_t* outNumChangedCompositionTypes,
1527 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001528{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001529 auto found = mReturnData.find(display);
1530 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001531 *outNumChangedCompositionTypes = 0;
1532 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001533 return false;
1534 }
1535
1536 const ReturnData& data = found->second;
1537
Chia-I Wu67e376d2016-12-19 11:36:22 +08001538 *outNumChangedCompositionTypes = data.compositionTypes.size();
1539 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001540
1541 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001542}
1543
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001544void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001545 std::vector<Layer>* outLayers,
1546 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001547{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001548 auto found = mReturnData.find(display);
1549 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001550 outLayers->clear();
1551 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001552 return;
1553 }
1554
1555 ReturnData& data = found->second;
1556
Chia-I Wu67e376d2016-12-19 11:36:22 +08001557 *outLayers = std::move(data.changedLayers);
1558 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001559}
1560
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001561void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001562 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1563 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001564{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001565 auto found = mReturnData.find(display);
1566 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001567 *outDisplayRequestMask = 0;
1568 outLayers->clear();
1569 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001570 return;
1571 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001572
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001573 ReturnData& data = found->second;
1574
Chia-I Wu67e376d2016-12-19 11:36:22 +08001575 *outDisplayRequestMask = data.displayRequests;
1576 *outLayers = std::move(data.requestedLayers);
1577 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001578}
1579
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001580void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001581 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001582{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001583 auto found = mReturnData.find(display);
1584 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001585 outLayers->clear();
1586 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001587 return;
1588 }
1589
1590 ReturnData& data = found->second;
1591
Chia-I Wu67e376d2016-12-19 11:36:22 +08001592 *outLayers = std::move(data.releasedLayers);
1593 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001594}
1595
Chia-I Wu67e376d2016-12-19 11:36:22 +08001596void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001597{
1598 auto found = mReturnData.find(display);
1599 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001600 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001601 return;
1602 }
1603
1604 ReturnData& data = found->second;
1605
Chia-I Wu67e376d2016-12-19 11:36:22 +08001606 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001607 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001608}
1609
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001610void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1611 auto found = mReturnData.find(display);
1612 if (found == mReturnData.end()) {
1613 *state= -1;
1614 return;
1615 }
1616 ReturnData& data = found->second;
1617 *state = data.presentOrValidateState;
1618}
1619
Lloyd Piquea822d522017-12-20 16:42:57 -08001620} // namespace impl
1621
Chia-I Wuaab99f52016-10-05 12:59:58 +08001622} // namespace Hwc2
1623
1624} // namespace android