blob: 704b17ef4387d1daeb201c428e353e288c3192d4 [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 Thomas0af4b9f2017-04-26 14:34:01 -0700218void Composer::resetCommands() {
219 mWriter.reset();
220}
221
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800222uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800223{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800224 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800225 return unwrapRet(ret, 0);
226}
227
228Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800229 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800230{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800231 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800232 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800233 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800234 [&](const auto& tmpError, const auto& tmpDisplay,
235 const auto& tmpFormat) {
236 error = tmpError;
237 if (error != Error::NONE) {
238 return;
239 }
240
Chia-I Wu67e376d2016-12-19 11:36:22 +0800241 *outDisplay = tmpDisplay;
242 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800243 });
244
245 return error;
246}
247
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800248Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800249{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800250 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251 return unwrapRet(ret);
252}
253
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800254Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800255{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800256 mWriter.selectDisplay(display);
257 mWriter.acceptDisplayChanges();
258 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259}
260
Chia-I Wu67e376d2016-12-19 11:36:22 +0800261Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800262{
263 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800264 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800265 [&](const auto& tmpError, const auto& tmpLayer) {
266 error = tmpError;
267 if (error != Error::NONE) {
268 return;
269 }
270
Chia-I Wu67e376d2016-12-19 11:36:22 +0800271 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800272 });
273
274 return error;
275}
276
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800277Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800278{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800279 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800280 return unwrapRet(ret);
281}
282
Chia-I Wu67e376d2016-12-19 11:36:22 +0800283Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800284{
285 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800286 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800287 [&](const auto& tmpError, const auto& tmpConfig) {
288 error = tmpError;
289 if (error != Error::NONE) {
290 return;
291 }
292
Chia-I Wu67e376d2016-12-19 11:36:22 +0800293 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800294 });
295
296 return error;
297}
298
299Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800300 std::vector<Layer>* outLayers,
301 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800303 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800304 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800305}
306
307Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800308 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800309{
310 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800311 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800312 [&](const auto& tmpError, const auto& tmpModes) {
313 error = tmpError;
314 if (error != Error::NONE) {
315 return;
316 }
317
Chia-I Wu67e376d2016-12-19 11:36:22 +0800318 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800319 });
320
321 return error;
322}
323
324Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800325 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326{
327 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800328 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800329 [&](const auto& tmpError, const auto& tmpValue) {
330 error = tmpError;
331 if (error != Error::NONE) {
332 return;
333 }
334
Chia-I Wu67e376d2016-12-19 11:36:22 +0800335 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800336 });
337
338 return error;
339}
340
341Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800342 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800343{
344 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800345 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800346 [&](const auto& tmpError, const auto& tmpConfigs) {
347 error = tmpError;
348 if (error != Error::NONE) {
349 return;
350 }
351
Chia-I Wu67e376d2016-12-19 11:36:22 +0800352 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800353 });
354
355 return error;
356}
357
Chia-I Wu67e376d2016-12-19 11:36:22 +0800358Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800359{
360 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800361 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800362 [&](const auto& tmpError, const auto& tmpName) {
363 error = tmpError;
364 if (error != Error::NONE) {
365 return;
366 }
367
Chia-I Wu67e376d2016-12-19 11:36:22 +0800368 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800369 });
370
371 return error;
372}
373
374Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800375 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
376 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800377{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800378 mReader.takeDisplayRequests(display, outDisplayRequestMask,
379 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800380 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800381}
382
Chia-I Wu67e376d2016-12-19 11:36:22 +0800383Error Composer::getDisplayType(Display display,
384 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385{
386 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800387 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800388 [&](const auto& tmpError, const auto& tmpType) {
389 error = tmpError;
390 if (error != Error::NONE) {
391 return;
392 }
393
Chia-I Wu67e376d2016-12-19 11:36:22 +0800394 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395 });
396
397 return error;
398}
399
Chia-I Wu67e376d2016-12-19 11:36:22 +0800400Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800401{
402 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800403 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800404 [&](const auto& tmpError, const auto& tmpSupport) {
405 error = tmpError;
406 if (error != Error::NONE) {
407 return;
408 }
409
Chia-I Wu67e376d2016-12-19 11:36:22 +0800410 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800411 });
412
413 return error;
414}
415
Chia-I Wu67e376d2016-12-19 11:36:22 +0800416Error Composer::getHdrCapabilities(Display display,
417 std::vector<Hdr>* outTypes, float* outMaxLuminance,
418 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419{
420 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800421 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800422 [&](const auto& tmpError, const auto& tmpTypes,
423 const auto& tmpMaxLuminance,
424 const auto& tmpMaxAverageLuminance,
425 const auto& tmpMinLuminance) {
426 error = tmpError;
427 if (error != Error::NONE) {
428 return;
429 }
430
Chia-I Wu67e376d2016-12-19 11:36:22 +0800431 *outTypes = tmpTypes;
432 *outMaxLuminance = tmpMaxLuminance;
433 *outMaxAverageLuminance = tmpMaxAverageLuminance;
434 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800435 });
436
437 return error;
438}
439
Chia-I Wu67e376d2016-12-19 11:36:22 +0800440Error Composer::getReleaseFences(Display display,
441 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800442{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800443 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800444 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800445}
446
Chia-I Wu67e376d2016-12-19 11:36:22 +0800447Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800448{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800449 mWriter.selectDisplay(display);
450 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800451
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800452 Error error = execute();
453 if (error != Error::NONE) {
454 return error;
455 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456
Chia-I Wu67e376d2016-12-19 11:36:22 +0800457 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800458
459 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800460}
461
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800462Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800463{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800464 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465 return unwrapRet(ret);
466}
467
Chia-I Wu06d63de2017-01-04 14:58:51 +0800468Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400469 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800470 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800471 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800472{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800473 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400474 if (mIsUsingVrComposer && target.get()) {
475 IVrComposerClient::BufferMetadata metadata = {
476 .width = target->getWidth(),
477 .height = target->getHeight(),
478 .stride = target->getStride(),
479 .layerCount = target->getLayerCount(),
480 .format = static_cast<PixelFormat>(target->getPixelFormat()),
481 .usage = target->getUsage(),
482 };
483 mWriter.setClientTargetMetadata(metadata);
484 }
485
486 const native_handle_t* handle = nullptr;
487 if (target.get()) {
488 handle = target->getNativeBuffer()->handle;
489 }
490
491 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800492 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800493}
494
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800495Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800496{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800497 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800498 return unwrapRet(ret);
499}
500
501Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800502 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800503{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800504 mWriter.selectDisplay(display);
505 mWriter.setColorTransform(matrix, hint);
506 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507}
508
509Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800510 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800511{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800512 mWriter.selectDisplay(display);
513 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
514 return Error::NONE;
515}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800516
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800517Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
518{
519 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800520 return unwrapRet(ret);
521}
522
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800523Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800524{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800525 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800526 return unwrapRet(ret);
527}
528
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800529Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800530{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800531 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800532 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800533 return unwrapRet(ret);
534}
535
Chia-I Wu67e376d2016-12-19 11:36:22 +0800536Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
537 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800539 mWriter.selectDisplay(display);
540 mWriter.validateDisplay();
541
542 Error error = execute();
543 if (error != Error::NONE) {
544 return error;
545 }
546
Chia-I Wu67e376d2016-12-19 11:36:22 +0800547 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800548
549 return Error::NONE;
550}
551
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700552Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
553 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
554 mWriter.selectDisplay(display);
555 mWriter.presentOrvalidateDisplay();
556
557 Error error = execute();
558 if (error != Error::NONE) {
559 return error;
560 }
561
562 mReader.takePresentOrValidateStage(display, state);
563
564 if (*state == 1) { // Present succeeded
565 mReader.takePresentFence(display, outPresentFence);
566 }
567
568 if (*state == 0) { // Validate succeeded.
569 mReader.hasChanges(display, outNumTypes, outNumRequests);
570 }
571
572 return Error::NONE;
573}
574
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800575Error Composer::setCursorPosition(Display display, Layer layer,
576 int32_t x, int32_t y)
577{
578 mWriter.selectDisplay(display);
579 mWriter.selectLayer(layer);
580 mWriter.setLayerCursorPosition(x, y);
581 return Error::NONE;
582}
583
584Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400585 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800586{
587 mWriter.selectDisplay(display);
588 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400589 if (mIsUsingVrComposer && buffer.get()) {
590 IVrComposerClient::BufferMetadata metadata = {
591 .width = buffer->getWidth(),
592 .height = buffer->getHeight(),
593 .stride = buffer->getStride(),
594 .layerCount = buffer->getLayerCount(),
595 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
596 .usage = buffer->getUsage(),
597 };
598 mWriter.setLayerBufferMetadata(metadata);
599 }
600
601 const native_handle_t* handle = nullptr;
602 if (buffer.get()) {
603 handle = buffer->getNativeBuffer()->handle;
604 }
605
606 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800607 return Error::NONE;
608}
609
610Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
611 const std::vector<IComposerClient::Rect>& damage)
612{
613 mWriter.selectDisplay(display);
614 mWriter.selectLayer(layer);
615 mWriter.setLayerSurfaceDamage(damage);
616 return Error::NONE;
617}
618
619Error Composer::setLayerBlendMode(Display display, Layer layer,
620 IComposerClient::BlendMode mode)
621{
622 mWriter.selectDisplay(display);
623 mWriter.selectLayer(layer);
624 mWriter.setLayerBlendMode(mode);
625 return Error::NONE;
626}
627
628Error Composer::setLayerColor(Display display, Layer layer,
629 const IComposerClient::Color& color)
630{
631 mWriter.selectDisplay(display);
632 mWriter.selectLayer(layer);
633 mWriter.setLayerColor(color);
634 return Error::NONE;
635}
636
637Error Composer::setLayerCompositionType(Display display, Layer layer,
638 IComposerClient::Composition type)
639{
640 mWriter.selectDisplay(display);
641 mWriter.selectLayer(layer);
642 mWriter.setLayerCompositionType(type);
643 return Error::NONE;
644}
645
646Error Composer::setLayerDataspace(Display display, Layer layer,
647 Dataspace dataspace)
648{
649 mWriter.selectDisplay(display);
650 mWriter.selectLayer(layer);
651 mWriter.setLayerDataspace(dataspace);
652 return Error::NONE;
653}
654
655Error Composer::setLayerDisplayFrame(Display display, Layer layer,
656 const IComposerClient::Rect& frame)
657{
658 mWriter.selectDisplay(display);
659 mWriter.selectLayer(layer);
660 mWriter.setLayerDisplayFrame(frame);
661 return Error::NONE;
662}
663
664Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
665 float alpha)
666{
667 mWriter.selectDisplay(display);
668 mWriter.selectLayer(layer);
669 mWriter.setLayerPlaneAlpha(alpha);
670 return Error::NONE;
671}
672
673Error Composer::setLayerSidebandStream(Display display, Layer layer,
674 const native_handle_t* stream)
675{
676 mWriter.selectDisplay(display);
677 mWriter.selectLayer(layer);
678 mWriter.setLayerSidebandStream(stream);
679 return Error::NONE;
680}
681
682Error Composer::setLayerSourceCrop(Display display, Layer layer,
683 const IComposerClient::FRect& crop)
684{
685 mWriter.selectDisplay(display);
686 mWriter.selectLayer(layer);
687 mWriter.setLayerSourceCrop(crop);
688 return Error::NONE;
689}
690
691Error Composer::setLayerTransform(Display display, Layer layer,
692 Transform transform)
693{
694 mWriter.selectDisplay(display);
695 mWriter.selectLayer(layer);
696 mWriter.setLayerTransform(transform);
697 return Error::NONE;
698}
699
700Error Composer::setLayerVisibleRegion(Display display, Layer layer,
701 const std::vector<IComposerClient::Rect>& visible)
702{
703 mWriter.selectDisplay(display);
704 mWriter.selectLayer(layer);
705 mWriter.setLayerVisibleRegion(visible);
706 return Error::NONE;
707}
708
709Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
710{
711 mWriter.selectDisplay(display);
712 mWriter.selectLayer(layer);
713 mWriter.setLayerZOrder(z);
714 return Error::NONE;
715}
716
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500717Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
718 uint32_t appId)
719{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800720 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500721 mWriter.selectDisplay(display);
722 mWriter.selectLayer(layer);
723 mWriter.setLayerInfo(type, appId);
724 }
725 return Error::NONE;
726}
727
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800728Error Composer::execute()
729{
730 // prepare input command queue
731 bool queueChanged = false;
732 uint32_t commandLength = 0;
733 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800734 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800735 mWriter.reset();
736 return Error::NO_RESOURCES;
737 }
738
739 // set up new input command queue if necessary
740 if (queueChanged) {
741 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
742 auto error = unwrapRet(ret);
743 if (error != Error::NONE) {
744 mWriter.reset();
745 return error;
746 }
747 }
748
Chia-I Wuaab99f52016-10-05 12:59:58 +0800749 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800750 mClient->executeCommands(commandLength, commandHandles,
751 [&](const auto& tmpError, const auto& tmpOutChanged,
752 const auto& tmpOutLength, const auto& tmpOutHandles)
753 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800754 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800755
756 // set up new output command queue if necessary
757 if (error == Error::NONE && tmpOutChanged) {
758 error = kDefaultError;
759 mClient->getOutputCommandQueue(
760 [&](const auto& tmpError,
761 const auto& tmpDescriptor)
762 {
763 error = tmpError;
764 if (error != Error::NONE) {
765 return;
766 }
767
768 mReader.setMQDescriptor(tmpDescriptor);
769 });
770 }
771
Chia-I Wuaab99f52016-10-05 12:59:58 +0800772 if (error != Error::NONE) {
773 return;
774 }
775
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800776 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
777 error = mReader.parse();
778 mReader.reset();
779 } else {
780 error = Error::NO_RESOURCES;
781 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800782 });
783
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800784 if (error == Error::NONE) {
785 std::vector<CommandReader::CommandError> commandErrors =
786 mReader.takeErrors();
787
788 for (const auto& cmdErr : commandErrors) {
789 auto command = mWriter.getCommand(cmdErr.location);
790
791 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700792 command == IComposerClient::Command::PRESENT_DISPLAY ||
793 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800794 error = cmdErr.error;
795 } else {
796 ALOGW("command 0x%x generated error %d",
797 command, cmdErr.error);
798 }
799 }
800 }
801
802 mWriter.reset();
803
Chia-I Wuaab99f52016-10-05 12:59:58 +0800804 return error;
805}
806
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800807CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800808{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800809 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800810}
811
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800812Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800813{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800814 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800815
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800816 IComposerClient::Command command;
817 uint16_t length = 0;
818
819 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800820 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800821 break;
822 }
823
824 bool parsed = false;
825 switch (command) {
826 case IComposerClient::Command::SELECT_DISPLAY:
827 parsed = parseSelectDisplay(length);
828 break;
829 case IComposerClient::Command::SET_ERROR:
830 parsed = parseSetError(length);
831 break;
832 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
833 parsed = parseSetChangedCompositionTypes(length);
834 break;
835 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
836 parsed = parseSetDisplayRequests(length);
837 break;
838 case IComposerClient::Command::SET_PRESENT_FENCE:
839 parsed = parseSetPresentFence(length);
840 break;
841 case IComposerClient::Command::SET_RELEASE_FENCES:
842 parsed = parseSetReleaseFences(length);
843 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700844 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
845 parsed = parseSetPresentOrValidateDisplayResult(length);
846 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800847 default:
848 parsed = false;
849 break;
850 }
851
852 endCommand();
853
854 if (!parsed) {
855 ALOGE("failed to parse command 0x%x length %" PRIu16,
856 command, length);
857 break;
858 }
859 }
860
861 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800862}
863
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800864bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800865{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500866 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800867 return false;
868 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800869
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800870 mCurrentReturnData = &mReturnData[read64()];
871
872 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800873}
874
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800875bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800876{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500877 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800878 return false;
879 }
880
881 auto location = read();
882 auto error = static_cast<Error>(readSigned());
883
884 mErrors.emplace_back(CommandError{location, error});
885
886 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800887}
888
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800889bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800890{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800891 // (layer id, composition type) pairs
892 if (length % 3 != 0 || !mCurrentReturnData) {
893 return false;
894 }
895
896 uint32_t count = length / 3;
897 mCurrentReturnData->changedLayers.reserve(count);
898 mCurrentReturnData->compositionTypes.reserve(count);
899 while (count > 0) {
900 auto layer = read64();
901 auto type = static_cast<IComposerClient::Composition>(readSigned());
902
903 mCurrentReturnData->changedLayers.push_back(layer);
904 mCurrentReturnData->compositionTypes.push_back(type);
905
906 count--;
907 }
908
909 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800910}
911
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800912bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800913{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800914 // display requests followed by (layer id, layer requests) pairs
915 if (length % 3 != 1 || !mCurrentReturnData) {
916 return false;
917 }
918
919 mCurrentReturnData->displayRequests = read();
920
921 uint32_t count = (length - 1) / 3;
922 mCurrentReturnData->requestedLayers.reserve(count);
923 mCurrentReturnData->requestMasks.reserve(count);
924 while (count > 0) {
925 auto layer = read64();
926 auto layerRequestMask = read();
927
928 mCurrentReturnData->requestedLayers.push_back(layer);
929 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
930
931 count--;
932 }
933
934 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800935}
936
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800937bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800938{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500939 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800940 !mCurrentReturnData) {
941 return false;
942 }
943
944 if (mCurrentReturnData->presentFence >= 0) {
945 close(mCurrentReturnData->presentFence);
946 }
947 mCurrentReturnData->presentFence = readFence();
948
949 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800950}
951
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800952bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800953{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800954 // (layer id, release fence index) pairs
955 if (length % 3 != 0 || !mCurrentReturnData) {
956 return false;
957 }
958
959 uint32_t count = length / 3;
960 mCurrentReturnData->releasedLayers.reserve(count);
961 mCurrentReturnData->releaseFences.reserve(count);
962 while (count > 0) {
963 auto layer = read64();
964 auto fence = readFence();
965
966 mCurrentReturnData->releasedLayers.push_back(layer);
967 mCurrentReturnData->releaseFences.push_back(fence);
968
969 count--;
970 }
971
972 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800973}
974
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700975bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
976{
977 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
978 return false;
979 }
980 mCurrentReturnData->presentOrValidateState = read();
981 return true;
982}
983
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800984void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800985{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800986 mErrors.clear();
987
988 for (auto& data : mReturnData) {
989 if (data.second.presentFence >= 0) {
990 close(data.second.presentFence);
991 }
992 for (auto fence : data.second.releaseFences) {
993 if (fence >= 0) {
994 close(fence);
995 }
996 }
997 }
998
999 mReturnData.clear();
1000 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001001}
1002
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001003std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001004{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001005 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001006}
1007
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001008bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001009 uint32_t* outNumChangedCompositionTypes,
1010 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001011{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001012 auto found = mReturnData.find(display);
1013 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001014 *outNumChangedCompositionTypes = 0;
1015 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001016 return false;
1017 }
1018
1019 const ReturnData& data = found->second;
1020
Chia-I Wu67e376d2016-12-19 11:36:22 +08001021 *outNumChangedCompositionTypes = data.compositionTypes.size();
1022 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001023
1024 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001025}
1026
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001027void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001028 std::vector<Layer>* outLayers,
1029 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001030{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001031 auto found = mReturnData.find(display);
1032 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001033 outLayers->clear();
1034 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001035 return;
1036 }
1037
1038 ReturnData& data = found->second;
1039
Chia-I Wu67e376d2016-12-19 11:36:22 +08001040 *outLayers = std::move(data.changedLayers);
1041 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001042}
1043
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001044void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001045 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1046 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001047{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001048 auto found = mReturnData.find(display);
1049 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001050 *outDisplayRequestMask = 0;
1051 outLayers->clear();
1052 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001053 return;
1054 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001055
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001056 ReturnData& data = found->second;
1057
Chia-I Wu67e376d2016-12-19 11:36:22 +08001058 *outDisplayRequestMask = data.displayRequests;
1059 *outLayers = std::move(data.requestedLayers);
1060 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001061}
1062
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001063void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001064 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001065{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001066 auto found = mReturnData.find(display);
1067 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001068 outLayers->clear();
1069 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001070 return;
1071 }
1072
1073 ReturnData& data = found->second;
1074
Chia-I Wu67e376d2016-12-19 11:36:22 +08001075 *outLayers = std::move(data.releasedLayers);
1076 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001077}
1078
Chia-I Wu67e376d2016-12-19 11:36:22 +08001079void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001080{
1081 auto found = mReturnData.find(display);
1082 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001083 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001084 return;
1085 }
1086
1087 ReturnData& data = found->second;
1088
Chia-I Wu67e376d2016-12-19 11:36:22 +08001089 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001090 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001091}
1092
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001093void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1094 auto found = mReturnData.find(display);
1095 if (found == mReturnData.end()) {
1096 *state= -1;
1097 return;
1098 }
1099 ReturnData& data = found->second;
1100 *state = data.presentOrValidateState;
1101}
1102
Chia-I Wuaab99f52016-10-05 12:59:58 +08001103} // namespace Hwc2
1104
1105} // namespace android