blob: c94c290cb294504af25870946c2e1c5638836011 [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:
44 BufferHandle(const native_handle_t* buffer)
45 {
46 // nullptr is not a valid handle to HIDL
47 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
48 }
49
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010050 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080051 {
52 return mHandle;
53 }
54
55private:
56 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010057 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080058};
59
60class FenceHandle
61{
62public:
63 FenceHandle(int fd, bool owned)
64 : mOwned(owned)
65 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010066 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080067 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010068 handle = native_handle_init(mStorage, 1, 0);
69 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080070 } else {
71 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010072 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080073 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010074 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080075 }
76
77 ~FenceHandle()
78 {
79 if (mOwned) {
80 native_handle_close(mHandle);
81 }
82 }
83
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010084 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080085 {
86 return mHandle;
87 }
88
89private:
90 bool mOwned;
91 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010092 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080093};
94
95// assume NO_RESOURCES when Status::isOk returns false
96constexpr Error kDefaultError = Error::NO_RESOURCES;
97
98template<typename T, typename U>
99T unwrapRet(Return<T>& ret, const U& default_val)
100{
Steven Moreland9d021002017-01-03 17:10:54 -0800101 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800102 static_cast<T>(default_val);
103}
104
105Error unwrapRet(Return<Error>& ret)
106{
107 return unwrapRet(ret, kDefaultError);
108}
109
Chia-I Wuaab99f52016-10-05 12:59:58 +0800110} // anonymous namespace
111
Lloyd Piquea822d522017-12-20 16:42:57 -0800112namespace impl {
113
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500114Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
115 : CommandWriterBase(initialMaxSize) {}
116
117Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800118{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500119}
120
121void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
122{
123 constexpr uint16_t kSetLayerInfoLength = 2;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700124 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700125 IVrComposerClient::VrCommand::SET_LAYER_INFO),
126 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500127 write(type);
128 write(appId);
129 endCommand();
130}
131
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400132void Composer::CommandWriter::setClientTargetMetadata(
133 const IVrComposerClient::BufferMetadata& metadata)
134{
135 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700136 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700137 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
138 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400139 writeBufferMetadata(metadata);
140 endCommand();
141}
142
143void Composer::CommandWriter::setLayerBufferMetadata(
144 const IVrComposerClient::BufferMetadata& metadata)
145{
146 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700147 beginCommand(static_cast<V2_1::IComposerClient::Command>(
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700148 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
149 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400150 writeBufferMetadata(metadata);
151 endCommand();
152}
153
154void Composer::CommandWriter::writeBufferMetadata(
155 const IVrComposerClient::BufferMetadata& metadata)
156{
157 write(metadata.width);
158 write(metadata.height);
159 write(metadata.stride);
160 write(metadata.layerCount);
161 writeSigned(static_cast<int32_t>(metadata.format));
162 write64(metadata.usage);
163}
164
Kalle Raitaa099a242017-01-11 11:17:29 -0800165Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800166 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800167 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500168{
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700169 mComposer = V2_1::IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500170
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800171 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800172 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
173 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800174
175 mComposer->createClient(
176 [&](const auto& tmpError, const auto& tmpClient)
177 {
178 if (tmpError == Error::NONE) {
179 mClient = tmpClient;
180 }
181 });
182 if (mClient == nullptr) {
183 LOG_ALWAYS_FATAL("failed to create composer client");
184 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400185
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700186 // 2.2 support is optional
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700187 sp<IComposer> composer_2_2 = IComposer::castFrom(mComposer);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700188 if (composer_2_2 != nullptr) {
189 mClient_2_2 = IComposerClient::castFrom(mClient);
190 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
191 }
192
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400193 if (mIsUsingVrComposer) {
194 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
195 if (vrClient == nullptr) {
196 LOG_ALWAYS_FATAL("failed to create vr composer client");
197 }
198 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800199}
200
Lloyd Piquea822d522017-12-20 16:42:57 -0800201Composer::~Composer() = default;
202
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800203std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800204{
205 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800206 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800207 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800208 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800209 });
210
211 return capabilities;
212}
213
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800214std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800215{
216 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800217 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800218 info = tmpInfo.c_str();
219 });
220
221 return info;
222}
223
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800224void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800225{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800226 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800227 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800228 ALOGE("failed to register IComposerCallback");
229 }
230}
231
Steven Thomasb02664d2017-07-26 18:48:28 -0700232bool Composer::isRemote() {
233 return mClient->isRemote();
234}
235
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700236void Composer::resetCommands() {
237 mWriter.reset();
238}
239
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700240Error Composer::executeCommands() {
241 return execute();
242}
243
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800244uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800245{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800246 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800247 return unwrapRet(ret, 0);
248}
249
250Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800251 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800253 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800254 Error error = kDefaultError;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700255 if (mClient_2_2) {
256 mClient_2_2->createVirtualDisplay_2_2(width, height, *format, bufferSlotCount,
257 [&](const auto& tmpError, const auto& tmpDisplay,
258 const auto& tmpFormat) {
259 error = tmpError;
260 if (error != Error::NONE) {
261 return;
262 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800263
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700264 *outDisplay = tmpDisplay;
265 *format = tmpFormat;
266 });
267 } else {
268 mClient->createVirtualDisplay(width, height,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700269 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700270 [&](const auto& tmpError, const auto& tmpDisplay,
271 const auto& tmpFormat) {
272 error = tmpError;
273 if (error != Error::NONE) {
274 return;
275 }
276
277 *outDisplay = tmpDisplay;
278 *format = static_cast<PixelFormat>(tmpFormat);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800279 });
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700280 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800281
282 return error;
283}
284
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800285Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800286{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800287 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288 return unwrapRet(ret);
289}
290
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800291Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800292{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800293 mWriter.selectDisplay(display);
294 mWriter.acceptDisplayChanges();
295 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800296}
297
Chia-I Wu67e376d2016-12-19 11:36:22 +0800298Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800299{
300 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800301 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302 [&](const auto& tmpError, const auto& tmpLayer) {
303 error = tmpError;
304 if (error != Error::NONE) {
305 return;
306 }
307
Chia-I Wu67e376d2016-12-19 11:36:22 +0800308 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309 });
310
311 return error;
312}
313
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800314Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800315{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800316 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800317 return unwrapRet(ret);
318}
319
Chia-I Wu67e376d2016-12-19 11:36:22 +0800320Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800321{
322 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800323 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324 [&](const auto& tmpError, const auto& tmpConfig) {
325 error = tmpError;
326 if (error != Error::NONE) {
327 return;
328 }
329
Chia-I Wu67e376d2016-12-19 11:36:22 +0800330 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800331 });
332
333 return error;
334}
335
336Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800337 std::vector<Layer>* outLayers,
338 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800339{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800340 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800341 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800342}
343
344Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800345 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800346{
347 Error error = kDefaultError;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800348
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700349 if (mClient_2_2) {
350 mClient_2_2->getColorModes_2_2(display,
351 [&](const auto& tmpError, const auto& tmpModes) {
352 error = tmpError;
353 if (error != Error::NONE) {
354 return;
355 }
356
357 *outModes = tmpModes;
358 });
359 } else {
360 mClient->getColorModes(display,
361 [&](const auto& tmpError, const auto& tmpModes) {
362 error = tmpError;
363 if (error != Error::NONE) {
364 return;
365 }
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700366 for (types::V1_0::ColorMode colorMode : tmpModes) {
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700367 outModes->push_back(static_cast<ColorMode>(colorMode));
368 }
369 });
370 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800371
372 return error;
373}
374
375Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800376 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800377{
378 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800379 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800380 [&](const auto& tmpError, const auto& tmpValue) {
381 error = tmpError;
382 if (error != Error::NONE) {
383 return;
384 }
385
Chia-I Wu67e376d2016-12-19 11:36:22 +0800386 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800387 });
388
389 return error;
390}
391
392Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800393 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800394{
395 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800396 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800397 [&](const auto& tmpError, const auto& tmpConfigs) {
398 error = tmpError;
399 if (error != Error::NONE) {
400 return;
401 }
402
Chia-I Wu67e376d2016-12-19 11:36:22 +0800403 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 });
405
406 return error;
407}
408
Chia-I Wu67e376d2016-12-19 11:36:22 +0800409Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800410{
411 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800412 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800413 [&](const auto& tmpError, const auto& tmpName) {
414 error = tmpError;
415 if (error != Error::NONE) {
416 return;
417 }
418
Chia-I Wu67e376d2016-12-19 11:36:22 +0800419 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800420 });
421
422 return error;
423}
424
425Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800426 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
427 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800428{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800429 mReader.takeDisplayRequests(display, outDisplayRequestMask,
430 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800431 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800432}
433
Chia-I Wu67e376d2016-12-19 11:36:22 +0800434Error Composer::getDisplayType(Display display,
435 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800436{
437 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800438 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800439 [&](const auto& tmpError, const auto& tmpType) {
440 error = tmpError;
441 if (error != Error::NONE) {
442 return;
443 }
444
Chia-I Wu67e376d2016-12-19 11:36:22 +0800445 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800446 });
447
448 return error;
449}
450
Chia-I Wu67e376d2016-12-19 11:36:22 +0800451Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800452{
453 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800454 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800455 [&](const auto& tmpError, const auto& tmpSupport) {
456 error = tmpError;
457 if (error != Error::NONE) {
458 return;
459 }
460
Chia-I Wu67e376d2016-12-19 11:36:22 +0800461 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800462 });
463
464 return error;
465}
466
Chia-I Wu67e376d2016-12-19 11:36:22 +0800467Error Composer::getHdrCapabilities(Display display,
468 std::vector<Hdr>* outTypes, float* outMaxLuminance,
469 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800470{
471 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800472 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800473 [&](const auto& tmpError, const auto& tmpTypes,
474 const auto& tmpMaxLuminance,
475 const auto& tmpMaxAverageLuminance,
476 const auto& tmpMinLuminance) {
477 error = tmpError;
478 if (error != Error::NONE) {
479 return;
480 }
481
Chia-I Wu67e376d2016-12-19 11:36:22 +0800482 *outTypes = tmpTypes;
483 *outMaxLuminance = tmpMaxLuminance;
484 *outMaxAverageLuminance = tmpMaxAverageLuminance;
485 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800486 });
487
488 return error;
489}
490
Chia-I Wu67e376d2016-12-19 11:36:22 +0800491Error Composer::getReleaseFences(Display display,
492 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800493{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800494 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800495 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800496}
497
Chia-I Wu67e376d2016-12-19 11:36:22 +0800498Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800499{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800500 mWriter.selectDisplay(display);
501 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800502
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800503 Error error = execute();
504 if (error != Error::NONE) {
505 return error;
506 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507
Chia-I Wu67e376d2016-12-19 11:36:22 +0800508 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800509
510 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800511}
512
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800513Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800514{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800515 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800516 return unwrapRet(ret);
517}
518
Chia-I Wu06d63de2017-01-04 14:58:51 +0800519Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400520 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800521 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800522 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800523{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800524 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400525 if (mIsUsingVrComposer && target.get()) {
526 IVrComposerClient::BufferMetadata metadata = {
527 .width = target->getWidth(),
528 .height = target->getHeight(),
529 .stride = target->getStride(),
530 .layerCount = target->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700531 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400532 .usage = target->getUsage(),
533 };
534 mWriter.setClientTargetMetadata(metadata);
535 }
536
537 const native_handle_t* handle = nullptr;
538 if (target.get()) {
539 handle = target->getNativeBuffer()->handle;
540 }
541
542 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800543 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800544}
545
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700546Error Composer::setColorMode(Display display, ColorMode mode,
547 RenderIntent renderIntent)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800548{
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700549 hardware::Return<Error> ret(kDefaultError);
550 if (mClient_2_2) {
551 ret = mClient_2_2->setColorMode_2_2(display, mode, renderIntent);
552 } else {
553 ret = mClient->setColorMode(display,
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700554 static_cast<types::V1_0::ColorMode>(mode));
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700555 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556 return unwrapRet(ret);
557}
558
559Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800560 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800561{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800562 mWriter.selectDisplay(display);
563 mWriter.setColorTransform(matrix, hint);
564 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800565}
566
567Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800568 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800569{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800570 mWriter.selectDisplay(display);
571 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
572 return Error::NONE;
573}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800574
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700575Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
576 Return<Error> ret(Error::UNSUPPORTED);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700577 if (mClient_2_2) {
578 ret = mClient_2_2->setPowerMode_2_2(display, mode);
579 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700580 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700581 }
582
Chia-I Wuaab99f52016-10-05 12:59:58 +0800583 return unwrapRet(ret);
584}
585
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800586Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800587{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800588 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800589 return unwrapRet(ret);
590}
591
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800592Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800593{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800594 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800595 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800596 return unwrapRet(ret);
597}
598
Chia-I Wu67e376d2016-12-19 11:36:22 +0800599Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
600 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800601{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800602 mWriter.selectDisplay(display);
603 mWriter.validateDisplay();
604
605 Error error = execute();
606 if (error != Error::NONE) {
607 return error;
608 }
609
Chia-I Wu67e376d2016-12-19 11:36:22 +0800610 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800611
612 return Error::NONE;
613}
614
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700615Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
616 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
617 mWriter.selectDisplay(display);
618 mWriter.presentOrvalidateDisplay();
619
620 Error error = execute();
621 if (error != Error::NONE) {
622 return error;
623 }
624
625 mReader.takePresentOrValidateStage(display, state);
626
627 if (*state == 1) { // Present succeeded
628 mReader.takePresentFence(display, outPresentFence);
629 }
630
631 if (*state == 0) { // Validate succeeded.
632 mReader.hasChanges(display, outNumTypes, outNumRequests);
633 }
634
635 return Error::NONE;
636}
637
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800638Error Composer::setCursorPosition(Display display, Layer layer,
639 int32_t x, int32_t y)
640{
641 mWriter.selectDisplay(display);
642 mWriter.selectLayer(layer);
643 mWriter.setLayerCursorPosition(x, y);
644 return Error::NONE;
645}
646
647Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400648 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800649{
650 mWriter.selectDisplay(display);
651 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400652 if (mIsUsingVrComposer && buffer.get()) {
653 IVrComposerClient::BufferMetadata metadata = {
654 .width = buffer->getWidth(),
655 .height = buffer->getHeight(),
656 .stride = buffer->getStride(),
657 .layerCount = buffer->getLayerCount(),
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700658 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()),
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400659 .usage = buffer->getUsage(),
660 };
661 mWriter.setLayerBufferMetadata(metadata);
662 }
663
664 const native_handle_t* handle = nullptr;
665 if (buffer.get()) {
666 handle = buffer->getNativeBuffer()->handle;
667 }
668
669 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800670 return Error::NONE;
671}
672
673Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
674 const std::vector<IComposerClient::Rect>& damage)
675{
676 mWriter.selectDisplay(display);
677 mWriter.selectLayer(layer);
678 mWriter.setLayerSurfaceDamage(damage);
679 return Error::NONE;
680}
681
682Error Composer::setLayerBlendMode(Display display, Layer layer,
683 IComposerClient::BlendMode mode)
684{
685 mWriter.selectDisplay(display);
686 mWriter.selectLayer(layer);
687 mWriter.setLayerBlendMode(mode);
688 return Error::NONE;
689}
690
691Error Composer::setLayerColor(Display display, Layer layer,
692 const IComposerClient::Color& color)
693{
694 mWriter.selectDisplay(display);
695 mWriter.selectLayer(layer);
696 mWriter.setLayerColor(color);
697 return Error::NONE;
698}
699
700Error Composer::setLayerCompositionType(Display display, Layer layer,
701 IComposerClient::Composition type)
702{
703 mWriter.selectDisplay(display);
704 mWriter.selectLayer(layer);
705 mWriter.setLayerCompositionType(type);
706 return Error::NONE;
707}
708
709Error Composer::setLayerDataspace(Display display, Layer layer,
710 Dataspace dataspace)
711{
712 mWriter.selectDisplay(display);
713 mWriter.selectLayer(layer);
714 mWriter.setLayerDataspace(dataspace);
715 return Error::NONE;
716}
717
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700718Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {
Courtney Goeltzenleuchter301bb302018-03-12 11:12:42 -0600719 if (!mClient_2_2) {
720 return Error::UNSUPPORTED;
721 }
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700722
723 mWriter.selectDisplay(display);
724 mWriter.selectLayer(layer);
725
Dominik Laskowski6231aaf2018-04-02 17:10:23 -0700726 std::vector<IComposerClient::PerFrameMetadata> composerMetadata;
727 using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700728 if (metadata.validTypes & HdrMetadata::SMPTE2086) {
729 composerMetadata
730 .insert(composerMetadata.end(),
731 {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
732 metadata.smpte2086.displayPrimaryRed.x},
733 {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
734 metadata.smpte2086.displayPrimaryRed.y},
735 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
736 metadata.smpte2086.displayPrimaryGreen.x},
737 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
738 metadata.smpte2086.displayPrimaryGreen.y},
739 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
740 metadata.smpte2086.displayPrimaryBlue.x},
741 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
742 metadata.smpte2086.displayPrimaryBlue.y},
743 {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
744 {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
745 {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
746 {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
747 }
748 if (metadata.validTypes & HdrMetadata::CTA861_3) {
749 composerMetadata.insert(composerMetadata.end(),
750 {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
751 metadata.cta8613.maxContentLightLevel},
752 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
753 metadata.cta8613.maxFrameAverageLightLevel}});
754 }
755
Chia-I Wubcbd53c2018-03-30 12:35:13 -0700756 mWriter.setLayerPerFrameMetadata(composerMetadata);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700757 return Error::NONE;
758}
759
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800760Error Composer::setLayerDisplayFrame(Display display, Layer layer,
761 const IComposerClient::Rect& frame)
762{
763 mWriter.selectDisplay(display);
764 mWriter.selectLayer(layer);
765 mWriter.setLayerDisplayFrame(frame);
766 return Error::NONE;
767}
768
769Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
770 float alpha)
771{
772 mWriter.selectDisplay(display);
773 mWriter.selectLayer(layer);
774 mWriter.setLayerPlaneAlpha(alpha);
775 return Error::NONE;
776}
777
778Error Composer::setLayerSidebandStream(Display display, Layer layer,
779 const native_handle_t* stream)
780{
781 mWriter.selectDisplay(display);
782 mWriter.selectLayer(layer);
783 mWriter.setLayerSidebandStream(stream);
784 return Error::NONE;
785}
786
787Error Composer::setLayerSourceCrop(Display display, Layer layer,
788 const IComposerClient::FRect& crop)
789{
790 mWriter.selectDisplay(display);
791 mWriter.selectLayer(layer);
792 mWriter.setLayerSourceCrop(crop);
793 return Error::NONE;
794}
795
796Error Composer::setLayerTransform(Display display, Layer layer,
797 Transform transform)
798{
799 mWriter.selectDisplay(display);
800 mWriter.selectLayer(layer);
801 mWriter.setLayerTransform(transform);
802 return Error::NONE;
803}
804
805Error Composer::setLayerVisibleRegion(Display display, Layer layer,
806 const std::vector<IComposerClient::Rect>& visible)
807{
808 mWriter.selectDisplay(display);
809 mWriter.selectLayer(layer);
810 mWriter.setLayerVisibleRegion(visible);
811 return Error::NONE;
812}
813
814Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
815{
816 mWriter.selectDisplay(display);
817 mWriter.selectLayer(layer);
818 mWriter.setLayerZOrder(z);
819 return Error::NONE;
820}
821
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500822Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
823 uint32_t appId)
824{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800825 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500826 mWriter.selectDisplay(display);
827 mWriter.selectLayer(layer);
828 mWriter.setLayerInfo(type, appId);
829 }
830 return Error::NONE;
831}
832
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800833Error Composer::execute()
834{
835 // prepare input command queue
836 bool queueChanged = false;
837 uint32_t commandLength = 0;
838 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800839 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800840 mWriter.reset();
841 return Error::NO_RESOURCES;
842 }
843
844 // set up new input command queue if necessary
845 if (queueChanged) {
846 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
847 auto error = unwrapRet(ret);
848 if (error != Error::NONE) {
849 mWriter.reset();
850 return error;
851 }
852 }
853
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700854 if (commandLength == 0) {
855 mWriter.reset();
856 return Error::NONE;
857 }
858
Chia-I Wuaab99f52016-10-05 12:59:58 +0800859 Error error = kDefaultError;
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700860 hardware::Return<void> ret;
861 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
862 const auto& tmpOutLength, const auto& tmpOutHandles)
863 {
864 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800865
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700866 // set up new output command queue if necessary
867 if (error == Error::NONE && tmpOutChanged) {
868 error = kDefaultError;
869 mClient->getOutputCommandQueue(
870 [&](const auto& tmpError,
871 const auto& tmpDescriptor)
872 {
873 error = tmpError;
874 if (error != Error::NONE) {
875 return;
876 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800877
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700878 mReader.setMQDescriptor(tmpDescriptor);
879 });
880 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800881
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700882 if (error != Error::NONE) {
883 return;
884 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800885
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700886 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
887 error = mReader.parse();
888 mReader.reset();
889 } else {
890 error = Error::NO_RESOURCES;
891 }
892 };
893 if (mClient_2_2) {
894 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
895 } else {
896 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
897 }
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
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700928// Composer HAL 2.2
929
930Error Composer::getPerFrameMetadataKeys(
931 Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
932 if (!mClient_2_2) {
933 return Error::UNSUPPORTED;
934 }
935
936 Error error = kDefaultError;
937 mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
938 error = tmpError;
939 if (error != Error::NONE) {
940 return;
941 }
942
943 *outKeys = tmpKeys;
944 });
945
946 return error;
947}
948
949Error Composer::getRenderIntents(Display display, ColorMode colorMode,
950 std::vector<RenderIntent>* outRenderIntents) {
951 if (!mClient_2_2) {
952 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
953 return Error::NONE;
954 }
955
956 Error error = kDefaultError;
957 mClient_2_2->getRenderIntents(display, colorMode,
958 [&](const auto& tmpError, const auto& tmpKeys) {
959 error = tmpError;
960 if (error != Error::NONE) {
961 return;
962 }
963
964 *outRenderIntents = tmpKeys;
965 });
966
967 return error;
968}
969
970Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
971{
972 if (!mClient_2_2) {
973 *outMatrix = mat4();
974 return Error::NONE;
975 }
976
977 Error error = kDefaultError;
978 mClient_2_2->getDataspaceSaturationMatrix(dataspace, [&](const auto& tmpError, const auto& tmpMatrix) {
979 error = tmpError;
980 if (error != Error::NONE) {
981 return;
982 }
983
984 *outMatrix = mat4(tmpMatrix.data());
985 });
986
987 return error;
988}
989
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800990CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800991{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800992 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800993}
994
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800995Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800996{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800997 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800998
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800999 IComposerClient::Command command;
1000 uint16_t length = 0;
1001
1002 while (!isEmpty()) {
Dominik Laskowski6231aaf2018-04-02 17:10:23 -07001003 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command);
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -07001004 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001005 break;
1006 }
1007
1008 bool parsed = false;
1009 switch (command) {
1010 case IComposerClient::Command::SELECT_DISPLAY:
1011 parsed = parseSelectDisplay(length);
1012 break;
1013 case IComposerClient::Command::SET_ERROR:
1014 parsed = parseSetError(length);
1015 break;
1016 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1017 parsed = parseSetChangedCompositionTypes(length);
1018 break;
1019 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1020 parsed = parseSetDisplayRequests(length);
1021 break;
1022 case IComposerClient::Command::SET_PRESENT_FENCE:
1023 parsed = parseSetPresentFence(length);
1024 break;
1025 case IComposerClient::Command::SET_RELEASE_FENCES:
1026 parsed = parseSetReleaseFences(length);
1027 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001028 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1029 parsed = parseSetPresentOrValidateDisplayResult(length);
1030 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001031 default:
1032 parsed = false;
1033 break;
1034 }
1035
1036 endCommand();
1037
1038 if (!parsed) {
1039 ALOGE("failed to parse command 0x%x length %" PRIu16,
1040 command, length);
1041 break;
1042 }
1043 }
1044
1045 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001046}
1047
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001048bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001049{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001050 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001051 return false;
1052 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001053
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001054 mCurrentReturnData = &mReturnData[read64()];
1055
1056 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001057}
1058
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001059bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001060{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001061 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001062 return false;
1063 }
1064
1065 auto location = read();
1066 auto error = static_cast<Error>(readSigned());
1067
1068 mErrors.emplace_back(CommandError{location, error});
1069
1070 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001071}
1072
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001073bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001074{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001075 // (layer id, composition type) pairs
1076 if (length % 3 != 0 || !mCurrentReturnData) {
1077 return false;
1078 }
1079
1080 uint32_t count = length / 3;
1081 mCurrentReturnData->changedLayers.reserve(count);
1082 mCurrentReturnData->compositionTypes.reserve(count);
1083 while (count > 0) {
1084 auto layer = read64();
1085 auto type = static_cast<IComposerClient::Composition>(readSigned());
1086
1087 mCurrentReturnData->changedLayers.push_back(layer);
1088 mCurrentReturnData->compositionTypes.push_back(type);
1089
1090 count--;
1091 }
1092
1093 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001094}
1095
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001096bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001097{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001098 // display requests followed by (layer id, layer requests) pairs
1099 if (length % 3 != 1 || !mCurrentReturnData) {
1100 return false;
1101 }
1102
1103 mCurrentReturnData->displayRequests = read();
1104
1105 uint32_t count = (length - 1) / 3;
1106 mCurrentReturnData->requestedLayers.reserve(count);
1107 mCurrentReturnData->requestMasks.reserve(count);
1108 while (count > 0) {
1109 auto layer = read64();
1110 auto layerRequestMask = read();
1111
1112 mCurrentReturnData->requestedLayers.push_back(layer);
1113 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1114
1115 count--;
1116 }
1117
1118 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001119}
1120
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001121bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001122{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001123 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001124 !mCurrentReturnData) {
1125 return false;
1126 }
1127
1128 if (mCurrentReturnData->presentFence >= 0) {
1129 close(mCurrentReturnData->presentFence);
1130 }
1131 mCurrentReturnData->presentFence = readFence();
1132
1133 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001134}
1135
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001136bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001137{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001138 // (layer id, release fence index) pairs
1139 if (length % 3 != 0 || !mCurrentReturnData) {
1140 return false;
1141 }
1142
1143 uint32_t count = length / 3;
1144 mCurrentReturnData->releasedLayers.reserve(count);
1145 mCurrentReturnData->releaseFences.reserve(count);
1146 while (count > 0) {
1147 auto layer = read64();
1148 auto fence = readFence();
1149
1150 mCurrentReturnData->releasedLayers.push_back(layer);
1151 mCurrentReturnData->releaseFences.push_back(fence);
1152
1153 count--;
1154 }
1155
1156 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001157}
1158
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001159bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1160{
1161 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1162 return false;
1163 }
1164 mCurrentReturnData->presentOrValidateState = read();
1165 return true;
1166}
1167
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001168void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001169{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001170 mErrors.clear();
1171
1172 for (auto& data : mReturnData) {
1173 if (data.second.presentFence >= 0) {
1174 close(data.second.presentFence);
1175 }
1176 for (auto fence : data.second.releaseFences) {
1177 if (fence >= 0) {
1178 close(fence);
1179 }
1180 }
1181 }
1182
1183 mReturnData.clear();
1184 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001185}
1186
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001187std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001188{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001189 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001190}
1191
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001192bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001193 uint32_t* outNumChangedCompositionTypes,
1194 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001195{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001196 auto found = mReturnData.find(display);
1197 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001198 *outNumChangedCompositionTypes = 0;
1199 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001200 return false;
1201 }
1202
1203 const ReturnData& data = found->second;
1204
Chia-I Wu67e376d2016-12-19 11:36:22 +08001205 *outNumChangedCompositionTypes = data.compositionTypes.size();
1206 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001207
1208 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001209}
1210
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001211void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001212 std::vector<Layer>* outLayers,
1213 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001214{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001215 auto found = mReturnData.find(display);
1216 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001217 outLayers->clear();
1218 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001219 return;
1220 }
1221
1222 ReturnData& data = found->second;
1223
Chia-I Wu67e376d2016-12-19 11:36:22 +08001224 *outLayers = std::move(data.changedLayers);
1225 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001226}
1227
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001228void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001229 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1230 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001231{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001232 auto found = mReturnData.find(display);
1233 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001234 *outDisplayRequestMask = 0;
1235 outLayers->clear();
1236 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001237 return;
1238 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001239
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001240 ReturnData& data = found->second;
1241
Chia-I Wu67e376d2016-12-19 11:36:22 +08001242 *outDisplayRequestMask = data.displayRequests;
1243 *outLayers = std::move(data.requestedLayers);
1244 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001245}
1246
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001247void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001248 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001249{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001250 auto found = mReturnData.find(display);
1251 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001252 outLayers->clear();
1253 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001254 return;
1255 }
1256
1257 ReturnData& data = found->second;
1258
Chia-I Wu67e376d2016-12-19 11:36:22 +08001259 *outLayers = std::move(data.releasedLayers);
1260 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001261}
1262
Chia-I Wu67e376d2016-12-19 11:36:22 +08001263void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001264{
1265 auto found = mReturnData.find(display);
1266 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001267 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001268 return;
1269 }
1270
1271 ReturnData& data = found->second;
1272
Chia-I Wu67e376d2016-12-19 11:36:22 +08001273 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001274 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001275}
1276
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001277void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1278 auto found = mReturnData.find(display);
1279 if (found == mReturnData.end()) {
1280 *state= -1;
1281 return;
1282 }
1283 ReturnData& data = found->second;
1284 *state = data.presentOrValidateState;
1285}
1286
Lloyd Piquea822d522017-12-20 16:42:57 -08001287} // namespace impl
1288
Chia-I Wuaab99f52016-10-05 12:59:58 +08001289} // namespace Hwc2
1290
1291} // namespace android