blob: 2d91c68f02e619ffbbdcfc213ed6d9ed3311571d [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:
43 BufferHandle(const native_handle_t* buffer)
44 {
45 // nullptr is not a valid handle to HIDL
46 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
47 }
48
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010049 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080050 {
51 return mHandle;
52 }
53
54private:
55 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010056 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080057};
58
59class FenceHandle
60{
61public:
62 FenceHandle(int fd, bool owned)
63 : mOwned(owned)
64 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010065 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080066 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010067 handle = native_handle_init(mStorage, 1, 0);
68 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 } else {
70 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010071 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080072 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 }
75
76 ~FenceHandle()
77 {
78 if (mOwned) {
79 native_handle_close(mHandle);
80 }
81 }
82
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010083 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080084 {
85 return mHandle;
86 }
87
88private:
89 bool mOwned;
90 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010091 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080092};
93
94// assume NO_RESOURCES when Status::isOk returns false
95constexpr Error kDefaultError = Error::NO_RESOURCES;
96
97template<typename T, typename U>
98T unwrapRet(Return<T>& ret, const U& default_val)
99{
Steven Moreland9d021002017-01-03 17:10:54 -0800100 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800101 static_cast<T>(default_val);
102}
103
104Error unwrapRet(Return<Error>& ret)
105{
106 return unwrapRet(ret, kDefaultError);
107}
108
Chia-I Wuaab99f52016-10-05 12:59:58 +0800109} // anonymous namespace
110
Lloyd Piquea822d522017-12-20 16:42:57 -0800111namespace impl {
112
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500113Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
114 : CommandWriterBase(initialMaxSize) {}
115
116Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800117{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500118}
119
120void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
121{
122 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700123 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700124 IVrComposerClient::VrCommand::SET_LAYER_INFO),
125 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500126 write(type);
127 write(appId);
128 endCommand();
129}
130
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400131void Composer::CommandWriter::setClientTargetMetadata(
132 const IVrComposerClient::BufferMetadata& metadata)
133{
134 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700135 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700136 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
137 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400138 writeBufferMetadata(metadata);
139 endCommand();
140}
141
142void Composer::CommandWriter::setLayerBufferMetadata(
143 const IVrComposerClient::BufferMetadata& metadata)
144{
145 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700146 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700147 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
148 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400149 writeBufferMetadata(metadata);
150 endCommand();
151}
152
153void Composer::CommandWriter::writeBufferMetadata(
154 const IVrComposerClient::BufferMetadata& metadata)
155{
156 write(metadata.width);
157 write(metadata.height);
158 write(metadata.stride);
159 write(metadata.layerCount);
160 writeSigned(static_cast<int32_t>(metadata.format));
161 write64(metadata.usage);
162}
163
Kalle Raitaa099a242017-01-11 11:17:29 -0800164Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800165 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800166 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500167{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700168 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500169
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800170 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800171 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
172 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800173
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700174 if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) {
175 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
176 if (tmpError == Error::NONE) {
177 mClient = tmpClient;
178 mClient_2_2 = tmpClient;
179 mClient_2_3 = tmpClient;
180 }
181 });
182 } else {
183 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
184 if (tmpError != Error::NONE) {
185 return;
186 }
187
188 mClient = tmpClient;
189 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
190 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
191 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
192 "IComposer 2.2 did not return IComposerClient 2.2");
193 }
194 });
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800195 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400196
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -0700197 if (mClient == nullptr) {
198 LOG_ALWAYS_FATAL("failed to create composer client");
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700199 }
200
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400201 if (mIsUsingVrComposer) {
202 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
203 if (vrClient == nullptr) {
204 LOG_ALWAYS_FATAL("failed to create vr composer client");
205 }
206 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800207}
208
Lloyd Piquea822d522017-12-20 16:42:57 -0800209Composer::~Composer() = default;
210
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800211std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800212{
213 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800214 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800215 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800216 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800217 });
218
219 return capabilities;
220}
221
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800222std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223{
224 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800225 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800226 info = tmpInfo.c_str();
227 });
228
229 return info;
230}
231
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800232void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800234 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800235 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800236 ALOGE("failed to register IComposerCallback");
237 }
238}
239
Steven Thomasb02664d2017-07-26 18:48:28 -0700240bool Composer::isRemote() {
241 return mClient->isRemote();
242}
243
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700244void Composer::resetCommands() {
245 mWriter.reset();
246}
247
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700248Error Composer::executeCommands() {
249 return execute();
250}
251
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800252uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800253{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800254 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800255 return unwrapRet(ret, 0);
256}
257
258Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800259 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800260{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800261 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800262 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700263 if (mClient_2_2) {
264 mClient_2_2->createVirtualDisplay_2_2(width, height, *format, bufferSlotCount,
265 [&](const auto& tmpError, const auto& tmpDisplay,
266 const auto& tmpFormat) {
267 error = tmpError;
268 if (error != Error::NONE) {
269 return;
270 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800271
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700272 *outDisplay = tmpDisplay;
273 *format = tmpFormat;
274 });
275 } else {
276 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700277 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700278 [&](const auto& tmpError, const auto& tmpDisplay,
279 const auto& tmpFormat) {
280 error = tmpError;
281 if (error != Error::NONE) {
282 return;
283 }
284
285 *outDisplay = tmpDisplay;
286 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800287 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700288 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800289
290 return error;
291}
292
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800293Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800294{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800295 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800296 return unwrapRet(ret);
297}
298
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800299Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800300{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800301 mWriter.selectDisplay(display);
302 mWriter.acceptDisplayChanges();
303 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800304}
305
Chia-I Wu67e376d2016-12-19 11:36:22 +0800306Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800307{
308 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800309 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800310 [&](const auto& tmpError, const auto& tmpLayer) {
311 error = tmpError;
312 if (error != Error::NONE) {
313 return;
314 }
315
Chia-I Wu67e376d2016-12-19 11:36:22 +0800316 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800317 });
318
319 return error;
320}
321
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800322Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800324 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800325 return unwrapRet(ret);
326}
327
Chia-I Wu67e376d2016-12-19 11:36:22 +0800328Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800329{
330 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800331 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800332 [&](const auto& tmpError, const auto& tmpConfig) {
333 error = tmpError;
334 if (error != Error::NONE) {
335 return;
336 }
337
Chia-I Wu67e376d2016-12-19 11:36:22 +0800338 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800339 });
340
341 return error;
342}
343
344Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800345 std::vector<Layer>* outLayers,
346 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800348 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800349 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350}
351
352Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800353 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800354{
355 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800356
Valerie Hau9758ae02018-10-09 16:05:09 -0700357 if (mClient_2_3) {
358 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
359 error = tmpError;
360 if (error != Error::NONE) {
361 return;
362 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700363
Valerie Hau9758ae02018-10-09 16:05:09 -0700364 *outModes = tmpModes;
365 });
366 } else if (mClient_2_2) {
367 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
368 error = tmpError;
369 if (error != Error::NONE) {
370 return;
371 }
372
373 for (types::V1_1::ColorMode colorMode : tmpModes) {
374 outModes->push_back(static_cast<ColorMode>(colorMode));
375 }
376 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700377 } else {
378 mClient->getColorModes(display,
379 [&](const auto& tmpError, const auto& tmpModes) {
380 error = tmpError;
381 if (error != Error::NONE) {
382 return;
383 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700384 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700385 outModes->push_back(static_cast<ColorMode>(colorMode));
386 }
387 });
388 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800389
390 return error;
391}
392
393Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800394 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395{
396 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800397 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800398 [&](const auto& tmpError, const auto& tmpValue) {
399 error = tmpError;
400 if (error != Error::NONE) {
401 return;
402 }
403
Chia-I Wu67e376d2016-12-19 11:36:22 +0800404 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800405 });
406
407 return error;
408}
409
410Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800411 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800412{
413 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800414 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800415 [&](const auto& tmpError, const auto& tmpConfigs) {
416 error = tmpError;
417 if (error != Error::NONE) {
418 return;
419 }
420
Chia-I Wu67e376d2016-12-19 11:36:22 +0800421 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800422 });
423
424 return error;
425}
426
Chia-I Wu67e376d2016-12-19 11:36:22 +0800427Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800428{
429 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800430 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800431 [&](const auto& tmpError, const auto& tmpName) {
432 error = tmpError;
433 if (error != Error::NONE) {
434 return;
435 }
436
Chia-I Wu67e376d2016-12-19 11:36:22 +0800437 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800438 });
439
440 return error;
441}
442
443Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800444 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
445 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800446{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800447 mReader.takeDisplayRequests(display, outDisplayRequestMask,
448 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800449 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800450}
451
Chia-I Wu67e376d2016-12-19 11:36:22 +0800452Error Composer::getDisplayType(Display display,
453 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800454{
455 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800456 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800457 [&](const auto& tmpError, const auto& tmpType) {
458 error = tmpError;
459 if (error != Error::NONE) {
460 return;
461 }
462
Chia-I Wu67e376d2016-12-19 11:36:22 +0800463 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464 });
465
466 return error;
467}
468
Chia-I Wu67e376d2016-12-19 11:36:22 +0800469Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800470{
471 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800472 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800473 [&](const auto& tmpError, const auto& tmpSupport) {
474 error = tmpError;
475 if (error != Error::NONE) {
476 return;
477 }
478
Chia-I Wu67e376d2016-12-19 11:36:22 +0800479 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800480 });
481
482 return error;
483}
484
Chia-I Wu67e376d2016-12-19 11:36:22 +0800485Error Composer::getHdrCapabilities(Display display,
486 std::vector<Hdr>* outTypes, float* outMaxLuminance,
487 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800488{
489 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800490 if (mClient_2_3) {
491 mClient_2_3->getHdrCapabilities_2_3(display,
492 [&](const auto& tmpError, const auto& tmpTypes,
493 const auto& tmpMaxLuminance,
494 const auto& tmpMaxAverageLuminance,
495 const auto& tmpMinLuminance) {
496 error = tmpError;
497 if (error != Error::NONE) {
498 return;
499 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800500
Valerie Haue9e843a2018-12-18 13:39:23 -0800501 *outTypes = tmpTypes;
502 *outMaxLuminance = tmpMaxLuminance;
503 *outMaxAverageLuminance = tmpMaxAverageLuminance;
504 *outMinLuminance = tmpMinLuminance;
505 });
506 } else {
507 mClient->getHdrCapabilities(display,
508 [&](const auto& tmpError, const auto& tmpTypes,
509 const auto& tmpMaxLuminance,
510 const auto& tmpMaxAverageLuminance,
511 const auto& tmpMinLuminance) {
512 error = tmpError;
513 if (error != Error::NONE) {
514 return;
515 }
516
517 outTypes->clear();
518 for (auto type : tmpTypes) {
519 outTypes->push_back(static_cast<Hdr>(type));
520 }
521
522 *outMaxLuminance = tmpMaxLuminance;
523 *outMaxAverageLuminance = tmpMaxAverageLuminance;
524 *outMinLuminance = tmpMinLuminance;
525 });
526 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800527
528 return error;
529}
530
Chia-I Wu67e376d2016-12-19 11:36:22 +0800531Error Composer::getReleaseFences(Display display,
532 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800533{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800534 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800535 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800536}
537
Chia-I Wu67e376d2016-12-19 11:36:22 +0800538Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800539{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800540 mWriter.selectDisplay(display);
541 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800542
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800543 Error error = execute();
544 if (error != Error::NONE) {
545 return error;
546 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800547
Chia-I Wu67e376d2016-12-19 11:36:22 +0800548 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800549
550 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800551}
552
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800553Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800554{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800555 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556 return unwrapRet(ret);
557}
558
Chia-I Wu06d63de2017-01-04 14:58:51 +0800559Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400560 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800561 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800562 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800563{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800564 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400565 if (mIsUsingVrComposer && target.get()) {
566 IVrComposerClient::BufferMetadata metadata = {
567 .width = target->getWidth(),
568 .height = target->getHeight(),
569 .stride = target->getStride(),
570 .layerCount = target->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700571 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400572 .usage = target->getUsage(),
573 };
574 mWriter.setClientTargetMetadata(metadata);
575 }
576
577 const native_handle_t* handle = nullptr;
578 if (target.get()) {
579 handle = target->getNativeBuffer()->handle;
580 }
581
582 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800583 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800584}
585
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700586Error Composer::setColorMode(Display display, ColorMode mode,
587 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800588{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700589 hardware::Return<Error> ret(kDefaultError);
Valerie Hau9758ae02018-10-09 16:05:09 -0700590 if (mClient_2_3) {
591 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
592 } else if (mClient_2_2) {
593 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
594 renderIntent);
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700595 } else {
596 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700597 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700598 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800599 return unwrapRet(ret);
600}
601
602Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800603 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800604{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800605 mWriter.selectDisplay(display);
606 mWriter.setColorTransform(matrix, hint);
607 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800608}
609
610Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800611 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800612{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800613 mWriter.selectDisplay(display);
614 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
615 return Error::NONE;
616}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800617
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700618Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
619 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700620 if (mClient_2_2) {
621 ret = mClient_2_2->setPowerMode_2_2(display, mode);
622 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700623 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700624 }
625
Chia-I Wuaab99f52016-10-05 12:59:58 +0800626 return unwrapRet(ret);
627}
628
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800629Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800630{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800631 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800632 return unwrapRet(ret);
633}
634
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800635Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800636{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800637 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800638 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800639 return unwrapRet(ret);
640}
641
Chia-I Wu67e376d2016-12-19 11:36:22 +0800642Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
643 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800644{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800645 mWriter.selectDisplay(display);
646 mWriter.validateDisplay();
647
648 Error error = execute();
649 if (error != Error::NONE) {
650 return error;
651 }
652
Chia-I Wu67e376d2016-12-19 11:36:22 +0800653 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800654
655 return Error::NONE;
656}
657
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700658Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
659 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
660 mWriter.selectDisplay(display);
661 mWriter.presentOrvalidateDisplay();
662
663 Error error = execute();
664 if (error != Error::NONE) {
665 return error;
666 }
667
668 mReader.takePresentOrValidateStage(display, state);
669
670 if (*state == 1) { // Present succeeded
671 mReader.takePresentFence(display, outPresentFence);
672 }
673
674 if (*state == 0) { // Validate succeeded.
675 mReader.hasChanges(display, outNumTypes, outNumRequests);
676 }
677
678 return Error::NONE;
679}
680
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800681Error Composer::setCursorPosition(Display display, Layer layer,
682 int32_t x, int32_t y)
683{
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerCursorPosition(x, y);
687 return Error::NONE;
688}
689
690Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400691 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800692{
693 mWriter.selectDisplay(display);
694 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400695 if (mIsUsingVrComposer && buffer.get()) {
696 IVrComposerClient::BufferMetadata metadata = {
697 .width = buffer->getWidth(),
698 .height = buffer->getHeight(),
699 .stride = buffer->getStride(),
700 .layerCount = buffer->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700701 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400702 .usage = buffer->getUsage(),
703 };
704 mWriter.setLayerBufferMetadata(metadata);
705 }
706
707 const native_handle_t* handle = nullptr;
708 if (buffer.get()) {
709 handle = buffer->getNativeBuffer()->handle;
710 }
711
712 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800713 return Error::NONE;
714}
715
716Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
717 const std::vector<IComposerClient::Rect>& damage)
718{
719 mWriter.selectDisplay(display);
720 mWriter.selectLayer(layer);
721 mWriter.setLayerSurfaceDamage(damage);
722 return Error::NONE;
723}
724
725Error Composer::setLayerBlendMode(Display display, Layer layer,
726 IComposerClient::BlendMode mode)
727{
728 mWriter.selectDisplay(display);
729 mWriter.selectLayer(layer);
730 mWriter.setLayerBlendMode(mode);
731 return Error::NONE;
732}
733
734Error Composer::setLayerColor(Display display, Layer layer,
735 const IComposerClient::Color& color)
736{
737 mWriter.selectDisplay(display);
738 mWriter.selectLayer(layer);
739 mWriter.setLayerColor(color);
740 return Error::NONE;
741}
742
743Error Composer::setLayerCompositionType(Display display, Layer layer,
744 IComposerClient::Composition type)
745{
746 mWriter.selectDisplay(display);
747 mWriter.selectLayer(layer);
748 mWriter.setLayerCompositionType(type);
749 return Error::NONE;
750}
751
752Error Composer::setLayerDataspace(Display display, Layer layer,
753 Dataspace dataspace)
754{
755 mWriter.selectDisplay(display);
756 mWriter.selectLayer(layer);
757 mWriter.setLayerDataspace(dataspace);
758 return Error::NONE;
759}
760
761Error Composer::setLayerDisplayFrame(Display display, Layer layer,
762 const IComposerClient::Rect& frame)
763{
764 mWriter.selectDisplay(display);
765 mWriter.selectLayer(layer);
766 mWriter.setLayerDisplayFrame(frame);
767 return Error::NONE;
768}
769
770Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
771 float alpha)
772{
773 mWriter.selectDisplay(display);
774 mWriter.selectLayer(layer);
775 mWriter.setLayerPlaneAlpha(alpha);
776 return Error::NONE;
777}
778
779Error Composer::setLayerSidebandStream(Display display, Layer layer,
780 const native_handle_t* stream)
781{
782 mWriter.selectDisplay(display);
783 mWriter.selectLayer(layer);
784 mWriter.setLayerSidebandStream(stream);
785 return Error::NONE;
786}
787
788Error Composer::setLayerSourceCrop(Display display, Layer layer,
789 const IComposerClient::FRect& crop)
790{
791 mWriter.selectDisplay(display);
792 mWriter.selectLayer(layer);
793 mWriter.setLayerSourceCrop(crop);
794 return Error::NONE;
795}
796
797Error Composer::setLayerTransform(Display display, Layer layer,
798 Transform transform)
799{
800 mWriter.selectDisplay(display);
801 mWriter.selectLayer(layer);
802 mWriter.setLayerTransform(transform);
803 return Error::NONE;
804}
805
806Error Composer::setLayerVisibleRegion(Display display, Layer layer,
807 const std::vector<IComposerClient::Rect>& visible)
808{
809 mWriter.selectDisplay(display);
810 mWriter.selectLayer(layer);
811 mWriter.setLayerVisibleRegion(visible);
812 return Error::NONE;
813}
814
815Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
816{
817 mWriter.selectDisplay(display);
818 mWriter.selectLayer(layer);
819 mWriter.setLayerZOrder(z);
820 return Error::NONE;
821}
822
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500823Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
824 uint32_t appId)
825{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800826 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500827 mWriter.selectDisplay(display);
828 mWriter.selectLayer(layer);
829 mWriter.setLayerInfo(type, appId);
830 }
831 return Error::NONE;
832}
833
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800834Error Composer::execute()
835{
836 // prepare input command queue
837 bool queueChanged = false;
838 uint32_t commandLength = 0;
839 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800840 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800841 mWriter.reset();
842 return Error::NO_RESOURCES;
843 }
844
845 // set up new input command queue if necessary
846 if (queueChanged) {
847 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
848 auto error = unwrapRet(ret);
849 if (error != Error::NONE) {
850 mWriter.reset();
851 return error;
852 }
853 }
854
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700855 if (commandLength == 0) {
856 mWriter.reset();
857 return Error::NONE;
858 }
859
Chia-I Wuaab99f52016-10-05 12:59:58 +0800860 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700861 hardware::Return<void> ret;
862 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
863 const auto& tmpOutLength, const auto& tmpOutHandles)
864 {
865 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800866
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700867 // set up new output command queue if necessary
868 if (error == Error::NONE && tmpOutChanged) {
869 error = kDefaultError;
870 mClient->getOutputCommandQueue(
871 [&](const auto& tmpError,
872 const auto& tmpDescriptor)
873 {
874 error = tmpError;
875 if (error != Error::NONE) {
876 return;
877 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800878
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700879 mReader.setMQDescriptor(tmpDescriptor);
880 });
881 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800882
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700883 if (error != Error::NONE) {
884 return;
885 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800886
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700887 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
888 error = mReader.parse();
889 mReader.reset();
890 } else {
891 error = Error::NO_RESOURCES;
892 }
893 };
894 if (mClient_2_2) {
895 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
896 } else {
897 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
898 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700899 // executeCommands can fail because of out-of-fd and we do not want to
900 // abort() in that case
901 if (!ret.isOk()) {
902 ALOGE("executeCommands failed because of %s", ret.description().c_str());
903 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800904
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800905 if (error == Error::NONE) {
906 std::vector<CommandReader::CommandError> commandErrors =
907 mReader.takeErrors();
908
909 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700910 auto command =
911 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800912
913 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700914 command == IComposerClient::Command::PRESENT_DISPLAY ||
915 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800916 error = cmdErr.error;
917 } else {
918 ALOGW("command 0x%x generated error %d",
919 command, cmdErr.error);
920 }
921 }
922 }
923
924 mWriter.reset();
925
Chia-I Wuaab99f52016-10-05 12:59:58 +0800926 return error;
927}
928
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700929// Composer HAL 2.2
930
Peiyong Lin0ac5f4e2018-04-19 22:06:34 -0700931Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
932 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
933 if (!mClient_2_2) {
934 return Error::UNSUPPORTED;
935 }
936
937 mWriter.selectDisplay(display);
938 mWriter.selectLayer(layer);
939 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
940 return Error::NONE;
941}
942
Chia-I Wud7e01d72018-06-21 13:39:09 +0800943std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys(
944 Display display) {
945 std::vector<IComposerClient::PerFrameMetadataKey> keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700946 if (!mClient_2_2) {
Chia-I Wud7e01d72018-06-21 13:39:09 +0800947 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700948 }
949
950 Error error = kDefaultError;
Valerie Haue9e843a2018-12-18 13:39:23 -0800951 if (mClient_2_3) {
952 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
953 [&](const auto& tmpError, const auto& tmpKeys) {
954 error = tmpError;
955 if (error != Error::NONE) {
956 ALOGW("getPerFrameMetadataKeys failed "
957 "with %d",
958 tmpError);
959 return;
960 }
961 keys = tmpKeys;
962 });
963 } else {
964 mClient_2_2
965 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
966 error = tmpError;
967 if (error != Error::NONE) {
968 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
969 return;
970 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700971
Valerie Haue9e843a2018-12-18 13:39:23 -0800972 keys.clear();
973 for (auto key : tmpKeys) {
974 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
975 }
976 });
977 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700978
Chia-I Wud7e01d72018-06-21 13:39:09 +0800979 return keys;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700980}
981
982Error Composer::getRenderIntents(Display display, ColorMode colorMode,
983 std::vector<RenderIntent>* outRenderIntents) {
984 if (!mClient_2_2) {
985 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
986 return Error::NONE;
987 }
988
989 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -0700990
991 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700992 error = tmpError;
993 if (error != Error::NONE) {
994 return;
995 }
996
997 *outRenderIntents = tmpKeys;
Valerie Hau9758ae02018-10-09 16:05:09 -0700998 };
999
1000 if (mClient_2_3) {
1001 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1002 } else {
1003 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1004 getRenderIntentsLambda);
1005 }
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001006
1007 return error;
1008}
1009
1010Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
1011{
1012 if (!mClient_2_2) {
1013 *outMatrix = mat4();
1014 return Error::NONE;
1015 }
1016
1017 Error error = kDefaultError;
Valerie Hau9758ae02018-10-09 16:05:09 -07001018 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1019 [&](const auto& tmpError, const auto& tmpMatrix) {
1020 error = tmpError;
1021 if (error != Error::NONE) {
1022 return;
1023 }
1024 *outMatrix = mat4(tmpMatrix.data());
1025 });
Peiyong Lin0e7a7912018-04-05 14:36:36 -07001026
1027 return error;
1028}
1029
Dominik Laskowskie9ef7c42018-03-12 19:34:30 -07001030// Composer HAL 2.3
1031
1032Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1033 std::vector<uint8_t>* outData) {
1034 if (!mClient_2_3) {
1035 return Error::UNSUPPORTED;
1036 }
1037
1038 Error error = kDefaultError;
1039 mClient_2_3->getDisplayIdentificationData(display,
1040 [&](const auto& tmpError, const auto& tmpPort,
1041 const auto& tmpData) {
1042 error = tmpError;
1043 if (error != Error::NONE) {
1044 return;
1045 }
1046
1047 *outPort = tmpPort;
1048 *outData = tmpData;
1049 });
1050
1051 return error;
1052}
1053
Peiyong Lin698147a2018-09-14 13:27:18 -07001054Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix)
1055{
1056 if (!mClient_2_3) {
1057 return Error::UNSUPPORTED;
1058 }
1059
1060 mWriter.selectDisplay(display);
1061 mWriter.selectLayer(layer);
1062 mWriter.setLayerColorTransform(matrix);
1063 return Error::NONE;
1064}
1065
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001066Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1067 Dataspace* outDataspace,
1068 uint8_t* outComponentMask) {
1069 if (!outFormat || !outDataspace || !outComponentMask) {
1070 return Error::BAD_PARAMETER;
1071 }
1072 if (!mClient_2_3) {
1073 return Error::UNSUPPORTED;
1074 }
1075 Error error = kDefaultError;
1076 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1077 [&](const auto tmpError,
1078 const auto& tmpFormat,
1079 const auto& tmpDataspace,
1080 const auto& tmpComponentMask) {
1081 error = tmpError;
1082 if (error == Error::NONE) {
1083 *outFormat = tmpFormat;
1084 *outDataspace = tmpDataspace;
1085 *outComponentMask =
1086 static_cast<uint8_t>(
1087 tmpComponentMask);
1088 }
1089 });
1090 return error;
1091}
1092
Peiyong Lined531a32018-10-26 18:27:56 -07001093Error Composer::getDisplayCapabilities(Display display,
1094 std::vector<DisplayCapability>* outCapabilities) {
1095 if (!mClient_2_3) {
1096 return Error::UNSUPPORTED;
1097 }
1098 Error error = kDefaultError;
1099 mClient_2_3->getDisplayCapabilities(display,
1100 [&](const auto& tmpError, const auto& tmpCapabilities) {
1101 error = tmpError;
1102 if (error != Error::NONE) {
1103 return;
1104 }
1105 *outCapabilities = tmpCapabilities;
1106 });
1107 return error;
1108}
1109
Kevin DuBois74e53772018-11-19 10:52:38 -08001110Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1111 uint8_t componentMask, uint64_t maxFrames) {
1112 if (!mClient_2_3) {
1113 return Error::UNSUPPORTED;
1114 }
1115
1116 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1117 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1118 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1119 maxFrames);
1120}
1121
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001122Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
1123 DisplayedFrameStats* outStats) {
1124 if (!outStats) {
1125 return Error::BAD_PARAMETER;
1126 }
1127 if (!mClient_2_3) {
1128 return Error::UNSUPPORTED;
1129 }
1130 Error error = kDefaultError;
1131 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1132 [&](const auto tmpError, auto tmpNumFrames,
1133 const auto& tmpSamples0, const auto& tmpSamples1,
1134 const auto& tmpSamples2, const auto& tmpSamples3) {
1135 error = tmpError;
1136 if (error == Error::NONE) {
1137 outStats->numFrames = tmpNumFrames;
1138 outStats->component_0_sample = tmpSamples0;
1139 outStats->component_1_sample = tmpSamples1;
1140 outStats->component_2_sample = tmpSamples2;
1141 outStats->component_3_sample = tmpSamples3;
1142 }
1143 });
1144 return error;
1145}
1146
Valerie Haue9e843a2018-12-18 13:39:23 -08001147Error Composer::setLayerPerFrameMetadataBlobs(
1148 Display display, Layer layer,
1149 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1150 if (!mClient_2_3) {
1151 return Error::UNSUPPORTED;
1152 }
1153
1154 mWriter.selectDisplay(display);
1155 mWriter.selectLayer(layer);
1156 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1157 return Error::NONE;
1158}
1159
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001160CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001161{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001162 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001163}
1164
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001165Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001166{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001167 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001168
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001169 IComposerClient::Command command;
1170 uint16_t length = 0;
1171
1172 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001173 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001174 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001175 break;
1176 }
1177
1178 bool parsed = false;
1179 switch (command) {
1180 case IComposerClient::Command::SELECT_DISPLAY:
1181 parsed = parseSelectDisplay(length);
1182 break;
1183 case IComposerClient::Command::SET_ERROR:
1184 parsed = parseSetError(length);
1185 break;
1186 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1187 parsed = parseSetChangedCompositionTypes(length);
1188 break;
1189 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1190 parsed = parseSetDisplayRequests(length);
1191 break;
1192 case IComposerClient::Command::SET_PRESENT_FENCE:
1193 parsed = parseSetPresentFence(length);
1194 break;
1195 case IComposerClient::Command::SET_RELEASE_FENCES:
1196 parsed = parseSetReleaseFences(length);
1197 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001198 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1199 parsed = parseSetPresentOrValidateDisplayResult(length);
1200 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001201 default:
1202 parsed = false;
1203 break;
1204 }
1205
1206 endCommand();
1207
1208 if (!parsed) {
1209 ALOGE("failed to parse command 0x%x length %" PRIu16,
1210 command, length);
1211 break;
1212 }
1213 }
1214
1215 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001216}
1217
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001218bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001219{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001220 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001221 return false;
1222 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001223
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001224 mCurrentReturnData = &mReturnData[read64()];
1225
1226 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001227}
1228
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001229bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001230{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001231 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001232 return false;
1233 }
1234
1235 auto location = read();
1236 auto error = static_cast<Error>(readSigned());
1237
1238 mErrors.emplace_back(CommandError{location, error});
1239
1240 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001241}
1242
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001243bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001244{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001245 // (layer id, composition type) pairs
1246 if (length % 3 != 0 || !mCurrentReturnData) {
1247 return false;
1248 }
1249
1250 uint32_t count = length / 3;
1251 mCurrentReturnData->changedLayers.reserve(count);
1252 mCurrentReturnData->compositionTypes.reserve(count);
1253 while (count > 0) {
1254 auto layer = read64();
1255 auto type = static_cast<IComposerClient::Composition>(readSigned());
1256
1257 mCurrentReturnData->changedLayers.push_back(layer);
1258 mCurrentReturnData->compositionTypes.push_back(type);
1259
1260 count--;
1261 }
1262
1263 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001264}
1265
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001266bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001267{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001268 // display requests followed by (layer id, layer requests) pairs
1269 if (length % 3 != 1 || !mCurrentReturnData) {
1270 return false;
1271 }
1272
1273 mCurrentReturnData->displayRequests = read();
1274
1275 uint32_t count = (length - 1) / 3;
1276 mCurrentReturnData->requestedLayers.reserve(count);
1277 mCurrentReturnData->requestMasks.reserve(count);
1278 while (count > 0) {
1279 auto layer = read64();
1280 auto layerRequestMask = read();
1281
1282 mCurrentReturnData->requestedLayers.push_back(layer);
1283 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1284
1285 count--;
1286 }
1287
1288 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001289}
1290
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001291bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001292{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001293 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001294 !mCurrentReturnData) {
1295 return false;
1296 }
1297
1298 if (mCurrentReturnData->presentFence >= 0) {
1299 close(mCurrentReturnData->presentFence);
1300 }
1301 mCurrentReturnData->presentFence = readFence();
1302
1303 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001304}
1305
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001306bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001307{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001308 // (layer id, release fence index) pairs
1309 if (length % 3 != 0 || !mCurrentReturnData) {
1310 return false;
1311 }
1312
1313 uint32_t count = length / 3;
1314 mCurrentReturnData->releasedLayers.reserve(count);
1315 mCurrentReturnData->releaseFences.reserve(count);
1316 while (count > 0) {
1317 auto layer = read64();
1318 auto fence = readFence();
1319
1320 mCurrentReturnData->releasedLayers.push_back(layer);
1321 mCurrentReturnData->releaseFences.push_back(fence);
1322
1323 count--;
1324 }
1325
1326 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001327}
1328
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001329bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1330{
1331 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1332 return false;
1333 }
1334 mCurrentReturnData->presentOrValidateState = read();
1335 return true;
1336}
1337
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001338void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001339{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001340 mErrors.clear();
1341
1342 for (auto& data : mReturnData) {
1343 if (data.second.presentFence >= 0) {
1344 close(data.second.presentFence);
1345 }
1346 for (auto fence : data.second.releaseFences) {
1347 if (fence >= 0) {
1348 close(fence);
1349 }
1350 }
1351 }
1352
1353 mReturnData.clear();
1354 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001355}
1356
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001357std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001358{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001359 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001360}
1361
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001362bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001363 uint32_t* outNumChangedCompositionTypes,
1364 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001365{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001366 auto found = mReturnData.find(display);
1367 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001368 *outNumChangedCompositionTypes = 0;
1369 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001370 return false;
1371 }
1372
1373 const ReturnData& data = found->second;
1374
Chia-I Wu67e376d2016-12-19 11:36:22 +08001375 *outNumChangedCompositionTypes = data.compositionTypes.size();
1376 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001377
1378 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001379}
1380
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001381void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001382 std::vector<Layer>* outLayers,
1383 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001384{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001385 auto found = mReturnData.find(display);
1386 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001387 outLayers->clear();
1388 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001389 return;
1390 }
1391
1392 ReturnData& data = found->second;
1393
Chia-I Wu67e376d2016-12-19 11:36:22 +08001394 *outLayers = std::move(data.changedLayers);
1395 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001396}
1397
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001398void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001399 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1400 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001401{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001402 auto found = mReturnData.find(display);
1403 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001404 *outDisplayRequestMask = 0;
1405 outLayers->clear();
1406 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001407 return;
1408 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001409
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001410 ReturnData& data = found->second;
1411
Chia-I Wu67e376d2016-12-19 11:36:22 +08001412 *outDisplayRequestMask = data.displayRequests;
1413 *outLayers = std::move(data.requestedLayers);
1414 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001415}
1416
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001417void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001418 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001419{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001420 auto found = mReturnData.find(display);
1421 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001422 outLayers->clear();
1423 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001424 return;
1425 }
1426
1427 ReturnData& data = found->second;
1428
Chia-I Wu67e376d2016-12-19 11:36:22 +08001429 *outLayers = std::move(data.releasedLayers);
1430 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001431}
1432
Chia-I Wu67e376d2016-12-19 11:36:22 +08001433void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001434{
1435 auto found = mReturnData.find(display);
1436 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001437 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001438 return;
1439 }
1440
1441 ReturnData& data = found->second;
1442
Chia-I Wu67e376d2016-12-19 11:36:22 +08001443 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001444 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001445}
1446
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001447void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1448 auto found = mReturnData.find(display);
1449 if (found == mReturnData.end()) {
1450 *state= -1;
1451 return;
1452 }
1453 ReturnData& data = found->second;
1454 *state = data.presentOrValidateState;
1455}
1456
Lloyd Piquea822d522017-12-20 16:42:57 -08001457} // namespace impl
1458
Chia-I Wuaab99f52016-10-05 12:59:58 +08001459} // namespace Hwc2
1460
1461} // namespace android