blob: 439adc47290deb55c35560d5d9b944499f5979ee [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
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800160Composer::Composer(bool useVrComposer)
161 : mWriter(kWriterInitialSize),
162 mIsUsingVrComposer(useVrComposer)
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500163{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800164 if (mIsUsingVrComposer) {
Daniel Nicoarae96afe62017-03-24 15:15:50 -0400165 mComposer = IComposer::getService("vr");
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500166 } else {
Chris Phoenixf5eb5e62017-01-24 14:08:33 -0800167 mComposer = IComposer::getService(); // use default name
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500168 }
169
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800170 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800171 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
172 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800173
174 mComposer->createClient(
175 [&](const auto& tmpError, const auto& tmpClient)
176 {
177 if (tmpError == Error::NONE) {
178 mClient = tmpClient;
179 }
180 });
181 if (mClient == nullptr) {
182 LOG_ALWAYS_FATAL("failed to create composer client");
183 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800184}
185
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800186std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800187{
188 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800189 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800190 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800191 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800192 });
193
194 return capabilities;
195}
196
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800197std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800198{
199 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800200 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800201 info = tmpInfo.c_str();
202 });
203
204 return info;
205}
206
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800207void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800208{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800209 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800210 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211 ALOGE("failed to register IComposerCallback");
212 }
213}
214
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700215void Composer::resetCommands() {
216 mWriter.reset();
217}
218
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800219uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800220{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800221 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800222 return unwrapRet(ret, 0);
223}
224
225Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800226 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800228 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800229 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800230 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800231 [&](const auto& tmpError, const auto& tmpDisplay,
232 const auto& tmpFormat) {
233 error = tmpError;
234 if (error != Error::NONE) {
235 return;
236 }
237
Chia-I Wu67e376d2016-12-19 11:36:22 +0800238 *outDisplay = tmpDisplay;
239 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800240 });
241
242 return error;
243}
244
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800245Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800246{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800247 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248 return unwrapRet(ret);
249}
250
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800251Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800253 mWriter.selectDisplay(display);
254 mWriter.acceptDisplayChanges();
255 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800256}
257
Chia-I Wu67e376d2016-12-19 11:36:22 +0800258Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259{
260 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800261 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800262 [&](const auto& tmpError, const auto& tmpLayer) {
263 error = tmpError;
264 if (error != Error::NONE) {
265 return;
266 }
267
Chia-I Wu67e376d2016-12-19 11:36:22 +0800268 *outLayer = tmpLayer;
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::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800275{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800276 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277 return unwrapRet(ret);
278}
279
Chia-I Wu67e376d2016-12-19 11:36:22 +0800280Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800281{
282 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800283 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800284 [&](const auto& tmpError, const auto& tmpConfig) {
285 error = tmpError;
286 if (error != Error::NONE) {
287 return;
288 }
289
Chia-I Wu67e376d2016-12-19 11:36:22 +0800290 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291 });
292
293 return error;
294}
295
296Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297 std::vector<Layer>* outLayers,
298 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800299{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800300 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800301 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302}
303
304Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800305 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800306{
307 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800308 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309 [&](const auto& tmpError, const auto& tmpModes) {
310 error = tmpError;
311 if (error != Error::NONE) {
312 return;
313 }
314
Chia-I Wu67e376d2016-12-19 11:36:22 +0800315 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316 });
317
318 return error;
319}
320
321Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800322 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323{
324 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800325 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326 [&](const auto& tmpError, const auto& tmpValue) {
327 error = tmpError;
328 if (error != Error::NONE) {
329 return;
330 }
331
Chia-I Wu67e376d2016-12-19 11:36:22 +0800332 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800333 });
334
335 return error;
336}
337
338Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800339 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800340{
341 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800342 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800343 [&](const auto& tmpError, const auto& tmpConfigs) {
344 error = tmpError;
345 if (error != Error::NONE) {
346 return;
347 }
348
Chia-I Wu67e376d2016-12-19 11:36:22 +0800349 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350 });
351
352 return error;
353}
354
Chia-I Wu67e376d2016-12-19 11:36:22 +0800355Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800356{
357 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800358 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800359 [&](const auto& tmpError, const auto& tmpName) {
360 error = tmpError;
361 if (error != Error::NONE) {
362 return;
363 }
364
Chia-I Wu67e376d2016-12-19 11:36:22 +0800365 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800366 });
367
368 return error;
369}
370
371Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800372 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
373 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800374{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800375 mReader.takeDisplayRequests(display, outDisplayRequestMask,
376 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800377 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378}
379
Chia-I Wu67e376d2016-12-19 11:36:22 +0800380Error Composer::getDisplayType(Display display,
381 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800382{
383 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800384 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385 [&](const auto& tmpError, const auto& tmpType) {
386 error = tmpError;
387 if (error != Error::NONE) {
388 return;
389 }
390
Chia-I Wu67e376d2016-12-19 11:36:22 +0800391 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800392 });
393
394 return error;
395}
396
Chia-I Wu67e376d2016-12-19 11:36:22 +0800397Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800398{
399 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800400 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800401 [&](const auto& tmpError, const auto& tmpSupport) {
402 error = tmpError;
403 if (error != Error::NONE) {
404 return;
405 }
406
Chia-I Wu67e376d2016-12-19 11:36:22 +0800407 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800408 });
409
410 return error;
411}
412
Chia-I Wu67e376d2016-12-19 11:36:22 +0800413Error Composer::getHdrCapabilities(Display display,
414 std::vector<Hdr>* outTypes, float* outMaxLuminance,
415 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800416{
417 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800418 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419 [&](const auto& tmpError, const auto& tmpTypes,
420 const auto& tmpMaxLuminance,
421 const auto& tmpMaxAverageLuminance,
422 const auto& tmpMinLuminance) {
423 error = tmpError;
424 if (error != Error::NONE) {
425 return;
426 }
427
Chia-I Wu67e376d2016-12-19 11:36:22 +0800428 *outTypes = tmpTypes;
429 *outMaxLuminance = tmpMaxLuminance;
430 *outMaxAverageLuminance = tmpMaxAverageLuminance;
431 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800432 });
433
434 return error;
435}
436
Chia-I Wu67e376d2016-12-19 11:36:22 +0800437Error Composer::getReleaseFences(Display display,
438 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800439{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800440 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800441 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800442}
443
Chia-I Wu67e376d2016-12-19 11:36:22 +0800444Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800446 mWriter.selectDisplay(display);
447 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800448
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800449 Error error = execute();
450 if (error != Error::NONE) {
451 return error;
452 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453
Chia-I Wu67e376d2016-12-19 11:36:22 +0800454 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800455
456 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800457}
458
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800459Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800460{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800461 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800462 return unwrapRet(ret);
463}
464
Chia-I Wu06d63de2017-01-04 14:58:51 +0800465Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400466 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800467 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800468 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800469{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800470 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400471 if (mIsUsingVrComposer && target.get()) {
472 IVrComposerClient::BufferMetadata metadata = {
473 .width = target->getWidth(),
474 .height = target->getHeight(),
475 .stride = target->getStride(),
476 .layerCount = target->getLayerCount(),
477 .format = static_cast<PixelFormat>(target->getPixelFormat()),
478 .usage = target->getUsage(),
479 };
480 mWriter.setClientTargetMetadata(metadata);
481 }
482
483 const native_handle_t* handle = nullptr;
484 if (target.get()) {
485 handle = target->getNativeBuffer()->handle;
486 }
487
488 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800489 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800490}
491
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800492Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800493{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800494 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800495 return unwrapRet(ret);
496}
497
498Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800499 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800500{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800501 mWriter.selectDisplay(display);
502 mWriter.setColorTransform(matrix, hint);
503 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504}
505
506Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800507 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800508{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800509 mWriter.selectDisplay(display);
510 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
511 return Error::NONE;
512}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800513
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800514Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
515{
516 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517 return unwrapRet(ret);
518}
519
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800520Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800521{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800522 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800523 return unwrapRet(ret);
524}
525
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800526Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800527{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800528 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800529 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800530 return unwrapRet(ret);
531}
532
Chia-I Wu67e376d2016-12-19 11:36:22 +0800533Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
534 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800535{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800536 mWriter.selectDisplay(display);
537 mWriter.validateDisplay();
538
539 Error error = execute();
540 if (error != Error::NONE) {
541 return error;
542 }
543
Chia-I Wu67e376d2016-12-19 11:36:22 +0800544 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800545
546 return Error::NONE;
547}
548
549Error Composer::setCursorPosition(Display display, Layer layer,
550 int32_t x, int32_t y)
551{
552 mWriter.selectDisplay(display);
553 mWriter.selectLayer(layer);
554 mWriter.setLayerCursorPosition(x, y);
555 return Error::NONE;
556}
557
558Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400559 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800560{
561 mWriter.selectDisplay(display);
562 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400563 if (mIsUsingVrComposer && buffer.get()) {
564 IVrComposerClient::BufferMetadata metadata = {
565 .width = buffer->getWidth(),
566 .height = buffer->getHeight(),
567 .stride = buffer->getStride(),
568 .layerCount = buffer->getLayerCount(),
569 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
570 .usage = buffer->getUsage(),
571 };
572 mWriter.setLayerBufferMetadata(metadata);
573 }
574
575 const native_handle_t* handle = nullptr;
576 if (buffer.get()) {
577 handle = buffer->getNativeBuffer()->handle;
578 }
579
580 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800581 return Error::NONE;
582}
583
584Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
585 const std::vector<IComposerClient::Rect>& damage)
586{
587 mWriter.selectDisplay(display);
588 mWriter.selectLayer(layer);
589 mWriter.setLayerSurfaceDamage(damage);
590 return Error::NONE;
591}
592
593Error Composer::setLayerBlendMode(Display display, Layer layer,
594 IComposerClient::BlendMode mode)
595{
596 mWriter.selectDisplay(display);
597 mWriter.selectLayer(layer);
598 mWriter.setLayerBlendMode(mode);
599 return Error::NONE;
600}
601
602Error Composer::setLayerColor(Display display, Layer layer,
603 const IComposerClient::Color& color)
604{
605 mWriter.selectDisplay(display);
606 mWriter.selectLayer(layer);
607 mWriter.setLayerColor(color);
608 return Error::NONE;
609}
610
611Error Composer::setLayerCompositionType(Display display, Layer layer,
612 IComposerClient::Composition type)
613{
614 mWriter.selectDisplay(display);
615 mWriter.selectLayer(layer);
616 mWriter.setLayerCompositionType(type);
617 return Error::NONE;
618}
619
620Error Composer::setLayerDataspace(Display display, Layer layer,
621 Dataspace dataspace)
622{
623 mWriter.selectDisplay(display);
624 mWriter.selectLayer(layer);
625 mWriter.setLayerDataspace(dataspace);
626 return Error::NONE;
627}
628
629Error Composer::setLayerDisplayFrame(Display display, Layer layer,
630 const IComposerClient::Rect& frame)
631{
632 mWriter.selectDisplay(display);
633 mWriter.selectLayer(layer);
634 mWriter.setLayerDisplayFrame(frame);
635 return Error::NONE;
636}
637
638Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
639 float alpha)
640{
641 mWriter.selectDisplay(display);
642 mWriter.selectLayer(layer);
643 mWriter.setLayerPlaneAlpha(alpha);
644 return Error::NONE;
645}
646
647Error Composer::setLayerSidebandStream(Display display, Layer layer,
648 const native_handle_t* stream)
649{
650 mWriter.selectDisplay(display);
651 mWriter.selectLayer(layer);
652 mWriter.setLayerSidebandStream(stream);
653 return Error::NONE;
654}
655
656Error Composer::setLayerSourceCrop(Display display, Layer layer,
657 const IComposerClient::FRect& crop)
658{
659 mWriter.selectDisplay(display);
660 mWriter.selectLayer(layer);
661 mWriter.setLayerSourceCrop(crop);
662 return Error::NONE;
663}
664
665Error Composer::setLayerTransform(Display display, Layer layer,
666 Transform transform)
667{
668 mWriter.selectDisplay(display);
669 mWriter.selectLayer(layer);
670 mWriter.setLayerTransform(transform);
671 return Error::NONE;
672}
673
674Error Composer::setLayerVisibleRegion(Display display, Layer layer,
675 const std::vector<IComposerClient::Rect>& visible)
676{
677 mWriter.selectDisplay(display);
678 mWriter.selectLayer(layer);
679 mWriter.setLayerVisibleRegion(visible);
680 return Error::NONE;
681}
682
683Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
684{
685 mWriter.selectDisplay(display);
686 mWriter.selectLayer(layer);
687 mWriter.setLayerZOrder(z);
688 return Error::NONE;
689}
690
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500691Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
692 uint32_t appId)
693{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800694 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500695 mWriter.selectDisplay(display);
696 mWriter.selectLayer(layer);
697 mWriter.setLayerInfo(type, appId);
698 }
699 return Error::NONE;
700}
701
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800702Error Composer::execute()
703{
704 // prepare input command queue
705 bool queueChanged = false;
706 uint32_t commandLength = 0;
707 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800708 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800709 mWriter.reset();
710 return Error::NO_RESOURCES;
711 }
712
713 // set up new input command queue if necessary
714 if (queueChanged) {
715 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
716 auto error = unwrapRet(ret);
717 if (error != Error::NONE) {
718 mWriter.reset();
719 return error;
720 }
721 }
722
Chia-I Wuaab99f52016-10-05 12:59:58 +0800723 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800724 mClient->executeCommands(commandLength, commandHandles,
725 [&](const auto& tmpError, const auto& tmpOutChanged,
726 const auto& tmpOutLength, const auto& tmpOutHandles)
727 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800728 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800729
730 // set up new output command queue if necessary
731 if (error == Error::NONE && tmpOutChanged) {
732 error = kDefaultError;
733 mClient->getOutputCommandQueue(
734 [&](const auto& tmpError,
735 const auto& tmpDescriptor)
736 {
737 error = tmpError;
738 if (error != Error::NONE) {
739 return;
740 }
741
742 mReader.setMQDescriptor(tmpDescriptor);
743 });
744 }
745
Chia-I Wuaab99f52016-10-05 12:59:58 +0800746 if (error != Error::NONE) {
747 return;
748 }
749
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800750 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
751 error = mReader.parse();
752 mReader.reset();
753 } else {
754 error = Error::NO_RESOURCES;
755 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800756 });
757
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800758 if (error == Error::NONE) {
759 std::vector<CommandReader::CommandError> commandErrors =
760 mReader.takeErrors();
761
762 for (const auto& cmdErr : commandErrors) {
763 auto command = mWriter.getCommand(cmdErr.location);
764
765 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
766 command == IComposerClient::Command::PRESENT_DISPLAY) {
767 error = cmdErr.error;
768 } else {
769 ALOGW("command 0x%x generated error %d",
770 command, cmdErr.error);
771 }
772 }
773 }
774
775 mWriter.reset();
776
Chia-I Wuaab99f52016-10-05 12:59:58 +0800777 return error;
778}
779
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800780CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800781{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800782 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800783}
784
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800785Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800786{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800787 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800788
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800789 IComposerClient::Command command;
790 uint16_t length = 0;
791
792 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800793 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800794 break;
795 }
796
797 bool parsed = false;
798 switch (command) {
799 case IComposerClient::Command::SELECT_DISPLAY:
800 parsed = parseSelectDisplay(length);
801 break;
802 case IComposerClient::Command::SET_ERROR:
803 parsed = parseSetError(length);
804 break;
805 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
806 parsed = parseSetChangedCompositionTypes(length);
807 break;
808 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
809 parsed = parseSetDisplayRequests(length);
810 break;
811 case IComposerClient::Command::SET_PRESENT_FENCE:
812 parsed = parseSetPresentFence(length);
813 break;
814 case IComposerClient::Command::SET_RELEASE_FENCES:
815 parsed = parseSetReleaseFences(length);
816 break;
817 default:
818 parsed = false;
819 break;
820 }
821
822 endCommand();
823
824 if (!parsed) {
825 ALOGE("failed to parse command 0x%x length %" PRIu16,
826 command, length);
827 break;
828 }
829 }
830
831 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800832}
833
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800834bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800835{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500836 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800837 return false;
838 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800839
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800840 mCurrentReturnData = &mReturnData[read64()];
841
842 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800843}
844
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800845bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800846{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500847 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800848 return false;
849 }
850
851 auto location = read();
852 auto error = static_cast<Error>(readSigned());
853
854 mErrors.emplace_back(CommandError{location, error});
855
856 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800857}
858
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800859bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800860{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800861 // (layer id, composition type) pairs
862 if (length % 3 != 0 || !mCurrentReturnData) {
863 return false;
864 }
865
866 uint32_t count = length / 3;
867 mCurrentReturnData->changedLayers.reserve(count);
868 mCurrentReturnData->compositionTypes.reserve(count);
869 while (count > 0) {
870 auto layer = read64();
871 auto type = static_cast<IComposerClient::Composition>(readSigned());
872
873 mCurrentReturnData->changedLayers.push_back(layer);
874 mCurrentReturnData->compositionTypes.push_back(type);
875
876 count--;
877 }
878
879 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800880}
881
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800882bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800883{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800884 // display requests followed by (layer id, layer requests) pairs
885 if (length % 3 != 1 || !mCurrentReturnData) {
886 return false;
887 }
888
889 mCurrentReturnData->displayRequests = read();
890
891 uint32_t count = (length - 1) / 3;
892 mCurrentReturnData->requestedLayers.reserve(count);
893 mCurrentReturnData->requestMasks.reserve(count);
894 while (count > 0) {
895 auto layer = read64();
896 auto layerRequestMask = read();
897
898 mCurrentReturnData->requestedLayers.push_back(layer);
899 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
900
901 count--;
902 }
903
904 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800905}
906
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800907bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800908{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500909 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800910 !mCurrentReturnData) {
911 return false;
912 }
913
914 if (mCurrentReturnData->presentFence >= 0) {
915 close(mCurrentReturnData->presentFence);
916 }
917 mCurrentReturnData->presentFence = readFence();
918
919 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800920}
921
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800922bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800923{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800924 // (layer id, release fence index) pairs
925 if (length % 3 != 0 || !mCurrentReturnData) {
926 return false;
927 }
928
929 uint32_t count = length / 3;
930 mCurrentReturnData->releasedLayers.reserve(count);
931 mCurrentReturnData->releaseFences.reserve(count);
932 while (count > 0) {
933 auto layer = read64();
934 auto fence = readFence();
935
936 mCurrentReturnData->releasedLayers.push_back(layer);
937 mCurrentReturnData->releaseFences.push_back(fence);
938
939 count--;
940 }
941
942 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800943}
944
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800945void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800946{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800947 mErrors.clear();
948
949 for (auto& data : mReturnData) {
950 if (data.second.presentFence >= 0) {
951 close(data.second.presentFence);
952 }
953 for (auto fence : data.second.releaseFences) {
954 if (fence >= 0) {
955 close(fence);
956 }
957 }
958 }
959
960 mReturnData.clear();
961 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800962}
963
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800964std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800965{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800966 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800967}
968
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800969bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800970 uint32_t* outNumChangedCompositionTypes,
971 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +0800972{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800973 auto found = mReturnData.find(display);
974 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800975 *outNumChangedCompositionTypes = 0;
976 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800977 return false;
978 }
979
980 const ReturnData& data = found->second;
981
Chia-I Wu67e376d2016-12-19 11:36:22 +0800982 *outNumChangedCompositionTypes = data.compositionTypes.size();
983 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800984
985 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +0800986}
987
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800988void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800989 std::vector<Layer>* outLayers,
990 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800991{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800992 auto found = mReturnData.find(display);
993 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800994 outLayers->clear();
995 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800996 return;
997 }
998
999 ReturnData& data = found->second;
1000
Chia-I Wu67e376d2016-12-19 11:36:22 +08001001 *outLayers = std::move(data.changedLayers);
1002 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001003}
1004
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001005void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001006 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1007 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001008{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001009 auto found = mReturnData.find(display);
1010 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001011 *outDisplayRequestMask = 0;
1012 outLayers->clear();
1013 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001014 return;
1015 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001016
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001017 ReturnData& data = found->second;
1018
Chia-I Wu67e376d2016-12-19 11:36:22 +08001019 *outDisplayRequestMask = data.displayRequests;
1020 *outLayers = std::move(data.requestedLayers);
1021 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001022}
1023
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001024void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001025 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001026{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001027 auto found = mReturnData.find(display);
1028 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001029 outLayers->clear();
1030 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001031 return;
1032 }
1033
1034 ReturnData& data = found->second;
1035
Chia-I Wu67e376d2016-12-19 11:36:22 +08001036 *outLayers = std::move(data.releasedLayers);
1037 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001038}
1039
Chia-I Wu67e376d2016-12-19 11:36:22 +08001040void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001041{
1042 auto found = mReturnData.find(display);
1043 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001044 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001045 return;
1046 }
1047
1048 ReturnData& data = found->second;
1049
Chia-I Wu67e376d2016-12-19 11:36:22 +08001050 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001051 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001052}
1053
1054} // namespace Hwc2
1055
1056} // namespace android