blob: bbffd0ae7f4fcc6ab4d6adc67c3a03e2e606ebac [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 Wucd8d7f02016-11-16 11:02:31 +0800353 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800354 [&](const auto& tmpError, const auto& tmpModes) {
355 error = tmpError;
356 if (error != Error::NONE) {
357 return;
358 }
359
Chia-I Wu67e376d2016-12-19 11:36:22 +0800360 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800361 });
362
363 return error;
364}
365
366Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800367 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800368{
369 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800370 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800371 [&](const auto& tmpError, const auto& tmpValue) {
372 error = tmpError;
373 if (error != Error::NONE) {
374 return;
375 }
376
Chia-I Wu67e376d2016-12-19 11:36:22 +0800377 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378 });
379
380 return error;
381}
382
383Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800384 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385{
386 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800387 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388 [&](const auto& tmpError, const auto& tmpConfigs) {
389 error = tmpError;
390 if (error != Error::NONE) {
391 return;
392 }
393
Chia-I Wu67e376d2016-12-19 11:36:22 +0800394 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395 });
396
397 return error;
398}
399
Chia-I Wu67e376d2016-12-19 11:36:22 +0800400Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800401{
402 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800403 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 [&](const auto& tmpError, const auto& tmpName) {
405 error = tmpError;
406 if (error != Error::NONE) {
407 return;
408 }
409
Chia-I Wu67e376d2016-12-19 11:36:22 +0800410 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800411 });
412
413 return error;
414}
415
416Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800417 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
418 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800420 mReader.takeDisplayRequests(display, outDisplayRequestMask,
421 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800422 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423}
424
Chia-I Wu67e376d2016-12-19 11:36:22 +0800425Error Composer::getDisplayType(Display display,
426 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800427{
428 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800429 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430 [&](const auto& tmpError, const auto& tmpType) {
431 error = tmpError;
432 if (error != Error::NONE) {
433 return;
434 }
435
Chia-I Wu67e376d2016-12-19 11:36:22 +0800436 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800437 });
438
439 return error;
440}
441
Chia-I Wu67e376d2016-12-19 11:36:22 +0800442Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800443{
444 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800445 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800446 [&](const auto& tmpError, const auto& tmpSupport) {
447 error = tmpError;
448 if (error != Error::NONE) {
449 return;
450 }
451
Chia-I Wu67e376d2016-12-19 11:36:22 +0800452 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453 });
454
455 return error;
456}
457
Chia-I Wu67e376d2016-12-19 11:36:22 +0800458Error Composer::getHdrCapabilities(Display display,
459 std::vector<Hdr>* outTypes, float* outMaxLuminance,
460 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800461{
462 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800463 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464 [&](const auto& tmpError, const auto& tmpTypes,
465 const auto& tmpMaxLuminance,
466 const auto& tmpMaxAverageLuminance,
467 const auto& tmpMinLuminance) {
468 error = tmpError;
469 if (error != Error::NONE) {
470 return;
471 }
472
Chia-I Wu67e376d2016-12-19 11:36:22 +0800473 *outTypes = tmpTypes;
474 *outMaxLuminance = tmpMaxLuminance;
475 *outMaxAverageLuminance = tmpMaxAverageLuminance;
476 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800477 });
478
479 return error;
480}
481
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700482Error Composer::getPerFrameMetadataKeys(
483 Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
484 if (!mClient_2_2) {
485 return Error::UNSUPPORTED;
486 }
487
488 Error error = kDefaultError;
489 mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
490 error = tmpError;
491 if (error != Error::NONE) {
492 return;
493 }
494
495 *outKeys = tmpKeys;
496 });
497
498 return error;
499}
500
Chia-I Wu67e376d2016-12-19 11:36:22 +0800501Error Composer::getReleaseFences(Display display,
502 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800503{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800504 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800505 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800506}
507
Chia-I Wu67e376d2016-12-19 11:36:22 +0800508Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800509{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800510 mWriter.selectDisplay(display);
511 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800512
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800513 Error error = execute();
514 if (error != Error::NONE) {
515 return error;
516 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517
Chia-I Wu67e376d2016-12-19 11:36:22 +0800518 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800519
520 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800521}
522
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800523Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800524{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800525 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800526 return unwrapRet(ret);
527}
528
Chia-I Wu06d63de2017-01-04 14:58:51 +0800529Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400530 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800531 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800532 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800533{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800534 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400535 if (mIsUsingVrComposer && target.get()) {
536 IVrComposerClient::BufferMetadata metadata = {
537 .width = target->getWidth(),
538 .height = target->getHeight(),
539 .stride = target->getStride(),
540 .layerCount = target->getLayerCount(),
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700541 .format = static_cast<V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400542 .usage = target->getUsage(),
543 };
544 mWriter.setClientTargetMetadata(metadata);
545 }
546
547 const native_handle_t* handle = nullptr;
548 if (target.get()) {
549 handle = target->getNativeBuffer()->handle;
550 }
551
552 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800553 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800554}
555
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800557{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800558 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800559 return unwrapRet(ret);
560}
561
562Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800563 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800564{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800565 mWriter.selectDisplay(display);
566 mWriter.setColorTransform(matrix, hint);
567 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800568}
569
570Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800571 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800572{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800573 mWriter.selectDisplay(display);
574 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
575 return Error::NONE;
576}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800577
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800578Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
579{
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700580 hardware::Return<Error> ret(Error::UNSUPPORTED);
581 if (mClient_2_2) {
582 ret = mClient_2_2->setPowerMode_2_2(display, mode);
583 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
584 ret = mClient->setPowerMode(display,
585 static_cast<hardware::graphics::composer::V2_1::
586 IComposerClient::PowerMode>(mode));
587 }
588
Chia-I Wuaab99f52016-10-05 12:59:58 +0800589 return unwrapRet(ret);
590}
591
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800592Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800593{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800594 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800595 return unwrapRet(ret);
596}
597
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800598Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800599{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800600 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800601 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800602 return unwrapRet(ret);
603}
604
Chia-I Wu67e376d2016-12-19 11:36:22 +0800605Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
606 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800607{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800608 mWriter.selectDisplay(display);
609 mWriter.validateDisplay();
610
611 Error error = execute();
612 if (error != Error::NONE) {
613 return error;
614 }
615
Chia-I Wu67e376d2016-12-19 11:36:22 +0800616 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800617
618 return Error::NONE;
619}
620
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700621Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
622 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
623 mWriter.selectDisplay(display);
624 mWriter.presentOrvalidateDisplay();
625
626 Error error = execute();
627 if (error != Error::NONE) {
628 return error;
629 }
630
631 mReader.takePresentOrValidateStage(display, state);
632
633 if (*state == 1) { // Present succeeded
634 mReader.takePresentFence(display, outPresentFence);
635 }
636
637 if (*state == 0) { // Validate succeeded.
638 mReader.hasChanges(display, outNumTypes, outNumRequests);
639 }
640
641 return Error::NONE;
642}
643
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800644Error Composer::setCursorPosition(Display display, Layer layer,
645 int32_t x, int32_t y)
646{
647 mWriter.selectDisplay(display);
648 mWriter.selectLayer(layer);
649 mWriter.setLayerCursorPosition(x, y);
650 return Error::NONE;
651}
652
653Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400654 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800655{
656 mWriter.selectDisplay(display);
657 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400658 if (mIsUsingVrComposer && buffer.get()) {
659 IVrComposerClient::BufferMetadata metadata = {
660 .width = buffer->getWidth(),
661 .height = buffer->getHeight(),
662 .stride = buffer->getStride(),
663 .layerCount = buffer->getLayerCount(),
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700664 .format = static_cast<V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400665 .usage = buffer->getUsage(),
666 };
667 mWriter.setLayerBufferMetadata(metadata);
668 }
669
670 const native_handle_t* handle = nullptr;
671 if (buffer.get()) {
672 handle = buffer->getNativeBuffer()->handle;
673 }
674
675 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800676 return Error::NONE;
677}
678
679Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
680 const std::vector<IComposerClient::Rect>& damage)
681{
682 mWriter.selectDisplay(display);
683 mWriter.selectLayer(layer);
684 mWriter.setLayerSurfaceDamage(damage);
685 return Error::NONE;
686}
687
688Error Composer::setLayerBlendMode(Display display, Layer layer,
689 IComposerClient::BlendMode mode)
690{
691 mWriter.selectDisplay(display);
692 mWriter.selectLayer(layer);
693 mWriter.setLayerBlendMode(mode);
694 return Error::NONE;
695}
696
697Error Composer::setLayerColor(Display display, Layer layer,
698 const IComposerClient::Color& color)
699{
700 mWriter.selectDisplay(display);
701 mWriter.selectLayer(layer);
702 mWriter.setLayerColor(color);
703 return Error::NONE;
704}
705
706Error Composer::setLayerCompositionType(Display display, Layer layer,
707 IComposerClient::Composition type)
708{
709 mWriter.selectDisplay(display);
710 mWriter.selectLayer(layer);
711 mWriter.setLayerCompositionType(type);
712 return Error::NONE;
713}
714
715Error Composer::setLayerDataspace(Display display, Layer layer,
716 Dataspace dataspace)
717{
718 mWriter.selectDisplay(display);
719 mWriter.selectLayer(layer);
720 mWriter.setLayerDataspace(dataspace);
721 return Error::NONE;
722}
723
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700724Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {
Courtney Goeltzenleuchter301bb302018-03-12 11:12:42 -0600725 if (!mClient_2_2) {
726 return Error::UNSUPPORTED;
727 }
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700728
729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731
732 std::vector<PerFrameMetadata> composerMetadata;
733 if (metadata.validTypes & HdrMetadata::SMPTE2086) {
734 composerMetadata
735 .insert(composerMetadata.end(),
736 {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
737 metadata.smpte2086.displayPrimaryRed.x},
738 {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
739 metadata.smpte2086.displayPrimaryRed.y},
740 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
741 metadata.smpte2086.displayPrimaryGreen.x},
742 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
743 metadata.smpte2086.displayPrimaryGreen.y},
744 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
745 metadata.smpte2086.displayPrimaryBlue.x},
746 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
747 metadata.smpte2086.displayPrimaryBlue.y},
748 {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
749 {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
750 {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
751 {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
752 }
753 if (metadata.validTypes & HdrMetadata::CTA861_3) {
754 composerMetadata.insert(composerMetadata.end(),
755 {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
756 metadata.cta8613.maxContentLightLevel},
757 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
758 metadata.cta8613.maxFrameAverageLightLevel}});
759 }
760
Chia-I Wubcbd53c2018-03-30 12:35:13 -0700761 mWriter.setLayerPerFrameMetadata(composerMetadata);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700762 return Error::NONE;
763}
764
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800765Error Composer::setLayerDisplayFrame(Display display, Layer layer,
766 const IComposerClient::Rect& frame)
767{
768 mWriter.selectDisplay(display);
769 mWriter.selectLayer(layer);
770 mWriter.setLayerDisplayFrame(frame);
771 return Error::NONE;
772}
773
774Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
775 float alpha)
776{
777 mWriter.selectDisplay(display);
778 mWriter.selectLayer(layer);
779 mWriter.setLayerPlaneAlpha(alpha);
780 return Error::NONE;
781}
782
783Error Composer::setLayerSidebandStream(Display display, Layer layer,
784 const native_handle_t* stream)
785{
786 mWriter.selectDisplay(display);
787 mWriter.selectLayer(layer);
788 mWriter.setLayerSidebandStream(stream);
789 return Error::NONE;
790}
791
792Error Composer::setLayerSourceCrop(Display display, Layer layer,
793 const IComposerClient::FRect& crop)
794{
795 mWriter.selectDisplay(display);
796 mWriter.selectLayer(layer);
797 mWriter.setLayerSourceCrop(crop);
798 return Error::NONE;
799}
800
801Error Composer::setLayerTransform(Display display, Layer layer,
802 Transform transform)
803{
804 mWriter.selectDisplay(display);
805 mWriter.selectLayer(layer);
806 mWriter.setLayerTransform(transform);
807 return Error::NONE;
808}
809
810Error Composer::setLayerVisibleRegion(Display display, Layer layer,
811 const std::vector<IComposerClient::Rect>& visible)
812{
813 mWriter.selectDisplay(display);
814 mWriter.selectLayer(layer);
815 mWriter.setLayerVisibleRegion(visible);
816 return Error::NONE;
817}
818
819Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
820{
821 mWriter.selectDisplay(display);
822 mWriter.selectLayer(layer);
823 mWriter.setLayerZOrder(z);
824 return Error::NONE;
825}
826
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500827Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
828 uint32_t appId)
829{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800830 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500831 mWriter.selectDisplay(display);
832 mWriter.selectLayer(layer);
833 mWriter.setLayerInfo(type, appId);
834 }
835 return Error::NONE;
836}
837
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800838Error Composer::execute()
839{
840 // prepare input command queue
841 bool queueChanged = false;
842 uint32_t commandLength = 0;
843 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800844 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800845 mWriter.reset();
846 return Error::NO_RESOURCES;
847 }
848
849 // set up new input command queue if necessary
850 if (queueChanged) {
851 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
852 auto error = unwrapRet(ret);
853 if (error != Error::NONE) {
854 mWriter.reset();
855 return error;
856 }
857 }
858
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700859 if (commandLength == 0) {
860 mWriter.reset();
861 return Error::NONE;
862 }
863
Chia-I Wuaab99f52016-10-05 12:59:58 +0800864 Error error = kDefaultError;
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700865 auto ret = mClient->executeCommands(commandLength, commandHandles,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800866 [&](const auto& tmpError, const auto& tmpOutChanged,
867 const auto& tmpOutLength, const auto& tmpOutHandles)
868 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800869 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800870
871 // set up new output command queue if necessary
872 if (error == Error::NONE && tmpOutChanged) {
873 error = kDefaultError;
874 mClient->getOutputCommandQueue(
875 [&](const auto& tmpError,
876 const auto& tmpDescriptor)
877 {
878 error = tmpError;
879 if (error != Error::NONE) {
880 return;
881 }
882
883 mReader.setMQDescriptor(tmpDescriptor);
884 });
885 }
886
Chia-I Wuaab99f52016-10-05 12:59:58 +0800887 if (error != Error::NONE) {
888 return;
889 }
890
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800891 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
892 error = mReader.parse();
893 mReader.reset();
894 } else {
895 error = Error::NO_RESOURCES;
896 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800897 });
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700898 // executeCommands can fail because of out-of-fd and we do not want to
899 // abort() in that case
900 if (!ret.isOk()) {
901 ALOGE("executeCommands failed because of %s", ret.description().c_str());
902 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800903
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800904 if (error == Error::NONE) {
905 std::vector<CommandReader::CommandError> commandErrors =
906 mReader.takeErrors();
907
908 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700909 auto command =
910 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800911
912 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700913 command == IComposerClient::Command::PRESENT_DISPLAY ||
914 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800915 error = cmdErr.error;
916 } else {
917 ALOGW("command 0x%x generated error %d",
918 command, cmdErr.error);
919 }
920 }
921 }
922
923 mWriter.reset();
924
Chia-I Wuaab99f52016-10-05 12:59:58 +0800925 return error;
926}
927
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800928CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800929{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800930 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800931}
932
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800933Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800934{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800935 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800936
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800937 IComposerClient::Command command;
938 uint16_t length = 0;
939
940 while (!isEmpty()) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700941 auto command_2_1 =
942 reinterpret_cast<hardware::graphics::composer::V2_1::IComposerClient::Command*>(
943 &command);
944 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800945 break;
946 }
947
948 bool parsed = false;
949 switch (command) {
950 case IComposerClient::Command::SELECT_DISPLAY:
951 parsed = parseSelectDisplay(length);
952 break;
953 case IComposerClient::Command::SET_ERROR:
954 parsed = parseSetError(length);
955 break;
956 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
957 parsed = parseSetChangedCompositionTypes(length);
958 break;
959 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
960 parsed = parseSetDisplayRequests(length);
961 break;
962 case IComposerClient::Command::SET_PRESENT_FENCE:
963 parsed = parseSetPresentFence(length);
964 break;
965 case IComposerClient::Command::SET_RELEASE_FENCES:
966 parsed = parseSetReleaseFences(length);
967 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700968 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
969 parsed = parseSetPresentOrValidateDisplayResult(length);
970 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800971 default:
972 parsed = false;
973 break;
974 }
975
976 endCommand();
977
978 if (!parsed) {
979 ALOGE("failed to parse command 0x%x length %" PRIu16,
980 command, length);
981 break;
982 }
983 }
984
985 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800986}
987
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800988bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800989{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500990 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800991 return false;
992 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800993
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800994 mCurrentReturnData = &mReturnData[read64()];
995
996 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800997}
998
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800999bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001000{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001001 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001002 return false;
1003 }
1004
1005 auto location = read();
1006 auto error = static_cast<Error>(readSigned());
1007
1008 mErrors.emplace_back(CommandError{location, error});
1009
1010 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001011}
1012
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001013bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001014{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001015 // (layer id, composition type) pairs
1016 if (length % 3 != 0 || !mCurrentReturnData) {
1017 return false;
1018 }
1019
1020 uint32_t count = length / 3;
1021 mCurrentReturnData->changedLayers.reserve(count);
1022 mCurrentReturnData->compositionTypes.reserve(count);
1023 while (count > 0) {
1024 auto layer = read64();
1025 auto type = static_cast<IComposerClient::Composition>(readSigned());
1026
1027 mCurrentReturnData->changedLayers.push_back(layer);
1028 mCurrentReturnData->compositionTypes.push_back(type);
1029
1030 count--;
1031 }
1032
1033 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001034}
1035
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001036bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001037{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001038 // display requests followed by (layer id, layer requests) pairs
1039 if (length % 3 != 1 || !mCurrentReturnData) {
1040 return false;
1041 }
1042
1043 mCurrentReturnData->displayRequests = read();
1044
1045 uint32_t count = (length - 1) / 3;
1046 mCurrentReturnData->requestedLayers.reserve(count);
1047 mCurrentReturnData->requestMasks.reserve(count);
1048 while (count > 0) {
1049 auto layer = read64();
1050 auto layerRequestMask = read();
1051
1052 mCurrentReturnData->requestedLayers.push_back(layer);
1053 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1054
1055 count--;
1056 }
1057
1058 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001059}
1060
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001061bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001062{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001063 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001064 !mCurrentReturnData) {
1065 return false;
1066 }
1067
1068 if (mCurrentReturnData->presentFence >= 0) {
1069 close(mCurrentReturnData->presentFence);
1070 }
1071 mCurrentReturnData->presentFence = readFence();
1072
1073 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001074}
1075
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001076bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001077{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001078 // (layer id, release fence index) pairs
1079 if (length % 3 != 0 || !mCurrentReturnData) {
1080 return false;
1081 }
1082
1083 uint32_t count = length / 3;
1084 mCurrentReturnData->releasedLayers.reserve(count);
1085 mCurrentReturnData->releaseFences.reserve(count);
1086 while (count > 0) {
1087 auto layer = read64();
1088 auto fence = readFence();
1089
1090 mCurrentReturnData->releasedLayers.push_back(layer);
1091 mCurrentReturnData->releaseFences.push_back(fence);
1092
1093 count--;
1094 }
1095
1096 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001097}
1098
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001099bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1100{
1101 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1102 return false;
1103 }
1104 mCurrentReturnData->presentOrValidateState = read();
1105 return true;
1106}
1107
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001108void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001109{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001110 mErrors.clear();
1111
1112 for (auto& data : mReturnData) {
1113 if (data.second.presentFence >= 0) {
1114 close(data.second.presentFence);
1115 }
1116 for (auto fence : data.second.releaseFences) {
1117 if (fence >= 0) {
1118 close(fence);
1119 }
1120 }
1121 }
1122
1123 mReturnData.clear();
1124 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001125}
1126
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001127std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001128{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001129 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001130}
1131
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001132bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001133 uint32_t* outNumChangedCompositionTypes,
1134 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001135{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001136 auto found = mReturnData.find(display);
1137 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001138 *outNumChangedCompositionTypes = 0;
1139 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001140 return false;
1141 }
1142
1143 const ReturnData& data = found->second;
1144
Chia-I Wu67e376d2016-12-19 11:36:22 +08001145 *outNumChangedCompositionTypes = data.compositionTypes.size();
1146 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001147
1148 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001149}
1150
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001151void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001152 std::vector<Layer>* outLayers,
1153 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001154{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001155 auto found = mReturnData.find(display);
1156 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001157 outLayers->clear();
1158 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001159 return;
1160 }
1161
1162 ReturnData& data = found->second;
1163
Chia-I Wu67e376d2016-12-19 11:36:22 +08001164 *outLayers = std::move(data.changedLayers);
1165 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001166}
1167
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001168void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001169 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1170 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001171{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001172 auto found = mReturnData.find(display);
1173 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001174 *outDisplayRequestMask = 0;
1175 outLayers->clear();
1176 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001177 return;
1178 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001179
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001180 ReturnData& data = found->second;
1181
Chia-I Wu67e376d2016-12-19 11:36:22 +08001182 *outDisplayRequestMask = data.displayRequests;
1183 *outLayers = std::move(data.requestedLayers);
1184 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001185}
1186
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001187void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001188 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001189{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001190 auto found = mReturnData.find(display);
1191 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001192 outLayers->clear();
1193 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001194 return;
1195 }
1196
1197 ReturnData& data = found->second;
1198
Chia-I Wu67e376d2016-12-19 11:36:22 +08001199 *outLayers = std::move(data.releasedLayers);
1200 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001201}
1202
Chia-I Wu67e376d2016-12-19 11:36:22 +08001203void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001204{
1205 auto found = mReturnData.find(display);
1206 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001207 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001208 return;
1209 }
1210
1211 ReturnData& data = found->second;
1212
Chia-I Wu67e376d2016-12-19 11:36:22 +08001213 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001214 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001215}
1216
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001217void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1218 auto found = mReturnData.find(display);
1219 if (found == mReturnData.end()) {
1220 *state= -1;
1221 return;
1222 }
1223 ReturnData& data = found->second;
1224 *state = data.presentOrValidateState;
1225}
1226
Lloyd Piquea822d522017-12-20 16:42:57 -08001227} // namespace impl
1228
Chia-I Wuaab99f52016-10-05 12:59:58 +08001229} // namespace Hwc2
1230
1231} // namespace android