blob: 262ab62ac2a82351d92ab7f475a0867333c53c93 [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
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800215uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800216{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800217 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800218 return unwrapRet(ret, 0);
219}
220
221Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800222 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800224 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800225 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800226 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800227 [&](const auto& tmpError, const auto& tmpDisplay,
228 const auto& tmpFormat) {
229 error = tmpError;
230 if (error != Error::NONE) {
231 return;
232 }
233
Chia-I Wu67e376d2016-12-19 11:36:22 +0800234 *outDisplay = tmpDisplay;
235 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800236 });
237
238 return error;
239}
240
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800241Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800242{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800243 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800244 return unwrapRet(ret);
245}
246
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800247Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800249 mWriter.selectDisplay(display);
250 mWriter.acceptDisplayChanges();
251 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800252}
253
Chia-I Wu67e376d2016-12-19 11:36:22 +0800254Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800255{
256 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800257 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800258 [&](const auto& tmpError, const auto& tmpLayer) {
259 error = tmpError;
260 if (error != Error::NONE) {
261 return;
262 }
263
Chia-I Wu67e376d2016-12-19 11:36:22 +0800264 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800265 });
266
267 return error;
268}
269
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800270Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800271{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800272 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800273 return unwrapRet(ret);
274}
275
Chia-I Wu67e376d2016-12-19 11:36:22 +0800276Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277{
278 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800279 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800280 [&](const auto& tmpError, const auto& tmpConfig) {
281 error = tmpError;
282 if (error != Error::NONE) {
283 return;
284 }
285
Chia-I Wu67e376d2016-12-19 11:36:22 +0800286 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800287 });
288
289 return error;
290}
291
292Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800293 std::vector<Layer>* outLayers,
294 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800296 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800297 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298}
299
300Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800301 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302{
303 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800304 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800305 [&](const auto& tmpError, const auto& tmpModes) {
306 error = tmpError;
307 if (error != Error::NONE) {
308 return;
309 }
310
Chia-I Wu67e376d2016-12-19 11:36:22 +0800311 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800312 });
313
314 return error;
315}
316
317Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800318 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800319{
320 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800321 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800322 [&](const auto& tmpError, const auto& tmpValue) {
323 error = tmpError;
324 if (error != Error::NONE) {
325 return;
326 }
327
Chia-I Wu67e376d2016-12-19 11:36:22 +0800328 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800329 });
330
331 return error;
332}
333
334Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800335 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800336{
337 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800338 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800339 [&](const auto& tmpError, const auto& tmpConfigs) {
340 error = tmpError;
341 if (error != Error::NONE) {
342 return;
343 }
344
Chia-I Wu67e376d2016-12-19 11:36:22 +0800345 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800346 });
347
348 return error;
349}
350
Chia-I Wu67e376d2016-12-19 11:36:22 +0800351Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800352{
353 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800354 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355 [&](const auto& tmpError, const auto& tmpName) {
356 error = tmpError;
357 if (error != Error::NONE) {
358 return;
359 }
360
Chia-I Wu67e376d2016-12-19 11:36:22 +0800361 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800362 });
363
364 return error;
365}
366
367Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800368 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
369 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800370{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800371 mReader.takeDisplayRequests(display, outDisplayRequestMask,
372 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800373 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800374}
375
Chia-I Wu67e376d2016-12-19 11:36:22 +0800376Error Composer::getDisplayType(Display display,
377 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800378{
379 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800380 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800381 [&](const auto& tmpError, const auto& tmpType) {
382 error = tmpError;
383 if (error != Error::NONE) {
384 return;
385 }
386
Chia-I Wu67e376d2016-12-19 11:36:22 +0800387 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388 });
389
390 return error;
391}
392
Chia-I Wu67e376d2016-12-19 11:36:22 +0800393Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800394{
395 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800396 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800397 [&](const auto& tmpError, const auto& tmpSupport) {
398 error = tmpError;
399 if (error != Error::NONE) {
400 return;
401 }
402
Chia-I Wu67e376d2016-12-19 11:36:22 +0800403 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 });
405
406 return error;
407}
408
Chia-I Wu67e376d2016-12-19 11:36:22 +0800409Error Composer::getHdrCapabilities(Display display,
410 std::vector<Hdr>* outTypes, float* outMaxLuminance,
411 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800412{
413 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800414 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800415 [&](const auto& tmpError, const auto& tmpTypes,
416 const auto& tmpMaxLuminance,
417 const auto& tmpMaxAverageLuminance,
418 const auto& tmpMinLuminance) {
419 error = tmpError;
420 if (error != Error::NONE) {
421 return;
422 }
423
Chia-I Wu67e376d2016-12-19 11:36:22 +0800424 *outTypes = tmpTypes;
425 *outMaxLuminance = tmpMaxLuminance;
426 *outMaxAverageLuminance = tmpMaxAverageLuminance;
427 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800428 });
429
430 return error;
431}
432
Chia-I Wu67e376d2016-12-19 11:36:22 +0800433Error Composer::getReleaseFences(Display display,
434 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800435{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800436 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800437 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800438}
439
Chia-I Wu67e376d2016-12-19 11:36:22 +0800440Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800441{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800442 mWriter.selectDisplay(display);
443 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800444
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800445 Error error = execute();
446 if (error != Error::NONE) {
447 return error;
448 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449
Chia-I Wu67e376d2016-12-19 11:36:22 +0800450 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800451
452 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453}
454
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800455Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800457 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800458 return unwrapRet(ret);
459}
460
Chia-I Wu06d63de2017-01-04 14:58:51 +0800461Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400462 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800463 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800464 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800466 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400467 if (mIsUsingVrComposer && target.get()) {
468 IVrComposerClient::BufferMetadata metadata = {
469 .width = target->getWidth(),
470 .height = target->getHeight(),
471 .stride = target->getStride(),
472 .layerCount = target->getLayerCount(),
473 .format = static_cast<PixelFormat>(target->getPixelFormat()),
474 .usage = target->getUsage(),
475 };
476 mWriter.setClientTargetMetadata(metadata);
477 }
478
479 const native_handle_t* handle = nullptr;
480 if (target.get()) {
481 handle = target->getNativeBuffer()->handle;
482 }
483
484 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800485 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800486}
487
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800488Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800489{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800490 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800491 return unwrapRet(ret);
492}
493
494Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800495 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800496{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800497 mWriter.selectDisplay(display);
498 mWriter.setColorTransform(matrix, hint);
499 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800500}
501
502Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800503 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800505 mWriter.selectDisplay(display);
506 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
507 return Error::NONE;
508}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800509
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800510Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
511{
512 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800513 return unwrapRet(ret);
514}
515
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800516Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800519 return unwrapRet(ret);
520}
521
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800522Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800523{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800524 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800525 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800526 return unwrapRet(ret);
527}
528
Chia-I Wu67e376d2016-12-19 11:36:22 +0800529Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
530 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800531{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800532 mWriter.selectDisplay(display);
533 mWriter.validateDisplay();
534
535 Error error = execute();
536 if (error != Error::NONE) {
537 return error;
538 }
539
Chia-I Wu67e376d2016-12-19 11:36:22 +0800540 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800541
542 return Error::NONE;
543}
544
545Error Composer::setCursorPosition(Display display, Layer layer,
546 int32_t x, int32_t y)
547{
548 mWriter.selectDisplay(display);
549 mWriter.selectLayer(layer);
550 mWriter.setLayerCursorPosition(x, y);
551 return Error::NONE;
552}
553
554Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400555 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556{
557 mWriter.selectDisplay(display);
558 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400559 if (mIsUsingVrComposer && buffer.get()) {
560 IVrComposerClient::BufferMetadata metadata = {
561 .width = buffer->getWidth(),
562 .height = buffer->getHeight(),
563 .stride = buffer->getStride(),
564 .layerCount = buffer->getLayerCount(),
565 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
566 .usage = buffer->getUsage(),
567 };
568 mWriter.setLayerBufferMetadata(metadata);
569 }
570
571 const native_handle_t* handle = nullptr;
572 if (buffer.get()) {
573 handle = buffer->getNativeBuffer()->handle;
574 }
575
576 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800577 return Error::NONE;
578}
579
580Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
581 const std::vector<IComposerClient::Rect>& damage)
582{
583 mWriter.selectDisplay(display);
584 mWriter.selectLayer(layer);
585 mWriter.setLayerSurfaceDamage(damage);
586 return Error::NONE;
587}
588
589Error Composer::setLayerBlendMode(Display display, Layer layer,
590 IComposerClient::BlendMode mode)
591{
592 mWriter.selectDisplay(display);
593 mWriter.selectLayer(layer);
594 mWriter.setLayerBlendMode(mode);
595 return Error::NONE;
596}
597
598Error Composer::setLayerColor(Display display, Layer layer,
599 const IComposerClient::Color& color)
600{
601 mWriter.selectDisplay(display);
602 mWriter.selectLayer(layer);
603 mWriter.setLayerColor(color);
604 return Error::NONE;
605}
606
607Error Composer::setLayerCompositionType(Display display, Layer layer,
608 IComposerClient::Composition type)
609{
610 mWriter.selectDisplay(display);
611 mWriter.selectLayer(layer);
612 mWriter.setLayerCompositionType(type);
613 return Error::NONE;
614}
615
616Error Composer::setLayerDataspace(Display display, Layer layer,
617 Dataspace dataspace)
618{
619 mWriter.selectDisplay(display);
620 mWriter.selectLayer(layer);
621 mWriter.setLayerDataspace(dataspace);
622 return Error::NONE;
623}
624
625Error Composer::setLayerDisplayFrame(Display display, Layer layer,
626 const IComposerClient::Rect& frame)
627{
628 mWriter.selectDisplay(display);
629 mWriter.selectLayer(layer);
630 mWriter.setLayerDisplayFrame(frame);
631 return Error::NONE;
632}
633
634Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
635 float alpha)
636{
637 mWriter.selectDisplay(display);
638 mWriter.selectLayer(layer);
639 mWriter.setLayerPlaneAlpha(alpha);
640 return Error::NONE;
641}
642
643Error Composer::setLayerSidebandStream(Display display, Layer layer,
644 const native_handle_t* stream)
645{
646 mWriter.selectDisplay(display);
647 mWriter.selectLayer(layer);
648 mWriter.setLayerSidebandStream(stream);
649 return Error::NONE;
650}
651
652Error Composer::setLayerSourceCrop(Display display, Layer layer,
653 const IComposerClient::FRect& crop)
654{
655 mWriter.selectDisplay(display);
656 mWriter.selectLayer(layer);
657 mWriter.setLayerSourceCrop(crop);
658 return Error::NONE;
659}
660
661Error Composer::setLayerTransform(Display display, Layer layer,
662 Transform transform)
663{
664 mWriter.selectDisplay(display);
665 mWriter.selectLayer(layer);
666 mWriter.setLayerTransform(transform);
667 return Error::NONE;
668}
669
670Error Composer::setLayerVisibleRegion(Display display, Layer layer,
671 const std::vector<IComposerClient::Rect>& visible)
672{
673 mWriter.selectDisplay(display);
674 mWriter.selectLayer(layer);
675 mWriter.setLayerVisibleRegion(visible);
676 return Error::NONE;
677}
678
679Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
680{
681 mWriter.selectDisplay(display);
682 mWriter.selectLayer(layer);
683 mWriter.setLayerZOrder(z);
684 return Error::NONE;
685}
686
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500687Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
688 uint32_t appId)
689{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800690 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500691 mWriter.selectDisplay(display);
692 mWriter.selectLayer(layer);
693 mWriter.setLayerInfo(type, appId);
694 }
695 return Error::NONE;
696}
697
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800698Error Composer::execute()
699{
700 // prepare input command queue
701 bool queueChanged = false;
702 uint32_t commandLength = 0;
703 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800704 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800705 mWriter.reset();
706 return Error::NO_RESOURCES;
707 }
708
709 // set up new input command queue if necessary
710 if (queueChanged) {
711 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
712 auto error = unwrapRet(ret);
713 if (error != Error::NONE) {
714 mWriter.reset();
715 return error;
716 }
717 }
718
Chia-I Wuaab99f52016-10-05 12:59:58 +0800719 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800720 mClient->executeCommands(commandLength, commandHandles,
721 [&](const auto& tmpError, const auto& tmpOutChanged,
722 const auto& tmpOutLength, const auto& tmpOutHandles)
723 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800724 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800725
726 // set up new output command queue if necessary
727 if (error == Error::NONE && tmpOutChanged) {
728 error = kDefaultError;
729 mClient->getOutputCommandQueue(
730 [&](const auto& tmpError,
731 const auto& tmpDescriptor)
732 {
733 error = tmpError;
734 if (error != Error::NONE) {
735 return;
736 }
737
738 mReader.setMQDescriptor(tmpDescriptor);
739 });
740 }
741
Chia-I Wuaab99f52016-10-05 12:59:58 +0800742 if (error != Error::NONE) {
743 return;
744 }
745
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800746 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
747 error = mReader.parse();
748 mReader.reset();
749 } else {
750 error = Error::NO_RESOURCES;
751 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800752 });
753
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800754 if (error == Error::NONE) {
755 std::vector<CommandReader::CommandError> commandErrors =
756 mReader.takeErrors();
757
758 for (const auto& cmdErr : commandErrors) {
759 auto command = mWriter.getCommand(cmdErr.location);
760
761 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
762 command == IComposerClient::Command::PRESENT_DISPLAY) {
763 error = cmdErr.error;
764 } else {
765 ALOGW("command 0x%x generated error %d",
766 command, cmdErr.error);
767 }
768 }
769 }
770
771 mWriter.reset();
772
Chia-I Wuaab99f52016-10-05 12:59:58 +0800773 return error;
774}
775
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800776CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800777{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800778 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800779}
780
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800781Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800782{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800783 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800784
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800785 IComposerClient::Command command;
786 uint16_t length = 0;
787
788 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800789 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800790 break;
791 }
792
793 bool parsed = false;
794 switch (command) {
795 case IComposerClient::Command::SELECT_DISPLAY:
796 parsed = parseSelectDisplay(length);
797 break;
798 case IComposerClient::Command::SET_ERROR:
799 parsed = parseSetError(length);
800 break;
801 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
802 parsed = parseSetChangedCompositionTypes(length);
803 break;
804 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
805 parsed = parseSetDisplayRequests(length);
806 break;
807 case IComposerClient::Command::SET_PRESENT_FENCE:
808 parsed = parseSetPresentFence(length);
809 break;
810 case IComposerClient::Command::SET_RELEASE_FENCES:
811 parsed = parseSetReleaseFences(length);
812 break;
813 default:
814 parsed = false;
815 break;
816 }
817
818 endCommand();
819
820 if (!parsed) {
821 ALOGE("failed to parse command 0x%x length %" PRIu16,
822 command, length);
823 break;
824 }
825 }
826
827 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800828}
829
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800830bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800831{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500832 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800833 return false;
834 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800835
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800836 mCurrentReturnData = &mReturnData[read64()];
837
838 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800839}
840
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800841bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800842{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500843 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800844 return false;
845 }
846
847 auto location = read();
848 auto error = static_cast<Error>(readSigned());
849
850 mErrors.emplace_back(CommandError{location, error});
851
852 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800853}
854
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800855bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800856{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800857 // (layer id, composition type) pairs
858 if (length % 3 != 0 || !mCurrentReturnData) {
859 return false;
860 }
861
862 uint32_t count = length / 3;
863 mCurrentReturnData->changedLayers.reserve(count);
864 mCurrentReturnData->compositionTypes.reserve(count);
865 while (count > 0) {
866 auto layer = read64();
867 auto type = static_cast<IComposerClient::Composition>(readSigned());
868
869 mCurrentReturnData->changedLayers.push_back(layer);
870 mCurrentReturnData->compositionTypes.push_back(type);
871
872 count--;
873 }
874
875 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800876}
877
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800878bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800879{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800880 // display requests followed by (layer id, layer requests) pairs
881 if (length % 3 != 1 || !mCurrentReturnData) {
882 return false;
883 }
884
885 mCurrentReturnData->displayRequests = read();
886
887 uint32_t count = (length - 1) / 3;
888 mCurrentReturnData->requestedLayers.reserve(count);
889 mCurrentReturnData->requestMasks.reserve(count);
890 while (count > 0) {
891 auto layer = read64();
892 auto layerRequestMask = read();
893
894 mCurrentReturnData->requestedLayers.push_back(layer);
895 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
896
897 count--;
898 }
899
900 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800901}
902
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800903bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800904{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500905 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800906 !mCurrentReturnData) {
907 return false;
908 }
909
910 if (mCurrentReturnData->presentFence >= 0) {
911 close(mCurrentReturnData->presentFence);
912 }
913 mCurrentReturnData->presentFence = readFence();
914
915 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800916}
917
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800918bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800919{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800920 // (layer id, release fence index) pairs
921 if (length % 3 != 0 || !mCurrentReturnData) {
922 return false;
923 }
924
925 uint32_t count = length / 3;
926 mCurrentReturnData->releasedLayers.reserve(count);
927 mCurrentReturnData->releaseFences.reserve(count);
928 while (count > 0) {
929 auto layer = read64();
930 auto fence = readFence();
931
932 mCurrentReturnData->releasedLayers.push_back(layer);
933 mCurrentReturnData->releaseFences.push_back(fence);
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 +0800941void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800942{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800943 mErrors.clear();
944
945 for (auto& data : mReturnData) {
946 if (data.second.presentFence >= 0) {
947 close(data.second.presentFence);
948 }
949 for (auto fence : data.second.releaseFences) {
950 if (fence >= 0) {
951 close(fence);
952 }
953 }
954 }
955
956 mReturnData.clear();
957 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800958}
959
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800960std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800961{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800962 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800963}
964
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800965bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800966 uint32_t* outNumChangedCompositionTypes,
967 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +0800968{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800969 auto found = mReturnData.find(display);
970 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800971 *outNumChangedCompositionTypes = 0;
972 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800973 return false;
974 }
975
976 const ReturnData& data = found->second;
977
Chia-I Wu67e376d2016-12-19 11:36:22 +0800978 *outNumChangedCompositionTypes = data.compositionTypes.size();
979 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800980
981 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +0800982}
983
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800984void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800985 std::vector<Layer>* outLayers,
986 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800987{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800988 auto found = mReturnData.find(display);
989 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800990 outLayers->clear();
991 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800992 return;
993 }
994
995 ReturnData& data = found->second;
996
Chia-I Wu67e376d2016-12-19 11:36:22 +0800997 *outLayers = std::move(data.changedLayers);
998 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800999}
1000
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001001void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001002 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1003 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001004{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001005 auto found = mReturnData.find(display);
1006 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001007 *outDisplayRequestMask = 0;
1008 outLayers->clear();
1009 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001010 return;
1011 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001012
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001013 ReturnData& data = found->second;
1014
Chia-I Wu67e376d2016-12-19 11:36:22 +08001015 *outDisplayRequestMask = data.displayRequests;
1016 *outLayers = std::move(data.requestedLayers);
1017 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001018}
1019
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001020void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001021 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001022{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001023 auto found = mReturnData.find(display);
1024 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001025 outLayers->clear();
1026 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001027 return;
1028 }
1029
1030 ReturnData& data = found->second;
1031
Chia-I Wu67e376d2016-12-19 11:36:22 +08001032 *outLayers = std::move(data.releasedLayers);
1033 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001034}
1035
Chia-I Wu67e376d2016-12-19 11:36:22 +08001036void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001037{
1038 auto found = mReturnData.find(display);
1039 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001040 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001041 return;
1042 }
1043
1044 ReturnData& data = found->second;
1045
Chia-I Wu67e376d2016-12-19 11:36:22 +08001046 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001047 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001048}
1049
1050} // namespace Hwc2
1051
1052} // namespace android