blob: 03b714f95819ccc8c4f0491bbbaec087a99b5a58 [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
Lloyd Piquea822d522017-12-20 16:42:57 -080034Composer::~Composer() = default;
35
Chia-I Wuaab99f52016-10-05 12:59:58 +080036namespace {
37
38class BufferHandle {
39public:
40 BufferHandle(const native_handle_t* buffer)
41 {
42 // nullptr is not a valid handle to HIDL
43 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
44 }
45
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010046 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080047 {
48 return mHandle;
49 }
50
51private:
52 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010053 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080054};
55
56class FenceHandle
57{
58public:
59 FenceHandle(int fd, bool owned)
60 : mOwned(owned)
61 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010062 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080063 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010064 handle = native_handle_init(mStorage, 1, 0);
65 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080066 } else {
67 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010068 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010070 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080071 }
72
73 ~FenceHandle()
74 {
75 if (mOwned) {
76 native_handle_close(mHandle);
77 }
78 }
79
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010080 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080081 {
82 return mHandle;
83 }
84
85private:
86 bool mOwned;
87 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010088 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080089};
90
91// assume NO_RESOURCES when Status::isOk returns false
92constexpr Error kDefaultError = Error::NO_RESOURCES;
93
94template<typename T, typename U>
95T unwrapRet(Return<T>& ret, const U& default_val)
96{
Steven Moreland9d021002017-01-03 17:10:54 -080097 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +080098 static_cast<T>(default_val);
99}
100
101Error unwrapRet(Return<Error>& ret)
102{
103 return unwrapRet(ret, kDefaultError);
104}
105
Chia-I Wuaab99f52016-10-05 12:59:58 +0800106} // anonymous namespace
107
Lloyd Piquea822d522017-12-20 16:42:57 -0800108namespace impl {
109
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500110Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
111 : CommandWriterBase(initialMaxSize) {}
112
113Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800114{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500115}
116
117void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
118{
119 constexpr uint16_t kSetLayerInfoLength = 2;
120 beginCommand(
121 static_cast<IComposerClient::Command>(
122 IVrComposerClient::VrCommand::SET_LAYER_INFO),
123 kSetLayerInfoLength);
124 write(type);
125 write(appId);
126 endCommand();
127}
128
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400129void Composer::CommandWriter::setClientTargetMetadata(
130 const IVrComposerClient::BufferMetadata& metadata)
131{
132 constexpr uint16_t kSetClientTargetMetadataLength = 7;
133 beginCommand(
134 static_cast<IComposerClient::Command>(
135 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
136 kSetClientTargetMetadataLength);
137 writeBufferMetadata(metadata);
138 endCommand();
139}
140
141void Composer::CommandWriter::setLayerBufferMetadata(
142 const IVrComposerClient::BufferMetadata& metadata)
143{
144 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
145 beginCommand(
146 static_cast<IComposerClient::Command>(
147 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
148 kSetLayerBufferMetadataLength);
149 writeBufferMetadata(metadata);
150 endCommand();
151}
152
153void Composer::CommandWriter::writeBufferMetadata(
154 const IVrComposerClient::BufferMetadata& metadata)
155{
156 write(metadata.width);
157 write(metadata.height);
158 write(metadata.stride);
159 write(metadata.layerCount);
160 writeSigned(static_cast<int32_t>(metadata.format));
161 write64(metadata.usage);
162}
163
Kalle Raitaa099a242017-01-11 11:17:29 -0800164Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800165 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800166 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500167{
Kalle Raitaa099a242017-01-11 11:17:29 -0800168 mComposer = IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500169
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 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400184
185 if (mIsUsingVrComposer) {
186 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
187 if (vrClient == nullptr) {
188 LOG_ALWAYS_FATAL("failed to create vr composer client");
189 }
190 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800191}
192
Lloyd Piquea822d522017-12-20 16:42:57 -0800193Composer::~Composer() = default;
194
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800195std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800196{
197 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800198 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800199 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800200 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800201 });
202
203 return capabilities;
204}
205
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800206std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800207{
208 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800209 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800210 info = tmpInfo.c_str();
211 });
212
213 return info;
214}
215
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800216void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800217{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800218 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800219 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800220 ALOGE("failed to register IComposerCallback");
221 }
222}
223
Steven Thomasb02664d2017-07-26 18:48:28 -0700224bool Composer::isRemote() {
225 return mClient->isRemote();
226}
227
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700228void Composer::resetCommands() {
229 mWriter.reset();
230}
231
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700232Error Composer::executeCommands() {
233 return execute();
234}
235
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800236uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800237{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800238 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800239 return unwrapRet(ret, 0);
240}
241
242Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800243 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800244{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800245 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800246 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800247 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800248 [&](const auto& tmpError, const auto& tmpDisplay,
249 const auto& tmpFormat) {
250 error = tmpError;
251 if (error != Error::NONE) {
252 return;
253 }
254
Chia-I Wu67e376d2016-12-19 11:36:22 +0800255 *outDisplay = tmpDisplay;
256 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257 });
258
259 return error;
260}
261
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800262Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800263{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800264 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800265 return unwrapRet(ret);
266}
267
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800268Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800269{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800270 mWriter.selectDisplay(display);
271 mWriter.acceptDisplayChanges();
272 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800273}
274
Chia-I Wu67e376d2016-12-19 11:36:22 +0800275Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800276{
277 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800278 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800279 [&](const auto& tmpError, const auto& tmpLayer) {
280 error = tmpError;
281 if (error != Error::NONE) {
282 return;
283 }
284
Chia-I Wu67e376d2016-12-19 11:36:22 +0800285 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800286 });
287
288 return error;
289}
290
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800291Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800292{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800293 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800294 return unwrapRet(ret);
295}
296
Chia-I Wu67e376d2016-12-19 11:36:22 +0800297Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800298{
299 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800300 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800301 [&](const auto& tmpError, const auto& tmpConfig) {
302 error = tmpError;
303 if (error != Error::NONE) {
304 return;
305 }
306
Chia-I Wu67e376d2016-12-19 11:36:22 +0800307 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800308 });
309
310 return error;
311}
312
313Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800314 std::vector<Layer>* outLayers,
315 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800316{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800317 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800318 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800319}
320
321Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800322 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800323{
324 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800325 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800326 [&](const auto& tmpError, const auto& tmpModes) {
327 error = tmpError;
328 if (error != Error::NONE) {
329 return;
330 }
331
Chia-I Wu67e376d2016-12-19 11:36:22 +0800332 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800333 });
334
335 return error;
336}
337
338Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800339 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800340{
341 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800342 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800343 [&](const auto& tmpError, const auto& tmpValue) {
344 error = tmpError;
345 if (error != Error::NONE) {
346 return;
347 }
348
Chia-I Wu67e376d2016-12-19 11:36:22 +0800349 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350 });
351
352 return error;
353}
354
355Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800356 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800357{
358 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800359 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800360 [&](const auto& tmpError, const auto& tmpConfigs) {
361 error = tmpError;
362 if (error != Error::NONE) {
363 return;
364 }
365
Chia-I Wu67e376d2016-12-19 11:36:22 +0800366 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800367 });
368
369 return error;
370}
371
Chia-I Wu67e376d2016-12-19 11:36:22 +0800372Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800373{
374 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800375 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800376 [&](const auto& tmpError, const auto& tmpName) {
377 error = tmpError;
378 if (error != Error::NONE) {
379 return;
380 }
381
Chia-I Wu67e376d2016-12-19 11:36:22 +0800382 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800383 });
384
385 return error;
386}
387
388Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800389 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
390 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800391{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800392 mReader.takeDisplayRequests(display, outDisplayRequestMask,
393 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800394 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800395}
396
Chia-I Wu67e376d2016-12-19 11:36:22 +0800397Error Composer::getDisplayType(Display display,
398 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800399{
400 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800401 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800402 [&](const auto& tmpError, const auto& tmpType) {
403 error = tmpError;
404 if (error != Error::NONE) {
405 return;
406 }
407
Chia-I Wu67e376d2016-12-19 11:36:22 +0800408 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800409 });
410
411 return error;
412}
413
Chia-I Wu67e376d2016-12-19 11:36:22 +0800414Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800415{
416 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800417 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800418 [&](const auto& tmpError, const auto& tmpSupport) {
419 error = tmpError;
420 if (error != Error::NONE) {
421 return;
422 }
423
Chia-I Wu67e376d2016-12-19 11:36:22 +0800424 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800425 });
426
427 return error;
428}
429
Chia-I Wu67e376d2016-12-19 11:36:22 +0800430Error Composer::getHdrCapabilities(Display display,
431 std::vector<Hdr>* outTypes, float* outMaxLuminance,
432 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800433{
434 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800435 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800436 [&](const auto& tmpError, const auto& tmpTypes,
437 const auto& tmpMaxLuminance,
438 const auto& tmpMaxAverageLuminance,
439 const auto& tmpMinLuminance) {
440 error = tmpError;
441 if (error != Error::NONE) {
442 return;
443 }
444
Chia-I Wu67e376d2016-12-19 11:36:22 +0800445 *outTypes = tmpTypes;
446 *outMaxLuminance = tmpMaxLuminance;
447 *outMaxAverageLuminance = tmpMaxAverageLuminance;
448 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800449 });
450
451 return error;
452}
453
Chia-I Wu67e376d2016-12-19 11:36:22 +0800454Error Composer::getReleaseFences(Display display,
455 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800457 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800458 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800459}
460
Chia-I Wu67e376d2016-12-19 11:36:22 +0800461Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800462{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800463 mWriter.selectDisplay(display);
464 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800465
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800466 Error error = execute();
467 if (error != Error::NONE) {
468 return error;
469 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800470
Chia-I Wu67e376d2016-12-19 11:36:22 +0800471 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800472
473 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800474}
475
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800476Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800477{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800478 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800479 return unwrapRet(ret);
480}
481
Chia-I Wu06d63de2017-01-04 14:58:51 +0800482Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400483 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800484 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800485 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800486{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800487 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400488 if (mIsUsingVrComposer && target.get()) {
489 IVrComposerClient::BufferMetadata metadata = {
490 .width = target->getWidth(),
491 .height = target->getHeight(),
492 .stride = target->getStride(),
493 .layerCount = target->getLayerCount(),
494 .format = static_cast<PixelFormat>(target->getPixelFormat()),
495 .usage = target->getUsage(),
496 };
497 mWriter.setClientTargetMetadata(metadata);
498 }
499
500 const native_handle_t* handle = nullptr;
501 if (target.get()) {
502 handle = target->getNativeBuffer()->handle;
503 }
504
505 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800506 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800507}
508
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800509Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800510{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800511 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800512 return unwrapRet(ret);
513}
514
515Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800516 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800517{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518 mWriter.selectDisplay(display);
519 mWriter.setColorTransform(matrix, hint);
520 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800521}
522
523Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800524 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800525{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800526 mWriter.selectDisplay(display);
527 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
528 return Error::NONE;
529}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800530
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800531Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
532{
533 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534 return unwrapRet(ret);
535}
536
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800537Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800539 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800540 return unwrapRet(ret);
541}
542
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800543Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800544{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800545 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800546 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800547 return unwrapRet(ret);
548}
549
Chia-I Wu67e376d2016-12-19 11:36:22 +0800550Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
551 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800552{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800553 mWriter.selectDisplay(display);
554 mWriter.validateDisplay();
555
556 Error error = execute();
557 if (error != Error::NONE) {
558 return error;
559 }
560
Chia-I Wu67e376d2016-12-19 11:36:22 +0800561 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800562
563 return Error::NONE;
564}
565
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700566Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
567 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
568 mWriter.selectDisplay(display);
569 mWriter.presentOrvalidateDisplay();
570
571 Error error = execute();
572 if (error != Error::NONE) {
573 return error;
574 }
575
576 mReader.takePresentOrValidateStage(display, state);
577
578 if (*state == 1) { // Present succeeded
579 mReader.takePresentFence(display, outPresentFence);
580 }
581
582 if (*state == 0) { // Validate succeeded.
583 mReader.hasChanges(display, outNumTypes, outNumRequests);
584 }
585
586 return Error::NONE;
587}
588
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800589Error Composer::setCursorPosition(Display display, Layer layer,
590 int32_t x, int32_t y)
591{
592 mWriter.selectDisplay(display);
593 mWriter.selectLayer(layer);
594 mWriter.setLayerCursorPosition(x, y);
595 return Error::NONE;
596}
597
598Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400599 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800600{
601 mWriter.selectDisplay(display);
602 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400603 if (mIsUsingVrComposer && buffer.get()) {
604 IVrComposerClient::BufferMetadata metadata = {
605 .width = buffer->getWidth(),
606 .height = buffer->getHeight(),
607 .stride = buffer->getStride(),
608 .layerCount = buffer->getLayerCount(),
609 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
610 .usage = buffer->getUsage(),
611 };
612 mWriter.setLayerBufferMetadata(metadata);
613 }
614
615 const native_handle_t* handle = nullptr;
616 if (buffer.get()) {
617 handle = buffer->getNativeBuffer()->handle;
618 }
619
620 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800621 return Error::NONE;
622}
623
624Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
625 const std::vector<IComposerClient::Rect>& damage)
626{
627 mWriter.selectDisplay(display);
628 mWriter.selectLayer(layer);
629 mWriter.setLayerSurfaceDamage(damage);
630 return Error::NONE;
631}
632
633Error Composer::setLayerBlendMode(Display display, Layer layer,
634 IComposerClient::BlendMode mode)
635{
636 mWriter.selectDisplay(display);
637 mWriter.selectLayer(layer);
638 mWriter.setLayerBlendMode(mode);
639 return Error::NONE;
640}
641
642Error Composer::setLayerColor(Display display, Layer layer,
643 const IComposerClient::Color& color)
644{
645 mWriter.selectDisplay(display);
646 mWriter.selectLayer(layer);
647 mWriter.setLayerColor(color);
648 return Error::NONE;
649}
650
651Error Composer::setLayerCompositionType(Display display, Layer layer,
652 IComposerClient::Composition type)
653{
654 mWriter.selectDisplay(display);
655 mWriter.selectLayer(layer);
656 mWriter.setLayerCompositionType(type);
657 return Error::NONE;
658}
659
660Error Composer::setLayerDataspace(Display display, Layer layer,
661 Dataspace dataspace)
662{
663 mWriter.selectDisplay(display);
664 mWriter.selectLayer(layer);
665 mWriter.setLayerDataspace(dataspace);
666 return Error::NONE;
667}
668
669Error Composer::setLayerDisplayFrame(Display display, Layer layer,
670 const IComposerClient::Rect& frame)
671{
672 mWriter.selectDisplay(display);
673 mWriter.selectLayer(layer);
674 mWriter.setLayerDisplayFrame(frame);
675 return Error::NONE;
676}
677
678Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
679 float alpha)
680{
681 mWriter.selectDisplay(display);
682 mWriter.selectLayer(layer);
683 mWriter.setLayerPlaneAlpha(alpha);
684 return Error::NONE;
685}
686
687Error Composer::setLayerSidebandStream(Display display, Layer layer,
688 const native_handle_t* stream)
689{
690 mWriter.selectDisplay(display);
691 mWriter.selectLayer(layer);
692 mWriter.setLayerSidebandStream(stream);
693 return Error::NONE;
694}
695
696Error Composer::setLayerSourceCrop(Display display, Layer layer,
697 const IComposerClient::FRect& crop)
698{
699 mWriter.selectDisplay(display);
700 mWriter.selectLayer(layer);
701 mWriter.setLayerSourceCrop(crop);
702 return Error::NONE;
703}
704
705Error Composer::setLayerTransform(Display display, Layer layer,
706 Transform transform)
707{
708 mWriter.selectDisplay(display);
709 mWriter.selectLayer(layer);
710 mWriter.setLayerTransform(transform);
711 return Error::NONE;
712}
713
714Error Composer::setLayerVisibleRegion(Display display, Layer layer,
715 const std::vector<IComposerClient::Rect>& visible)
716{
717 mWriter.selectDisplay(display);
718 mWriter.selectLayer(layer);
719 mWriter.setLayerVisibleRegion(visible);
720 return Error::NONE;
721}
722
723Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
724{
725 mWriter.selectDisplay(display);
726 mWriter.selectLayer(layer);
727 mWriter.setLayerZOrder(z);
728 return Error::NONE;
729}
730
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500731Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
732 uint32_t appId)
733{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800734 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500735 mWriter.selectDisplay(display);
736 mWriter.selectLayer(layer);
737 mWriter.setLayerInfo(type, appId);
738 }
739 return Error::NONE;
740}
741
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800742Error Composer::execute()
743{
744 // prepare input command queue
745 bool queueChanged = false;
746 uint32_t commandLength = 0;
747 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800748 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800749 mWriter.reset();
750 return Error::NO_RESOURCES;
751 }
752
753 // set up new input command queue if necessary
754 if (queueChanged) {
755 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
756 auto error = unwrapRet(ret);
757 if (error != Error::NONE) {
758 mWriter.reset();
759 return error;
760 }
761 }
762
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700763 if (commandLength == 0) {
764 mWriter.reset();
765 return Error::NONE;
766 }
767
Chia-I Wuaab99f52016-10-05 12:59:58 +0800768 Error error = kDefaultError;
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700769 auto ret = mClient->executeCommands(commandLength, commandHandles,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800770 [&](const auto& tmpError, const auto& tmpOutChanged,
771 const auto& tmpOutLength, const auto& tmpOutHandles)
772 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800773 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800774
775 // set up new output command queue if necessary
776 if (error == Error::NONE && tmpOutChanged) {
777 error = kDefaultError;
778 mClient->getOutputCommandQueue(
779 [&](const auto& tmpError,
780 const auto& tmpDescriptor)
781 {
782 error = tmpError;
783 if (error != Error::NONE) {
784 return;
785 }
786
787 mReader.setMQDescriptor(tmpDescriptor);
788 });
789 }
790
Chia-I Wuaab99f52016-10-05 12:59:58 +0800791 if (error != Error::NONE) {
792 return;
793 }
794
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800795 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
796 error = mReader.parse();
797 mReader.reset();
798 } else {
799 error = Error::NO_RESOURCES;
800 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800801 });
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700802 // executeCommands can fail because of out-of-fd and we do not want to
803 // abort() in that case
804 if (!ret.isOk()) {
805 ALOGE("executeCommands failed because of %s", ret.description().c_str());
806 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800807
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800808 if (error == Error::NONE) {
809 std::vector<CommandReader::CommandError> commandErrors =
810 mReader.takeErrors();
811
812 for (const auto& cmdErr : commandErrors) {
813 auto command = mWriter.getCommand(cmdErr.location);
814
815 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700816 command == IComposerClient::Command::PRESENT_DISPLAY ||
817 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800818 error = cmdErr.error;
819 } else {
820 ALOGW("command 0x%x generated error %d",
821 command, cmdErr.error);
822 }
823 }
824 }
825
826 mWriter.reset();
827
Chia-I Wuaab99f52016-10-05 12:59:58 +0800828 return error;
829}
830
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800831CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800832{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800833 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800834}
835
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800836Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800837{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800838 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800839
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800840 IComposerClient::Command command;
841 uint16_t length = 0;
842
843 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800844 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800845 break;
846 }
847
848 bool parsed = false;
849 switch (command) {
850 case IComposerClient::Command::SELECT_DISPLAY:
851 parsed = parseSelectDisplay(length);
852 break;
853 case IComposerClient::Command::SET_ERROR:
854 parsed = parseSetError(length);
855 break;
856 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
857 parsed = parseSetChangedCompositionTypes(length);
858 break;
859 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
860 parsed = parseSetDisplayRequests(length);
861 break;
862 case IComposerClient::Command::SET_PRESENT_FENCE:
863 parsed = parseSetPresentFence(length);
864 break;
865 case IComposerClient::Command::SET_RELEASE_FENCES:
866 parsed = parseSetReleaseFences(length);
867 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700868 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
869 parsed = parseSetPresentOrValidateDisplayResult(length);
870 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800871 default:
872 parsed = false;
873 break;
874 }
875
876 endCommand();
877
878 if (!parsed) {
879 ALOGE("failed to parse command 0x%x length %" PRIu16,
880 command, length);
881 break;
882 }
883 }
884
885 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800886}
887
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800888bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800889{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500890 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800891 return false;
892 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800893
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800894 mCurrentReturnData = &mReturnData[read64()];
895
896 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800897}
898
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800899bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800900{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500901 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800902 return false;
903 }
904
905 auto location = read();
906 auto error = static_cast<Error>(readSigned());
907
908 mErrors.emplace_back(CommandError{location, error});
909
910 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800911}
912
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800913bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800914{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800915 // (layer id, composition type) pairs
916 if (length % 3 != 0 || !mCurrentReturnData) {
917 return false;
918 }
919
920 uint32_t count = length / 3;
921 mCurrentReturnData->changedLayers.reserve(count);
922 mCurrentReturnData->compositionTypes.reserve(count);
923 while (count > 0) {
924 auto layer = read64();
925 auto type = static_cast<IComposerClient::Composition>(readSigned());
926
927 mCurrentReturnData->changedLayers.push_back(layer);
928 mCurrentReturnData->compositionTypes.push_back(type);
929
930 count--;
931 }
932
933 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800934}
935
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800936bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800937{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800938 // display requests followed by (layer id, layer requests) pairs
939 if (length % 3 != 1 || !mCurrentReturnData) {
940 return false;
941 }
942
943 mCurrentReturnData->displayRequests = read();
944
945 uint32_t count = (length - 1) / 3;
946 mCurrentReturnData->requestedLayers.reserve(count);
947 mCurrentReturnData->requestMasks.reserve(count);
948 while (count > 0) {
949 auto layer = read64();
950 auto layerRequestMask = read();
951
952 mCurrentReturnData->requestedLayers.push_back(layer);
953 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
954
955 count--;
956 }
957
958 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800959}
960
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800961bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800962{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500963 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800964 !mCurrentReturnData) {
965 return false;
966 }
967
968 if (mCurrentReturnData->presentFence >= 0) {
969 close(mCurrentReturnData->presentFence);
970 }
971 mCurrentReturnData->presentFence = readFence();
972
973 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800974}
975
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800976bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800977{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800978 // (layer id, release fence index) pairs
979 if (length % 3 != 0 || !mCurrentReturnData) {
980 return false;
981 }
982
983 uint32_t count = length / 3;
984 mCurrentReturnData->releasedLayers.reserve(count);
985 mCurrentReturnData->releaseFences.reserve(count);
986 while (count > 0) {
987 auto layer = read64();
988 auto fence = readFence();
989
990 mCurrentReturnData->releasedLayers.push_back(layer);
991 mCurrentReturnData->releaseFences.push_back(fence);
992
993 count--;
994 }
995
996 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800997}
998
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700999bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
1000{
1001 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1002 return false;
1003 }
1004 mCurrentReturnData->presentOrValidateState = read();
1005 return true;
1006}
1007
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001008void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001009{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001010 mErrors.clear();
1011
1012 for (auto& data : mReturnData) {
1013 if (data.second.presentFence >= 0) {
1014 close(data.second.presentFence);
1015 }
1016 for (auto fence : data.second.releaseFences) {
1017 if (fence >= 0) {
1018 close(fence);
1019 }
1020 }
1021 }
1022
1023 mReturnData.clear();
1024 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001025}
1026
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001027std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001028{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001029 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001030}
1031
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001032bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001033 uint32_t* outNumChangedCompositionTypes,
1034 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001035{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001036 auto found = mReturnData.find(display);
1037 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001038 *outNumChangedCompositionTypes = 0;
1039 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001040 return false;
1041 }
1042
1043 const ReturnData& data = found->second;
1044
Chia-I Wu67e376d2016-12-19 11:36:22 +08001045 *outNumChangedCompositionTypes = data.compositionTypes.size();
1046 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001047
1048 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001049}
1050
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001051void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001052 std::vector<Layer>* outLayers,
1053 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001054{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001055 auto found = mReturnData.find(display);
1056 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001057 outLayers->clear();
1058 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001059 return;
1060 }
1061
1062 ReturnData& data = found->second;
1063
Chia-I Wu67e376d2016-12-19 11:36:22 +08001064 *outLayers = std::move(data.changedLayers);
1065 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001066}
1067
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001068void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001069 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1070 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001071{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001072 auto found = mReturnData.find(display);
1073 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001074 *outDisplayRequestMask = 0;
1075 outLayers->clear();
1076 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001077 return;
1078 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001079
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001080 ReturnData& data = found->second;
1081
Chia-I Wu67e376d2016-12-19 11:36:22 +08001082 *outDisplayRequestMask = data.displayRequests;
1083 *outLayers = std::move(data.requestedLayers);
1084 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001085}
1086
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001087void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001088 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001089{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001090 auto found = mReturnData.find(display);
1091 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001092 outLayers->clear();
1093 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001094 return;
1095 }
1096
1097 ReturnData& data = found->second;
1098
Chia-I Wu67e376d2016-12-19 11:36:22 +08001099 *outLayers = std::move(data.releasedLayers);
1100 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001101}
1102
Chia-I Wu67e376d2016-12-19 11:36:22 +08001103void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001104{
1105 auto found = mReturnData.find(display);
1106 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001107 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001108 return;
1109 }
1110
1111 ReturnData& data = found->second;
1112
Chia-I Wu67e376d2016-12-19 11:36:22 +08001113 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001114 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001115}
1116
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001117void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1118 auto found = mReturnData.find(display);
1119 if (found == mReturnData.end()) {
1120 *state= -1;
1121 return;
1122 }
1123 ReturnData& data = found->second;
1124 *state = data.presentOrValidateState;
1125}
1126
Lloyd Piquea822d522017-12-20 16:42:57 -08001127} // namespace impl
1128
Chia-I Wuaab99f52016-10-05 12:59:58 +08001129} // namespace Hwc2
1130
1131} // namespace android