blob: 433a224e25ca084593373a2abee40be1b195a92b [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>
Chia-I Wu06d63de2017-01-04 14:58:51 +080022#include <gui/BufferQueue.h>
Chia-I Wuaab99f52016-10-05 12:59:58 +080023
24#include "ComposerHal.h"
25
26namespace android {
27
28using hardware::Return;
29using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010030using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080031
32namespace Hwc2 {
33
34namespace {
35
36class BufferHandle {
37public:
38 BufferHandle(const native_handle_t* buffer)
39 {
40 // nullptr is not a valid handle to HIDL
41 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
42 }
43
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010044 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080045 {
46 return mHandle;
47 }
48
49private:
50 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010051 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080052};
53
54class FenceHandle
55{
56public:
57 FenceHandle(int fd, bool owned)
58 : mOwned(owned)
59 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010060 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080061 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010062 handle = native_handle_init(mStorage, 1, 0);
63 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080064 } else {
65 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010066 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080067 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010068 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 }
70
71 ~FenceHandle()
72 {
73 if (mOwned) {
74 native_handle_close(mHandle);
75 }
76 }
77
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010078 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080079 {
80 return mHandle;
81 }
82
83private:
84 bool mOwned;
85 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010086 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080087};
88
89// assume NO_RESOURCES when Status::isOk returns false
90constexpr Error kDefaultError = Error::NO_RESOURCES;
91
92template<typename T, typename U>
93T unwrapRet(Return<T>& ret, const U& default_val)
94{
Steven Moreland9d021002017-01-03 17:10:54 -080095 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +080096 static_cast<T>(default_val);
97}
98
99Error unwrapRet(Return<Error>& ret)
100{
101 return unwrapRet(ret, kDefaultError);
102}
103
Chia-I Wuaab99f52016-10-05 12:59:58 +0800104} // anonymous namespace
105
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500106Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
107 : CommandWriterBase(initialMaxSize) {}
108
109Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800110{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500111}
112
113void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
114{
115 constexpr uint16_t kSetLayerInfoLength = 2;
116 beginCommand(
117 static_cast<IComposerClient::Command>(
118 IVrComposerClient::VrCommand::SET_LAYER_INFO),
119 kSetLayerInfoLength);
120 write(type);
121 write(appId);
122 endCommand();
123}
124
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400125void Composer::CommandWriter::setClientTargetMetadata(
126 const IVrComposerClient::BufferMetadata& metadata)
127{
128 constexpr uint16_t kSetClientTargetMetadataLength = 7;
129 beginCommand(
130 static_cast<IComposerClient::Command>(
131 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
132 kSetClientTargetMetadataLength);
133 writeBufferMetadata(metadata);
134 endCommand();
135}
136
137void Composer::CommandWriter::setLayerBufferMetadata(
138 const IVrComposerClient::BufferMetadata& metadata)
139{
140 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
141 beginCommand(
142 static_cast<IComposerClient::Command>(
143 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
144 kSetLayerBufferMetadataLength);
145 writeBufferMetadata(metadata);
146 endCommand();
147}
148
149void Composer::CommandWriter::writeBufferMetadata(
150 const IVrComposerClient::BufferMetadata& metadata)
151{
152 write(metadata.width);
153 write(metadata.height);
154 write(metadata.stride);
155 write(metadata.layerCount);
156 writeSigned(static_cast<int32_t>(metadata.format));
157 write64(metadata.usage);
158}
159
Kalle Raitaa099a242017-01-11 11:17:29 -0800160Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800161 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800162 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500163{
Kalle Raitaa099a242017-01-11 11:17:29 -0800164 mComposer = IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500165
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800166 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800167 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
168 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800169
170 mComposer->createClient(
171 [&](const auto& tmpError, const auto& tmpClient)
172 {
173 if (tmpError == Error::NONE) {
174 mClient = tmpClient;
175 }
176 });
177 if (mClient == nullptr) {
178 LOG_ALWAYS_FATAL("failed to create composer client");
179 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400180
181 if (mIsUsingVrComposer) {
182 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
183 if (vrClient == nullptr) {
184 LOG_ALWAYS_FATAL("failed to create vr composer client");
185 }
186 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800187}
188
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800189std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800190{
191 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800192 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800193 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800194 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800195 });
196
197 return capabilities;
198}
199
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800200std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800201{
202 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800203 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800204 info = tmpInfo.c_str();
205 });
206
207 return info;
208}
209
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800212 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800213 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214 ALOGE("failed to register IComposerCallback");
215 }
216}
217
Steven Thomasb02664d2017-07-26 18:48:28 -0700218bool Composer::isRemote() {
219 return mClient->isRemote();
220}
221
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700222void Composer::resetCommands() {
223 mWriter.reset();
224}
225
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800226uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800228 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800229 return unwrapRet(ret, 0);
230}
231
232Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800233 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800234{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800235 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800236 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800237 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800238 [&](const auto& tmpError, const auto& tmpDisplay,
239 const auto& tmpFormat) {
240 error = tmpError;
241 if (error != Error::NONE) {
242 return;
243 }
244
Chia-I Wu67e376d2016-12-19 11:36:22 +0800245 *outDisplay = tmpDisplay;
246 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800247 });
248
249 return error;
250}
251
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800252Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800253{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800254 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800255 return unwrapRet(ret);
256}
257
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800258Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800260 mWriter.selectDisplay(display);
261 mWriter.acceptDisplayChanges();
262 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800263}
264
Chia-I Wu67e376d2016-12-19 11:36:22 +0800265Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800266{
267 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800268 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800269 [&](const auto& tmpError, const auto& tmpLayer) {
270 error = tmpError;
271 if (error != Error::NONE) {
272 return;
273 }
274
Chia-I Wu67e376d2016-12-19 11:36:22 +0800275 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800276 });
277
278 return error;
279}
280
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800281Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800282{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800283 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800284 return unwrapRet(ret);
285}
286
Chia-I Wu67e376d2016-12-19 11:36:22 +0800287Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288{
289 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800290 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291 [&](const auto& tmpError, const auto& tmpConfig) {
292 error = tmpError;
293 if (error != Error::NONE) {
294 return;
295 }
296
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298 });
299
300 return error;
301}
302
303Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800304 std::vector<Layer>* outLayers,
305 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800307 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800308 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309}
310
311Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800312 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313{
314 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800315 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316 [&](const auto& tmpError, const auto& tmpModes) {
317 error = tmpError;
318 if (error != Error::NONE) {
319 return;
320 }
321
Chia-I Wu67e376d2016-12-19 11:36:22 +0800322 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323 });
324
325 return error;
326}
327
328Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800329 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800330{
331 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800332 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800333 [&](const auto& tmpError, const auto& tmpValue) {
334 error = tmpError;
335 if (error != Error::NONE) {
336 return;
337 }
338
Chia-I Wu67e376d2016-12-19 11:36:22 +0800339 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800340 });
341
342 return error;
343}
344
345Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800346 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347{
348 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800349 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350 [&](const auto& tmpError, const auto& tmpConfigs) {
351 error = tmpError;
352 if (error != Error::NONE) {
353 return;
354 }
355
Chia-I Wu67e376d2016-12-19 11:36:22 +0800356 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357 });
358
359 return error;
360}
361
Chia-I Wu67e376d2016-12-19 11:36:22 +0800362Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800363{
364 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800365 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800366 [&](const auto& tmpError, const auto& tmpName) {
367 error = tmpError;
368 if (error != Error::NONE) {
369 return;
370 }
371
Chia-I Wu67e376d2016-12-19 11:36:22 +0800372 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800373 });
374
375 return error;
376}
377
378Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800379 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
380 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800381{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800382 mReader.takeDisplayRequests(display, outDisplayRequestMask,
383 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800384 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385}
386
Chia-I Wu67e376d2016-12-19 11:36:22 +0800387Error Composer::getDisplayType(Display display,
388 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800389{
390 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800391 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800392 [&](const auto& tmpError, const auto& tmpType) {
393 error = tmpError;
394 if (error != Error::NONE) {
395 return;
396 }
397
Chia-I Wu67e376d2016-12-19 11:36:22 +0800398 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800399 });
400
401 return error;
402}
403
Chia-I Wu67e376d2016-12-19 11:36:22 +0800404Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800405{
406 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800407 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800408 [&](const auto& tmpError, const auto& tmpSupport) {
409 error = tmpError;
410 if (error != Error::NONE) {
411 return;
412 }
413
Chia-I Wu67e376d2016-12-19 11:36:22 +0800414 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800415 });
416
417 return error;
418}
419
Chia-I Wu67e376d2016-12-19 11:36:22 +0800420Error Composer::getHdrCapabilities(Display display,
421 std::vector<Hdr>* outTypes, float* outMaxLuminance,
422 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800423{
424 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800425 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800426 [&](const auto& tmpError, const auto& tmpTypes,
427 const auto& tmpMaxLuminance,
428 const auto& tmpMaxAverageLuminance,
429 const auto& tmpMinLuminance) {
430 error = tmpError;
431 if (error != Error::NONE) {
432 return;
433 }
434
Chia-I Wu67e376d2016-12-19 11:36:22 +0800435 *outTypes = tmpTypes;
436 *outMaxLuminance = tmpMaxLuminance;
437 *outMaxAverageLuminance = tmpMaxAverageLuminance;
438 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800439 });
440
441 return error;
442}
443
Chia-I Wu67e376d2016-12-19 11:36:22 +0800444Error Composer::getReleaseFences(Display display,
445 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800446{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800447 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800448 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449}
450
Chia-I Wu67e376d2016-12-19 11:36:22 +0800451Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800452{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800453 mWriter.selectDisplay(display);
454 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800455
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800456 Error error = execute();
457 if (error != Error::NONE) {
458 return error;
459 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800460
Chia-I Wu67e376d2016-12-19 11:36:22 +0800461 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800462
463 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464}
465
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800466Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800467{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800468 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469 return unwrapRet(ret);
470}
471
Chia-I Wu06d63de2017-01-04 14:58:51 +0800472Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400473 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800474 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800475 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800476{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800477 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400478 if (mIsUsingVrComposer && target.get()) {
479 IVrComposerClient::BufferMetadata metadata = {
480 .width = target->getWidth(),
481 .height = target->getHeight(),
482 .stride = target->getStride(),
483 .layerCount = target->getLayerCount(),
484 .format = static_cast<PixelFormat>(target->getPixelFormat()),
485 .usage = target->getUsage(),
486 };
487 mWriter.setClientTargetMetadata(metadata);
488 }
489
490 const native_handle_t* handle = nullptr;
491 if (target.get()) {
492 handle = target->getNativeBuffer()->handle;
493 }
494
495 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800496 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800497}
498
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800499Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800500{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800501 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800502 return unwrapRet(ret);
503}
504
505Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800506 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800508 mWriter.selectDisplay(display);
509 mWriter.setColorTransform(matrix, hint);
510 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800511}
512
513Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800514 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800515{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800516 mWriter.selectDisplay(display);
517 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
518 return Error::NONE;
519}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800520
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800521Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
522{
523 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800524 return unwrapRet(ret);
525}
526
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800527Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800528{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800529 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800530 return unwrapRet(ret);
531}
532
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800533Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800535 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800536 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800537 return unwrapRet(ret);
538}
539
Chia-I Wu67e376d2016-12-19 11:36:22 +0800540Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
541 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800542{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800543 mWriter.selectDisplay(display);
544 mWriter.validateDisplay();
545
546 Error error = execute();
547 if (error != Error::NONE) {
548 return error;
549 }
550
Chia-I Wu67e376d2016-12-19 11:36:22 +0800551 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800552
553 return Error::NONE;
554}
555
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700556Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
557 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
558 mWriter.selectDisplay(display);
559 mWriter.presentOrvalidateDisplay();
560
561 Error error = execute();
562 if (error != Error::NONE) {
563 return error;
564 }
565
566 mReader.takePresentOrValidateStage(display, state);
567
568 if (*state == 1) { // Present succeeded
569 mReader.takePresentFence(display, outPresentFence);
570 }
571
572 if (*state == 0) { // Validate succeeded.
573 mReader.hasChanges(display, outNumTypes, outNumRequests);
574 }
575
576 return Error::NONE;
577}
578
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800579Error Composer::setCursorPosition(Display display, Layer layer,
580 int32_t x, int32_t y)
581{
582 mWriter.selectDisplay(display);
583 mWriter.selectLayer(layer);
584 mWriter.setLayerCursorPosition(x, y);
585 return Error::NONE;
586}
587
588Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400589 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800590{
591 mWriter.selectDisplay(display);
592 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400593 if (mIsUsingVrComposer && buffer.get()) {
594 IVrComposerClient::BufferMetadata metadata = {
595 .width = buffer->getWidth(),
596 .height = buffer->getHeight(),
597 .stride = buffer->getStride(),
598 .layerCount = buffer->getLayerCount(),
599 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
600 .usage = buffer->getUsage(),
601 };
602 mWriter.setLayerBufferMetadata(metadata);
603 }
604
605 const native_handle_t* handle = nullptr;
606 if (buffer.get()) {
607 handle = buffer->getNativeBuffer()->handle;
608 }
609
610 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800611 return Error::NONE;
612}
613
614Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
615 const std::vector<IComposerClient::Rect>& damage)
616{
617 mWriter.selectDisplay(display);
618 mWriter.selectLayer(layer);
619 mWriter.setLayerSurfaceDamage(damage);
620 return Error::NONE;
621}
622
623Error Composer::setLayerBlendMode(Display display, Layer layer,
624 IComposerClient::BlendMode mode)
625{
626 mWriter.selectDisplay(display);
627 mWriter.selectLayer(layer);
628 mWriter.setLayerBlendMode(mode);
629 return Error::NONE;
630}
631
632Error Composer::setLayerColor(Display display, Layer layer,
633 const IComposerClient::Color& color)
634{
635 mWriter.selectDisplay(display);
636 mWriter.selectLayer(layer);
637 mWriter.setLayerColor(color);
638 return Error::NONE;
639}
640
641Error Composer::setLayerCompositionType(Display display, Layer layer,
642 IComposerClient::Composition type)
643{
644 mWriter.selectDisplay(display);
645 mWriter.selectLayer(layer);
646 mWriter.setLayerCompositionType(type);
647 return Error::NONE;
648}
649
650Error Composer::setLayerDataspace(Display display, Layer layer,
651 Dataspace dataspace)
652{
653 mWriter.selectDisplay(display);
654 mWriter.selectLayer(layer);
655 mWriter.setLayerDataspace(dataspace);
656 return Error::NONE;
657}
658
659Error Composer::setLayerDisplayFrame(Display display, Layer layer,
660 const IComposerClient::Rect& frame)
661{
662 mWriter.selectDisplay(display);
663 mWriter.selectLayer(layer);
664 mWriter.setLayerDisplayFrame(frame);
665 return Error::NONE;
666}
667
668Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
669 float alpha)
670{
671 mWriter.selectDisplay(display);
672 mWriter.selectLayer(layer);
673 mWriter.setLayerPlaneAlpha(alpha);
674 return Error::NONE;
675}
676
677Error Composer::setLayerSidebandStream(Display display, Layer layer,
678 const native_handle_t* stream)
679{
680 mWriter.selectDisplay(display);
681 mWriter.selectLayer(layer);
682 mWriter.setLayerSidebandStream(stream);
683 return Error::NONE;
684}
685
686Error Composer::setLayerSourceCrop(Display display, Layer layer,
687 const IComposerClient::FRect& crop)
688{
689 mWriter.selectDisplay(display);
690 mWriter.selectLayer(layer);
691 mWriter.setLayerSourceCrop(crop);
692 return Error::NONE;
693}
694
695Error Composer::setLayerTransform(Display display, Layer layer,
696 Transform transform)
697{
698 mWriter.selectDisplay(display);
699 mWriter.selectLayer(layer);
700 mWriter.setLayerTransform(transform);
701 return Error::NONE;
702}
703
704Error Composer::setLayerVisibleRegion(Display display, Layer layer,
705 const std::vector<IComposerClient::Rect>& visible)
706{
707 mWriter.selectDisplay(display);
708 mWriter.selectLayer(layer);
709 mWriter.setLayerVisibleRegion(visible);
710 return Error::NONE;
711}
712
713Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
714{
715 mWriter.selectDisplay(display);
716 mWriter.selectLayer(layer);
717 mWriter.setLayerZOrder(z);
718 return Error::NONE;
719}
720
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500721Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
722 uint32_t appId)
723{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800724 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500725 mWriter.selectDisplay(display);
726 mWriter.selectLayer(layer);
727 mWriter.setLayerInfo(type, appId);
728 }
729 return Error::NONE;
730}
731
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800732Error Composer::execute()
733{
734 // prepare input command queue
735 bool queueChanged = false;
736 uint32_t commandLength = 0;
737 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800738 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800739 mWriter.reset();
740 return Error::NO_RESOURCES;
741 }
742
743 // set up new input command queue if necessary
744 if (queueChanged) {
745 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
746 auto error = unwrapRet(ret);
747 if (error != Error::NONE) {
748 mWriter.reset();
749 return error;
750 }
751 }
752
Chia-I Wuaab99f52016-10-05 12:59:58 +0800753 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800754 mClient->executeCommands(commandLength, commandHandles,
755 [&](const auto& tmpError, const auto& tmpOutChanged,
756 const auto& tmpOutLength, const auto& tmpOutHandles)
757 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800758 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800759
760 // set up new output command queue if necessary
761 if (error == Error::NONE && tmpOutChanged) {
762 error = kDefaultError;
763 mClient->getOutputCommandQueue(
764 [&](const auto& tmpError,
765 const auto& tmpDescriptor)
766 {
767 error = tmpError;
768 if (error != Error::NONE) {
769 return;
770 }
771
772 mReader.setMQDescriptor(tmpDescriptor);
773 });
774 }
775
Chia-I Wuaab99f52016-10-05 12:59:58 +0800776 if (error != Error::NONE) {
777 return;
778 }
779
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800780 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
781 error = mReader.parse();
782 mReader.reset();
783 } else {
784 error = Error::NO_RESOURCES;
785 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800786 });
787
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800788 if (error == Error::NONE) {
789 std::vector<CommandReader::CommandError> commandErrors =
790 mReader.takeErrors();
791
792 for (const auto& cmdErr : commandErrors) {
793 auto command = mWriter.getCommand(cmdErr.location);
794
795 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700796 command == IComposerClient::Command::PRESENT_DISPLAY ||
797 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800798 error = cmdErr.error;
799 } else {
800 ALOGW("command 0x%x generated error %d",
801 command, cmdErr.error);
802 }
803 }
804 }
805
806 mWriter.reset();
807
Chia-I Wuaab99f52016-10-05 12:59:58 +0800808 return error;
809}
810
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800811CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800812{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800813 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800814}
815
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800816Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800817{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800818 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800819
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800820 IComposerClient::Command command;
821 uint16_t length = 0;
822
823 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800824 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800825 break;
826 }
827
828 bool parsed = false;
829 switch (command) {
830 case IComposerClient::Command::SELECT_DISPLAY:
831 parsed = parseSelectDisplay(length);
832 break;
833 case IComposerClient::Command::SET_ERROR:
834 parsed = parseSetError(length);
835 break;
836 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
837 parsed = parseSetChangedCompositionTypes(length);
838 break;
839 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
840 parsed = parseSetDisplayRequests(length);
841 break;
842 case IComposerClient::Command::SET_PRESENT_FENCE:
843 parsed = parseSetPresentFence(length);
844 break;
845 case IComposerClient::Command::SET_RELEASE_FENCES:
846 parsed = parseSetReleaseFences(length);
847 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700848 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
849 parsed = parseSetPresentOrValidateDisplayResult(length);
850 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800851 default:
852 parsed = false;
853 break;
854 }
855
856 endCommand();
857
858 if (!parsed) {
859 ALOGE("failed to parse command 0x%x length %" PRIu16,
860 command, length);
861 break;
862 }
863 }
864
865 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800866}
867
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800868bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800869{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500870 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800871 return false;
872 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800873
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800874 mCurrentReturnData = &mReturnData[read64()];
875
876 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800877}
878
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800879bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800880{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500881 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800882 return false;
883 }
884
885 auto location = read();
886 auto error = static_cast<Error>(readSigned());
887
888 mErrors.emplace_back(CommandError{location, error});
889
890 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800891}
892
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800893bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800894{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800895 // (layer id, composition type) pairs
896 if (length % 3 != 0 || !mCurrentReturnData) {
897 return false;
898 }
899
900 uint32_t count = length / 3;
901 mCurrentReturnData->changedLayers.reserve(count);
902 mCurrentReturnData->compositionTypes.reserve(count);
903 while (count > 0) {
904 auto layer = read64();
905 auto type = static_cast<IComposerClient::Composition>(readSigned());
906
907 mCurrentReturnData->changedLayers.push_back(layer);
908 mCurrentReturnData->compositionTypes.push_back(type);
909
910 count--;
911 }
912
913 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800914}
915
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800916bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800917{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918 // display requests followed by (layer id, layer requests) pairs
919 if (length % 3 != 1 || !mCurrentReturnData) {
920 return false;
921 }
922
923 mCurrentReturnData->displayRequests = read();
924
925 uint32_t count = (length - 1) / 3;
926 mCurrentReturnData->requestedLayers.reserve(count);
927 mCurrentReturnData->requestMasks.reserve(count);
928 while (count > 0) {
929 auto layer = read64();
930 auto layerRequestMask = read();
931
932 mCurrentReturnData->requestedLayers.push_back(layer);
933 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
934
935 count--;
936 }
937
938 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800939}
940
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800941bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800942{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500943 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800944 !mCurrentReturnData) {
945 return false;
946 }
947
948 if (mCurrentReturnData->presentFence >= 0) {
949 close(mCurrentReturnData->presentFence);
950 }
951 mCurrentReturnData->presentFence = readFence();
952
953 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800954}
955
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800956bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800957{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800958 // (layer id, release fence index) pairs
959 if (length % 3 != 0 || !mCurrentReturnData) {
960 return false;
961 }
962
963 uint32_t count = length / 3;
964 mCurrentReturnData->releasedLayers.reserve(count);
965 mCurrentReturnData->releaseFences.reserve(count);
966 while (count > 0) {
967 auto layer = read64();
968 auto fence = readFence();
969
970 mCurrentReturnData->releasedLayers.push_back(layer);
971 mCurrentReturnData->releaseFences.push_back(fence);
972
973 count--;
974 }
975
976 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800977}
978
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700979bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
980{
981 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
982 return false;
983 }
984 mCurrentReturnData->presentOrValidateState = read();
985 return true;
986}
987
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800988void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800989{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800990 mErrors.clear();
991
992 for (auto& data : mReturnData) {
993 if (data.second.presentFence >= 0) {
994 close(data.second.presentFence);
995 }
996 for (auto fence : data.second.releaseFences) {
997 if (fence >= 0) {
998 close(fence);
999 }
1000 }
1001 }
1002
1003 mReturnData.clear();
1004 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001005}
1006
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001007std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001008{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001009 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001010}
1011
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001012bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001013 uint32_t* outNumChangedCompositionTypes,
1014 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001015{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001016 auto found = mReturnData.find(display);
1017 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001018 *outNumChangedCompositionTypes = 0;
1019 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001020 return false;
1021 }
1022
1023 const ReturnData& data = found->second;
1024
Chia-I Wu67e376d2016-12-19 11:36:22 +08001025 *outNumChangedCompositionTypes = data.compositionTypes.size();
1026 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001027
1028 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001029}
1030
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001031void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001032 std::vector<Layer>* outLayers,
1033 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001034{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001035 auto found = mReturnData.find(display);
1036 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001037 outLayers->clear();
1038 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001039 return;
1040 }
1041
1042 ReturnData& data = found->second;
1043
Chia-I Wu67e376d2016-12-19 11:36:22 +08001044 *outLayers = std::move(data.changedLayers);
1045 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001046}
1047
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001048void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001049 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1050 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001051{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001052 auto found = mReturnData.find(display);
1053 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001054 *outDisplayRequestMask = 0;
1055 outLayers->clear();
1056 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001057 return;
1058 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001059
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001060 ReturnData& data = found->second;
1061
Chia-I Wu67e376d2016-12-19 11:36:22 +08001062 *outDisplayRequestMask = data.displayRequests;
1063 *outLayers = std::move(data.requestedLayers);
1064 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001065}
1066
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001067void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001068 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001069{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001070 auto found = mReturnData.find(display);
1071 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001072 outLayers->clear();
1073 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001074 return;
1075 }
1076
1077 ReturnData& data = found->second;
1078
Chia-I Wu67e376d2016-12-19 11:36:22 +08001079 *outLayers = std::move(data.releasedLayers);
1080 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001081}
1082
Chia-I Wu67e376d2016-12-19 11:36:22 +08001083void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001084{
1085 auto found = mReturnData.find(display);
1086 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001087 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001088 return;
1089 }
1090
1091 ReturnData& data = found->second;
1092
Chia-I Wu67e376d2016-12-19 11:36:22 +08001093 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001094 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001095}
1096
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001097void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1098 auto found = mReturnData.find(display);
1099 if (found == mReturnData.end()) {
1100 *state= -1;
1101 return;
1102 }
1103 ReturnData& data = found->second;
1104 *state = data.presentOrValidateState;
1105}
1106
Chia-I Wuaab99f52016-10-05 12:59:58 +08001107} // namespace Hwc2
1108
1109} // namespace android