blob: acddc42601f35430390efa4c4a1c6d9c4cb13281 [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;
98
99template<typename T, typename U>
100T unwrapRet(Return<T>& ret, const U& default_val)
101{
Steven Moreland9d021002017-01-03 17:10:54 -0800102 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800103 static_cast<T>(default_val);
104}
105
106Error unwrapRet(Return<Error>& ret)
107{
108 return unwrapRet(ret, kDefaultError);
109}
110
Chia-I Wuaab99f52016-10-05 12:59:58 +0800111} // anonymous namespace
112
Lloyd Piquea822d522017-12-20 16:42:57 -0800113namespace impl {
114
mamik94e91f62019-08-19 09:11:33 -0700115#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500116Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
117 : CommandWriterBase(initialMaxSize) {}
118
119Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800120{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500121}
122
123void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
124{
125 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700126 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700127 IVrComposerClient::VrCommand::SET_LAYER_INFO),
128 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500129 write(type);
130 write(appId);
131 endCommand();
132}
133
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400134void Composer::CommandWriter::setClientTargetMetadata(
135 const IVrComposerClient::BufferMetadata& metadata)
136{
137 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700138 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700139 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
140 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400141 writeBufferMetadata(metadata);
142 endCommand();
143}
144
145void Composer::CommandWriter::setLayerBufferMetadata(
146 const IVrComposerClient::BufferMetadata& metadata)
147{
148 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700149 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700150 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
151 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400152 writeBufferMetadata(metadata);
153 endCommand();
154}
155
156void Composer::CommandWriter::writeBufferMetadata(
157 const IVrComposerClient::BufferMetadata& metadata)
158{
159 write(metadata.width);
160 write(metadata.height);
161 write(metadata.stride);
162 write(metadata.layerCount);
163 writeSigned(static_cast<int32_t>(metadata.format));
164 write64(metadata.usage);
165}
mamik94e91f62019-08-19 09:11:33 -0700166#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400167
Kalle Raitaa099a242017-01-11 11:17:29 -0800168Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800169 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800170 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500171{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700172 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500173
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800174 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800175 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
176 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800177
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -0700178 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
179 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
180 if (tmpError == Error::NONE) {
181 mClient = tmpClient;
182 mClient_2_2 = tmpClient;
183 mClient_2_3 = tmpClient;
184 mClient_2_4 = tmpClient;
185 }
186 });
187 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700188 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
189 if (tmpError == Error::NONE) {
190 mClient = tmpClient;
191 mClient_2_2 = tmpClient;
192 mClient_2_3 = tmpClient;
193 }
194 });
195 } else {
196 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
197 if (tmpError != Error::NONE) {
198 return;
199 }
200
201 mClient = tmpClient;
202 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
203 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
204 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
205 "IComposer 2.2 did not return IComposerClient 2.2");
206 }
207 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800208 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400209
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700210 if (mClient == nullptr) {
211 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700212 }
213
mamik94e91f62019-08-19 09:11:33 -0700214#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400215 if (mIsUsingVrComposer) {
216 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
217 if (vrClient == nullptr) {
218 LOG_ALWAYS_FATAL("failed to create vr composer client");
219 }
220 }
mamik94e91f62019-08-19 09:11:33 -0700221#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Chia-I Wuaab99f52016-10-05 12:59:58 +0800222}
223
Lloyd Piquea822d522017-12-20 16:42:57 -0800224Composer::~Composer() = default;
225
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800226std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227{
228 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800229 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800230 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800231 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800232 });
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233 return capabilities;
234}
235
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800236std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800237{
238 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800239 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800240 info = tmpInfo.c_str();
241 });
242
243 return info;
244}
245
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800246void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800247{
Wei Wangae211b42019-06-07 17:22:49 -0700248 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800249 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800250 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251 ALOGE("failed to register IComposerCallback");
252 }
253}
254
Steven Thomasb02664d2017-07-26 18:48:28 -0700255bool Composer::isRemote() {
256 return mClient->isRemote();
257}
258
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700259void Composer::resetCommands() {
260 mWriter.reset();
261}
262
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700263Error Composer::executeCommands() {
264 return execute();
265}
266
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800267uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800268{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800269 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800270 return unwrapRet(ret, 0);
271}
272
273Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800274 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800275{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800276 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700278 if (mClient_2_2) {
Kevin DuBois73d0f482019-01-25 11:18:03 -0800279 mClient_2_2->createVirtualDisplay_2_2(width, height,
280 static_cast<types::V1_1::PixelFormat>(*format),
281 bufferSlotCount,
282 [&](const auto& tmpError, const auto& tmpDisplay,
283 const auto& tmpFormat) {
284 error = tmpError;
285 if (error != Error::NONE) {
286 return;
287 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288
Kevin DuBois73d0f482019-01-25 11:18:03 -0800289 *outDisplay = tmpDisplay;
290 *format = static_cast<types::V1_2::PixelFormat>(
291 tmpFormat);
292 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700293 } else {
294 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700295 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700296 [&](const auto& tmpError, const auto& tmpDisplay,
297 const auto& tmpFormat) {
298 error = tmpError;
299 if (error != Error::NONE) {
300 return;
301 }
302
303 *outDisplay = tmpDisplay;
304 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800305 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700306 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800307
308 return error;
309}
310
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800311Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800312{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800313 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800314 return unwrapRet(ret);
315}
316
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800317Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800318{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800319 mWriter.selectDisplay(display);
320 mWriter.acceptDisplayChanges();
321 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800322}
323
Chia-I Wu67e376d2016-12-19 11:36:22 +0800324Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800325{
326 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800327 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800328 [&](const auto& tmpError, const auto& tmpLayer) {
329 error = tmpError;
330 if (error != Error::NONE) {
331 return;
332 }
333
Chia-I Wu67e376d2016-12-19 11:36:22 +0800334 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800335 });
336
337 return error;
338}
339
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800340Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800341{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800342 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800343 return unwrapRet(ret);
344}
345
Chia-I Wu67e376d2016-12-19 11:36:22 +0800346Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347{
348 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800349 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350 [&](const auto& tmpError, const auto& tmpConfig) {
351 error = tmpError;
352 if (error != Error::NONE) {
353 return;
354 }
355
Chia-I Wu67e376d2016-12-19 11:36:22 +0800356 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357 });
358
359 return error;
360}
361
362Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800363 std::vector<Layer>* outLayers,
364 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800365{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800366 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800367 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800368}
369
370Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800371 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800372{
373 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800374
Valerie Hau9758ae02018-10-09 16:05:09 -0700375 if (mClient_2_3) {
376 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
377 error = tmpError;
378 if (error != Error::NONE) {
379 return;
380 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700381
Valerie Hau9758ae02018-10-09 16:05:09 -0700382 *outModes = tmpModes;
383 });
384 } else if (mClient_2_2) {
385 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
386 error = tmpError;
387 if (error != Error::NONE) {
388 return;
389 }
390
391 for (types::V1_1::ColorMode colorMode : tmpModes) {
392 outModes->push_back(static_cast<ColorMode>(colorMode));
393 }
394 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700395 } else {
396 mClient->getColorModes(display,
397 [&](const auto& tmpError, const auto& tmpModes) {
398 error = tmpError;
399 if (error != Error::NONE) {
400 return;
401 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700402 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700403 outModes->push_back(static_cast<ColorMode>(colorMode));
404 }
405 });
406 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800407
408 return error;
409}
410
411Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800412 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800413{
414 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800415 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800416 [&](const auto& tmpError, const auto& tmpValue) {
417 error = tmpError;
418 if (error != Error::NONE) {
419 return;
420 }
421
Chia-I Wu67e376d2016-12-19 11:36:22 +0800422 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423 });
424
425 return error;
426}
427
428Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800429 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430{
431 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800432 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800433 [&](const auto& tmpError, const auto& tmpConfigs) {
434 error = tmpError;
435 if (error != Error::NONE) {
436 return;
437 }
438
Chia-I Wu67e376d2016-12-19 11:36:22 +0800439 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800440 });
441
442 return error;
443}
444
Chia-I Wu67e376d2016-12-19 11:36:22 +0800445Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800446{
447 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800448 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449 [&](const auto& tmpError, const auto& tmpName) {
450 error = tmpError;
451 if (error != Error::NONE) {
452 return;
453 }
454
Chia-I Wu67e376d2016-12-19 11:36:22 +0800455 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456 });
457
458 return error;
459}
460
461Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800462 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
463 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800465 mReader.takeDisplayRequests(display, outDisplayRequestMask,
466 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800467 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800468}
469
Chia-I Wu67e376d2016-12-19 11:36:22 +0800470Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800471{
472 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800473 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800474 [&](const auto& tmpError, const auto& tmpSupport) {
475 error = tmpError;
476 if (error != Error::NONE) {
477 return;
478 }
479
Chia-I Wu67e376d2016-12-19 11:36:22 +0800480 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800481 });
482
483 return error;
484}
485
Chia-I Wu67e376d2016-12-19 11:36:22 +0800486Error Composer::getHdrCapabilities(Display display,
487 std::vector<Hdr>* outTypes, float* outMaxLuminance,
488 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800489{
490 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800491 if (mClient_2_3) {
492 mClient_2_3->getHdrCapabilities_2_3(display,
493 [&](const auto& tmpError, const auto& tmpTypes,
494 const auto& tmpMaxLuminance,
495 const auto& tmpMaxAverageLuminance,
496 const auto& tmpMinLuminance) {
497 error = tmpError;
498 if (error != Error::NONE) {
499 return;
500 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501
Valerie Haue9e843a2018-12-18 13:39:23 -0800502 *outTypes = tmpTypes;
503 *outMaxLuminance = tmpMaxLuminance;
504 *outMaxAverageLuminance = tmpMaxAverageLuminance;
505 *outMinLuminance = tmpMinLuminance;
506 });
507 } else {
508 mClient->getHdrCapabilities(display,
509 [&](const auto& tmpError, const auto& tmpTypes,
510 const auto& tmpMaxLuminance,
511 const auto& tmpMaxAverageLuminance,
512 const auto& tmpMinLuminance) {
513 error = tmpError;
514 if (error != Error::NONE) {
515 return;
516 }
517
518 outTypes->clear();
519 for (auto type : tmpTypes) {
520 outTypes->push_back(static_cast<Hdr>(type));
521 }
522
523 *outMaxLuminance = tmpMaxLuminance;
524 *outMaxAverageLuminance = tmpMaxAverageLuminance;
525 *outMinLuminance = tmpMinLuminance;
526 });
527 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800528
529 return error;
530}
531
Chia-I Wu67e376d2016-12-19 11:36:22 +0800532Error Composer::getReleaseFences(Display display,
533 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800535 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800536 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800537}
538
Chia-I Wu67e376d2016-12-19 11:36:22 +0800539Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800540{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800541 mWriter.selectDisplay(display);
542 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800543
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800544 Error error = execute();
545 if (error != Error::NONE) {
546 return error;
547 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800548
Chia-I Wu67e376d2016-12-19 11:36:22 +0800549 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800550
551 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800552}
553
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800554Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800555{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800557 return unwrapRet(ret);
558}
559
Chia-I Wu06d63de2017-01-04 14:58:51 +0800560Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400561 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800562 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800563 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800564{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800565 mWriter.selectDisplay(display);
mamik94e91f62019-08-19 09:11:33 -0700566
567#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400568 if (mIsUsingVrComposer && target.get()) {
569 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700570 .width = target->getWidth(),
571 .height = target->getHeight(),
572 .stride = target->getStride(),
573 .layerCount = target->getLayerCount(),
574 .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()),
575 .usage = target->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400576 };
577 mWriter.setClientTargetMetadata(metadata);
578 }
mamik94e91f62019-08-19 09:11:33 -0700579#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400580
581 const native_handle_t* handle = nullptr;
582 if (target.get()) {
583 handle = target->getNativeBuffer()->handle;
584 }
585
586 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800587 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800588}
589
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700590Error Composer::setColorMode(Display display, ColorMode mode,
591 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800592{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700593 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700594 if (mClient_2_3) {
595 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
596 } else if (mClient_2_2) {
597 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
598 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700599 } else {
600 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700601 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700602 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800603 return unwrapRet(ret);
604}
605
606Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800607 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800608{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800609 mWriter.selectDisplay(display);
610 mWriter.setColorTransform(matrix, hint);
611 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800612}
613
614Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800615 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800616{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800617 mWriter.selectDisplay(display);
618 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
619 return Error::NONE;
620}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800621
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700622Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
623 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700624 if (mClient_2_2) {
625 ret = mClient_2_2->setPowerMode_2_2(display, mode);
626 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700627 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700628 }
629
Chia-I Wuaab99f52016-10-05 12:59:58 +0800630 return unwrapRet(ret);
631}
632
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800633Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800634{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800635 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800636 return unwrapRet(ret);
637}
638
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800639Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800640{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800641 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800642 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800643 return unwrapRet(ret);
644}
645
Chia-I Wu67e376d2016-12-19 11:36:22 +0800646Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
647 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800648{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800649 mWriter.selectDisplay(display);
650 mWriter.validateDisplay();
651
652 Error error = execute();
653 if (error != Error::NONE) {
654 return error;
655 }
656
Chia-I Wu67e376d2016-12-19 11:36:22 +0800657 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800658
659 return Error::NONE;
660}
661
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700662Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
663 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
664 mWriter.selectDisplay(display);
665 mWriter.presentOrvalidateDisplay();
666
667 Error error = execute();
668 if (error != Error::NONE) {
669 return error;
670 }
671
672 mReader.takePresentOrValidateStage(display, state);
673
674 if (*state == 1) { // Present succeeded
675 mReader.takePresentFence(display, outPresentFence);
676 }
677
678 if (*state == 0) { // Validate succeeded.
679 mReader.hasChanges(display, outNumTypes, outNumRequests);
680 }
681
682 return Error::NONE;
683}
684
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800685Error Composer::setCursorPosition(Display display, Layer layer,
686 int32_t x, int32_t y)
687{
688 mWriter.selectDisplay(display);
689 mWriter.selectLayer(layer);
690 mWriter.setLayerCursorPosition(x, y);
691 return Error::NONE;
692}
693
694Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400695 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800696{
697 mWriter.selectDisplay(display);
698 mWriter.selectLayer(layer);
mamik94e91f62019-08-19 09:11:33 -0700699
700#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400701 if (mIsUsingVrComposer && buffer.get()) {
702 IVrComposerClient::BufferMetadata metadata = {
mamik94e91f62019-08-19 09:11:33 -0700703 .width = buffer->getWidth(),
704 .height = buffer->getHeight(),
705 .stride = buffer->getStride(),
706 .layerCount = buffer->getLayerCount(),
707 .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()),
708 .usage = buffer->getUsage(),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400709 };
710 mWriter.setLayerBufferMetadata(metadata);
711 }
mamik94e91f62019-08-19 09:11:33 -0700712#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400713
714 const native_handle_t* handle = nullptr;
715 if (buffer.get()) {
716 handle = buffer->getNativeBuffer()->handle;
717 }
718
719 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800720 return Error::NONE;
721}
722
723Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
724 const std::vector<IComposerClient::Rect>& damage)
725{
726 mWriter.selectDisplay(display);
727 mWriter.selectLayer(layer);
728 mWriter.setLayerSurfaceDamage(damage);
729 return Error::NONE;
730}
731
732Error Composer::setLayerBlendMode(Display display, Layer layer,
733 IComposerClient::BlendMode mode)
734{
735 mWriter.selectDisplay(display);
736 mWriter.selectLayer(layer);
737 mWriter.setLayerBlendMode(mode);
738 return Error::NONE;
739}
740
741Error Composer::setLayerColor(Display display, Layer layer,
742 const IComposerClient::Color& color)
743{
744 mWriter.selectDisplay(display);
745 mWriter.selectLayer(layer);
746 mWriter.setLayerColor(color);
747 return Error::NONE;
748}
749
750Error Composer::setLayerCompositionType(Display display, Layer layer,
751 IComposerClient::Composition type)
752{
753 mWriter.selectDisplay(display);
754 mWriter.selectLayer(layer);
755 mWriter.setLayerCompositionType(type);
756 return Error::NONE;
757}
758
759Error Composer::setLayerDataspace(Display display, Layer layer,
760 Dataspace dataspace)
761{
762 mWriter.selectDisplay(display);
763 mWriter.selectLayer(layer);
764 mWriter.setLayerDataspace(dataspace);
765 return Error::NONE;
766}
767
768Error Composer::setLayerDisplayFrame(Display display, Layer layer,
769 const IComposerClient::Rect& frame)
770{
771 mWriter.selectDisplay(display);
772 mWriter.selectLayer(layer);
773 mWriter.setLayerDisplayFrame(frame);
774 return Error::NONE;
775}
776
777Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
778 float alpha)
779{
780 mWriter.selectDisplay(display);
781 mWriter.selectLayer(layer);
782 mWriter.setLayerPlaneAlpha(alpha);
783 return Error::NONE;
784}
785
786Error Composer::setLayerSidebandStream(Display display, Layer layer,
787 const native_handle_t* stream)
788{
789 mWriter.selectDisplay(display);
790 mWriter.selectLayer(layer);
791 mWriter.setLayerSidebandStream(stream);
792 return Error::NONE;
793}
794
795Error Composer::setLayerSourceCrop(Display display, Layer layer,
796 const IComposerClient::FRect& crop)
797{
798 mWriter.selectDisplay(display);
799 mWriter.selectLayer(layer);
800 mWriter.setLayerSourceCrop(crop);
801 return Error::NONE;
802}
803
804Error Composer::setLayerTransform(Display display, Layer layer,
805 Transform transform)
806{
807 mWriter.selectDisplay(display);
808 mWriter.selectLayer(layer);
809 mWriter.setLayerTransform(transform);
810 return Error::NONE;
811}
812
813Error Composer::setLayerVisibleRegion(Display display, Layer layer,
814 const std::vector<IComposerClient::Rect>& visible)
815{
816 mWriter.selectDisplay(display);
817 mWriter.selectLayer(layer);
818 mWriter.setLayerVisibleRegion(visible);
819 return Error::NONE;
820}
821
822Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
823{
824 mWriter.selectDisplay(display);
825 mWriter.selectLayer(layer);
826 mWriter.setLayerZOrder(z);
827 return Error::NONE;
828}
829
mamik94e91f62019-08-19 09:11:33 -0700830#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500831Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
832 uint32_t appId)
833{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800834 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500835 mWriter.selectDisplay(display);
836 mWriter.selectLayer(layer);
837 mWriter.setLayerInfo(type, appId);
838 }
839 return Error::NONE;
840}
mamik94e91f62019-08-19 09:11:33 -0700841#else
842Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) {
843 if (mIsUsingVrComposer) {
844 mWriter.selectDisplay(display);
845 mWriter.selectLayer(layer);
846 }
847 return Error::NONE;
848}
849#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500850
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800851Error Composer::execute()
852{
853 // prepare input command queue
854 bool queueChanged = false;
855 uint32_t commandLength = 0;
856 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800857 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800858 mWriter.reset();
859 return Error::NO_RESOURCES;
860 }
861
862 // set up new input command queue if necessary
863 if (queueChanged) {
864 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
865 auto error = unwrapRet(ret);
866 if (error != Error::NONE) {
867 mWriter.reset();
868 return error;
869 }
870 }
871
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700872 if (commandLength == 0) {
873 mWriter.reset();
874 return Error::NONE;
875 }
876
Chia-I Wuaab99f52016-10-05 12:59:58 +0800877 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700878 hardware::Return<void> ret;
879 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
880 const auto& tmpOutLength, const auto& tmpOutHandles)
881 {
882 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800883
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700884 // set up new output command queue if necessary
885 if (error == Error::NONE && tmpOutChanged) {
886 error = kDefaultError;
887 mClient->getOutputCommandQueue(
888 [&](const auto& tmpError,
889 const auto& tmpDescriptor)
890 {
891 error = tmpError;
892 if (error != Error::NONE) {
893 return;
894 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800895
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700896 mReader.setMQDescriptor(tmpDescriptor);
897 });
898 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800899
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700900 if (error != Error::NONE) {
901 return;
902 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800903
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700904 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
905 error = mReader.parse();
906 mReader.reset();
907 } else {
908 error = Error::NO_RESOURCES;
909 }
910 };
911 if (mClient_2_2) {
912 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
913 } else {
914 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
915 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700916 // executeCommands can fail because of out-of-fd and we do not want to
917 // abort() in that case
918 if (!ret.isOk()) {
919 ALOGE("executeCommands failed because of %s", ret.description().c_str());
920 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800921
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800922 if (error == Error::NONE) {
923 std::vector<CommandReader::CommandError> commandErrors =
924 mReader.takeErrors();
925
926 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700927 auto command =
928 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800929
930 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700931 command == IComposerClient::Command::PRESENT_DISPLAY ||
932 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800933 error = cmdErr.error;
934 } else {
935 ALOGW("command 0x%x generated error %d",
936 command, cmdErr.error);
937 }
938 }
939 }
940
941 mWriter.reset();
942
Chia-I Wuaab99f52016-10-05 12:59:58 +0800943 return error;
944}
945
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700946// Composer HAL 2.2
947
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700948Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
949 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
950 if (!mClient_2_2) {
951 return Error::UNSUPPORTED;
952 }
953
954 mWriter.selectDisplay(display);
955 mWriter.selectLayer(layer);
956 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
957 return Error::NONE;
958}
959
Chia-I Wud7e01d72018-06-21 13:39:09 +0800960std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
961 Display display) {
962 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700963 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800964 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700965 }
966
967 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800968 if (mClient_2_3) {
969 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
970 [&](const auto& tmpError, const auto& tmpKeys) {
971 error = tmpError;
972 if (error != Error::NONE) {
973 ALOGW("getPerFrameMetadataKeys failed "
974 "with %d",
975 tmpError);
976 return;
977 }
978 keys = tmpKeys;
979 });
980 } else {
981 mClient_2_2
982 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
983 error = tmpError;
984 if (error != Error::NONE) {
985 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
986 return;
987 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700988
Valerie Haue9e843a2018-12-18 13:39:23 -0800989 keys.clear();
990 for (auto key : tmpKeys) {
991 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
992 }
993 });
994 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700995
Chia-I Wud7e01d72018-06-21 13:39:09 +0800996 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700997}
998
999Error Composer::getRenderIntents(Display display, ColorMode colorMode,
1000 std::vector<RenderIntent>* outRenderIntents) {
1001 if (!mClient_2_2) {
1002 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1003 return Error::NONE;
1004 }
1005
1006 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001007
1008 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001009 error = tmpError;
1010 if (error != Error::NONE) {
1011 return;
1012 }
1013
1014 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001015 };
1016
1017 if (mClient_2_3) {
1018 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1019 } else {
1020 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1021 getRenderIntentsLambda);
1022 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001023
1024 return error;
1025}
1026
1027Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1028{
1029 if (!mClient_2_2) {
1030 *outMatrix = mat4();
1031 return Error::NONE;
1032 }
1033
1034 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001035 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1036 [&](const auto& tmpError, const auto& tmpMatrix) {
1037 error = tmpError;
1038 if (error != Error::NONE) {
1039 return;
1040 }
1041 *outMatrix = mat4(tmpMatrix.data());
1042 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001043
1044 return error;
1045}
1046
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001047// Composer HAL 2.3
1048
1049Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1050 std::vector<uint8_t>* outData) {
1051 if (!mClient_2_3) {
1052 return Error::UNSUPPORTED;
1053 }
1054
1055 Error error = kDefaultError;
1056 mClient_2_3->getDisplayIdentificationData(display,
1057 [&](const auto& tmpError, const auto& tmpPort,
1058 const auto& tmpData) {
1059 error = tmpError;
1060 if (error != Error::NONE) {
1061 return;
1062 }
1063
1064 *outPort = tmpPort;
1065 *outData = tmpData;
1066 });
1067
1068 return error;
1069}
1070
Peiyong Lin698147a2018-09-14 13:27:18 -07001071Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1072{
1073 if (!mClient_2_3) {
1074 return Error::UNSUPPORTED;
1075 }
1076
1077 mWriter.selectDisplay(display);
1078 mWriter.selectLayer(layer);
1079 mWriter.setLayerColorTransform(matrix);
1080 return Error::NONE;
1081}
1082
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001083Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1084 Dataspace* outDataspace,
1085 uint8_t* outComponentMask) {
1086 if (!outFormat || !outDataspace || !outComponentMask) {
1087 return Error::BAD_PARAMETER;
1088 }
1089 if (!mClient_2_3) {
1090 return Error::UNSUPPORTED;
1091 }
1092 Error error = kDefaultError;
1093 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1094 [&](const auto tmpError,
1095 const auto& tmpFormat,
1096 const auto& tmpDataspace,
1097 const auto& tmpComponentMask) {
1098 error = tmpError;
1099 if (error == Error::NONE) {
1100 *outFormat = tmpFormat;
1101 *outDataspace = tmpDataspace;
1102 *outComponentMask =
1103 static_cast<uint8_t>(
1104 tmpComponentMask);
1105 }
1106 });
1107 return error;
1108}
1109
Kevin DuBois74e53772018-11-19 10:52:38 -08001110Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1111 uint8_t componentMask, uint64_t maxFrames) {
1112 if (!mClient_2_3) {
1113 return Error::UNSUPPORTED;
1114 }
1115
1116 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1117 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1118 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1119 maxFrames);
1120}
1121
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001122Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1123 DisplayedFrameStats* outStats) {
1124 if (!outStats) {
1125 return Error::BAD_PARAMETER;
1126 }
1127 if (!mClient_2_3) {
1128 return Error::UNSUPPORTED;
1129 }
1130 Error error = kDefaultError;
1131 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1132 [&](const auto tmpError, auto tmpNumFrames,
1133 const auto& tmpSamples0, const auto& tmpSamples1,
1134 const auto& tmpSamples2, const auto& tmpSamples3) {
1135 error = tmpError;
1136 if (error == Error::NONE) {
1137 outStats->numFrames = tmpNumFrames;
1138 outStats->component_0_sample = tmpSamples0;
1139 outStats->component_1_sample = tmpSamples1;
1140 outStats->component_2_sample = tmpSamples2;
1141 outStats->component_3_sample = tmpSamples3;
1142 }
1143 });
1144 return error;
1145}
1146
Valerie Haue9e843a2018-12-18 13:39:23 -08001147Error Composer::setLayerPerFrameMetadataBlobs(
1148 Display display, Layer layer,
1149 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1150 if (!mClient_2_3) {
1151 return Error::UNSUPPORTED;
1152 }
1153
1154 mWriter.selectDisplay(display);
1155 mWriter.selectLayer(layer);
1156 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1157 return Error::NONE;
1158}
1159
Dan Gittik57e63c52019-01-18 16:37:54 +00001160Error Composer::setDisplayBrightness(Display display, float brightness) {
1161 if (!mClient_2_3) {
1162 return Error::UNSUPPORTED;
1163 }
1164 return mClient_2_3->setDisplayBrightness(display, brightness);
1165}
1166
Dominik Laskowski25a4e7d2019-09-20 14:50:10 -07001167// Composer HAL 2.4
1168
1169Error Composer::getDisplayCapabilities(Display display,
1170 std::vector<DisplayCapability>* outCapabilities) {
1171 if (!mClient_2_3) {
1172 return Error::UNSUPPORTED;
1173 }
1174
1175 Error error = kDefaultError;
1176 if (mClient_2_4) {
1177 mClient_2_4->getDisplayCapabilities_2_4(display,
1178 [&](const auto& tmpError, const auto& tmpCaps) {
1179 error = tmpError;
1180 if (error != Error::NONE) {
1181 return;
1182 }
1183 *outCapabilities = tmpCaps;
1184 });
1185 } else {
1186 mClient_2_3
1187 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1188 error = tmpError;
1189 if (error != Error::NONE) {
1190 return;
1191 }
1192
1193 outCapabilities->resize(tmpCaps.size());
1194 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1195 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1196 });
1197 }
1198
1199 return error;
1200}
1201
1202Error Composer::getDisplayConnectionType(Display display,
1203 IComposerClient::DisplayConnectionType* outType) {
1204 if (!mClient_2_4) {
1205 return Error::UNSUPPORTED;
1206 }
1207
1208 Error error = kDefaultError;
1209 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1210 error = tmpError;
1211 if (error != Error::NONE) {
1212 return;
1213 }
1214
1215 *outType = tmpType;
1216 });
1217
1218 return error;
1219}
1220
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001221CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001222{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001223 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001224}
1225
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001226Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001227{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001228 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001229
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001230 IComposerClient::Command command;
1231 uint16_t length = 0;
1232
1233 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001234 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001235 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001236 break;
1237 }
1238
1239 bool parsed = false;
1240 switch (command) {
1241 case IComposerClient::Command::SELECT_DISPLAY:
1242 parsed = parseSelectDisplay(length);
1243 break;
1244 case IComposerClient::Command::SET_ERROR:
1245 parsed = parseSetError(length);
1246 break;
1247 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1248 parsed = parseSetChangedCompositionTypes(length);
1249 break;
1250 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1251 parsed = parseSetDisplayRequests(length);
1252 break;
1253 case IComposerClient::Command::SET_PRESENT_FENCE:
1254 parsed = parseSetPresentFence(length);
1255 break;
1256 case IComposerClient::Command::SET_RELEASE_FENCES:
1257 parsed = parseSetReleaseFences(length);
1258 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001259 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1260 parsed = parseSetPresentOrValidateDisplayResult(length);
1261 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001262 default:
1263 parsed = false;
1264 break;
1265 }
1266
1267 endCommand();
1268
1269 if (!parsed) {
1270 ALOGE("failed to parse command 0x%x length %" PRIu16,
1271 command, length);
1272 break;
1273 }
1274 }
1275
1276 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001277}
1278
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001279bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001280{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001281 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001282 return false;
1283 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001284
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001285 mCurrentReturnData = &mReturnData[read64()];
1286
1287 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001288}
1289
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001290bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001291{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001292 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001293 return false;
1294 }
1295
1296 auto location = read();
1297 auto error = static_cast<Error>(readSigned());
1298
1299 mErrors.emplace_back(CommandError{location, error});
1300
1301 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001302}
1303
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001304bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001305{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001306 // (layer id, composition type) pairs
1307 if (length % 3 != 0 || !mCurrentReturnData) {
1308 return false;
1309 }
1310
1311 uint32_t count = length / 3;
1312 mCurrentReturnData->changedLayers.reserve(count);
1313 mCurrentReturnData->compositionTypes.reserve(count);
1314 while (count > 0) {
1315 auto layer = read64();
1316 auto type = static_cast<IComposerClient::Composition>(readSigned());
1317
1318 mCurrentReturnData->changedLayers.push_back(layer);
1319 mCurrentReturnData->compositionTypes.push_back(type);
1320
1321 count--;
1322 }
1323
1324 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001325}
1326
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001327bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001328{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001329 // display requests followed by (layer id, layer requests) pairs
1330 if (length % 3 != 1 || !mCurrentReturnData) {
1331 return false;
1332 }
1333
1334 mCurrentReturnData->displayRequests = read();
1335
1336 uint32_t count = (length - 1) / 3;
1337 mCurrentReturnData->requestedLayers.reserve(count);
1338 mCurrentReturnData->requestMasks.reserve(count);
1339 while (count > 0) {
1340 auto layer = read64();
1341 auto layerRequestMask = read();
1342
1343 mCurrentReturnData->requestedLayers.push_back(layer);
1344 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1345
1346 count--;
1347 }
1348
1349 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001350}
1351
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001352bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001353{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001354 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001355 !mCurrentReturnData) {
1356 return false;
1357 }
1358
1359 if (mCurrentReturnData->presentFence >= 0) {
1360 close(mCurrentReturnData->presentFence);
1361 }
1362 mCurrentReturnData->presentFence = readFence();
1363
1364 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001365}
1366
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001367bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001368{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001369 // (layer id, release fence index) pairs
1370 if (length % 3 != 0 || !mCurrentReturnData) {
1371 return false;
1372 }
1373
1374 uint32_t count = length / 3;
1375 mCurrentReturnData->releasedLayers.reserve(count);
1376 mCurrentReturnData->releaseFences.reserve(count);
1377 while (count > 0) {
1378 auto layer = read64();
1379 auto fence = readFence();
1380
1381 mCurrentReturnData->releasedLayers.push_back(layer);
1382 mCurrentReturnData->releaseFences.push_back(fence);
1383
1384 count--;
1385 }
1386
1387 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001388}
1389
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001390bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1391{
1392 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1393 return false;
1394 }
1395 mCurrentReturnData->presentOrValidateState = read();
1396 return true;
1397}
1398
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001399void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001400{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001401 mErrors.clear();
1402
1403 for (auto& data : mReturnData) {
1404 if (data.second.presentFence >= 0) {
1405 close(data.second.presentFence);
1406 }
1407 for (auto fence : data.second.releaseFences) {
1408 if (fence >= 0) {
1409 close(fence);
1410 }
1411 }
1412 }
1413
1414 mReturnData.clear();
1415 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001416}
1417
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001418std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001419{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001420 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001421}
1422
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001423bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001424 uint32_t* outNumChangedCompositionTypes,
1425 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001426{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001427 auto found = mReturnData.find(display);
1428 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001429 *outNumChangedCompositionTypes = 0;
1430 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001431 return false;
1432 }
1433
1434 const ReturnData& data = found->second;
1435
Chia-I Wu67e376d2016-12-19 11:36:22 +08001436 *outNumChangedCompositionTypes = data.compositionTypes.size();
1437 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001438
1439 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001440}
1441
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001442void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001443 std::vector<Layer>* outLayers,
1444 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001445{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001446 auto found = mReturnData.find(display);
1447 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001448 outLayers->clear();
1449 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001450 return;
1451 }
1452
1453 ReturnData& data = found->second;
1454
Chia-I Wu67e376d2016-12-19 11:36:22 +08001455 *outLayers = std::move(data.changedLayers);
1456 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001457}
1458
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001459void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001460 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1461 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001462{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001463 auto found = mReturnData.find(display);
1464 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001465 *outDisplayRequestMask = 0;
1466 outLayers->clear();
1467 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001468 return;
1469 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001470
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001471 ReturnData& data = found->second;
1472
Chia-I Wu67e376d2016-12-19 11:36:22 +08001473 *outDisplayRequestMask = data.displayRequests;
1474 *outLayers = std::move(data.requestedLayers);
1475 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001476}
1477
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001478void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001479 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001480{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001481 auto found = mReturnData.find(display);
1482 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001483 outLayers->clear();
1484 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001485 return;
1486 }
1487
1488 ReturnData& data = found->second;
1489
Chia-I Wu67e376d2016-12-19 11:36:22 +08001490 *outLayers = std::move(data.releasedLayers);
1491 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001492}
1493
Chia-I Wu67e376d2016-12-19 11:36:22 +08001494void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001495{
1496 auto found = mReturnData.find(display);
1497 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001498 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001499 return;
1500 }
1501
1502 ReturnData& data = found->second;
1503
Chia-I Wu67e376d2016-12-19 11:36:22 +08001504 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001505 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001506}
1507
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001508void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1509 auto found = mReturnData.find(display);
1510 if (found == mReturnData.end()) {
1511 *state= -1;
1512 return;
1513 }
1514 ReturnData& data = found->second;
1515 *state = data.presentOrValidateState;
1516}
1517
Lloyd Piquea822d522017-12-20 16:42:57 -08001518} // namespace impl
1519
Chia-I Wuaab99f52016-10-05 12:59:58 +08001520} // namespace Hwc2
1521
1522} // namespace android