blob: 0425a8a216ce18ef73636104a8b7a4f817a3352b [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;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -070035using namespace hardware::graphics::composer;
36using PerFrameMetadata = hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadata;
37using PerFrameMetadataKey =
38 hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey;
Chia-I Wuaab99f52016-10-05 12:59:58 +080039
40namespace Hwc2 {
41
Lloyd Piquea822d522017-12-20 16:42:57 -080042Composer::~Composer() = default;
43
Chia-I Wuaab99f52016-10-05 12:59:58 +080044namespace {
45
46class BufferHandle {
47public:
48 BufferHandle(const native_handle_t* buffer)
49 {
50 // nullptr is not a valid handle to HIDL
51 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
52 }
53
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010054 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080055 {
56 return mHandle;
57 }
58
59private:
60 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010061 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080062};
63
64class FenceHandle
65{
66public:
67 FenceHandle(int fd, bool owned)
68 : mOwned(owned)
69 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010070 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010072 handle = native_handle_init(mStorage, 1, 0);
73 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080074 } else {
75 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010076 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080077 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010078 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080079 }
80
81 ~FenceHandle()
82 {
83 if (mOwned) {
84 native_handle_close(mHandle);
85 }
86 }
87
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010088 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080089 {
90 return mHandle;
91 }
92
93private:
94 bool mOwned;
95 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010096 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080097};
98
99// assume NO_RESOURCES when Status::isOk returns false
100constexpr Error kDefaultError = Error::NO_RESOURCES;
101
102template<typename T, typename U>
103T unwrapRet(Return<T>& ret, const U& default_val)
104{
Steven Moreland9d021002017-01-03 17:10:54 -0800105 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +0800106 static_cast<T>(default_val);
107}
108
109Error unwrapRet(Return<Error>& ret)
110{
111 return unwrapRet(ret, kDefaultError);
112}
113
Chia-I Wuaab99f52016-10-05 12:59:58 +0800114} // anonymous namespace
115
Lloyd Piquea822d522017-12-20 16:42:57 -0800116namespace impl {
117
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500118Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
119 : CommandWriterBase(initialMaxSize) {}
120
121Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800122{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500123}
124
125void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
126{
127 constexpr uint16_t kSetLayerInfoLength = 2;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700128 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
129 IVrComposerClient::VrCommand::SET_LAYER_INFO),
130 kSetLayerInfoLength);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500131 write(type);
132 write(appId);
133 endCommand();
134}
135
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400136void Composer::CommandWriter::setClientTargetMetadata(
137 const IVrComposerClient::BufferMetadata& metadata)
138{
139 constexpr uint16_t kSetClientTargetMetadataLength = 7;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700140 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
141 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
142 kSetClientTargetMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400143 writeBufferMetadata(metadata);
144 endCommand();
145}
146
147void Composer::CommandWriter::setLayerBufferMetadata(
148 const IVrComposerClient::BufferMetadata& metadata)
149{
150 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700151 beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
152 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
153 kSetLayerBufferMetadataLength);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400154 writeBufferMetadata(metadata);
155 endCommand();
156}
157
158void Composer::CommandWriter::writeBufferMetadata(
159 const IVrComposerClient::BufferMetadata& metadata)
160{
161 write(metadata.width);
162 write(metadata.height);
163 write(metadata.stride);
164 write(metadata.layerCount);
165 writeSigned(static_cast<int32_t>(metadata.format));
166 write64(metadata.usage);
167}
168
Kalle Raitaa099a242017-01-11 11:17:29 -0800169Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800170 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800171 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500172{
Kalle Raitaa099a242017-01-11 11:17:29 -0800173 mComposer = IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500174
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800175 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800176 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
177 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800178
179 mComposer->createClient(
180 [&](const auto& tmpError, const auto& tmpClient)
181 {
182 if (tmpError == Error::NONE) {
183 mClient = tmpClient;
184 }
185 });
186 if (mClient == nullptr) {
187 LOG_ALWAYS_FATAL("failed to create composer client");
188 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400189
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700190 // 2.2 support is optional
191 sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer);
192 if (composer_2_2 != nullptr) {
193 mClient_2_2 = IComposerClient::castFrom(mClient);
194 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
195 }
196
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400197 if (mIsUsingVrComposer) {
198 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
199 if (vrClient == nullptr) {
200 LOG_ALWAYS_FATAL("failed to create vr composer client");
201 }
202 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800203}
204
Lloyd Piquea822d522017-12-20 16:42:57 -0800205Composer::~Composer() = default;
206
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800207std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800208{
209 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800212 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800213 });
214
215 return capabilities;
216}
217
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800218std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800219{
220 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800221 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800222 info = tmpInfo.c_str();
223 });
224
225 return info;
226}
227
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800228void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800229{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800230 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800231 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800232 ALOGE("failed to register IComposerCallback");
233 }
234}
235
Steven Thomasb02664d2017-07-26 18:48:28 -0700236bool Composer::isRemote() {
237 return mClient->isRemote();
238}
239
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700240void Composer::resetCommands() {
241 mWriter.reset();
242}
243
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700244Error Composer::executeCommands() {
245 return execute();
246}
247
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800248uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800249{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800250 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251 return unwrapRet(ret, 0);
252}
253
254Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800255 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800256{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800257 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800258 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800259 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800260 [&](const auto& tmpError, const auto& tmpDisplay,
261 const auto& tmpFormat) {
262 error = tmpError;
263 if (error != Error::NONE) {
264 return;
265 }
266
Chia-I Wu67e376d2016-12-19 11:36:22 +0800267 *outDisplay = tmpDisplay;
268 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800269 });
270
271 return error;
272}
273
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800274Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800275{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800276 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277 return unwrapRet(ret);
278}
279
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800280Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800281{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800282 mWriter.selectDisplay(display);
283 mWriter.acceptDisplayChanges();
284 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800285}
286
Chia-I Wu67e376d2016-12-19 11:36:22 +0800287Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288{
289 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800290 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291 [&](const auto& tmpError, const auto& tmpLayer) {
292 error = tmpError;
293 if (error != Error::NONE) {
294 return;
295 }
296
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298 });
299
300 return error;
301}
302
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800303Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800304{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800305 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306 return unwrapRet(ret);
307}
308
Chia-I Wu67e376d2016-12-19 11:36:22 +0800309Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800310{
311 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800312 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313 [&](const auto& tmpError, const auto& tmpConfig) {
314 error = tmpError;
315 if (error != Error::NONE) {
316 return;
317 }
318
Chia-I Wu67e376d2016-12-19 11:36:22 +0800319 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800320 });
321
322 return error;
323}
324
325Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800326 std::vector<Layer>* outLayers,
327 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800328{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800329 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800330 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800331}
332
333Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800334 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800335{
336 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800337 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800338 [&](const auto& tmpError, const auto& tmpModes) {
339 error = tmpError;
340 if (error != Error::NONE) {
341 return;
342 }
343
Chia-I Wu67e376d2016-12-19 11:36:22 +0800344 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800345 });
346
347 return error;
348}
349
350Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800351 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800352{
353 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800354 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355 [&](const auto& tmpError, const auto& tmpValue) {
356 error = tmpError;
357 if (error != Error::NONE) {
358 return;
359 }
360
Chia-I Wu67e376d2016-12-19 11:36:22 +0800361 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800362 });
363
364 return error;
365}
366
367Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800368 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800369{
370 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800371 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800372 [&](const auto& tmpError, const auto& tmpConfigs) {
373 error = tmpError;
374 if (error != Error::NONE) {
375 return;
376 }
377
Chia-I Wu67e376d2016-12-19 11:36:22 +0800378 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800379 });
380
381 return error;
382}
383
Chia-I Wu67e376d2016-12-19 11:36:22 +0800384Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385{
386 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800387 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388 [&](const auto& tmpError, const auto& tmpName) {
389 error = tmpError;
390 if (error != Error::NONE) {
391 return;
392 }
393
Chia-I Wu67e376d2016-12-19 11:36:22 +0800394 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395 });
396
397 return error;
398}
399
400Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800401 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
402 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800403{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800404 mReader.takeDisplayRequests(display, outDisplayRequestMask,
405 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800406 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800407}
408
Chia-I Wu67e376d2016-12-19 11:36:22 +0800409Error Composer::getDisplayType(Display display,
410 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800411{
412 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800413 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800414 [&](const auto& tmpError, const auto& tmpType) {
415 error = tmpError;
416 if (error != Error::NONE) {
417 return;
418 }
419
Chia-I Wu67e376d2016-12-19 11:36:22 +0800420 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800421 });
422
423 return error;
424}
425
Chia-I Wu67e376d2016-12-19 11:36:22 +0800426Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800427{
428 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800429 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430 [&](const auto& tmpError, const auto& tmpSupport) {
431 error = tmpError;
432 if (error != Error::NONE) {
433 return;
434 }
435
Chia-I Wu67e376d2016-12-19 11:36:22 +0800436 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800437 });
438
439 return error;
440}
441
Chia-I Wu67e376d2016-12-19 11:36:22 +0800442Error Composer::getHdrCapabilities(Display display,
443 std::vector<Hdr>* outTypes, float* outMaxLuminance,
444 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445{
446 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800447 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800448 [&](const auto& tmpError, const auto& tmpTypes,
449 const auto& tmpMaxLuminance,
450 const auto& tmpMaxAverageLuminance,
451 const auto& tmpMinLuminance) {
452 error = tmpError;
453 if (error != Error::NONE) {
454 return;
455 }
456
Chia-I Wu67e376d2016-12-19 11:36:22 +0800457 *outTypes = tmpTypes;
458 *outMaxLuminance = tmpMaxLuminance;
459 *outMaxAverageLuminance = tmpMaxAverageLuminance;
460 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800461 });
462
463 return error;
464}
465
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700466Error Composer::getPerFrameMetadataKeys(
467 Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
468 if (!mClient_2_2) {
469 return Error::UNSUPPORTED;
470 }
471
472 Error error = kDefaultError;
473 mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
474 error = tmpError;
475 if (error != Error::NONE) {
476 return;
477 }
478
479 *outKeys = tmpKeys;
480 });
481
482 return error;
483}
484
Chia-I Wu67e376d2016-12-19 11:36:22 +0800485Error Composer::getReleaseFences(Display display,
486 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800487{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800488 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800489 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800490}
491
Chia-I Wu67e376d2016-12-19 11:36:22 +0800492Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800493{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800494 mWriter.selectDisplay(display);
495 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800496
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800497 Error error = execute();
498 if (error != Error::NONE) {
499 return error;
500 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501
Chia-I Wu67e376d2016-12-19 11:36:22 +0800502 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800503
504 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800505}
506
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800507Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800508{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800509 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800510 return unwrapRet(ret);
511}
512
Chia-I Wu06d63de2017-01-04 14:58:51 +0800513Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400514 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800515 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800516 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400519 if (mIsUsingVrComposer && target.get()) {
520 IVrComposerClient::BufferMetadata metadata = {
521 .width = target->getWidth(),
522 .height = target->getHeight(),
523 .stride = target->getStride(),
524 .layerCount = target->getLayerCount(),
525 .format = static_cast<PixelFormat>(target->getPixelFormat()),
526 .usage = target->getUsage(),
527 };
528 mWriter.setClientTargetMetadata(metadata);
529 }
530
531 const native_handle_t* handle = nullptr;
532 if (target.get()) {
533 handle = target->getNativeBuffer()->handle;
534 }
535
536 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800537 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538}
539
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800540Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800541{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800542 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800543 return unwrapRet(ret);
544}
545
546Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800547 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800548{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800549 mWriter.selectDisplay(display);
550 mWriter.setColorTransform(matrix, hint);
551 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800552}
553
554Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800555 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800556{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800557 mWriter.selectDisplay(display);
558 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
559 return Error::NONE;
560}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800561
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800562Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
563{
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700564 hardware::Return<Error> ret(Error::UNSUPPORTED);
565 if (mClient_2_2) {
566 ret = mClient_2_2->setPowerMode_2_2(display, mode);
567 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
568 ret = mClient->setPowerMode(display,
569 static_cast<hardware::graphics::composer::V2_1::
570 IComposerClient::PowerMode>(mode));
571 }
572
Chia-I Wuaab99f52016-10-05 12:59:58 +0800573 return unwrapRet(ret);
574}
575
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800576Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800577{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800578 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800579 return unwrapRet(ret);
580}
581
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800582Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800583{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800584 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800585 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800586 return unwrapRet(ret);
587}
588
Chia-I Wu67e376d2016-12-19 11:36:22 +0800589Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
590 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800591{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800592 mWriter.selectDisplay(display);
593 mWriter.validateDisplay();
594
595 Error error = execute();
596 if (error != Error::NONE) {
597 return error;
598 }
599
Chia-I Wu67e376d2016-12-19 11:36:22 +0800600 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800601
602 return Error::NONE;
603}
604
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700605Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
606 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
607 mWriter.selectDisplay(display);
608 mWriter.presentOrvalidateDisplay();
609
610 Error error = execute();
611 if (error != Error::NONE) {
612 return error;
613 }
614
615 mReader.takePresentOrValidateStage(display, state);
616
617 if (*state == 1) { // Present succeeded
618 mReader.takePresentFence(display, outPresentFence);
619 }
620
621 if (*state == 0) { // Validate succeeded.
622 mReader.hasChanges(display, outNumTypes, outNumRequests);
623 }
624
625 return Error::NONE;
626}
627
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800628Error Composer::setCursorPosition(Display display, Layer layer,
629 int32_t x, int32_t y)
630{
631 mWriter.selectDisplay(display);
632 mWriter.selectLayer(layer);
633 mWriter.setLayerCursorPosition(x, y);
634 return Error::NONE;
635}
636
637Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400638 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800639{
640 mWriter.selectDisplay(display);
641 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400642 if (mIsUsingVrComposer && buffer.get()) {
643 IVrComposerClient::BufferMetadata metadata = {
644 .width = buffer->getWidth(),
645 .height = buffer->getHeight(),
646 .stride = buffer->getStride(),
647 .layerCount = buffer->getLayerCount(),
648 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
649 .usage = buffer->getUsage(),
650 };
651 mWriter.setLayerBufferMetadata(metadata);
652 }
653
654 const native_handle_t* handle = nullptr;
655 if (buffer.get()) {
656 handle = buffer->getNativeBuffer()->handle;
657 }
658
659 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800660 return Error::NONE;
661}
662
663Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
664 const std::vector<IComposerClient::Rect>& damage)
665{
666 mWriter.selectDisplay(display);
667 mWriter.selectLayer(layer);
668 mWriter.setLayerSurfaceDamage(damage);
669 return Error::NONE;
670}
671
672Error Composer::setLayerBlendMode(Display display, Layer layer,
673 IComposerClient::BlendMode mode)
674{
675 mWriter.selectDisplay(display);
676 mWriter.selectLayer(layer);
677 mWriter.setLayerBlendMode(mode);
678 return Error::NONE;
679}
680
681Error Composer::setLayerColor(Display display, Layer layer,
682 const IComposerClient::Color& color)
683{
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerColor(color);
687 return Error::NONE;
688}
689
690Error Composer::setLayerCompositionType(Display display, Layer layer,
691 IComposerClient::Composition type)
692{
693 mWriter.selectDisplay(display);
694 mWriter.selectLayer(layer);
695 mWriter.setLayerCompositionType(type);
696 return Error::NONE;
697}
698
699Error Composer::setLayerDataspace(Display display, Layer layer,
700 Dataspace dataspace)
701{
702 mWriter.selectDisplay(display);
703 mWriter.selectLayer(layer);
704 mWriter.setLayerDataspace(dataspace);
705 return Error::NONE;
706}
707
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700708Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {
Courtney Goeltzenleuchter301bb302018-03-12 11:12:42 -0600709 if (!mClient_2_2) {
710 return Error::UNSUPPORTED;
711 }
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700712
713 mWriter.selectDisplay(display);
714 mWriter.selectLayer(layer);
715
716 std::vector<PerFrameMetadata> composerMetadata;
717 if (metadata.validTypes & HdrMetadata::SMPTE2086) {
718 composerMetadata
719 .insert(composerMetadata.end(),
720 {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
721 metadata.smpte2086.displayPrimaryRed.x},
722 {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
723 metadata.smpte2086.displayPrimaryRed.y},
724 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
725 metadata.smpte2086.displayPrimaryGreen.x},
726 {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
727 metadata.smpte2086.displayPrimaryGreen.y},
728 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
729 metadata.smpte2086.displayPrimaryBlue.x},
730 {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
731 metadata.smpte2086.displayPrimaryBlue.y},
732 {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
733 {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
734 {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
735 {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
736 }
737 if (metadata.validTypes & HdrMetadata::CTA861_3) {
738 composerMetadata.insert(composerMetadata.end(),
739 {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
740 metadata.cta8613.maxContentLightLevel},
741 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
742 metadata.cta8613.maxFrameAverageLightLevel}});
743 }
744
745 mWriter.setPerFrameMetadata(composerMetadata);
746 return Error::NONE;
747}
748
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800749Error Composer::setLayerDisplayFrame(Display display, Layer layer,
750 const IComposerClient::Rect& frame)
751{
752 mWriter.selectDisplay(display);
753 mWriter.selectLayer(layer);
754 mWriter.setLayerDisplayFrame(frame);
755 return Error::NONE;
756}
757
758Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
759 float alpha)
760{
761 mWriter.selectDisplay(display);
762 mWriter.selectLayer(layer);
763 mWriter.setLayerPlaneAlpha(alpha);
764 return Error::NONE;
765}
766
767Error Composer::setLayerSidebandStream(Display display, Layer layer,
768 const native_handle_t* stream)
769{
770 mWriter.selectDisplay(display);
771 mWriter.selectLayer(layer);
772 mWriter.setLayerSidebandStream(stream);
773 return Error::NONE;
774}
775
776Error Composer::setLayerSourceCrop(Display display, Layer layer,
777 const IComposerClient::FRect& crop)
778{
779 mWriter.selectDisplay(display);
780 mWriter.selectLayer(layer);
781 mWriter.setLayerSourceCrop(crop);
782 return Error::NONE;
783}
784
785Error Composer::setLayerTransform(Display display, Layer layer,
786 Transform transform)
787{
788 mWriter.selectDisplay(display);
789 mWriter.selectLayer(layer);
790 mWriter.setLayerTransform(transform);
791 return Error::NONE;
792}
793
794Error Composer::setLayerVisibleRegion(Display display, Layer layer,
795 const std::vector<IComposerClient::Rect>& visible)
796{
797 mWriter.selectDisplay(display);
798 mWriter.selectLayer(layer);
799 mWriter.setLayerVisibleRegion(visible);
800 return Error::NONE;
801}
802
803Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
804{
805 mWriter.selectDisplay(display);
806 mWriter.selectLayer(layer);
807 mWriter.setLayerZOrder(z);
808 return Error::NONE;
809}
810
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500811Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
812 uint32_t appId)
813{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800814 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500815 mWriter.selectDisplay(display);
816 mWriter.selectLayer(layer);
817 mWriter.setLayerInfo(type, appId);
818 }
819 return Error::NONE;
820}
821
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800822Error Composer::execute()
823{
824 // prepare input command queue
825 bool queueChanged = false;
826 uint32_t commandLength = 0;
827 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800828 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800829 mWriter.reset();
830 return Error::NO_RESOURCES;
831 }
832
833 // set up new input command queue if necessary
834 if (queueChanged) {
835 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
836 auto error = unwrapRet(ret);
837 if (error != Error::NONE) {
838 mWriter.reset();
839 return error;
840 }
841 }
842
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700843 if (commandLength == 0) {
844 mWriter.reset();
845 return Error::NONE;
846 }
847
Chia-I Wuaab99f52016-10-05 12:59:58 +0800848 Error error = kDefaultError;
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700849 auto ret = mClient->executeCommands(commandLength, commandHandles,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800850 [&](const auto& tmpError, const auto& tmpOutChanged,
851 const auto& tmpOutLength, const auto& tmpOutHandles)
852 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800853 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800854
855 // set up new output command queue if necessary
856 if (error == Error::NONE && tmpOutChanged) {
857 error = kDefaultError;
858 mClient->getOutputCommandQueue(
859 [&](const auto& tmpError,
860 const auto& tmpDescriptor)
861 {
862 error = tmpError;
863 if (error != Error::NONE) {
864 return;
865 }
866
867 mReader.setMQDescriptor(tmpDescriptor);
868 });
869 }
870
Chia-I Wuaab99f52016-10-05 12:59:58 +0800871 if (error != Error::NONE) {
872 return;
873 }
874
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800875 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
876 error = mReader.parse();
877 mReader.reset();
878 } else {
879 error = Error::NO_RESOURCES;
880 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800881 });
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700882 // executeCommands can fail because of out-of-fd and we do not want to
883 // abort() in that case
884 if (!ret.isOk()) {
885 ALOGE("executeCommands failed because of %s", ret.description().c_str());
886 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800887
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800888 if (error == Error::NONE) {
889 std::vector<CommandReader::CommandError> commandErrors =
890 mReader.takeErrors();
891
892 for (const auto& cmdErr : commandErrors) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700893 auto command =
894 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800895
896 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700897 command == IComposerClient::Command::PRESENT_DISPLAY ||
898 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800899 error = cmdErr.error;
900 } else {
901 ALOGW("command 0x%x generated error %d",
902 command, cmdErr.error);
903 }
904 }
905 }
906
907 mWriter.reset();
908
Chia-I Wuaab99f52016-10-05 12:59:58 +0800909 return error;
910}
911
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800912CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800913{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800914 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800915}
916
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800917Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800918{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800919 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800920
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800921 IComposerClient::Command command;
922 uint16_t length = 0;
923
924 while (!isEmpty()) {
Courtney Goeltzenleuchterf9c98e52018-02-12 07:23:17 -0700925 auto command_2_1 =
926 reinterpret_cast<hardware::graphics::composer::V2_1::IComposerClient::Command*>(
927 &command);
928 if (!beginCommand(command_2_1, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800929 break;
930 }
931
932 bool parsed = false;
933 switch (command) {
934 case IComposerClient::Command::SELECT_DISPLAY:
935 parsed = parseSelectDisplay(length);
936 break;
937 case IComposerClient::Command::SET_ERROR:
938 parsed = parseSetError(length);
939 break;
940 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
941 parsed = parseSetChangedCompositionTypes(length);
942 break;
943 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
944 parsed = parseSetDisplayRequests(length);
945 break;
946 case IComposerClient::Command::SET_PRESENT_FENCE:
947 parsed = parseSetPresentFence(length);
948 break;
949 case IComposerClient::Command::SET_RELEASE_FENCES:
950 parsed = parseSetReleaseFences(length);
951 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700952 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
953 parsed = parseSetPresentOrValidateDisplayResult(length);
954 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800955 default:
956 parsed = false;
957 break;
958 }
959
960 endCommand();
961
962 if (!parsed) {
963 ALOGE("failed to parse command 0x%x length %" PRIu16,
964 command, length);
965 break;
966 }
967 }
968
969 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800970}
971
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800972bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800973{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500974 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800975 return false;
976 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800977
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800978 mCurrentReturnData = &mReturnData[read64()];
979
980 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800981}
982
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800983bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800984{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500985 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800986 return false;
987 }
988
989 auto location = read();
990 auto error = static_cast<Error>(readSigned());
991
992 mErrors.emplace_back(CommandError{location, error});
993
994 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800995}
996
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800997bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800998{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800999 // (layer id, composition type) pairs
1000 if (length % 3 != 0 || !mCurrentReturnData) {
1001 return false;
1002 }
1003
1004 uint32_t count = length / 3;
1005 mCurrentReturnData->changedLayers.reserve(count);
1006 mCurrentReturnData->compositionTypes.reserve(count);
1007 while (count > 0) {
1008 auto layer = read64();
1009 auto type = static_cast<IComposerClient::Composition>(readSigned());
1010
1011 mCurrentReturnData->changedLayers.push_back(layer);
1012 mCurrentReturnData->compositionTypes.push_back(type);
1013
1014 count--;
1015 }
1016
1017 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001018}
1019
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001020bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001021{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001022 // display requests followed by (layer id, layer requests) pairs
1023 if (length % 3 != 1 || !mCurrentReturnData) {
1024 return false;
1025 }
1026
1027 mCurrentReturnData->displayRequests = read();
1028
1029 uint32_t count = (length - 1) / 3;
1030 mCurrentReturnData->requestedLayers.reserve(count);
1031 mCurrentReturnData->requestMasks.reserve(count);
1032 while (count > 0) {
1033 auto layer = read64();
1034 auto layerRequestMask = read();
1035
1036 mCurrentReturnData->requestedLayers.push_back(layer);
1037 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1038
1039 count--;
1040 }
1041
1042 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001043}
1044
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001045bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001046{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -05001047 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001048 !mCurrentReturnData) {
1049 return false;
1050 }
1051
1052 if (mCurrentReturnData->presentFence >= 0) {
1053 close(mCurrentReturnData->presentFence);
1054 }
1055 mCurrentReturnData->presentFence = readFence();
1056
1057 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001058}
1059
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001060bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001061{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001062 // (layer id, release fence index) pairs
1063 if (length % 3 != 0 || !mCurrentReturnData) {
1064 return false;
1065 }
1066
1067 uint32_t count = length / 3;
1068 mCurrentReturnData->releasedLayers.reserve(count);
1069 mCurrentReturnData->releaseFences.reserve(count);
1070 while (count > 0) {
1071 auto layer = read64();
1072 auto fence = readFence();
1073
1074 mCurrentReturnData->releasedLayers.push_back(layer);
1075 mCurrentReturnData->releaseFences.push_back(fence);
1076
1077 count--;
1078 }
1079
1080 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001081}
1082
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001083bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1084{
1085 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1086 return false;
1087 }
1088 mCurrentReturnData->presentOrValidateState = read();
1089 return true;
1090}
1091
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001092void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001093{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001094 mErrors.clear();
1095
1096 for (auto& data : mReturnData) {
1097 if (data.second.presentFence >= 0) {
1098 close(data.second.presentFence);
1099 }
1100 for (auto fence : data.second.releaseFences) {
1101 if (fence >= 0) {
1102 close(fence);
1103 }
1104 }
1105 }
1106
1107 mReturnData.clear();
1108 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001109}
1110
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001111std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001112{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001113 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001114}
1115
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001116bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001117 uint32_t* outNumChangedCompositionTypes,
1118 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001119{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001120 auto found = mReturnData.find(display);
1121 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001122 *outNumChangedCompositionTypes = 0;
1123 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001124 return false;
1125 }
1126
1127 const ReturnData& data = found->second;
1128
Chia-I Wu67e376d2016-12-19 11:36:22 +08001129 *outNumChangedCompositionTypes = data.compositionTypes.size();
1130 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001131
1132 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001133}
1134
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001135void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001136 std::vector<Layer>* outLayers,
1137 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001138{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001139 auto found = mReturnData.find(display);
1140 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001141 outLayers->clear();
1142 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001143 return;
1144 }
1145
1146 ReturnData& data = found->second;
1147
Chia-I Wu67e376d2016-12-19 11:36:22 +08001148 *outLayers = std::move(data.changedLayers);
1149 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001150}
1151
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001152void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001153 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1154 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001155{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001156 auto found = mReturnData.find(display);
1157 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001158 *outDisplayRequestMask = 0;
1159 outLayers->clear();
1160 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001161 return;
1162 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001163
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001164 ReturnData& data = found->second;
1165
Chia-I Wu67e376d2016-12-19 11:36:22 +08001166 *outDisplayRequestMask = data.displayRequests;
1167 *outLayers = std::move(data.requestedLayers);
1168 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001169}
1170
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001171void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001172 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001173{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001174 auto found = mReturnData.find(display);
1175 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001176 outLayers->clear();
1177 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001178 return;
1179 }
1180
1181 ReturnData& data = found->second;
1182
Chia-I Wu67e376d2016-12-19 11:36:22 +08001183 *outLayers = std::move(data.releasedLayers);
1184 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001185}
1186
Chia-I Wu67e376d2016-12-19 11:36:22 +08001187void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001188{
1189 auto found = mReturnData.find(display);
1190 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001191 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001192 return;
1193 }
1194
1195 ReturnData& data = found->second;
1196
Chia-I Wu67e376d2016-12-19 11:36:22 +08001197 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001198 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001199}
1200
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001201void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1202 auto found = mReturnData.find(display);
1203 if (found == mReturnData.end()) {
1204 *state= -1;
1205 return;
1206 }
1207 ReturnData& data = found->second;
1208 *state = data.presentOrValidateState;
1209}
1210
Lloyd Piquea822d522017-12-20 16:42:57 -08001211} // namespace impl
1212
Chia-I Wuaab99f52016-10-05 12:59:58 +08001213} // namespace Hwc2
1214
1215} // namespace android