blob: 8343e5ab91215a69e6a7b6037323d7df7e106dbd [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 DuBois79947732019-01-22 13:53:20 -0800263 mClient_2_2->createVirtualDisplay_2_2(width, height,
264 static_cast<types::V1_1::PixelFormat>(*format),
265 bufferSlotCount,
266 [&](const auto& tmpError, const auto& tmpDisplay,
267 const auto& tmpFormat) {
268 error = tmpError;
269 if (error != Error::NONE) {
270 return;
271 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800272
Kevin DuBois79947732019-01-22 13:53:20 -0800273 *outDisplay = tmpDisplay;
274 *format = static_cast<types::V1_2::PixelFormat>(
275 tmpFormat);
276 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700277 } else {
278 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700279 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700280 [&](const auto& tmpError, const auto& tmpDisplay,
281 const auto& tmpFormat) {
282 error = tmpError;
283 if (error != Error::NONE) {
284 return;
285 }
286
287 *outDisplay = tmpDisplay;
288 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800289 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700290 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291
292 return error;
293}
294
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800295Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800296{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800297 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298 return unwrapRet(ret);
299}
300
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800301Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800303 mWriter.selectDisplay(display);
304 mWriter.acceptDisplayChanges();
305 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306}
307
Chia-I Wu67e376d2016-12-19 11:36:22 +0800308Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309{
310 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800311 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800312 [&](const auto& tmpError, const auto& tmpLayer) {
313 error = tmpError;
314 if (error != Error::NONE) {
315 return;
316 }
317
Chia-I Wu67e376d2016-12-19 11:36:22 +0800318 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800319 });
320
321 return error;
322}
323
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800324Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800325{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800326 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800327 return unwrapRet(ret);
328}
329
Chia-I Wu67e376d2016-12-19 11:36:22 +0800330Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800331{
332 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800333 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800334 [&](const auto& tmpError, const auto& tmpConfig) {
335 error = tmpError;
336 if (error != Error::NONE) {
337 return;
338 }
339
Chia-I Wu67e376d2016-12-19 11:36:22 +0800340 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800341 });
342
343 return error;
344}
345
346Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800347 std::vector<Layer>* outLayers,
348 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800349{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800350 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800351 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800352}
353
354Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800355 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800356{
357 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800358
Valerie Hau9758ae02018-10-09 16:05:09 -0700359 if (mClient_2_3) {
360 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
361 error = tmpError;
362 if (error != Error::NONE) {
363 return;
364 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700365
Valerie Hau9758ae02018-10-09 16:05:09 -0700366 *outModes = tmpModes;
367 });
368 } else if (mClient_2_2) {
369 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
370 error = tmpError;
371 if (error != Error::NONE) {
372 return;
373 }
374
375 for (types::V1_1::ColorMode colorMode : tmpModes) {
376 outModes->push_back(static_cast<ColorMode>(colorMode));
377 }
378 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700379 } else {
380 mClient->getColorModes(display,
381 [&](const auto& tmpError, const auto& tmpModes) {
382 error = tmpError;
383 if (error != Error::NONE) {
384 return;
385 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700386 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700387 outModes->push_back(static_cast<ColorMode>(colorMode));
388 }
389 });
390 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800391
392 return error;
393}
394
395Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800396 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800397{
398 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800399 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800400 [&](const auto& tmpError, const auto& tmpValue) {
401 error = tmpError;
402 if (error != Error::NONE) {
403 return;
404 }
405
Chia-I Wu67e376d2016-12-19 11:36:22 +0800406 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800407 });
408
409 return error;
410}
411
412Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800413 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800414{
415 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800416 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800417 [&](const auto& tmpError, const auto& tmpConfigs) {
418 error = tmpError;
419 if (error != Error::NONE) {
420 return;
421 }
422
Chia-I Wu67e376d2016-12-19 11:36:22 +0800423 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800424 });
425
426 return error;
427}
428
Chia-I Wu67e376d2016-12-19 11:36:22 +0800429Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430{
431 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800432 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800433 [&](const auto& tmpError, const auto& tmpName) {
434 error = tmpError;
435 if (error != Error::NONE) {
436 return;
437 }
438
Chia-I Wu67e376d2016-12-19 11:36:22 +0800439 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800440 });
441
442 return error;
443}
444
445Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800446 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
447 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800448{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800449 mReader.takeDisplayRequests(display, outDisplayRequestMask,
450 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800451 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800452}
453
Chia-I Wu67e376d2016-12-19 11:36:22 +0800454Error Composer::getDisplayType(Display display,
455 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456{
457 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800458 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800459 [&](const auto& tmpError, const auto& tmpType) {
460 error = tmpError;
461 if (error != Error::NONE) {
462 return;
463 }
464
Chia-I Wu67e376d2016-12-19 11:36:22 +0800465 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800466 });
467
468 return error;
469}
470
Chia-I Wu67e376d2016-12-19 11:36:22 +0800471Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472{
473 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800474 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800475 [&](const auto& tmpError, const auto& tmpSupport) {
476 error = tmpError;
477 if (error != Error::NONE) {
478 return;
479 }
480
Chia-I Wu67e376d2016-12-19 11:36:22 +0800481 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800482 });
483
484 return error;
485}
486
Chia-I Wu67e376d2016-12-19 11:36:22 +0800487Error Composer::getHdrCapabilities(Display display,
488 std::vector<Hdr>* outTypes, float* outMaxLuminance,
489 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800490{
491 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800492 if (mClient_2_3) {
493 mClient_2_3->getHdrCapabilities_2_3(display,
494 [&](const auto& tmpError, const auto& tmpTypes,
495 const auto& tmpMaxLuminance,
496 const auto& tmpMaxAverageLuminance,
497 const auto& tmpMinLuminance) {
498 error = tmpError;
499 if (error != Error::NONE) {
500 return;
501 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800502
Valerie Haue9e843a2018-12-18 13:39:23 -0800503 *outTypes = tmpTypes;
504 *outMaxLuminance = tmpMaxLuminance;
505 *outMaxAverageLuminance = tmpMaxAverageLuminance;
506 *outMinLuminance = tmpMinLuminance;
507 });
508 } else {
509 mClient->getHdrCapabilities(display,
510 [&](const auto& tmpError, const auto& tmpTypes,
511 const auto& tmpMaxLuminance,
512 const auto& tmpMaxAverageLuminance,
513 const auto& tmpMinLuminance) {
514 error = tmpError;
515 if (error != Error::NONE) {
516 return;
517 }
518
519 outTypes->clear();
520 for (auto type : tmpTypes) {
521 outTypes->push_back(static_cast<Hdr>(type));
522 }
523
524 *outMaxLuminance = tmpMaxLuminance;
525 *outMaxAverageLuminance = tmpMaxAverageLuminance;
526 *outMinLuminance = tmpMinLuminance;
527 });
528 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800529
530 return error;
531}
532
Chia-I Wu67e376d2016-12-19 11:36:22 +0800533Error Composer::getReleaseFences(Display display,
534 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800535{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800536 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800537 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538}
539
Chia-I Wu67e376d2016-12-19 11:36:22 +0800540Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800541{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 mWriter.selectDisplay(display);
543 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800544
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800545 Error error = execute();
546 if (error != Error::NONE) {
547 return error;
548 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800549
Chia-I Wu67e376d2016-12-19 11:36:22 +0800550 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800551
552 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553}
554
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800555Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800557 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800558 return unwrapRet(ret);
559}
560
Chia-I Wu06d63de2017-01-04 14:58:51 +0800561Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400562 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800564 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800565{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800566 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400567 if (mIsUsingVrComposer && target.get()) {
568 IVrComposerClient::BufferMetadata metadata = {
569 .width = target->getWidth(),
570 .height = target->getHeight(),
571 .stride = target->getStride(),
572 .layerCount = target->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700573 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400574 .usage = target->getUsage(),
575 };
576 mWriter.setClientTargetMetadata(metadata);
577 }
578
579 const native_handle_t* handle = nullptr;
580 if (target.get()) {
581 handle = target->getNativeBuffer()->handle;
582 }
583
584 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800585 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800586}
587
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700588Error Composer::setColorMode(Display display, ColorMode mode,
589 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800590{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700591 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700592 if (mClient_2_3) {
593 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
594 } else if (mClient_2_2) {
595 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
596 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700597 } else {
598 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700599 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700600 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800601 return unwrapRet(ret);
602}
603
604Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800605 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800606{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800607 mWriter.selectDisplay(display);
608 mWriter.setColorTransform(matrix, hint);
609 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800610}
611
612Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800613 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800614{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800615 mWriter.selectDisplay(display);
616 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
617 return Error::NONE;
618}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800619
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700620Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
621 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700622 if (mClient_2_2) {
623 ret = mClient_2_2->setPowerMode_2_2(display, mode);
624 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700625 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700626 }
627
Chia-I Wuaab99f52016-10-05 12:59:58 +0800628 return unwrapRet(ret);
629}
630
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800631Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800632{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800633 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800634 return unwrapRet(ret);
635}
636
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800637Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800638{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800639 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800640 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800641 return unwrapRet(ret);
642}
643
Chia-I Wu67e376d2016-12-19 11:36:22 +0800644Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
645 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800646{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800647 mWriter.selectDisplay(display);
648 mWriter.validateDisplay();
649
650 Error error = execute();
651 if (error != Error::NONE) {
652 return error;
653 }
654
Chia-I Wu67e376d2016-12-19 11:36:22 +0800655 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800656
657 return Error::NONE;
658}
659
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700660Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
661 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
662 mWriter.selectDisplay(display);
663 mWriter.presentOrvalidateDisplay();
664
665 Error error = execute();
666 if (error != Error::NONE) {
667 return error;
668 }
669
670 mReader.takePresentOrValidateStage(display, state);
671
672 if (*state == 1) { // Present succeeded
673 mReader.takePresentFence(display, outPresentFence);
674 }
675
676 if (*state == 0) { // Validate succeeded.
677 mReader.hasChanges(display, outNumTypes, outNumRequests);
678 }
679
680 return Error::NONE;
681}
682
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800683Error Composer::setCursorPosition(Display display, Layer layer,
684 int32_t x, int32_t y)
685{
686 mWriter.selectDisplay(display);
687 mWriter.selectLayer(layer);
688 mWriter.setLayerCursorPosition(x, y);
689 return Error::NONE;
690}
691
692Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400693 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800694{
695 mWriter.selectDisplay(display);
696 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400697 if (mIsUsingVrComposer && buffer.get()) {
698 IVrComposerClient::BufferMetadata metadata = {
699 .width = buffer->getWidth(),
700 .height = buffer->getHeight(),
701 .stride = buffer->getStride(),
702 .layerCount = buffer->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700703 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400704 .usage = buffer->getUsage(),
705 };
706 mWriter.setLayerBufferMetadata(metadata);
707 }
708
709 const native_handle_t* handle = nullptr;
710 if (buffer.get()) {
711 handle = buffer->getNativeBuffer()->handle;
712 }
713
714 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800715 return Error::NONE;
716}
717
718Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
719 const std::vector<IComposerClient::Rect>& damage)
720{
721 mWriter.selectDisplay(display);
722 mWriter.selectLayer(layer);
723 mWriter.setLayerSurfaceDamage(damage);
724 return Error::NONE;
725}
726
727Error Composer::setLayerBlendMode(Display display, Layer layer,
728 IComposerClient::BlendMode mode)
729{
730 mWriter.selectDisplay(display);
731 mWriter.selectLayer(layer);
732 mWriter.setLayerBlendMode(mode);
733 return Error::NONE;
734}
735
736Error Composer::setLayerColor(Display display, Layer layer,
737 const IComposerClient::Color& color)
738{
739 mWriter.selectDisplay(display);
740 mWriter.selectLayer(layer);
741 mWriter.setLayerColor(color);
742 return Error::NONE;
743}
744
745Error Composer::setLayerCompositionType(Display display, Layer layer,
746 IComposerClient::Composition type)
747{
748 mWriter.selectDisplay(display);
749 mWriter.selectLayer(layer);
750 mWriter.setLayerCompositionType(type);
751 return Error::NONE;
752}
753
754Error Composer::setLayerDataspace(Display display, Layer layer,
755 Dataspace dataspace)
756{
757 mWriter.selectDisplay(display);
758 mWriter.selectLayer(layer);
759 mWriter.setLayerDataspace(dataspace);
760 return Error::NONE;
761}
762
763Error Composer::setLayerDisplayFrame(Display display, Layer layer,
764 const IComposerClient::Rect& frame)
765{
766 mWriter.selectDisplay(display);
767 mWriter.selectLayer(layer);
768 mWriter.setLayerDisplayFrame(frame);
769 return Error::NONE;
770}
771
772Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
773 float alpha)
774{
775 mWriter.selectDisplay(display);
776 mWriter.selectLayer(layer);
777 mWriter.setLayerPlaneAlpha(alpha);
778 return Error::NONE;
779}
780
781Error Composer::setLayerSidebandStream(Display display, Layer layer,
782 const native_handle_t* stream)
783{
784 mWriter.selectDisplay(display);
785 mWriter.selectLayer(layer);
786 mWriter.setLayerSidebandStream(stream);
787 return Error::NONE;
788}
789
790Error Composer::setLayerSourceCrop(Display display, Layer layer,
791 const IComposerClient::FRect& crop)
792{
793 mWriter.selectDisplay(display);
794 mWriter.selectLayer(layer);
795 mWriter.setLayerSourceCrop(crop);
796 return Error::NONE;
797}
798
799Error Composer::setLayerTransform(Display display, Layer layer,
800 Transform transform)
801{
802 mWriter.selectDisplay(display);
803 mWriter.selectLayer(layer);
804 mWriter.setLayerTransform(transform);
805 return Error::NONE;
806}
807
808Error Composer::setLayerVisibleRegion(Display display, Layer layer,
809 const std::vector<IComposerClient::Rect>& visible)
810{
811 mWriter.selectDisplay(display);
812 mWriter.selectLayer(layer);
813 mWriter.setLayerVisibleRegion(visible);
814 return Error::NONE;
815}
816
817Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
818{
819 mWriter.selectDisplay(display);
820 mWriter.selectLayer(layer);
821 mWriter.setLayerZOrder(z);
822 return Error::NONE;
823}
824
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500825Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
826 uint32_t appId)
827{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800828 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500829 mWriter.selectDisplay(display);
830 mWriter.selectLayer(layer);
831 mWriter.setLayerInfo(type, appId);
832 }
833 return Error::NONE;
834}
835
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800836Error Composer::execute()
837{
838 // prepare input command queue
839 bool queueChanged = false;
840 uint32_t commandLength = 0;
841 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800842 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800843 mWriter.reset();
844 return Error::NO_RESOURCES;
845 }
846
847 // set up new input command queue if necessary
848 if (queueChanged) {
849 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
850 auto error = unwrapRet(ret);
851 if (error != Error::NONE) {
852 mWriter.reset();
853 return error;
854 }
855 }
856
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700857 if (commandLength == 0) {
858 mWriter.reset();
859 return Error::NONE;
860 }
861
Chia-I Wuaab99f52016-10-05 12:59:58 +0800862 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700863 hardware::Return<void> ret;
864 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
865 const auto& tmpOutLength, const auto& tmpOutHandles)
866 {
867 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800868
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700869 // set up new output command queue if necessary
870 if (error == Error::NONE && tmpOutChanged) {
871 error = kDefaultError;
872 mClient->getOutputCommandQueue(
873 [&](const auto& tmpError,
874 const auto& tmpDescriptor)
875 {
876 error = tmpError;
877 if (error != Error::NONE) {
878 return;
879 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800880
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700881 mReader.setMQDescriptor(tmpDescriptor);
882 });
883 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800884
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700885 if (error != Error::NONE) {
886 return;
887 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800888
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700889 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
890 error = mReader.parse();
891 mReader.reset();
892 } else {
893 error = Error::NO_RESOURCES;
894 }
895 };
896 if (mClient_2_2) {
897 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
898 } else {
899 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
900 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700901 // executeCommands can fail because of out-of-fd and we do not want to
902 // abort() in that case
903 if (!ret.isOk()) {
904 ALOGE("executeCommands failed because of %s", ret.description().c_str());
905 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800906
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800907 if (error == Error::NONE) {
908 std::vector<CommandReader::CommandError> commandErrors =
909 mReader.takeErrors();
910
911 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700912 auto command =
913 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800914
915 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700916 command == IComposerClient::Command::PRESENT_DISPLAY ||
917 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918 error = cmdErr.error;
919 } else {
920 ALOGW("command 0x%x generated error %d",
921 command, cmdErr.error);
922 }
923 }
924 }
925
926 mWriter.reset();
927
Chia-I Wuaab99f52016-10-05 12:59:58 +0800928 return error;
929}
930
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700931// Composer HAL 2.2
932
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700933Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
934 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
935 if (!mClient_2_2) {
936 return Error::UNSUPPORTED;
937 }
938
939 mWriter.selectDisplay(display);
940 mWriter.selectLayer(layer);
941 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
942 return Error::NONE;
943}
944
Chia-I Wud7e01d72018-06-21 13:39:09 +0800945std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
946 Display display) {
947 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700948 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800949 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700950 }
951
952 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800953 if (mClient_2_3) {
954 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
955 [&](const auto& tmpError, const auto& tmpKeys) {
956 error = tmpError;
957 if (error != Error::NONE) {
958 ALOGW("getPerFrameMetadataKeys failed "
959 "with %d",
960 tmpError);
961 return;
962 }
963 keys = tmpKeys;
964 });
965 } else {
966 mClient_2_2
967 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
968 error = tmpError;
969 if (error != Error::NONE) {
970 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
971 return;
972 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700973
Valerie Haue9e843a2018-12-18 13:39:23 -0800974 keys.clear();
975 for (auto key : tmpKeys) {
976 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
977 }
978 });
979 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700980
Chia-I Wud7e01d72018-06-21 13:39:09 +0800981 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700982}
983
984Error Composer::getRenderIntents(Display display, ColorMode colorMode,
985 std::vector<RenderIntent>* outRenderIntents) {
986 if (!mClient_2_2) {
987 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
988 return Error::NONE;
989 }
990
991 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700992
993 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700994 error = tmpError;
995 if (error != Error::NONE) {
996 return;
997 }
998
999 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -07001000 };
1001
1002 if (mClient_2_3) {
1003 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1004 } else {
1005 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1006 getRenderIntentsLambda);
1007 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001008
1009 return error;
1010}
1011
1012Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1013{
1014 if (!mClient_2_2) {
1015 *outMatrix = mat4();
1016 return Error::NONE;
1017 }
1018
1019 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001020 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1021 [&](const auto& tmpError, const auto& tmpMatrix) {
1022 error = tmpError;
1023 if (error != Error::NONE) {
1024 return;
1025 }
1026 *outMatrix = mat4(tmpMatrix.data());
1027 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001028
1029 return error;
1030}
1031
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001032// Composer HAL 2.3
1033
1034Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1035 std::vector<uint8_t>* outData) {
1036 if (!mClient_2_3) {
1037 return Error::UNSUPPORTED;
1038 }
1039
1040 Error error = kDefaultError;
1041 mClient_2_3->getDisplayIdentificationData(display,
1042 [&](const auto& tmpError, const auto& tmpPort,
1043 const auto& tmpData) {
1044 error = tmpError;
1045 if (error != Error::NONE) {
1046 return;
1047 }
1048
1049 *outPort = tmpPort;
1050 *outData = tmpData;
1051 });
1052
1053 return error;
1054}
1055
Peiyong Lin698147a2018-09-14 13:27:18 -07001056Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1057{
1058 if (!mClient_2_3) {
1059 return Error::UNSUPPORTED;
1060 }
1061
1062 mWriter.selectDisplay(display);
1063 mWriter.selectLayer(layer);
1064 mWriter.setLayerColorTransform(matrix);
1065 return Error::NONE;
1066}
1067
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001068Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1069 Dataspace* outDataspace,
1070 uint8_t* outComponentMask) {
1071 if (!outFormat || !outDataspace || !outComponentMask) {
1072 return Error::BAD_PARAMETER;
1073 }
1074 if (!mClient_2_3) {
1075 return Error::UNSUPPORTED;
1076 }
1077 Error error = kDefaultError;
1078 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1079 [&](const auto tmpError,
1080 const auto& tmpFormat,
1081 const auto& tmpDataspace,
1082 const auto& tmpComponentMask) {
1083 error = tmpError;
1084 if (error == Error::NONE) {
1085 *outFormat = tmpFormat;
1086 *outDataspace = tmpDataspace;
1087 *outComponentMask =
1088 static_cast<uint8_t>(
1089 tmpComponentMask);
1090 }
1091 });
1092 return error;
1093}
1094
Peiyong Lined531a32018-10-26 18:27:56 -07001095Error Composer::getDisplayCapabilities(Display display,
1096 std::vector<DisplayCapability>* outCapabilities) {
1097 if (!mClient_2_3) {
1098 return Error::UNSUPPORTED;
1099 }
1100 Error error = kDefaultError;
1101 mClient_2_3->getDisplayCapabilities(display,
1102 [&](const auto& tmpError, const auto& tmpCapabilities) {
1103 error = tmpError;
1104 if (error != Error::NONE) {
1105 return;
1106 }
1107 *outCapabilities = tmpCapabilities;
1108 });
1109 return error;
1110}
1111
Kevin DuBois74e53772018-11-19 10:52:38 -08001112Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1113 uint8_t componentMask, uint64_t maxFrames) {
1114 if (!mClient_2_3) {
1115 return Error::UNSUPPORTED;
1116 }
1117
1118 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1119 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1120 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1121 maxFrames);
1122}
1123
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001124Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1125 DisplayedFrameStats* outStats) {
1126 if (!outStats) {
1127 return Error::BAD_PARAMETER;
1128 }
1129 if (!mClient_2_3) {
1130 return Error::UNSUPPORTED;
1131 }
1132 Error error = kDefaultError;
1133 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1134 [&](const auto tmpError, auto tmpNumFrames,
1135 const auto& tmpSamples0, const auto& tmpSamples1,
1136 const auto& tmpSamples2, const auto& tmpSamples3) {
1137 error = tmpError;
1138 if (error == Error::NONE) {
1139 outStats->numFrames = tmpNumFrames;
1140 outStats->component_0_sample = tmpSamples0;
1141 outStats->component_1_sample = tmpSamples1;
1142 outStats->component_2_sample = tmpSamples2;
1143 outStats->component_3_sample = tmpSamples3;
1144 }
1145 });
1146 return error;
1147}
1148
Valerie Haue9e843a2018-12-18 13:39:23 -08001149Error Composer::setLayerPerFrameMetadataBlobs(
1150 Display display, Layer layer,
1151 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1152 if (!mClient_2_3) {
1153 return Error::UNSUPPORTED;
1154 }
1155
1156 mWriter.selectDisplay(display);
1157 mWriter.selectLayer(layer);
1158 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1159 return Error::NONE;
1160}
1161
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001162CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001163{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001164 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001165}
1166
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001167Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001168{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001169 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001170
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001171 IComposerClient::Command command;
1172 uint16_t length = 0;
1173
1174 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001175 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001176 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001177 break;
1178 }
1179
1180 bool parsed = false;
1181 switch (command) {
1182 case IComposerClient::Command::SELECT_DISPLAY:
1183 parsed = parseSelectDisplay(length);
1184 break;
1185 case IComposerClient::Command::SET_ERROR:
1186 parsed = parseSetError(length);
1187 break;
1188 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1189 parsed = parseSetChangedCompositionTypes(length);
1190 break;
1191 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1192 parsed = parseSetDisplayRequests(length);
1193 break;
1194 case IComposerClient::Command::SET_PRESENT_FENCE:
1195 parsed = parseSetPresentFence(length);
1196 break;
1197 case IComposerClient::Command::SET_RELEASE_FENCES:
1198 parsed = parseSetReleaseFences(length);
1199 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001200 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1201 parsed = parseSetPresentOrValidateDisplayResult(length);
1202 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001203 default:
1204 parsed = false;
1205 break;
1206 }
1207
1208 endCommand();
1209
1210 if (!parsed) {
1211 ALOGE("failed to parse command 0x%x length %" PRIu16,
1212 command, length);
1213 break;
1214 }
1215 }
1216
1217 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001218}
1219
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001220bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001221{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001222 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001223 return false;
1224 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001225
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001226 mCurrentReturnData = &mReturnData[read64()];
1227
1228 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001229}
1230
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001231bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001232{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001233 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001234 return false;
1235 }
1236
1237 auto location = read();
1238 auto error = static_cast<Error>(readSigned());
1239
1240 mErrors.emplace_back(CommandError{location, error});
1241
1242 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001243}
1244
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001245bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001246{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001247 // (layer id, composition type) pairs
1248 if (length % 3 != 0 || !mCurrentReturnData) {
1249 return false;
1250 }
1251
1252 uint32_t count = length / 3;
1253 mCurrentReturnData->changedLayers.reserve(count);
1254 mCurrentReturnData->compositionTypes.reserve(count);
1255 while (count > 0) {
1256 auto layer = read64();
1257 auto type = static_cast<IComposerClient::Composition>(readSigned());
1258
1259 mCurrentReturnData->changedLayers.push_back(layer);
1260 mCurrentReturnData->compositionTypes.push_back(type);
1261
1262 count--;
1263 }
1264
1265 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001266}
1267
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001268bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001269{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001270 // display requests followed by (layer id, layer requests) pairs
1271 if (length % 3 != 1 || !mCurrentReturnData) {
1272 return false;
1273 }
1274
1275 mCurrentReturnData->displayRequests = read();
1276
1277 uint32_t count = (length - 1) / 3;
1278 mCurrentReturnData->requestedLayers.reserve(count);
1279 mCurrentReturnData->requestMasks.reserve(count);
1280 while (count > 0) {
1281 auto layer = read64();
1282 auto layerRequestMask = read();
1283
1284 mCurrentReturnData->requestedLayers.push_back(layer);
1285 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1286
1287 count--;
1288 }
1289
1290 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001291}
1292
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001293bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001294{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001295 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001296 !mCurrentReturnData) {
1297 return false;
1298 }
1299
1300 if (mCurrentReturnData->presentFence >= 0) {
1301 close(mCurrentReturnData->presentFence);
1302 }
1303 mCurrentReturnData->presentFence = readFence();
1304
1305 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001306}
1307
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001308bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001309{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001310 // (layer id, release fence index) pairs
1311 if (length % 3 != 0 || !mCurrentReturnData) {
1312 return false;
1313 }
1314
1315 uint32_t count = length / 3;
1316 mCurrentReturnData->releasedLayers.reserve(count);
1317 mCurrentReturnData->releaseFences.reserve(count);
1318 while (count > 0) {
1319 auto layer = read64();
1320 auto fence = readFence();
1321
1322 mCurrentReturnData->releasedLayers.push_back(layer);
1323 mCurrentReturnData->releaseFences.push_back(fence);
1324
1325 count--;
1326 }
1327
1328 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001329}
1330
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001331bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1332{
1333 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1334 return false;
1335 }
1336 mCurrentReturnData->presentOrValidateState = read();
1337 return true;
1338}
1339
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001340void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001341{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001342 mErrors.clear();
1343
1344 for (auto& data : mReturnData) {
1345 if (data.second.presentFence >= 0) {
1346 close(data.second.presentFence);
1347 }
1348 for (auto fence : data.second.releaseFences) {
1349 if (fence >= 0) {
1350 close(fence);
1351 }
1352 }
1353 }
1354
1355 mReturnData.clear();
1356 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001357}
1358
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001359std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001360{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001361 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001362}
1363
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001364bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001365 uint32_t* outNumChangedCompositionTypes,
1366 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001367{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001368 auto found = mReturnData.find(display);
1369 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001370 *outNumChangedCompositionTypes = 0;
1371 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001372 return false;
1373 }
1374
1375 const ReturnData& data = found->second;
1376
Chia-I Wu67e376d2016-12-19 11:36:22 +08001377 *outNumChangedCompositionTypes = data.compositionTypes.size();
1378 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001379
1380 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001381}
1382
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001383void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001384 std::vector<Layer>* outLayers,
1385 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001386{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001387 auto found = mReturnData.find(display);
1388 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001389 outLayers->clear();
1390 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001391 return;
1392 }
1393
1394 ReturnData& data = found->second;
1395
Chia-I Wu67e376d2016-12-19 11:36:22 +08001396 *outLayers = std::move(data.changedLayers);
1397 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001398}
1399
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001400void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001401 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1402 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001403{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001404 auto found = mReturnData.find(display);
1405 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001406 *outDisplayRequestMask = 0;
1407 outLayers->clear();
1408 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001409 return;
1410 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001411
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001412 ReturnData& data = found->second;
1413
Chia-I Wu67e376d2016-12-19 11:36:22 +08001414 *outDisplayRequestMask = data.displayRequests;
1415 *outLayers = std::move(data.requestedLayers);
1416 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001417}
1418
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001419void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001420 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001421{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001422 auto found = mReturnData.find(display);
1423 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001424 outLayers->clear();
1425 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001426 return;
1427 }
1428
1429 ReturnData& data = found->second;
1430
Chia-I Wu67e376d2016-12-19 11:36:22 +08001431 *outLayers = std::move(data.releasedLayers);
1432 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001433}
1434
Chia-I Wu67e376d2016-12-19 11:36:22 +08001435void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001436{
1437 auto found = mReturnData.find(display);
1438 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001439 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001440 return;
1441 }
1442
1443 ReturnData& data = found->second;
1444
Chia-I Wu67e376d2016-12-19 11:36:22 +08001445 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001446 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001447}
1448
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001449void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1450 auto found = mReturnData.find(display);
1451 if (found == mReturnData.end()) {
1452 *state= -1;
1453 return;
1454 }
1455 ReturnData& data = found->second;
1456 *state = data.presentOrValidateState;
1457}
1458
Lloyd Piquea822d522017-12-20 16:42:57 -08001459} // namespace impl
1460
Chia-I Wuaab99f52016-10-05 12:59:58 +08001461} // namespace Hwc2
1462
1463} // namespace android