blob: f190b7122e6db8e83949b06a8f2f0f8cb7b44379 [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;
Chia-I Wuaab99f52016-10-05 12:59:58 +080035
36namespace Hwc2 {
37
Lloyd Piquea822d522017-12-20 16:42:57 -080038Composer::~Composer() = default;
39
Chia-I Wuaab99f52016-10-05 12:59:58 +080040namespace {
41
42class BufferHandle {
43public:
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080044 explicit BufferHandle(const native_handle_t* buffer) {
Chia-I Wuaab99f52016-10-05 12:59:58 +080045 // nullptr is not a valid handle to HIDL
46 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
47 }
48
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080049 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080050 {
51 return mHandle;
52 }
53
54private:
55 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010056 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080057};
58
59class FenceHandle
60{
61public:
62 FenceHandle(int fd, bool owned)
63 : mOwned(owned)
64 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010065 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080066 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010067 handle = native_handle_init(mStorage, 1, 0);
68 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 } else {
70 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010071 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080072 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010073 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 }
75
76 ~FenceHandle()
77 {
78 if (mOwned) {
79 native_handle_close(mHandle);
80 }
81 }
82
Chih-Hung Hsieh22749042018-12-20 15:50:39 -080083 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
Chia-I Wuaab99f52016-10-05 12:59:58 +080084 {
85 return mHandle;
86 }
87
88private:
89 bool mOwned;
90 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010091 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080092};
93
94// assume NO_RESOURCES when Status::isOk returns false
95constexpr Error kDefaultError = Error::NO_RESOURCES;
96
97template<typename T, typename U>
98T unwrapRet(Return<T>& ret, const U& default_val)
99{
Steven Moreland9d021002017-01-03 17:10:54 -0800100 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800101 static_cast<T>(default_val);
102}
103
104Error unwrapRet(Return<Error>& ret)
105{
106 return unwrapRet(ret, kDefaultError);
107}
108
Chia-I Wuaab99f52016-10-05 12:59:58 +0800109} // anonymous namespace
110
Lloyd Piquea822d522017-12-20 16:42:57 -0800111namespace impl {
112
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500113Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
114 : CommandWriterBase(initialMaxSize) {}
115
116Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800117{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500118}
119
120void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
121{
122 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski3c894632018-04-02 17:10:23 -0700123 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700124 IVrComposerClient::VrCommand::SET_LAYER_INFO),
125 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500126 write(type);
127 write(appId);
128 endCommand();
129}
130
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400131void Composer::CommandWriter::setClientTargetMetadata(
132 const IVrComposerClient::BufferMetadata& metadata)
133{
134 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski3c894632018-04-02 17:10:23 -0700135 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700136 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
137 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400138 writeBufferMetadata(metadata);
139 endCommand();
140}
141
142void Composer::CommandWriter::setLayerBufferMetadata(
143 const IVrComposerClient::BufferMetadata& metadata)
144{
145 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski3c894632018-04-02 17:10:23 -0700146 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700147 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
148 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400149 writeBufferMetadata(metadata);
150 endCommand();
151}
152
153void Composer::CommandWriter::writeBufferMetadata(
154 const IVrComposerClient::BufferMetadata& metadata)
155{
156 write(metadata.width);
157 write(metadata.height);
158 write(metadata.stride);
159 write(metadata.layerCount);
160 writeSigned(static_cast<int32_t>(metadata.format));
161 write64(metadata.usage);
162}
163
Kalle Raitaa099a242017-01-11 11:17:29 -0800164Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800165 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800166 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500167{
Dominik Laskowski3c894632018-04-02 17:10:23 -0700168 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500169
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800170 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800171 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
172 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800173
174 mComposer->createClient(
175 [&](const auto& tmpError, const auto& tmpClient)
176 {
177 if (tmpError == Error::NONE) {
178 mClient = tmpClient;
179 }
180 });
181 if (mClient == nullptr) {
182 LOG_ALWAYS_FATAL("failed to create composer client");
183 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400184
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700185 // 2.2 support is optional
Dominik Laskowski3c894632018-04-02 17:10:23 -0700186 sp<IComposer> composer_2_2 = IComposer::castFrom(mComposer);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700187 if (composer_2_2 != nullptr) {
188 mClient_2_2 = IComposerClient::castFrom(mClient);
189 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
190 }
191
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400192 if (mIsUsingVrComposer) {
193 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
194 if (vrClient == nullptr) {
195 LOG_ALWAYS_FATAL("failed to create vr composer client");
196 }
197 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800198}
199
Lloyd Piquea822d522017-12-20 16:42:57 -0800200Composer::~Composer() = default;
201
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800202std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800203{
204 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800205 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800206 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800207 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800208 });
209
210 return capabilities;
211}
212
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800213std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214{
215 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800216 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800217 info = tmpInfo.c_str();
218 });
219
220 return info;
221}
222
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800223void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800224{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800225 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800226 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227 ALOGE("failed to register IComposerCallback");
228 }
229}
230
Steven Thomasb02664d2017-07-26 18:48:28 -0700231bool Composer::isRemote() {
232 return mClient->isRemote();
233}
234
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700235void Composer::resetCommands() {
236 mWriter.reset();
237}
238
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700239Error Composer::executeCommands() {
240 return execute();
241}
242
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800243uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800244{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800245 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800246 return unwrapRet(ret, 0);
247}
248
249Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800250 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800252 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800253 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700254 if (mClient_2_2) {
255 mClient_2_2->createVirtualDisplay_2_2(width, height, *format, bufferSlotCount,
256 [&](const auto& tmpError, const auto& tmpDisplay,
257 const auto& tmpFormat) {
258 error = tmpError;
259 if (error != Error::NONE) {
260 return;
261 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800262
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700263 *outDisplay = tmpDisplay;
264 *format = tmpFormat;
265 });
266 } else {
267 mClient->createVirtualDisplay(width, height,
Dominik Laskowski3c894632018-04-02 17:10:23 -0700268 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700269 [&](const auto& tmpError, const auto& tmpDisplay,
270 const auto& tmpFormat) {
271 error = tmpError;
272 if (error != Error::NONE) {
273 return;
274 }
275
276 *outDisplay = tmpDisplay;
277 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800278 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700279 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800280
281 return error;
282}
283
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800284Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800285{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800286 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800287 return unwrapRet(ret);
288}
289
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800290Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800292 mWriter.selectDisplay(display);
293 mWriter.acceptDisplayChanges();
294 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295}
296
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298{
299 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800300 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800301 [&](const auto& tmpError, const auto& tmpLayer) {
302 error = tmpError;
303 if (error != Error::NONE) {
304 return;
305 }
306
Chia-I Wu67e376d2016-12-19 11:36:22 +0800307 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800308 });
309
310 return error;
311}
312
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800313Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800314{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800315 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316 return unwrapRet(ret);
317}
318
Chia-I Wu67e376d2016-12-19 11:36:22 +0800319Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800320{
321 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800322 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323 [&](const auto& tmpError, const auto& tmpConfig) {
324 error = tmpError;
325 if (error != Error::NONE) {
326 return;
327 }
328
Chia-I Wu67e376d2016-12-19 11:36:22 +0800329 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800330 });
331
332 return error;
333}
334
335Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800336 std::vector<Layer>* outLayers,
337 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800338{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800339 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800340 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800341}
342
343Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800344 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800345{
346 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700348 if (mClient_2_2) {
349 mClient_2_2->getColorModes_2_2(display,
350 [&](const auto& tmpError, const auto& tmpModes) {
351 error = tmpError;
352 if (error != Error::NONE) {
353 return;
354 }
355
356 *outModes = tmpModes;
357 });
358 } else {
359 mClient->getColorModes(display,
360 [&](const auto& tmpError, const auto& tmpModes) {
361 error = tmpError;
362 if (error != Error::NONE) {
363 return;
364 }
Dominik Laskowski3c894632018-04-02 17:10:23 -0700365 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700366 outModes->push_back(static_cast<ColorMode>(colorMode));
367 }
368 });
369 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800370
371 return error;
372}
373
374Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800375 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800376{
377 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800378 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800379 [&](const auto& tmpError, const auto& tmpValue) {
380 error = tmpError;
381 if (error != Error::NONE) {
382 return;
383 }
384
Chia-I Wu67e376d2016-12-19 11:36:22 +0800385 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800386 });
387
388 return error;
389}
390
391Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800392 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800393{
394 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800395 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800396 [&](const auto& tmpError, const auto& tmpConfigs) {
397 error = tmpError;
398 if (error != Error::NONE) {
399 return;
400 }
401
Chia-I Wu67e376d2016-12-19 11:36:22 +0800402 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800403 });
404
405 return error;
406}
407
Chia-I Wu67e376d2016-12-19 11:36:22 +0800408Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800409{
410 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800411 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800412 [&](const auto& tmpError, const auto& tmpName) {
413 error = tmpError;
414 if (error != Error::NONE) {
415 return;
416 }
417
Chia-I Wu67e376d2016-12-19 11:36:22 +0800418 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419 });
420
421 return error;
422}
423
424Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800425 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
426 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800427{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800428 mReader.takeDisplayRequests(display, outDisplayRequestMask,
429 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800430 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800431}
432
Chia-I Wu67e376d2016-12-19 11:36:22 +0800433Error Composer::getDisplayType(Display display,
434 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800435{
436 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800437 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800438 [&](const auto& tmpError, const auto& tmpType) {
439 error = tmpError;
440 if (error != Error::NONE) {
441 return;
442 }
443
Chia-I Wu67e376d2016-12-19 11:36:22 +0800444 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445 });
446
447 return error;
448}
449
Chia-I Wu67e376d2016-12-19 11:36:22 +0800450Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800451{
452 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800453 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800454 [&](const auto& tmpError, const auto& tmpSupport) {
455 error = tmpError;
456 if (error != Error::NONE) {
457 return;
458 }
459
Chia-I Wu67e376d2016-12-19 11:36:22 +0800460 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800461 });
462
463 return error;
464}
465
Chia-I Wu67e376d2016-12-19 11:36:22 +0800466Error Composer::getHdrCapabilities(Display display,
467 std::vector<Hdr>* outTypes, float* outMaxLuminance,
468 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469{
470 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800471 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472 [&](const auto& tmpError, const auto& tmpTypes,
473 const auto& tmpMaxLuminance,
474 const auto& tmpMaxAverageLuminance,
475 const auto& tmpMinLuminance) {
476 error = tmpError;
477 if (error != Error::NONE) {
478 return;
479 }
480
Chia-I Wu67e376d2016-12-19 11:36:22 +0800481 *outTypes = tmpTypes;
482 *outMaxLuminance = tmpMaxLuminance;
483 *outMaxAverageLuminance = tmpMaxAverageLuminance;
484 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800485 });
486
487 return error;
488}
489
Chia-I Wu67e376d2016-12-19 11:36:22 +0800490Error Composer::getReleaseFences(Display display,
491 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800492{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800493 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800494 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800495}
496
Chia-I Wu67e376d2016-12-19 11:36:22 +0800497Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800498{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800499 mWriter.selectDisplay(display);
500 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800502 Error error = execute();
503 if (error != Error::NONE) {
504 return error;
505 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800506
Chia-I Wu67e376d2016-12-19 11:36:22 +0800507 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800508
509 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800510}
511
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800512Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800513{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800514 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800515 return unwrapRet(ret);
516}
517
Chia-I Wu06d63de2017-01-04 14:58:51 +0800518Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400519 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800520 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800521 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800522{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800523 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400524 if (mIsUsingVrComposer && target.get()) {
525 IVrComposerClient::BufferMetadata metadata = {
526 .width = target->getWidth(),
527 .height = target->getHeight(),
528 .stride = target->getStride(),
529 .layerCount = target->getLayerCount(),
Dominik Laskowski3c894632018-04-02 17:10:23 -0700530 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400531 .usage = target->getUsage(),
532 };
533 mWriter.setClientTargetMetadata(metadata);
534 }
535
536 const native_handle_t* handle = nullptr;
537 if (target.get()) {
538 handle = target->getNativeBuffer()->handle;
539 }
540
541 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800543}
544
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700545Error Composer::setColorMode(Display display, ColorMode mode,
546 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800547{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700548 hardware::Return<Error> ret(kDefaultError);
549 if (mClient_2_2) {
550 ret = mClient_2_2->setColorMode_2_2(display, mode, renderIntent);
551 } else {
552 ret = mClient->setColorMode(display,
Dominik Laskowski3c894632018-04-02 17:10:23 -0700553 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700554 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800555 return unwrapRet(ret);
556}
557
558Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800559 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800560{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800561 mWriter.selectDisplay(display);
562 mWriter.setColorTransform(matrix, hint);
563 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800564}
565
566Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800567 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800568{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800569 mWriter.selectDisplay(display);
570 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
571 return Error::NONE;
572}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800573
Dominik Laskowski3c894632018-04-02 17:10:23 -0700574Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
575 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700576 if (mClient_2_2) {
577 ret = mClient_2_2->setPowerMode_2_2(display, mode);
578 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski3c894632018-04-02 17:10:23 -0700579 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700580 }
581
Chia-I Wuaab99f52016-10-05 12:59:58 +0800582 return unwrapRet(ret);
583}
584
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800585Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800586{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800587 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800588 return unwrapRet(ret);
589}
590
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800591Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800592{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800593 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800594 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800595 return unwrapRet(ret);
596}
597
Chia-I Wu67e376d2016-12-19 11:36:22 +0800598Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
599 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800600{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800601 mWriter.selectDisplay(display);
602 mWriter.validateDisplay();
603
604 Error error = execute();
605 if (error != Error::NONE) {
606 return error;
607 }
608
Chia-I Wu67e376d2016-12-19 11:36:22 +0800609 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800610
611 return Error::NONE;
612}
613
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700614Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
615 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
616 mWriter.selectDisplay(display);
617 mWriter.presentOrvalidateDisplay();
618
619 Error error = execute();
620 if (error != Error::NONE) {
621 return error;
622 }
623
624 mReader.takePresentOrValidateStage(display, state);
625
626 if (*state == 1) { // Present succeeded
627 mReader.takePresentFence(display, outPresentFence);
628 }
629
630 if (*state == 0) { // Validate succeeded.
631 mReader.hasChanges(display, outNumTypes, outNumRequests);
632 }
633
634 return Error::NONE;
635}
636
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800637Error Composer::setCursorPosition(Display display, Layer layer,
638 int32_t x, int32_t y)
639{
640 mWriter.selectDisplay(display);
641 mWriter.selectLayer(layer);
642 mWriter.setLayerCursorPosition(x, y);
643 return Error::NONE;
644}
645
646Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400647 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800648{
649 mWriter.selectDisplay(display);
650 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400651 if (mIsUsingVrComposer && buffer.get()) {
652 IVrComposerClient::BufferMetadata metadata = {
653 .width = buffer->getWidth(),
654 .height = buffer->getHeight(),
655 .stride = buffer->getStride(),
656 .layerCount = buffer->getLayerCount(),
Dominik Laskowski3c894632018-04-02 17:10:23 -0700657 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400658 .usage = buffer->getUsage(),
659 };
660 mWriter.setLayerBufferMetadata(metadata);
661 }
662
663 const native_handle_t* handle = nullptr;
664 if (buffer.get()) {
665 handle = buffer->getNativeBuffer()->handle;
666 }
667
668 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800669 return Error::NONE;
670}
671
672Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
673 const std::vector<IComposerClient::Rect>& damage)
674{
675 mWriter.selectDisplay(display);
676 mWriter.selectLayer(layer);
677 mWriter.setLayerSurfaceDamage(damage);
678 return Error::NONE;
679}
680
681Error Composer::setLayerBlendMode(Display display, Layer layer,
682 IComposerClient::BlendMode mode)
683{
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerBlendMode(mode);
687 return Error::NONE;
688}
689
690Error Composer::setLayerColor(Display display, Layer layer,
691 const IComposerClient::Color& color)
692{
693 mWriter.selectDisplay(display);
694 mWriter.selectLayer(layer);
695 mWriter.setLayerColor(color);
696 return Error::NONE;
697}
698
699Error Composer::setLayerCompositionType(Display display, Layer layer,
700 IComposerClient::Composition type)
701{
702 mWriter.selectDisplay(display);
703 mWriter.selectLayer(layer);
704 mWriter.setLayerCompositionType(type);
705 return Error::NONE;
706}
707
708Error Composer::setLayerDataspace(Display display, Layer layer,
709 Dataspace dataspace)
710{
711 mWriter.selectDisplay(display);
712 mWriter.selectLayer(layer);
713 mWriter.setLayerDataspace(dataspace);
714 return Error::NONE;
715}
716
717Error Composer::setLayerDisplayFrame(Display display, Layer layer,
718 const IComposerClient::Rect& frame)
719{
720 mWriter.selectDisplay(display);
721 mWriter.selectLayer(layer);
722 mWriter.setLayerDisplayFrame(frame);
723 return Error::NONE;
724}
725
726Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
727 float alpha)
728{
729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731 mWriter.setLayerPlaneAlpha(alpha);
732 return Error::NONE;
733}
734
735Error Composer::setLayerSidebandStream(Display display, Layer layer,
736 const native_handle_t* stream)
737{
738 mWriter.selectDisplay(display);
739 mWriter.selectLayer(layer);
740 mWriter.setLayerSidebandStream(stream);
741 return Error::NONE;
742}
743
744Error Composer::setLayerSourceCrop(Display display, Layer layer,
745 const IComposerClient::FRect& crop)
746{
747 mWriter.selectDisplay(display);
748 mWriter.selectLayer(layer);
749 mWriter.setLayerSourceCrop(crop);
750 return Error::NONE;
751}
752
753Error Composer::setLayerTransform(Display display, Layer layer,
754 Transform transform)
755{
756 mWriter.selectDisplay(display);
757 mWriter.selectLayer(layer);
758 mWriter.setLayerTransform(transform);
759 return Error::NONE;
760}
761
762Error Composer::setLayerVisibleRegion(Display display, Layer layer,
763 const std::vector<IComposerClient::Rect>& visible)
764{
765 mWriter.selectDisplay(display);
766 mWriter.selectLayer(layer);
767 mWriter.setLayerVisibleRegion(visible);
768 return Error::NONE;
769}
770
771Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
772{
773 mWriter.selectDisplay(display);
774 mWriter.selectLayer(layer);
775 mWriter.setLayerZOrder(z);
776 return Error::NONE;
777}
778
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500779Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
780 uint32_t appId)
781{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800782 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500783 mWriter.selectDisplay(display);
784 mWriter.selectLayer(layer);
785 mWriter.setLayerInfo(type, appId);
786 }
787 return Error::NONE;
788}
789
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800790Error Composer::execute()
791{
792 // prepare input command queue
793 bool queueChanged = false;
794 uint32_t commandLength = 0;
795 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800796 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800797 mWriter.reset();
798 return Error::NO_RESOURCES;
799 }
800
801 // set up new input command queue if necessary
802 if (queueChanged) {
803 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
804 auto error = unwrapRet(ret);
805 if (error != Error::NONE) {
806 mWriter.reset();
807 return error;
808 }
809 }
810
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700811 if (commandLength == 0) {
812 mWriter.reset();
813 return Error::NONE;
814 }
815
Chia-I Wuaab99f52016-10-05 12:59:58 +0800816 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700817 hardware::Return<void> ret;
818 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
819 const auto& tmpOutLength, const auto& tmpOutHandles)
820 {
821 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800822
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700823 // set up new output command queue if necessary
824 if (error == Error::NONE && tmpOutChanged) {
825 error = kDefaultError;
826 mClient->getOutputCommandQueue(
827 [&](const auto& tmpError,
828 const auto& tmpDescriptor)
829 {
830 error = tmpError;
831 if (error != Error::NONE) {
832 return;
833 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800834
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700835 mReader.setMQDescriptor(tmpDescriptor);
836 });
837 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800838
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700839 if (error != Error::NONE) {
840 return;
841 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800842
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700843 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
844 error = mReader.parse();
845 mReader.reset();
846 } else {
847 error = Error::NO_RESOURCES;
848 }
849 };
850 if (mClient_2_2) {
851 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
852 } else {
853 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
854 }
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700855 // executeCommands can fail because of out-of-fd and we do not want to
856 // abort() in that case
857 if (!ret.isOk()) {
858 ALOGE("executeCommands failed because of %s", ret.description().c_str());
859 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800860
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800861 if (error == Error::NONE) {
862 std::vector<CommandReader::CommandError> commandErrors =
863 mReader.takeErrors();
864
865 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700866 auto command =
867 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800868
869 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700870 command == IComposerClient::Command::PRESENT_DISPLAY ||
871 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800872 error = cmdErr.error;
873 } else {
874 ALOGW("command 0x%x generated error %d",
875 command, cmdErr.error);
876 }
877 }
878 }
879
880 mWriter.reset();
881
Chia-I Wuaab99f52016-10-05 12:59:58 +0800882 return error;
883}
884
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700885// Composer HAL 2.2
886
Peiyong Lin2c327ac2018-04-19 22:06:34 -0700887Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
888 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
889 if (!mClient_2_2) {
890 return Error::UNSUPPORTED;
891 }
892
893 mWriter.selectDisplay(display);
894 mWriter.selectLayer(layer);
895 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
896 return Error::NONE;
897}
898
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700899Error Composer::getPerFrameMetadataKeys(
900 Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
901 if (!mClient_2_2) {
902 return Error::UNSUPPORTED;
903 }
904
905 Error error = kDefaultError;
906 mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
907 error = tmpError;
908 if (error != Error::NONE) {
909 return;
910 }
911
912 *outKeys = tmpKeys;
913 });
914
915 return error;
916}
917
918Error Composer::getRenderIntents(Display display, ColorMode colorMode,
919 std::vector<RenderIntent>* outRenderIntents) {
920 if (!mClient_2_2) {
921 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
922 return Error::NONE;
923 }
924
925 Error error = kDefaultError;
926 mClient_2_2->getRenderIntents(display, colorMode,
927 [&](const auto& tmpError, const auto& tmpKeys) {
928 error = tmpError;
929 if (error != Error::NONE) {
930 return;
931 }
932
933 *outRenderIntents = tmpKeys;
934 });
935
936 return error;
937}
938
939Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
940{
941 if (!mClient_2_2) {
942 *outMatrix = mat4();
943 return Error::NONE;
944 }
945
946 Error error = kDefaultError;
947 mClient_2_2->getDataspaceSaturationMatrix(dataspace, [&](const auto& tmpError, const auto& tmpMatrix) {
948 error = tmpError;
949 if (error != Error::NONE) {
950 return;
951 }
952
953 *outMatrix = mat4(tmpMatrix.data());
954 });
955
956 return error;
957}
958
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800959CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800960{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800961 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800962}
963
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800964Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800965{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800966 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800967
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800968 IComposerClient::Command command;
969 uint16_t length = 0;
970
971 while (!isEmpty()) {
Dominik Laskowski3c894632018-04-02 17:10:23 -0700972 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700973 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800974 break;
975 }
976
977 bool parsed = false;
978 switch (command) {
979 case IComposerClient::Command::SELECT_DISPLAY:
980 parsed = parseSelectDisplay(length);
981 break;
982 case IComposerClient::Command::SET_ERROR:
983 parsed = parseSetError(length);
984 break;
985 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
986 parsed = parseSetChangedCompositionTypes(length);
987 break;
988 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
989 parsed = parseSetDisplayRequests(length);
990 break;
991 case IComposerClient::Command::SET_PRESENT_FENCE:
992 parsed = parseSetPresentFence(length);
993 break;
994 case IComposerClient::Command::SET_RELEASE_FENCES:
995 parsed = parseSetReleaseFences(length);
996 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700997 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
998 parsed = parseSetPresentOrValidateDisplayResult(length);
999 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001000 default:
1001 parsed = false;
1002 break;
1003 }
1004
1005 endCommand();
1006
1007 if (!parsed) {
1008 ALOGE("failed to parse command 0x%x length %" PRIu16,
1009 command, length);
1010 break;
1011 }
1012 }
1013
1014 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001015}
1016
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001017bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001018{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001019 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001020 return false;
1021 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001022
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001023 mCurrentReturnData = &mReturnData[read64()];
1024
1025 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001026}
1027
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001028bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001029{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001030 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001031 return false;
1032 }
1033
1034 auto location = read();
1035 auto error = static_cast<Error>(readSigned());
1036
1037 mErrors.emplace_back(CommandError{location, error});
1038
1039 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001040}
1041
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001042bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001043{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001044 // (layer id, composition type) pairs
1045 if (length % 3 != 0 || !mCurrentReturnData) {
1046 return false;
1047 }
1048
1049 uint32_t count = length / 3;
1050 mCurrentReturnData->changedLayers.reserve(count);
1051 mCurrentReturnData->compositionTypes.reserve(count);
1052 while (count > 0) {
1053 auto layer = read64();
1054 auto type = static_cast<IComposerClient::Composition>(readSigned());
1055
1056 mCurrentReturnData->changedLayers.push_back(layer);
1057 mCurrentReturnData->compositionTypes.push_back(type);
1058
1059 count--;
1060 }
1061
1062 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001063}
1064
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001065bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001066{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001067 // display requests followed by (layer id, layer requests) pairs
1068 if (length % 3 != 1 || !mCurrentReturnData) {
1069 return false;
1070 }
1071
1072 mCurrentReturnData->displayRequests = read();
1073
1074 uint32_t count = (length - 1) / 3;
1075 mCurrentReturnData->requestedLayers.reserve(count);
1076 mCurrentReturnData->requestMasks.reserve(count);
1077 while (count > 0) {
1078 auto layer = read64();
1079 auto layerRequestMask = read();
1080
1081 mCurrentReturnData->requestedLayers.push_back(layer);
1082 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1083
1084 count--;
1085 }
1086
1087 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001088}
1089
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001090bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001091{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001092 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001093 !mCurrentReturnData) {
1094 return false;
1095 }
1096
1097 if (mCurrentReturnData->presentFence >= 0) {
1098 close(mCurrentReturnData->presentFence);
1099 }
1100 mCurrentReturnData->presentFence = readFence();
1101
1102 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001103}
1104
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001105bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001106{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001107 // (layer id, release fence index) pairs
1108 if (length % 3 != 0 || !mCurrentReturnData) {
1109 return false;
1110 }
1111
1112 uint32_t count = length / 3;
1113 mCurrentReturnData->releasedLayers.reserve(count);
1114 mCurrentReturnData->releaseFences.reserve(count);
1115 while (count > 0) {
1116 auto layer = read64();
1117 auto fence = readFence();
1118
1119 mCurrentReturnData->releasedLayers.push_back(layer);
1120 mCurrentReturnData->releaseFences.push_back(fence);
1121
1122 count--;
1123 }
1124
1125 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001126}
1127
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001128bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1129{
1130 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1131 return false;
1132 }
1133 mCurrentReturnData->presentOrValidateState = read();
1134 return true;
1135}
1136
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001137void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001138{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001139 mErrors.clear();
1140
1141 for (auto& data : mReturnData) {
1142 if (data.second.presentFence >= 0) {
1143 close(data.second.presentFence);
1144 }
1145 for (auto fence : data.second.releaseFences) {
1146 if (fence >= 0) {
1147 close(fence);
1148 }
1149 }
1150 }
1151
1152 mReturnData.clear();
1153 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001154}
1155
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001156std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001157{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001158 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001159}
1160
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001161bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001162 uint32_t* outNumChangedCompositionTypes,
1163 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001164{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001165 auto found = mReturnData.find(display);
1166 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001167 *outNumChangedCompositionTypes = 0;
1168 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001169 return false;
1170 }
1171
1172 const ReturnData& data = found->second;
1173
Chia-I Wu67e376d2016-12-19 11:36:22 +08001174 *outNumChangedCompositionTypes = data.compositionTypes.size();
1175 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001176
1177 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001178}
1179
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001180void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001181 std::vector<Layer>* outLayers,
1182 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001183{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001184 auto found = mReturnData.find(display);
1185 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001186 outLayers->clear();
1187 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001188 return;
1189 }
1190
1191 ReturnData& data = found->second;
1192
Chia-I Wu67e376d2016-12-19 11:36:22 +08001193 *outLayers = std::move(data.changedLayers);
1194 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001195}
1196
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001197void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001198 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1199 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001200{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001201 auto found = mReturnData.find(display);
1202 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001203 *outDisplayRequestMask = 0;
1204 outLayers->clear();
1205 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001206 return;
1207 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001208
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001209 ReturnData& data = found->second;
1210
Chia-I Wu67e376d2016-12-19 11:36:22 +08001211 *outDisplayRequestMask = data.displayRequests;
1212 *outLayers = std::move(data.requestedLayers);
1213 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001214}
1215
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001216void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001217 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001218{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001219 auto found = mReturnData.find(display);
1220 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001221 outLayers->clear();
1222 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001223 return;
1224 }
1225
1226 ReturnData& data = found->second;
1227
Chia-I Wu67e376d2016-12-19 11:36:22 +08001228 *outLayers = std::move(data.releasedLayers);
1229 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001230}
1231
Chia-I Wu67e376d2016-12-19 11:36:22 +08001232void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001233{
1234 auto found = mReturnData.find(display);
1235 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001236 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001237 return;
1238 }
1239
1240 ReturnData& data = found->second;
1241
Chia-I Wu67e376d2016-12-19 11:36:22 +08001242 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001243 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001244}
1245
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001246void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1247 auto found = mReturnData.find(display);
1248 if (found == mReturnData.end()) {
1249 *state= -1;
1250 return;
1251 }
1252 ReturnData& data = found->second;
1253 *state = data.presentOrValidateState;
1254}
1255
Lloyd Piquea822d522017-12-20 16:42:57 -08001256} // namespace impl
1257
Chia-I Wuaab99f52016-10-05 12:59:58 +08001258} // namespace Hwc2
1259
1260} // namespace android