blob: 03eafd51b2509c6ef266e4c4e0320e514dc4c731 [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
20#include <inttypes.h>
21#include <log/log.h>
22
23#include "ComposerHal.h"
24
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070025#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
26#include <gui/BufferQueue.h>
27#include <hidl/HidlTransportUtils.h>
28
Chia-I Wuaab99f52016-10-05 12:59:58 +080029namespace android {
30
31using hardware::Return;
32using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010033using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080034
35namespace Hwc2 {
36
Lloyd Piquea822d522017-12-20 16:42:57 -080037Composer::~Composer() = default;
38
Chia-I Wuaab99f52016-10-05 12:59:58 +080039namespace {
40
41class BufferHandle {
42public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080043 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080044 // nullptr is not a valid handle to HIDL
45 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
46 }
47
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080048 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080049 {
50 return mHandle;
51 }
52
53private:
54 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010055 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080056};
57
58class FenceHandle
59{
60public:
61 FenceHandle(int fd, bool owned)
62 : mOwned(owned)
63 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010064 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080065 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010066 handle = native_handle_init(mStorage, 1, 0);
67 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080068 } else {
69 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010070 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010072 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080073 }
74
75 ~FenceHandle()
76 {
77 if (mOwned) {
78 native_handle_close(mHandle);
79 }
80 }
81
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080082 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080083 {
84 return mHandle;
85 }
86
87private:
88 bool mOwned;
89 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010090 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080091};
92
93// assume NO_RESOURCES when Status::isOk returns false
94constexpr Error kDefaultError = Error::NO_RESOURCES;
95
96template<typename T, typename U>
97T unwrapRet(Return<T>& ret, const U& default_val)
98{
Steven Moreland9d021002017-01-03 17:10:54 -080099 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800100 static_cast<T>(default_val);
101}
102
103Error unwrapRet(Return<Error>& ret)
104{
105 return unwrapRet(ret, kDefaultError);
106}
107
Chia-I Wuaab99f52016-10-05 12:59:58 +0800108} // anonymous namespace
109
Lloyd Piquea822d522017-12-20 16:42:57 -0800110namespace impl {
111
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500112Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
113 : CommandWriterBase(initialMaxSize) {}
114
115Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800116{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500117}
118
119void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
120{
121 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700122 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700123 IVrComposerClient::VrCommand::SET_LAYER_INFO),
124 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500125 write(type);
126 write(appId);
127 endCommand();
128}
129
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400130void Composer::CommandWriter::setClientTargetMetadata(
131 const IVrComposerClient::BufferMetadata& metadata)
132{
133 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700134 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700135 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
136 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400137 writeBufferMetadata(metadata);
138 endCommand();
139}
140
141void Composer::CommandWriter::setLayerBufferMetadata(
142 const IVrComposerClient::BufferMetadata& metadata)
143{
144 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700145 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700146 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
147 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400148 writeBufferMetadata(metadata);
149 endCommand();
150}
151
152void Composer::CommandWriter::writeBufferMetadata(
153 const IVrComposerClient::BufferMetadata& metadata)
154{
155 write(metadata.width);
156 write(metadata.height);
157 write(metadata.stride);
158 write(metadata.layerCount);
159 writeSigned(static_cast<int32_t>(metadata.format));
160 write64(metadata.usage);
161}
162
Kalle Raitaa099a242017-01-11 11:17:29 -0800163Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800164 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800165 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500166{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700167 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500168
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800169 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800170 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
171 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800172
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700173 if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) {
174 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
175 if (tmpError == Error::NONE) {
176 mClient = tmpClient;
177 mClient_2_2 = tmpClient;
178 mClient_2_3 = tmpClient;
179 }
180 });
181 } else {
182 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
183 if (tmpError != Error::NONE) {
184 return;
185 }
186
187 mClient = tmpClient;
188 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
189 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
190 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
191 "IComposer 2.2 did not return IComposerClient 2.2");
192 }
193 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800194 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400195
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700196 if (mClient == nullptr) {
197 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700198 }
199
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400200 if (mIsUsingVrComposer) {
201 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
202 if (vrClient == nullptr) {
203 LOG_ALWAYS_FATAL("failed to create vr composer client");
204 }
205 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800206}
207
Lloyd Piquea822d522017-12-20 16:42:57 -0800208Composer::~Composer() = default;
209
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211{
212 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800213 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800215 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800216 });
217
218 return capabilities;
219}
220
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800221std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800222{
223 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800224 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800225 info = tmpInfo.c_str();
226 });
227
228 return info;
229}
230
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800231void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800232{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800233 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800234 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800235 ALOGE("failed to register IComposerCallback");
236 }
237}
238
Steven Thomasb02664d2017-07-26 18:48:28 -0700239bool Composer::isRemote() {
240 return mClient->isRemote();
241}
242
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700243void Composer::resetCommands() {
244 mWriter.reset();
245}
246
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700247Error Composer::executeCommands() {
248 return execute();
249}
250
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800251uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800253 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800254 return unwrapRet(ret, 0);
255}
256
257Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800258 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800260 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800261 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700262 if (mClient_2_2) {
Kevin DuBoisb04e9b62019-01-25 17:04:49 +0000263 mClient_2_2->createVirtualDisplay_2_2(width, height, *format, bufferSlotCount,
264 [&](const auto& tmpError, const auto& tmpDisplay,
265 const auto& tmpFormat) {
266 error = tmpError;
267 if (error != Error::NONE) {
268 return;
269 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800270
Kevin DuBoisb04e9b62019-01-25 17:04:49 +0000271 *outDisplay = tmpDisplay;
272 *format = tmpFormat;
273 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700274 } else {
275 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700276 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700277 [&](const auto& tmpError, const auto& tmpDisplay,
278 const auto& tmpFormat) {
279 error = tmpError;
280 if (error != Error::NONE) {
281 return;
282 }
283
284 *outDisplay = tmpDisplay;
285 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800286 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700287 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288
289 return error;
290}
291
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800292Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800293{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800294 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295 return unwrapRet(ret);
296}
297
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800298Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800299{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800300 mWriter.selectDisplay(display);
301 mWriter.acceptDisplayChanges();
302 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800303}
304
Chia-I Wu67e376d2016-12-19 11:36:22 +0800305Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306{
307 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800308 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309 [&](const auto& tmpError, const auto& tmpLayer) {
310 error = tmpError;
311 if (error != Error::NONE) {
312 return;
313 }
314
Chia-I Wu67e376d2016-12-19 11:36:22 +0800315 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316 });
317
318 return error;
319}
320
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800321Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800322{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800323 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324 return unwrapRet(ret);
325}
326
Chia-I Wu67e376d2016-12-19 11:36:22 +0800327Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800328{
329 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800330 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800331 [&](const auto& tmpError, const auto& tmpConfig) {
332 error = tmpError;
333 if (error != Error::NONE) {
334 return;
335 }
336
Chia-I Wu67e376d2016-12-19 11:36:22 +0800337 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800338 });
339
340 return error;
341}
342
343Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800344 std::vector<Layer>* outLayers,
345 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800346{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800347 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800348 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800349}
350
351Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800352 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800353{
354 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355
Valerie Hau9758ae02018-10-09 16:05:09 -0700356 if (mClient_2_3) {
357 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
358 error = tmpError;
359 if (error != Error::NONE) {
360 return;
361 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700362
Valerie Hau9758ae02018-10-09 16:05:09 -0700363 *outModes = tmpModes;
364 });
365 } else if (mClient_2_2) {
366 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
367 error = tmpError;
368 if (error != Error::NONE) {
369 return;
370 }
371
372 for (types::V1_1::ColorMode colorMode : tmpModes) {
373 outModes->push_back(static_cast<ColorMode>(colorMode));
374 }
375 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700376 } else {
377 mClient->getColorModes(display,
378 [&](const auto& tmpError, const auto& tmpModes) {
379 error = tmpError;
380 if (error != Error::NONE) {
381 return;
382 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700383 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700384 outModes->push_back(static_cast<ColorMode>(colorMode));
385 }
386 });
387 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388
389 return error;
390}
391
392Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800393 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800394{
395 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800396 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800397 [&](const auto& tmpError, const auto& tmpValue) {
398 error = tmpError;
399 if (error != Error::NONE) {
400 return;
401 }
402
Chia-I Wu67e376d2016-12-19 11:36:22 +0800403 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 });
405
406 return error;
407}
408
409Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800410 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800411{
412 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800413 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800414 [&](const auto& tmpError, const auto& tmpConfigs) {
415 error = tmpError;
416 if (error != Error::NONE) {
417 return;
418 }
419
Chia-I Wu67e376d2016-12-19 11:36:22 +0800420 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800421 });
422
423 return error;
424}
425
Chia-I Wu67e376d2016-12-19 11:36:22 +0800426Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800427{
428 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800429 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430 [&](const auto& tmpError, const auto& tmpName) {
431 error = tmpError;
432 if (error != Error::NONE) {
433 return;
434 }
435
Chia-I Wu67e376d2016-12-19 11:36:22 +0800436 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800437 });
438
439 return error;
440}
441
442Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800443 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
444 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800446 mReader.takeDisplayRequests(display, outDisplayRequestMask,
447 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800448 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449}
450
Chia-I Wu67e376d2016-12-19 11:36:22 +0800451Error Composer::getDisplayType(Display display,
452 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453{
454 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800455 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456 [&](const auto& tmpError, const auto& tmpType) {
457 error = tmpError;
458 if (error != Error::NONE) {
459 return;
460 }
461
Chia-I Wu67e376d2016-12-19 11:36:22 +0800462 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800463 });
464
465 return error;
466}
467
Chia-I Wu67e376d2016-12-19 11:36:22 +0800468Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469{
470 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800471 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472 [&](const auto& tmpError, const auto& tmpSupport) {
473 error = tmpError;
474 if (error != Error::NONE) {
475 return;
476 }
477
Chia-I Wu67e376d2016-12-19 11:36:22 +0800478 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800479 });
480
481 return error;
482}
483
Chia-I Wu67e376d2016-12-19 11:36:22 +0800484Error Composer::getHdrCapabilities(Display display,
485 std::vector<Hdr>* outTypes, float* outMaxLuminance,
486 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800487{
488 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800489 if (mClient_2_3) {
490 mClient_2_3->getHdrCapabilities_2_3(display,
491 [&](const auto& tmpError, const auto& tmpTypes,
492 const auto& tmpMaxLuminance,
493 const auto& tmpMaxAverageLuminance,
494 const auto& tmpMinLuminance) {
495 error = tmpError;
496 if (error != Error::NONE) {
497 return;
498 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800499
Valerie Haue9e843a2018-12-18 13:39:23 -0800500 *outTypes = tmpTypes;
501 *outMaxLuminance = tmpMaxLuminance;
502 *outMaxAverageLuminance = tmpMaxAverageLuminance;
503 *outMinLuminance = tmpMinLuminance;
504 });
505 } else {
506 mClient->getHdrCapabilities(display,
507 [&](const auto& tmpError, const auto& tmpTypes,
508 const auto& tmpMaxLuminance,
509 const auto& tmpMaxAverageLuminance,
510 const auto& tmpMinLuminance) {
511 error = tmpError;
512 if (error != Error::NONE) {
513 return;
514 }
515
516 outTypes->clear();
517 for (auto type : tmpTypes) {
518 outTypes->push_back(static_cast<Hdr>(type));
519 }
520
521 *outMaxLuminance = tmpMaxLuminance;
522 *outMaxAverageLuminance = tmpMaxAverageLuminance;
523 *outMinLuminance = tmpMinLuminance;
524 });
525 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800526
527 return error;
528}
529
Chia-I Wu67e376d2016-12-19 11:36:22 +0800530Error Composer::getReleaseFences(Display display,
531 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800532{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800533 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800534 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800535}
536
Chia-I Wu67e376d2016-12-19 11:36:22 +0800537Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800539 mWriter.selectDisplay(display);
540 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800541
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 Error error = execute();
543 if (error != Error::NONE) {
544 return error;
545 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800546
Chia-I Wu67e376d2016-12-19 11:36:22 +0800547 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800548
549 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800550}
551
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800552Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800554 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800555 return unwrapRet(ret);
556}
557
Chia-I Wu06d63de2017-01-04 14:58:51 +0800558Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400559 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800560 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800561 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800562{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800563 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400564 if (mIsUsingVrComposer && target.get()) {
565 IVrComposerClient::BufferMetadata metadata = {
566 .width = target->getWidth(),
567 .height = target->getHeight(),
568 .stride = target->getStride(),
569 .layerCount = target->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700570 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400571 .usage = target->getUsage(),
572 };
573 mWriter.setClientTargetMetadata(metadata);
574 }
575
576 const native_handle_t* handle = nullptr;
577 if (target.get()) {
578 handle = target->getNativeBuffer()->handle;
579 }
580
581 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800582 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800583}
584
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700585Error Composer::setColorMode(Display display, ColorMode mode,
586 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800587{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700588 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700589 if (mClient_2_3) {
590 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
591 } else if (mClient_2_2) {
592 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
593 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700594 } else {
595 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700596 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700597 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800598 return unwrapRet(ret);
599}
600
601Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800602 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800603{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800604 mWriter.selectDisplay(display);
605 mWriter.setColorTransform(matrix, hint);
606 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800607}
608
609Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800610 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800611{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800612 mWriter.selectDisplay(display);
613 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
614 return Error::NONE;
615}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800616
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700617Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
618 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700619 if (mClient_2_2) {
620 ret = mClient_2_2->setPowerMode_2_2(display, mode);
621 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700622 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700623 }
624
Chia-I Wuaab99f52016-10-05 12:59:58 +0800625 return unwrapRet(ret);
626}
627
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800628Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800629{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800630 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800631 return unwrapRet(ret);
632}
633
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800634Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800635{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800636 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800637 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800638 return unwrapRet(ret);
639}
640
Chia-I Wu67e376d2016-12-19 11:36:22 +0800641Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
642 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800643{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800644 mWriter.selectDisplay(display);
645 mWriter.validateDisplay();
646
647 Error error = execute();
648 if (error != Error::NONE) {
649 return error;
650 }
651
Chia-I Wu67e376d2016-12-19 11:36:22 +0800652 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800653
654 return Error::NONE;
655}
656
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700657Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
658 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
659 mWriter.selectDisplay(display);
660 mWriter.presentOrvalidateDisplay();
661
662 Error error = execute();
663 if (error != Error::NONE) {
664 return error;
665 }
666
667 mReader.takePresentOrValidateStage(display, state);
668
669 if (*state == 1) { // Present succeeded
670 mReader.takePresentFence(display, outPresentFence);
671 }
672
673 if (*state == 0) { // Validate succeeded.
674 mReader.hasChanges(display, outNumTypes, outNumRequests);
675 }
676
677 return Error::NONE;
678}
679
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800680Error Composer::setCursorPosition(Display display, Layer layer,
681 int32_t x, int32_t y)
682{
683 mWriter.selectDisplay(display);
684 mWriter.selectLayer(layer);
685 mWriter.setLayerCursorPosition(x, y);
686 return Error::NONE;
687}
688
689Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400690 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800691{
692 mWriter.selectDisplay(display);
693 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400694 if (mIsUsingVrComposer && buffer.get()) {
695 IVrComposerClient::BufferMetadata metadata = {
696 .width = buffer->getWidth(),
697 .height = buffer->getHeight(),
698 .stride = buffer->getStride(),
699 .layerCount = buffer->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700700 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400701 .usage = buffer->getUsage(),
702 };
703 mWriter.setLayerBufferMetadata(metadata);
704 }
705
706 const native_handle_t* handle = nullptr;
707 if (buffer.get()) {
708 handle = buffer->getNativeBuffer()->handle;
709 }
710
711 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800712 return Error::NONE;
713}
714
715Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
716 const std::vector<IComposerClient::Rect>& damage)
717{
718 mWriter.selectDisplay(display);
719 mWriter.selectLayer(layer);
720 mWriter.setLayerSurfaceDamage(damage);
721 return Error::NONE;
722}
723
724Error Composer::setLayerBlendMode(Display display, Layer layer,
725 IComposerClient::BlendMode mode)
726{
727 mWriter.selectDisplay(display);
728 mWriter.selectLayer(layer);
729 mWriter.setLayerBlendMode(mode);
730 return Error::NONE;
731}
732
733Error Composer::setLayerColor(Display display, Layer layer,
734 const IComposerClient::Color& color)
735{
736 mWriter.selectDisplay(display);
737 mWriter.selectLayer(layer);
738 mWriter.setLayerColor(color);
739 return Error::NONE;
740}
741
742Error Composer::setLayerCompositionType(Display display, Layer layer,
743 IComposerClient::Composition type)
744{
745 mWriter.selectDisplay(display);
746 mWriter.selectLayer(layer);
747 mWriter.setLayerCompositionType(type);
748 return Error::NONE;
749}
750
751Error Composer::setLayerDataspace(Display display, Layer layer,
752 Dataspace dataspace)
753{
754 mWriter.selectDisplay(display);
755 mWriter.selectLayer(layer);
756 mWriter.setLayerDataspace(dataspace);
757 return Error::NONE;
758}
759
760Error Composer::setLayerDisplayFrame(Display display, Layer layer,
761 const IComposerClient::Rect& frame)
762{
763 mWriter.selectDisplay(display);
764 mWriter.selectLayer(layer);
765 mWriter.setLayerDisplayFrame(frame);
766 return Error::NONE;
767}
768
769Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
770 float alpha)
771{
772 mWriter.selectDisplay(display);
773 mWriter.selectLayer(layer);
774 mWriter.setLayerPlaneAlpha(alpha);
775 return Error::NONE;
776}
777
778Error Composer::setLayerSidebandStream(Display display, Layer layer,
779 const native_handle_t* stream)
780{
781 mWriter.selectDisplay(display);
782 mWriter.selectLayer(layer);
783 mWriter.setLayerSidebandStream(stream);
784 return Error::NONE;
785}
786
787Error Composer::setLayerSourceCrop(Display display, Layer layer,
788 const IComposerClient::FRect& crop)
789{
790 mWriter.selectDisplay(display);
791 mWriter.selectLayer(layer);
792 mWriter.setLayerSourceCrop(crop);
793 return Error::NONE;
794}
795
796Error Composer::setLayerTransform(Display display, Layer layer,
797 Transform transform)
798{
799 mWriter.selectDisplay(display);
800 mWriter.selectLayer(layer);
801 mWriter.setLayerTransform(transform);
802 return Error::NONE;
803}
804
805Error Composer::setLayerVisibleRegion(Display display, Layer layer,
806 const std::vector<IComposerClient::Rect>& visible)
807{
808 mWriter.selectDisplay(display);
809 mWriter.selectLayer(layer);
810 mWriter.setLayerVisibleRegion(visible);
811 return Error::NONE;
812}
813
814Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
815{
816 mWriter.selectDisplay(display);
817 mWriter.selectLayer(layer);
818 mWriter.setLayerZOrder(z);
819 return Error::NONE;
820}
821
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500822Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
823 uint32_t appId)
824{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800825 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500826 mWriter.selectDisplay(display);
827 mWriter.selectLayer(layer);
828 mWriter.setLayerInfo(type, appId);
829 }
830 return Error::NONE;
831}
832
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800833Error Composer::execute()
834{
835 // prepare input command queue
836 bool queueChanged = false;
837 uint32_t commandLength = 0;
838 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800839 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800840 mWriter.reset();
841 return Error::NO_RESOURCES;
842 }
843
844 // set up new input command queue if necessary
845 if (queueChanged) {
846 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
847 auto error = unwrapRet(ret);
848 if (error != Error::NONE) {
849 mWriter.reset();
850 return error;
851 }
852 }
853
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700854 if (commandLength == 0) {
855 mWriter.reset();
856 return Error::NONE;
857 }
858
Chia-I Wuaab99f52016-10-05 12:59:58 +0800859 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700860 hardware::Return<void> ret;
861 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
862 const auto& tmpOutLength, const auto& tmpOutHandles)
863 {
864 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800865
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700866 // set up new output command queue if necessary
867 if (error == Error::NONE && tmpOutChanged) {
868 error = kDefaultError;
869 mClient->getOutputCommandQueue(
870 [&](const auto& tmpError,
871 const auto& tmpDescriptor)
872 {
873 error = tmpError;
874 if (error != Error::NONE) {
875 return;
876 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800877
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700878 mReader.setMQDescriptor(tmpDescriptor);
879 });
880 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800881
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700882 if (error != Error::NONE) {
883 return;
884 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800885
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700886 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
887 error = mReader.parse();
888 mReader.reset();
889 } else {
890 error = Error::NO_RESOURCES;
891 }
892 };
893 if (mClient_2_2) {
894 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
895 } else {
896 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
897 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700898 // executeCommands can fail because of out-of-fd and we do not want to
899 // abort() in that case
900 if (!ret.isOk()) {
901 ALOGE("executeCommands failed because of %s", ret.description().c_str());
902 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800903
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800904 if (error == Error::NONE) {
905 std::vector<CommandReader::CommandError> commandErrors =
906 mReader.takeErrors();
907
908 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700909 auto command =
910 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800911
912 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700913 command == IComposerClient::Command::PRESENT_DISPLAY ||
914 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800915 error = cmdErr.error;
916 } else {
917 ALOGW("command 0x%x generated error %d",
918 command, cmdErr.error);
919 }
920 }
921 }
922
923 mWriter.reset();
924
Chia-I Wuaab99f52016-10-05 12:59:58 +0800925 return error;
926}
927
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700928// Composer HAL 2.2
929
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700930Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
931 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
932 if (!mClient_2_2) {
933 return Error::UNSUPPORTED;
934 }
935
936 mWriter.selectDisplay(display);
937 mWriter.selectLayer(layer);
938 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
939 return Error::NONE;
940}
941
Chia-I Wud7e01d72018-06-21 13:39:09 +0800942std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
943 Display display) {
944 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700945 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800946 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700947 }
948
949 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800950 if (mClient_2_3) {
951 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
952 [&](const auto& tmpError, const auto& tmpKeys) {
953 error = tmpError;
954 if (error != Error::NONE) {
955 ALOGW("getPerFrameMetadataKeys failed "
956 "with %d",
957 tmpError);
958 return;
959 }
960 keys = tmpKeys;
961 });
962 } else {
963 mClient_2_2
964 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
965 error = tmpError;
966 if (error != Error::NONE) {
967 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
968 return;
969 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700970
Valerie Haue9e843a2018-12-18 13:39:23 -0800971 keys.clear();
972 for (auto key : tmpKeys) {
973 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
974 }
975 });
976 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700977
Chia-I Wud7e01d72018-06-21 13:39:09 +0800978 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700979}
980
981Error Composer::getRenderIntents(Display display, ColorMode colorMode,
982 std::vector<RenderIntent>* outRenderIntents) {
983 if (!mClient_2_2) {
984 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
985 return Error::NONE;
986 }
987
988 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700989
990 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700991 error = tmpError;
992 if (error != Error::NONE) {
993 return;
994 }
995
996 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -0700997 };
998
999 if (mClient_2_3) {
1000 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1001 } else {
1002 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1003 getRenderIntentsLambda);
1004 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001005
1006 return error;
1007}
1008
1009Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1010{
1011 if (!mClient_2_2) {
1012 *outMatrix = mat4();
1013 return Error::NONE;
1014 }
1015
1016 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001017 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1018 [&](const auto& tmpError, const auto& tmpMatrix) {
1019 error = tmpError;
1020 if (error != Error::NONE) {
1021 return;
1022 }
1023 *outMatrix = mat4(tmpMatrix.data());
1024 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001025
1026 return error;
1027}
1028
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001029// Composer HAL 2.3
1030
1031Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1032 std::vector<uint8_t>* outData) {
1033 if (!mClient_2_3) {
1034 return Error::UNSUPPORTED;
1035 }
1036
1037 Error error = kDefaultError;
1038 mClient_2_3->getDisplayIdentificationData(display,
1039 [&](const auto& tmpError, const auto& tmpPort,
1040 const auto& tmpData) {
1041 error = tmpError;
1042 if (error != Error::NONE) {
1043 return;
1044 }
1045
1046 *outPort = tmpPort;
1047 *outData = tmpData;
1048 });
1049
1050 return error;
1051}
1052
Peiyong Lin698147a2018-09-14 13:27:18 -07001053Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1054{
1055 if (!mClient_2_3) {
1056 return Error::UNSUPPORTED;
1057 }
1058
1059 mWriter.selectDisplay(display);
1060 mWriter.selectLayer(layer);
1061 mWriter.setLayerColorTransform(matrix);
1062 return Error::NONE;
1063}
1064
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001065Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1066 Dataspace* outDataspace,
1067 uint8_t* outComponentMask) {
1068 if (!outFormat || !outDataspace || !outComponentMask) {
1069 return Error::BAD_PARAMETER;
1070 }
1071 if (!mClient_2_3) {
1072 return Error::UNSUPPORTED;
1073 }
1074 Error error = kDefaultError;
1075 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1076 [&](const auto tmpError,
1077 const auto& tmpFormat,
1078 const auto& tmpDataspace,
1079 const auto& tmpComponentMask) {
1080 error = tmpError;
1081 if (error == Error::NONE) {
1082 *outFormat = tmpFormat;
1083 *outDataspace = tmpDataspace;
1084 *outComponentMask =
1085 static_cast<uint8_t>(
1086 tmpComponentMask);
1087 }
1088 });
1089 return error;
1090}
1091
Peiyong Lined531a32018-10-26 18:27:56 -07001092Error Composer::getDisplayCapabilities(Display display,
1093 std::vector<DisplayCapability>* outCapabilities) {
1094 if (!mClient_2_3) {
1095 return Error::UNSUPPORTED;
1096 }
1097 Error error = kDefaultError;
1098 mClient_2_3->getDisplayCapabilities(display,
1099 [&](const auto& tmpError, const auto& tmpCapabilities) {
1100 error = tmpError;
1101 if (error != Error::NONE) {
1102 return;
1103 }
1104 *outCapabilities = tmpCapabilities;
1105 });
1106 return error;
1107}
1108
Kevin DuBois74e53772018-11-19 10:52:38 -08001109Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1110 uint8_t componentMask, uint64_t maxFrames) {
1111 if (!mClient_2_3) {
1112 return Error::UNSUPPORTED;
1113 }
1114
1115 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1116 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1117 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1118 maxFrames);
1119}
1120
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001121Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1122 DisplayedFrameStats* outStats) {
1123 if (!outStats) {
1124 return Error::BAD_PARAMETER;
1125 }
1126 if (!mClient_2_3) {
1127 return Error::UNSUPPORTED;
1128 }
1129 Error error = kDefaultError;
1130 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1131 [&](const auto tmpError, auto tmpNumFrames,
1132 const auto& tmpSamples0, const auto& tmpSamples1,
1133 const auto& tmpSamples2, const auto& tmpSamples3) {
1134 error = tmpError;
1135 if (error == Error::NONE) {
1136 outStats->numFrames = tmpNumFrames;
1137 outStats->component_0_sample = tmpSamples0;
1138 outStats->component_1_sample = tmpSamples1;
1139 outStats->component_2_sample = tmpSamples2;
1140 outStats->component_3_sample = tmpSamples3;
1141 }
1142 });
1143 return error;
1144}
1145
Valerie Haue9e843a2018-12-18 13:39:23 -08001146Error Composer::setLayerPerFrameMetadataBlobs(
1147 Display display, Layer layer,
1148 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1149 if (!mClient_2_3) {
1150 return Error::UNSUPPORTED;
1151 }
1152
1153 mWriter.selectDisplay(display);
1154 mWriter.selectLayer(layer);
1155 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1156 return Error::NONE;
1157}
1158
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001159CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001160{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001161 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001162}
1163
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001164Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001165{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001166 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001167
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001168 IComposerClient::Command command;
1169 uint16_t length = 0;
1170
1171 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001172 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001173 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001174 break;
1175 }
1176
1177 bool parsed = false;
1178 switch (command) {
1179 case IComposerClient::Command::SELECT_DISPLAY:
1180 parsed = parseSelectDisplay(length);
1181 break;
1182 case IComposerClient::Command::SET_ERROR:
1183 parsed = parseSetError(length);
1184 break;
1185 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1186 parsed = parseSetChangedCompositionTypes(length);
1187 break;
1188 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1189 parsed = parseSetDisplayRequests(length);
1190 break;
1191 case IComposerClient::Command::SET_PRESENT_FENCE:
1192 parsed = parseSetPresentFence(length);
1193 break;
1194 case IComposerClient::Command::SET_RELEASE_FENCES:
1195 parsed = parseSetReleaseFences(length);
1196 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001197 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1198 parsed = parseSetPresentOrValidateDisplayResult(length);
1199 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001200 default:
1201 parsed = false;
1202 break;
1203 }
1204
1205 endCommand();
1206
1207 if (!parsed) {
1208 ALOGE("failed to parse command 0x%x length %" PRIu16,
1209 command, length);
1210 break;
1211 }
1212 }
1213
1214 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001215}
1216
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001217bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001218{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001219 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001220 return false;
1221 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001222
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001223 mCurrentReturnData = &mReturnData[read64()];
1224
1225 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001226}
1227
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001228bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001229{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001230 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001231 return false;
1232 }
1233
1234 auto location = read();
1235 auto error = static_cast<Error>(readSigned());
1236
1237 mErrors.emplace_back(CommandError{location, error});
1238
1239 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001240}
1241
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001242bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001243{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001244 // (layer id, composition type) pairs
1245 if (length % 3 != 0 || !mCurrentReturnData) {
1246 return false;
1247 }
1248
1249 uint32_t count = length / 3;
1250 mCurrentReturnData->changedLayers.reserve(count);
1251 mCurrentReturnData->compositionTypes.reserve(count);
1252 while (count > 0) {
1253 auto layer = read64();
1254 auto type = static_cast<IComposerClient::Composition>(readSigned());
1255
1256 mCurrentReturnData->changedLayers.push_back(layer);
1257 mCurrentReturnData->compositionTypes.push_back(type);
1258
1259 count--;
1260 }
1261
1262 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001263}
1264
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001265bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001266{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001267 // display requests followed by (layer id, layer requests) pairs
1268 if (length % 3 != 1 || !mCurrentReturnData) {
1269 return false;
1270 }
1271
1272 mCurrentReturnData->displayRequests = read();
1273
1274 uint32_t count = (length - 1) / 3;
1275 mCurrentReturnData->requestedLayers.reserve(count);
1276 mCurrentReturnData->requestMasks.reserve(count);
1277 while (count > 0) {
1278 auto layer = read64();
1279 auto layerRequestMask = read();
1280
1281 mCurrentReturnData->requestedLayers.push_back(layer);
1282 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1283
1284 count--;
1285 }
1286
1287 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001288}
1289
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001290bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001291{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001292 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001293 !mCurrentReturnData) {
1294 return false;
1295 }
1296
1297 if (mCurrentReturnData->presentFence >= 0) {
1298 close(mCurrentReturnData->presentFence);
1299 }
1300 mCurrentReturnData->presentFence = readFence();
1301
1302 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001303}
1304
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001305bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001306{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001307 // (layer id, release fence index) pairs
1308 if (length % 3 != 0 || !mCurrentReturnData) {
1309 return false;
1310 }
1311
1312 uint32_t count = length / 3;
1313 mCurrentReturnData->releasedLayers.reserve(count);
1314 mCurrentReturnData->releaseFences.reserve(count);
1315 while (count > 0) {
1316 auto layer = read64();
1317 auto fence = readFence();
1318
1319 mCurrentReturnData->releasedLayers.push_back(layer);
1320 mCurrentReturnData->releaseFences.push_back(fence);
1321
1322 count--;
1323 }
1324
1325 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001326}
1327
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001328bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1329{
1330 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1331 return false;
1332 }
1333 mCurrentReturnData->presentOrValidateState = read();
1334 return true;
1335}
1336
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001337void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001338{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001339 mErrors.clear();
1340
1341 for (auto& data : mReturnData) {
1342 if (data.second.presentFence >= 0) {
1343 close(data.second.presentFence);
1344 }
1345 for (auto fence : data.second.releaseFences) {
1346 if (fence >= 0) {
1347 close(fence);
1348 }
1349 }
1350 }
1351
1352 mReturnData.clear();
1353 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001354}
1355
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001356std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001357{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001358 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001359}
1360
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001361bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001362 uint32_t* outNumChangedCompositionTypes,
1363 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001364{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001365 auto found = mReturnData.find(display);
1366 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001367 *outNumChangedCompositionTypes = 0;
1368 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001369 return false;
1370 }
1371
1372 const ReturnData& data = found->second;
1373
Chia-I Wu67e376d2016-12-19 11:36:22 +08001374 *outNumChangedCompositionTypes = data.compositionTypes.size();
1375 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001376
1377 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001378}
1379
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001380void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001381 std::vector<Layer>* outLayers,
1382 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001383{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001384 auto found = mReturnData.find(display);
1385 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001386 outLayers->clear();
1387 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001388 return;
1389 }
1390
1391 ReturnData& data = found->second;
1392
Chia-I Wu67e376d2016-12-19 11:36:22 +08001393 *outLayers = std::move(data.changedLayers);
1394 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001395}
1396
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001397void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001398 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1399 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001400{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001401 auto found = mReturnData.find(display);
1402 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001403 *outDisplayRequestMask = 0;
1404 outLayers->clear();
1405 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001406 return;
1407 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001408
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001409 ReturnData& data = found->second;
1410
Chia-I Wu67e376d2016-12-19 11:36:22 +08001411 *outDisplayRequestMask = data.displayRequests;
1412 *outLayers = std::move(data.requestedLayers);
1413 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001414}
1415
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001416void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001417 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001418{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001419 auto found = mReturnData.find(display);
1420 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001421 outLayers->clear();
1422 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001423 return;
1424 }
1425
1426 ReturnData& data = found->second;
1427
Chia-I Wu67e376d2016-12-19 11:36:22 +08001428 *outLayers = std::move(data.releasedLayers);
1429 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001430}
1431
Chia-I Wu67e376d2016-12-19 11:36:22 +08001432void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001433{
1434 auto found = mReturnData.find(display);
1435 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001436 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001437 return;
1438 }
1439
1440 ReturnData& data = found->second;
1441
Chia-I Wu67e376d2016-12-19 11:36:22 +08001442 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001443 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001444}
1445
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001446void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1447 auto found = mReturnData.find(display);
1448 if (found == mReturnData.end()) {
1449 *state= -1;
1450 return;
1451 }
1452 ReturnData& data = found->second;
1453 *state = data.presentOrValidateState;
1454}
1455
Lloyd Piquea822d522017-12-20 16:42:57 -08001456} // namespace impl
1457
Chia-I Wuaab99f52016-10-05 12:59:58 +08001458} // namespace Hwc2
1459
1460} // namespace android