blob: 5daa87ee35f47d8985188039addabe5115195c89 [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 <android/hardware/graphics/composer/2.2/IComposer.h>
26#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
27#include <gui/BufferQueue.h>
28#include <hidl/HidlTransportUtils.h>
29
Chia-I Wuaab99f52016-10-05 12:59:58 +080030namespace android {
31
32using hardware::Return;
33using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010034using hardware::hidl_handle;
Peiyong Lin34beb7a2018-03-28 11:57:12 -070035using namespace hardware::graphics::common;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070036using namespace hardware::graphics::composer;
37using PerFrameMetadata = hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadata;
38using PerFrameMetadataKey =
39 hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey;
Chia-I Wuaab99f52016-10-05 12:59:58 +080040
41namespace Hwc2 {
42
Lloyd Piquea822d522017-12-20 16:42:57 -080043Composer::~Composer() = default;
44
Chia-I Wuaab99f52016-10-05 12:59:58 +080045namespace {
46
47class BufferHandle {
48public:
49 BufferHandle(const native_handle_t* buffer)
50 {
51 // nullptr is not a valid handle to HIDL
52 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
53 }
54
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010055 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080056 {
57 return mHandle;
58 }
59
60private:
61 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010062 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080063};
64
65class FenceHandle
66{
67public:
68 FenceHandle(int fd, bool owned)
69 : mOwned(owned)
70 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010071 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080072 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 handle = native_handle_init(mStorage, 1, 0);
74 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080075 } else {
76 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010077 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080078 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010079 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080080 }
81
82 ~FenceHandle()
83 {
84 if (mOwned) {
85 native_handle_close(mHandle);
86 }
87 }
88
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010089 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080090 {
91 return mHandle;
92 }
93
94private:
95 bool mOwned;
96 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010097 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080098};
99
100// assume NO_RESOURCES when Status::isOk returns false
101constexpr Error kDefaultError = Error::NO_RESOURCES;
102
103template<typename T, typename U>
104T unwrapRet(Return<T>& ret, const U& default_val)
105{
Steven Moreland9d021002017-01-03 17:10:54 -0800106 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800107 static_cast<T>(default_val);
108}
109
110Error unwrapRet(Return<Error>& ret)
111{
112 return unwrapRet(ret, kDefaultError);
113}
114
Chia-I Wuaab99f52016-10-05 12:59:58 +0800115} // anonymous namespace
116
Lloyd Piquea822d522017-12-20 16:42:57 -0800117namespace impl {
118
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500119Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
120 : CommandWriterBase(initialMaxSize) {}
121
122Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800123{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500124}
125
126void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
127{
128 constexpr uint16_t kSetLayerInfoLength = 2;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700129 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
130 IVrComposerClient::VrCommand::SET_LAYER_INFO),
131 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500132 write(type);
133 write(appId);
134 endCommand();
135}
136
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400137void Composer::CommandWriter::setClientTargetMetadata(
138 const IVrComposerClient::BufferMetadata& metadata)
139{
140 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700141 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
142 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
143 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400144 writeBufferMetadata(metadata);
145 endCommand();
146}
147
148void Composer::CommandWriter::setLayerBufferMetadata(
149 const IVrComposerClient::BufferMetadata& metadata)
150{
151 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700152 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
153 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
154 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400155 writeBufferMetadata(metadata);
156 endCommand();
157}
158
159void Composer::CommandWriter::writeBufferMetadata(
160 const IVrComposerClient::BufferMetadata& metadata)
161{
162 write(metadata.width);
163 write(metadata.height);
164 write(metadata.stride);
165 write(metadata.layerCount);
166 writeSigned(static_cast<int32_t>(metadata.format));
167 write64(metadata.usage);
168}
169
Kalle Raitaa099a242017-01-11 11:17:29 -0800170Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800171 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800172 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500173{
Kalle Raitaa099a242017-01-11 11:17:29 -0800174 mComposer = IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500175
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800176 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800177 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
178 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800179
180 mComposer->createClient(
181 [&](const auto& tmpError, const auto& tmpClient)
182 {
183 if (tmpError == Error::NONE) {
184 mClient = tmpClient;
185 }
186 });
187 if (mClient == nullptr) {
188 LOG_ALWAYS_FATAL("failed to create composer client");
189 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400190
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700191 // 2.2 support is optional
192 sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer);
193 if (composer_2_2 != nullptr) {
194 mClient_2_2 = IComposerClient::castFrom(mClient);
195 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
196 }
197
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400198 if (mIsUsingVrComposer) {
199 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
200 if (vrClient == nullptr) {
201 LOG_ALWAYS_FATAL("failed to create vr composer client");
202 }
203 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800204}
205
Lloyd Piquea822d522017-12-20 16:42:57 -0800206Composer::~Composer() = default;
207
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800208std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800209{
210 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800211 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800212 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800213 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214 });
215
216 return capabilities;
217}
218
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800219std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800220{
221 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800222 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223 info = tmpInfo.c_str();
224 });
225
226 return info;
227}
228
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800229void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800230{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800231 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800232 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233 ALOGE("failed to register IComposerCallback");
234 }
235}
236
Steven Thomasb02664d2017-07-26 18:48:28 -0700237bool Composer::isRemote() {
238 return mClient->isRemote();
239}
240
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700241void Composer::resetCommands() {
242 mWriter.reset();
243}
244
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700245Error Composer::executeCommands() {
246 return execute();
247}
248
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800249uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800250{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800251 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252 return unwrapRet(ret, 0);
253}
254
255Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800256 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800258 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700260 if (mClient_2_2) {
261 mClient_2_2->createVirtualDisplay_2_2(width, height, *format, bufferSlotCount,
262 [&](const auto& tmpError, const auto& tmpDisplay,
263 const auto& tmpFormat) {
264 error = tmpError;
265 if (error != Error::NONE) {
266 return;
267 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800268
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700269 *outDisplay = tmpDisplay;
270 *format = tmpFormat;
271 });
272 } else {
273 mClient->createVirtualDisplay(width, height,
274 static_cast<V1_0::PixelFormat>(*format), bufferSlotCount,
275 [&](const auto& tmpError, const auto& tmpDisplay,
276 const auto& tmpFormat) {
277 error = tmpError;
278 if (error != Error::NONE) {
279 return;
280 }
281
282 *outDisplay = tmpDisplay;
283 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800284 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700285 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800286
287 return error;
288}
289
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800290Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800292 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800293 return unwrapRet(ret);
294}
295
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800296Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800297{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800298 mWriter.selectDisplay(display);
299 mWriter.acceptDisplayChanges();
300 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800301}
302
Chia-I Wu67e376d2016-12-19 11:36:22 +0800303Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800304{
305 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800306 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800307 [&](const auto& tmpError, const auto& tmpLayer) {
308 error = tmpError;
309 if (error != Error::NONE) {
310 return;
311 }
312
Chia-I Wu67e376d2016-12-19 11:36:22 +0800313 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800314 });
315
316 return error;
317}
318
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800319Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800320{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800321 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800322 return unwrapRet(ret);
323}
324
Chia-I Wu67e376d2016-12-19 11:36:22 +0800325Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326{
327 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800328 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800329 [&](const auto& tmpError, const auto& tmpConfig) {
330 error = tmpError;
331 if (error != Error::NONE) {
332 return;
333 }
334
Chia-I Wu67e376d2016-12-19 11:36:22 +0800335 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800336 });
337
338 return error;
339}
340
341Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800342 std::vector<Layer>* outLayers,
343 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800344{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800345 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800346 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347}
348
349Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800350 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800351{
352 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800353
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700354 if (mClient_2_2) {
355 mClient_2_2->getColorModes_2_2(display,
356 [&](const auto& tmpError, const auto& tmpModes) {
357 error = tmpError;
358 if (error != Error::NONE) {
359 return;
360 }
361
362 *outModes = tmpModes;
363 });
364 } else {
365 mClient->getColorModes(display,
366 [&](const auto& tmpError, const auto& tmpModes) {
367 error = tmpError;
368 if (error != Error::NONE) {
369 return;
370 }
371 for (V1_0::ColorMode colorMode : tmpModes) {
372 outModes->push_back(static_cast<ColorMode>(colorMode));
373 }
374 });
375 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800376
377 return error;
378}
379
380Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800381 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800382{
383 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800384 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385 [&](const auto& tmpError, const auto& tmpValue) {
386 error = tmpError;
387 if (error != Error::NONE) {
388 return;
389 }
390
Chia-I Wu67e376d2016-12-19 11:36:22 +0800391 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800392 });
393
394 return error;
395}
396
397Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800398 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800399{
400 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800401 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800402 [&](const auto& tmpError, const auto& tmpConfigs) {
403 error = tmpError;
404 if (error != Error::NONE) {
405 return;
406 }
407
Chia-I Wu67e376d2016-12-19 11:36:22 +0800408 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800409 });
410
411 return error;
412}
413
Chia-I Wu67e376d2016-12-19 11:36:22 +0800414Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800415{
416 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800417 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800418 [&](const auto& tmpError, const auto& tmpName) {
419 error = tmpError;
420 if (error != Error::NONE) {
421 return;
422 }
423
Chia-I Wu67e376d2016-12-19 11:36:22 +0800424 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800425 });
426
427 return error;
428}
429
430Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800431 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
432 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800433{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800434 mReader.takeDisplayRequests(display, outDisplayRequestMask,
435 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800436 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800437}
438
Chia-I Wu67e376d2016-12-19 11:36:22 +0800439Error Composer::getDisplayType(Display display,
440 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800441{
442 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800443 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800444 [&](const auto& tmpError, const auto& tmpType) {
445 error = tmpError;
446 if (error != Error::NONE) {
447 return;
448 }
449
Chia-I Wu67e376d2016-12-19 11:36:22 +0800450 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800451 });
452
453 return error;
454}
455
Chia-I Wu67e376d2016-12-19 11:36:22 +0800456Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800457{
458 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800459 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800460 [&](const auto& tmpError, const auto& tmpSupport) {
461 error = tmpError;
462 if (error != Error::NONE) {
463 return;
464 }
465
Chia-I Wu67e376d2016-12-19 11:36:22 +0800466 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800467 });
468
469 return error;
470}
471
Chia-I Wu67e376d2016-12-19 11:36:22 +0800472Error Composer::getHdrCapabilities(Display display,
473 std::vector<Hdr>* outTypes, float* outMaxLuminance,
474 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800475{
476 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800477 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800478 [&](const auto& tmpError, const auto& tmpTypes,
479 const auto& tmpMaxLuminance,
480 const auto& tmpMaxAverageLuminance,
481 const auto& tmpMinLuminance) {
482 error = tmpError;
483 if (error != Error::NONE) {
484 return;
485 }
486
Chia-I Wu67e376d2016-12-19 11:36:22 +0800487 *outTypes = tmpTypes;
488 *outMaxLuminance = tmpMaxLuminance;
489 *outMaxAverageLuminance = tmpMaxAverageLuminance;
490 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800491 });
492
493 return error;
494}
495
Chia-I Wu67e376d2016-12-19 11:36:22 +0800496Error Composer::getReleaseFences(Display display,
497 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800498{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800499 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800500 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501}
502
Chia-I Wu67e376d2016-12-19 11:36:22 +0800503Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800505 mWriter.selectDisplay(display);
506 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800508 Error error = execute();
509 if (error != Error::NONE) {
510 return error;
511 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800512
Chia-I Wu67e376d2016-12-19 11:36:22 +0800513 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800514
515 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800516}
517
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800519{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800520 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800521 return unwrapRet(ret);
522}
523
Chia-I Wu06d63de2017-01-04 14:58:51 +0800524Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400525 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800526 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800527 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800528{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800529 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400530 if (mIsUsingVrComposer && target.get()) {
531 IVrComposerClient::BufferMetadata metadata = {
532 .width = target->getWidth(),
533 .height = target->getHeight(),
534 .stride = target->getStride(),
535 .layerCount = target->getLayerCount(),
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700536 .format = static_cast<V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400537 .usage = target->getUsage(),
538 };
539 mWriter.setClientTargetMetadata(metadata);
540 }
541
542 const native_handle_t* handle = nullptr;
543 if (target.get()) {
544 handle = target->getNativeBuffer()->handle;
545 }
546
547 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800548 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800549}
550
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700551Error Composer::setColorMode(Display display, ColorMode mode,
552 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800553{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700554 hardware::Return<Error> ret(kDefaultError);
555 if (mClient_2_2) {
556 ret = mClient_2_2->setColorMode_2_2(display, mode, renderIntent);
557 } else {
558 ret = mClient->setColorMode(display,
559 static_cast<V1_0::ColorMode>(mode));
560 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800561 return unwrapRet(ret);
562}
563
564Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800565 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800566{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800567 mWriter.selectDisplay(display);
568 mWriter.setColorTransform(matrix, hint);
569 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800570}
571
572Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800573 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800574{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800575 mWriter.selectDisplay(display);
576 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
577 return Error::NONE;
578}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800579
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800580Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
581{
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700582 hardware::Return<Error> ret(Error::UNSUPPORTED);
583 if (mClient_2_2) {
584 ret = mClient_2_2->setPowerMode_2_2(display, mode);
585 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
586 ret = mClient->setPowerMode(display,
587 static_cast<hardware::graphics::composer::V2_1::
588 IComposerClient::PowerMode>(mode));
589 }
590
Chia-I Wuaab99f52016-10-05 12:59:58 +0800591 return unwrapRet(ret);
592}
593
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800594Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800595{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800596 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800597 return unwrapRet(ret);
598}
599
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800600Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800601{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800602 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800603 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800604 return unwrapRet(ret);
605}
606
Chia-I Wu67e376d2016-12-19 11:36:22 +0800607Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
608 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800609{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800610 mWriter.selectDisplay(display);
611 mWriter.validateDisplay();
612
613 Error error = execute();
614 if (error != Error::NONE) {
615 return error;
616 }
617
Chia-I Wu67e376d2016-12-19 11:36:22 +0800618 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800619
620 return Error::NONE;
621}
622
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700623Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
624 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
625 mWriter.selectDisplay(display);
626 mWriter.presentOrvalidateDisplay();
627
628 Error error = execute();
629 if (error != Error::NONE) {
630 return error;
631 }
632
633 mReader.takePresentOrValidateStage(display, state);
634
635 if (*state == 1) { // Present succeeded
636 mReader.takePresentFence(display, outPresentFence);
637 }
638
639 if (*state == 0) { // Validate succeeded.
640 mReader.hasChanges(display, outNumTypes, outNumRequests);
641 }
642
643 return Error::NONE;
644}
645
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800646Error Composer::setCursorPosition(Display display, Layer layer,
647 int32_t x, int32_t y)
648{
649 mWriter.selectDisplay(display);
650 mWriter.selectLayer(layer);
651 mWriter.setLayerCursorPosition(x, y);
652 return Error::NONE;
653}
654
655Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400656 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800657{
658 mWriter.selectDisplay(display);
659 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400660 if (mIsUsingVrComposer && buffer.get()) {
661 IVrComposerClient::BufferMetadata metadata = {
662 .width = buffer->getWidth(),
663 .height = buffer->getHeight(),
664 .stride = buffer->getStride(),
665 .layerCount = buffer->getLayerCount(),
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700666 .format = static_cast<V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400667 .usage = buffer->getUsage(),
668 };
669 mWriter.setLayerBufferMetadata(metadata);
670 }
671
672 const native_handle_t* handle = nullptr;
673 if (buffer.get()) {
674 handle = buffer->getNativeBuffer()->handle;
675 }
676
677 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800678 return Error::NONE;
679}
680
681Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
682 const std::vector<IComposerClient::Rect>& damage)
683{
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerSurfaceDamage(damage);
687 return Error::NONE;
688}
689
690Error Composer::setLayerBlendMode(Display display, Layer layer,
691 IComposerClient::BlendMode mode)
692{
693 mWriter.selectDisplay(display);
694 mWriter.selectLayer(layer);
695 mWriter.setLayerBlendMode(mode);
696 return Error::NONE;
697}
698
699Error Composer::setLayerColor(Display display, Layer layer,
700 const IComposerClient::Color& color)
701{
702 mWriter.selectDisplay(display);
703 mWriter.selectLayer(layer);
704 mWriter.setLayerColor(color);
705 return Error::NONE;
706}
707
708Error Composer::setLayerCompositionType(Display display, Layer layer,
709 IComposerClient::Composition type)
710{
711 mWriter.selectDisplay(display);
712 mWriter.selectLayer(layer);
713 mWriter.setLayerCompositionType(type);
714 return Error::NONE;
715}
716
717Error Composer::setLayerDataspace(Display display, Layer layer,
718 Dataspace dataspace)
719{
720 mWriter.selectDisplay(display);
721 mWriter.selectLayer(layer);
722 mWriter.setLayerDataspace(dataspace);
723 return Error::NONE;
724}
725
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700726Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {
Courtney Goeltzenleuchter301bb302018-03-12 11:12:42 -0600727 if (!mClient_2_2) {
728 return Error::UNSUPPORTED;
729 }
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700730
731 mWriter.selectDisplay(display);
732 mWriter.selectLayer(layer);
733
734 std::vector<PerFrameMetadata> composerMetadata;
735 if (metadata.validTypes & HdrMetadata::SMPTE2086) {
736 composerMetadata
737 .insert(composerMetadata.end(),
738 {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
739 metadata.smpte2086.displayPrimaryRed.x},
740 {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
741 metadata.smpte2086.displayPrimaryRed.y},
742 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
743 metadata.smpte2086.displayPrimaryGreen.x},
744 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
745 metadata.smpte2086.displayPrimaryGreen.y},
746 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
747 metadata.smpte2086.displayPrimaryBlue.x},
748 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
749 metadata.smpte2086.displayPrimaryBlue.y},
750 {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
751 {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
752 {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
753 {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
754 }
755 if (metadata.validTypes & HdrMetadata::CTA861_3) {
756 composerMetadata.insert(composerMetadata.end(),
757 {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
758 metadata.cta8613.maxContentLightLevel},
759 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
760 metadata.cta8613.maxFrameAverageLightLevel}});
761 }
762
Chia-I Wubcbd53c2018-03-30 12:35:13 -0700763 mWriter.setLayerPerFrameMetadata(composerMetadata);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700764 return Error::NONE;
765}
766
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800767Error Composer::setLayerDisplayFrame(Display display, Layer layer,
768 const IComposerClient::Rect& frame)
769{
770 mWriter.selectDisplay(display);
771 mWriter.selectLayer(layer);
772 mWriter.setLayerDisplayFrame(frame);
773 return Error::NONE;
774}
775
776Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
777 float alpha)
778{
779 mWriter.selectDisplay(display);
780 mWriter.selectLayer(layer);
781 mWriter.setLayerPlaneAlpha(alpha);
782 return Error::NONE;
783}
784
785Error Composer::setLayerSidebandStream(Display display, Layer layer,
786 const native_handle_t* stream)
787{
788 mWriter.selectDisplay(display);
789 mWriter.selectLayer(layer);
790 mWriter.setLayerSidebandStream(stream);
791 return Error::NONE;
792}
793
794Error Composer::setLayerSourceCrop(Display display, Layer layer,
795 const IComposerClient::FRect& crop)
796{
797 mWriter.selectDisplay(display);
798 mWriter.selectLayer(layer);
799 mWriter.setLayerSourceCrop(crop);
800 return Error::NONE;
801}
802
803Error Composer::setLayerTransform(Display display, Layer layer,
804 Transform transform)
805{
806 mWriter.selectDisplay(display);
807 mWriter.selectLayer(layer);
808 mWriter.setLayerTransform(transform);
809 return Error::NONE;
810}
811
812Error Composer::setLayerVisibleRegion(Display display, Layer layer,
813 const std::vector<IComposerClient::Rect>& visible)
814{
815 mWriter.selectDisplay(display);
816 mWriter.selectLayer(layer);
817 mWriter.setLayerVisibleRegion(visible);
818 return Error::NONE;
819}
820
821Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
822{
823 mWriter.selectDisplay(display);
824 mWriter.selectLayer(layer);
825 mWriter.setLayerZOrder(z);
826 return Error::NONE;
827}
828
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500829Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
830 uint32_t appId)
831{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800832 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500833 mWriter.selectDisplay(display);
834 mWriter.selectLayer(layer);
835 mWriter.setLayerInfo(type, appId);
836 }
837 return Error::NONE;
838}
839
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800840Error Composer::execute()
841{
842 // prepare input command queue
843 bool queueChanged = false;
844 uint32_t commandLength = 0;
845 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800846 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800847 mWriter.reset();
848 return Error::NO_RESOURCES;
849 }
850
851 // set up new input command queue if necessary
852 if (queueChanged) {
853 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
854 auto error = unwrapRet(ret);
855 if (error != Error::NONE) {
856 mWriter.reset();
857 return error;
858 }
859 }
860
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700861 if (commandLength == 0) {
862 mWriter.reset();
863 return Error::NONE;
864 }
865
Chia-I Wuaab99f52016-10-05 12:59:58 +0800866 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700867 hardware::Return<void> ret;
868 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
869 const auto& tmpOutLength, const auto& tmpOutHandles)
870 {
871 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800872
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700873 // set up new output command queue if necessary
874 if (error == Error::NONE && tmpOutChanged) {
875 error = kDefaultError;
876 mClient->getOutputCommandQueue(
877 [&](const auto& tmpError,
878 const auto& tmpDescriptor)
879 {
880 error = tmpError;
881 if (error != Error::NONE) {
882 return;
883 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800884
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700885 mReader.setMQDescriptor(tmpDescriptor);
886 });
887 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800888
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700889 if (error != Error::NONE) {
890 return;
891 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800892
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700893 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
894 error = mReader.parse();
895 mReader.reset();
896 } else {
897 error = Error::NO_RESOURCES;
898 }
899 };
900 if (mClient_2_2) {
901 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
902 } else {
903 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
904 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700905 // executeCommands can fail because of out-of-fd and we do not want to
906 // abort() in that case
907 if (!ret.isOk()) {
908 ALOGE("executeCommands failed because of %s", ret.description().c_str());
909 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800910
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800911 if (error == Error::NONE) {
912 std::vector<CommandReader::CommandError> commandErrors =
913 mReader.takeErrors();
914
915 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700916 auto command =
917 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918
919 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700920 command == IComposerClient::Command::PRESENT_DISPLAY ||
921 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800922 error = cmdErr.error;
923 } else {
924 ALOGW("command 0x%x generated error %d",
925 command, cmdErr.error);
926 }
927 }
928 }
929
930 mWriter.reset();
931
Chia-I Wuaab99f52016-10-05 12:59:58 +0800932 return error;
933}
934
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700935// Composer HAL 2.2
936
937Error Composer::getPerFrameMetadataKeys(
938 Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
939 if (!mClient_2_2) {
940 return Error::UNSUPPORTED;
941 }
942
943 Error error = kDefaultError;
944 mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
945 error = tmpError;
946 if (error != Error::NONE) {
947 return;
948 }
949
950 *outKeys = tmpKeys;
951 });
952
953 return error;
954}
955
956Error Composer::getRenderIntents(Display display, ColorMode colorMode,
957 std::vector<RenderIntent>* outRenderIntents) {
958 if (!mClient_2_2) {
959 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
960 return Error::NONE;
961 }
962
963 Error error = kDefaultError;
964 mClient_2_2->getRenderIntents(display, colorMode,
965 [&](const auto& tmpError, const auto& tmpKeys) {
966 error = tmpError;
967 if (error != Error::NONE) {
968 return;
969 }
970
971 *outRenderIntents = tmpKeys;
972 });
973
974 return error;
975}
976
977Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
978{
979 if (!mClient_2_2) {
980 *outMatrix = mat4();
981 return Error::NONE;
982 }
983
984 Error error = kDefaultError;
985 mClient_2_2->getDataspaceSaturationMatrix(dataspace, [&](const auto& tmpError, const auto& tmpMatrix) {
986 error = tmpError;
987 if (error != Error::NONE) {
988 return;
989 }
990
991 *outMatrix = mat4(tmpMatrix.data());
992 });
993
994 return error;
995}
996
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800997CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800998{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800999 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001000}
1001
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001002Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001003{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001004 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +08001005
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001006 IComposerClient::Command command;
1007 uint16_t length = 0;
1008
1009 while (!isEmpty()) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001010 auto command_2_1 =
1011 reinterpret_cast<hardware::graphics::composer::V2_1::IComposerClient::Command*>(
1012 &command);
1013 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001014 break;
1015 }
1016
1017 bool parsed = false;
1018 switch (command) {
1019 case IComposerClient::Command::SELECT_DISPLAY:
1020 parsed = parseSelectDisplay(length);
1021 break;
1022 case IComposerClient::Command::SET_ERROR:
1023 parsed = parseSetError(length);
1024 break;
1025 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1026 parsed = parseSetChangedCompositionTypes(length);
1027 break;
1028 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1029 parsed = parseSetDisplayRequests(length);
1030 break;
1031 case IComposerClient::Command::SET_PRESENT_FENCE:
1032 parsed = parseSetPresentFence(length);
1033 break;
1034 case IComposerClient::Command::SET_RELEASE_FENCES:
1035 parsed = parseSetReleaseFences(length);
1036 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001037 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1038 parsed = parseSetPresentOrValidateDisplayResult(length);
1039 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001040 default:
1041 parsed = false;
1042 break;
1043 }
1044
1045 endCommand();
1046
1047 if (!parsed) {
1048 ALOGE("failed to parse command 0x%x length %" PRIu16,
1049 command, length);
1050 break;
1051 }
1052 }
1053
1054 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001055}
1056
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001057bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001058{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001059 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001060 return false;
1061 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001062
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001063 mCurrentReturnData = &mReturnData[read64()];
1064
1065 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001066}
1067
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001068bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001069{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001070 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001071 return false;
1072 }
1073
1074 auto location = read();
1075 auto error = static_cast<Error>(readSigned());
1076
1077 mErrors.emplace_back(CommandError{location, error});
1078
1079 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001080}
1081
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001082bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001083{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001084 // (layer id, composition type) pairs
1085 if (length % 3 != 0 || !mCurrentReturnData) {
1086 return false;
1087 }
1088
1089 uint32_t count = length / 3;
1090 mCurrentReturnData->changedLayers.reserve(count);
1091 mCurrentReturnData->compositionTypes.reserve(count);
1092 while (count > 0) {
1093 auto layer = read64();
1094 auto type = static_cast<IComposerClient::Composition>(readSigned());
1095
1096 mCurrentReturnData->changedLayers.push_back(layer);
1097 mCurrentReturnData->compositionTypes.push_back(type);
1098
1099 count--;
1100 }
1101
1102 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001103}
1104
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001105bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001106{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001107 // display requests followed by (layer id, layer requests) pairs
1108 if (length % 3 != 1 || !mCurrentReturnData) {
1109 return false;
1110 }
1111
1112 mCurrentReturnData->displayRequests = read();
1113
1114 uint32_t count = (length - 1) / 3;
1115 mCurrentReturnData->requestedLayers.reserve(count);
1116 mCurrentReturnData->requestMasks.reserve(count);
1117 while (count > 0) {
1118 auto layer = read64();
1119 auto layerRequestMask = read();
1120
1121 mCurrentReturnData->requestedLayers.push_back(layer);
1122 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1123
1124 count--;
1125 }
1126
1127 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001128}
1129
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001130bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001131{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001132 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001133 !mCurrentReturnData) {
1134 return false;
1135 }
1136
1137 if (mCurrentReturnData->presentFence >= 0) {
1138 close(mCurrentReturnData->presentFence);
1139 }
1140 mCurrentReturnData->presentFence = readFence();
1141
1142 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001143}
1144
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001145bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001146{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001147 // (layer id, release fence index) pairs
1148 if (length % 3 != 0 || !mCurrentReturnData) {
1149 return false;
1150 }
1151
1152 uint32_t count = length / 3;
1153 mCurrentReturnData->releasedLayers.reserve(count);
1154 mCurrentReturnData->releaseFences.reserve(count);
1155 while (count > 0) {
1156 auto layer = read64();
1157 auto fence = readFence();
1158
1159 mCurrentReturnData->releasedLayers.push_back(layer);
1160 mCurrentReturnData->releaseFences.push_back(fence);
1161
1162 count--;
1163 }
1164
1165 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001166}
1167
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001168bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1169{
1170 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1171 return false;
1172 }
1173 mCurrentReturnData->presentOrValidateState = read();
1174 return true;
1175}
1176
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001177void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001178{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001179 mErrors.clear();
1180
1181 for (auto& data : mReturnData) {
1182 if (data.second.presentFence >= 0) {
1183 close(data.second.presentFence);
1184 }
1185 for (auto fence : data.second.releaseFences) {
1186 if (fence >= 0) {
1187 close(fence);
1188 }
1189 }
1190 }
1191
1192 mReturnData.clear();
1193 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001194}
1195
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001196std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001197{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001198 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001199}
1200
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001201bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001202 uint32_t* outNumChangedCompositionTypes,
1203 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001204{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001205 auto found = mReturnData.find(display);
1206 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001207 *outNumChangedCompositionTypes = 0;
1208 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001209 return false;
1210 }
1211
1212 const ReturnData& data = found->second;
1213
Chia-I Wu67e376d2016-12-19 11:36:22 +08001214 *outNumChangedCompositionTypes = data.compositionTypes.size();
1215 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001216
1217 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001218}
1219
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001220void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001221 std::vector<Layer>* outLayers,
1222 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001223{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001224 auto found = mReturnData.find(display);
1225 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001226 outLayers->clear();
1227 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001228 return;
1229 }
1230
1231 ReturnData& data = found->second;
1232
Chia-I Wu67e376d2016-12-19 11:36:22 +08001233 *outLayers = std::move(data.changedLayers);
1234 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001235}
1236
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001237void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001238 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1239 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001240{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001241 auto found = mReturnData.find(display);
1242 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001243 *outDisplayRequestMask = 0;
1244 outLayers->clear();
1245 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001246 return;
1247 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001248
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001249 ReturnData& data = found->second;
1250
Chia-I Wu67e376d2016-12-19 11:36:22 +08001251 *outDisplayRequestMask = data.displayRequests;
1252 *outLayers = std::move(data.requestedLayers);
1253 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001254}
1255
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001256void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001257 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001258{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001259 auto found = mReturnData.find(display);
1260 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001261 outLayers->clear();
1262 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001263 return;
1264 }
1265
1266 ReturnData& data = found->second;
1267
Chia-I Wu67e376d2016-12-19 11:36:22 +08001268 *outLayers = std::move(data.releasedLayers);
1269 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001270}
1271
Chia-I Wu67e376d2016-12-19 11:36:22 +08001272void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001273{
1274 auto found = mReturnData.find(display);
1275 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001276 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001277 return;
1278 }
1279
1280 ReturnData& data = found->second;
1281
Chia-I Wu67e376d2016-12-19 11:36:22 +08001282 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001283 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001284}
1285
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001286void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1287 auto found = mReturnData.find(display);
1288 if (found == mReturnData.end()) {
1289 *state= -1;
1290 return;
1291 }
1292 ReturnData& data = found->second;
1293 *state = data.presentOrValidateState;
1294}
1295
Lloyd Piquea822d522017-12-20 16:42:57 -08001296} // namespace impl
1297
Chia-I Wuaab99f52016-10-05 12:59:58 +08001298} // namespace Hwc2
1299
1300} // namespace android