blob: c707e3cc65ec52528413e02c8e42fbdccf5e3528 [file] [log] [blame]
Chia-I Wuaab99f52016-10-05 12:59:58 +08001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "HwcComposer"
19
20#include <inttypes.h>
21#include <log/log.h>
Chia-I Wu06d63de2017-01-04 14:58:51 +080022#include <gui/BufferQueue.h>
Chia-I Wuaab99f52016-10-05 12:59:58 +080023
24#include "ComposerHal.h"
25
26namespace android {
27
28using hardware::Return;
29using hardware::hidl_vec;
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010030using hardware::hidl_handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080031
32namespace Hwc2 {
33
34namespace {
35
36class BufferHandle {
37public:
38 BufferHandle(const native_handle_t* buffer)
39 {
40 // nullptr is not a valid handle to HIDL
41 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
42 }
43
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010044 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080045 {
46 return mHandle;
47 }
48
49private:
50 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010051 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080052};
53
54class FenceHandle
55{
56public:
57 FenceHandle(int fd, bool owned)
58 : mOwned(owned)
59 {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010060 native_handle_t* handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080061 if (fd >= 0) {
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010062 handle = native_handle_init(mStorage, 1, 0);
63 handle->data[0] = fd;
Chia-I Wuaab99f52016-10-05 12:59:58 +080064 } else {
65 // nullptr is not a valid handle to HIDL
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010066 handle = native_handle_init(mStorage, 0, 0);
Chia-I Wuaab99f52016-10-05 12:59:58 +080067 }
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010068 mHandle = handle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080069 }
70
71 ~FenceHandle()
72 {
73 if (mOwned) {
74 native_handle_close(mHandle);
75 }
76 }
77
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010078 operator const hidl_handle&() const
Chia-I Wuaab99f52016-10-05 12:59:58 +080079 {
80 return mHandle;
81 }
82
83private:
84 bool mOwned;
85 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
Martijn Coenen7c5a92f2016-11-21 10:01:07 +010086 hidl_handle mHandle;
Chia-I Wuaab99f52016-10-05 12:59:58 +080087};
88
89// assume NO_RESOURCES when Status::isOk returns false
90constexpr Error kDefaultError = Error::NO_RESOURCES;
91
92template<typename T, typename U>
93T unwrapRet(Return<T>& ret, const U& default_val)
94{
Steven Moreland9d021002017-01-03 17:10:54 -080095 return (ret.isOk()) ? static_cast<T>(ret) :
Chia-I Wuaab99f52016-10-05 12:59:58 +080096 static_cast<T>(default_val);
97}
98
99Error unwrapRet(Return<Error>& ret)
100{
101 return unwrapRet(ret, kDefaultError);
102}
103
Chia-I Wuaab99f52016-10-05 12:59:58 +0800104} // anonymous namespace
105
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500106Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize)
107 : CommandWriterBase(initialMaxSize) {}
108
109Composer::CommandWriter::~CommandWriter()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800110{
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500111}
112
113void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
114{
115 constexpr uint16_t kSetLayerInfoLength = 2;
116 beginCommand(
117 static_cast<IComposerClient::Command>(
118 IVrComposerClient::VrCommand::SET_LAYER_INFO),
119 kSetLayerInfoLength);
120 write(type);
121 write(appId);
122 endCommand();
123}
124
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400125void Composer::CommandWriter::setClientTargetMetadata(
126 const IVrComposerClient::BufferMetadata& metadata)
127{
128 constexpr uint16_t kSetClientTargetMetadataLength = 7;
129 beginCommand(
130 static_cast<IComposerClient::Command>(
131 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
132 kSetClientTargetMetadataLength);
133 writeBufferMetadata(metadata);
134 endCommand();
135}
136
137void Composer::CommandWriter::setLayerBufferMetadata(
138 const IVrComposerClient::BufferMetadata& metadata)
139{
140 constexpr uint16_t kSetLayerBufferMetadataLength = 7;
141 beginCommand(
142 static_cast<IComposerClient::Command>(
143 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
144 kSetLayerBufferMetadataLength);
145 writeBufferMetadata(metadata);
146 endCommand();
147}
148
149void Composer::CommandWriter::writeBufferMetadata(
150 const IVrComposerClient::BufferMetadata& metadata)
151{
152 write(metadata.width);
153 write(metadata.height);
154 write(metadata.stride);
155 write(metadata.layerCount);
156 writeSigned(static_cast<int32_t>(metadata.format));
157 write64(metadata.usage);
158}
159
Kalle Raitaa099a242017-01-11 11:17:29 -0800160Composer::Composer(const std::string& serviceName)
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800161 : mWriter(kWriterInitialSize),
Kalle Raitaa099a242017-01-11 11:17:29 -0800162 mIsUsingVrComposer(serviceName == std::string("vr"))
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500163{
Kalle Raitaa099a242017-01-11 11:17:29 -0800164 mComposer = IComposer::getService(serviceName);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500165
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800166 if (mComposer == nullptr) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800167 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
168 }
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800169
170 mComposer->createClient(
171 [&](const auto& tmpError, const auto& tmpClient)
172 {
173 if (tmpError == Error::NONE) {
174 mClient = tmpClient;
175 }
176 });
177 if (mClient == nullptr) {
178 LOG_ALWAYS_FATAL("failed to create composer client");
179 }
Daniel Nicoaraa50abc22017-05-15 10:34:08 -0400180
181 if (mIsUsingVrComposer) {
182 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
183 if (vrClient == nullptr) {
184 LOG_ALWAYS_FATAL("failed to create vr composer client");
185 }
186 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800187}
188
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800189std::vector<IComposer::Capability> Composer::getCapabilities()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800190{
191 std::vector<IComposer::Capability> capabilities;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800192 mComposer->getCapabilities(
Chia-I Wuaab99f52016-10-05 12:59:58 +0800193 [&](const auto& tmpCapabilities) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800194 capabilities = tmpCapabilities;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800195 });
196
197 return capabilities;
198}
199
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800200std::string Composer::dumpDebugInfo()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800201{
202 std::string info;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800203 mComposer->dumpDebugInfo([&](const auto& tmpInfo) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800204 info = tmpInfo.c_str();
205 });
206
207 return info;
208}
209
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800210void Composer::registerCallback(const sp<IComposerCallback>& callback)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800211{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800212 auto ret = mClient->registerCallback(callback);
Steven Moreland9d021002017-01-03 17:10:54 -0800213 if (!ret.isOk()) {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800214 ALOGE("failed to register IComposerCallback");
215 }
216}
217
Steven Thomasb02664d2017-07-26 18:48:28 -0700218bool Composer::isRemote() {
219 return mClient->isRemote();
220}
221
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700222void Composer::resetCommands() {
223 mWriter.reset();
224}
225
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700226Error Composer::executeCommands() {
227 return execute();
228}
229
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800230uint32_t Composer::getMaxVirtualDisplayCount()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800231{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800232 auto ret = mClient->getMaxVirtualDisplayCount();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800233 return unwrapRet(ret, 0);
234}
235
236Error Composer::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800237 PixelFormat* format, Display* outDisplay)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800238{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800239 const uint32_t bufferSlotCount = 1;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800240 Error error = kDefaultError;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800241 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800242 [&](const auto& tmpError, const auto& tmpDisplay,
243 const auto& tmpFormat) {
244 error = tmpError;
245 if (error != Error::NONE) {
246 return;
247 }
248
Chia-I Wu67e376d2016-12-19 11:36:22 +0800249 *outDisplay = tmpDisplay;
250 *format = tmpFormat;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251 });
252
253 return error;
254}
255
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800256Error Composer::destroyVirtualDisplay(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800258 auto ret = mClient->destroyVirtualDisplay(display);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259 return unwrapRet(ret);
260}
261
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800262Error Composer::acceptDisplayChanges(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800263{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800264 mWriter.selectDisplay(display);
265 mWriter.acceptDisplayChanges();
266 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800267}
268
Chia-I Wu67e376d2016-12-19 11:36:22 +0800269Error Composer::createLayer(Display display, Layer* outLayer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800270{
271 Error error = kDefaultError;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800272 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800273 [&](const auto& tmpError, const auto& tmpLayer) {
274 error = tmpError;
275 if (error != Error::NONE) {
276 return;
277 }
278
Chia-I Wu67e376d2016-12-19 11:36:22 +0800279 *outLayer = tmpLayer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800280 });
281
282 return error;
283}
284
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800285Error Composer::destroyLayer(Display display, Layer layer)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800286{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800287 auto ret = mClient->destroyLayer(display, layer);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800288 return unwrapRet(ret);
289}
290
Chia-I Wu67e376d2016-12-19 11:36:22 +0800291Error Composer::getActiveConfig(Display display, Config* outConfig)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800292{
293 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800294 mClient->getActiveConfig(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295 [&](const auto& tmpError, const auto& tmpConfig) {
296 error = tmpError;
297 if (error != Error::NONE) {
298 return;
299 }
300
Chia-I Wu67e376d2016-12-19 11:36:22 +0800301 *outConfig = tmpConfig;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800302 });
303
304 return error;
305}
306
307Error Composer::getChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800308 std::vector<Layer>* outLayers,
309 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800310{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800311 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800312 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800313}
314
315Error Composer::getColorModes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800316 std::vector<ColorMode>* outModes)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800317{
318 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800319 mClient->getColorModes(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800320 [&](const auto& tmpError, const auto& tmpModes) {
321 error = tmpError;
322 if (error != Error::NONE) {
323 return;
324 }
325
Chia-I Wu67e376d2016-12-19 11:36:22 +0800326 *outModes = tmpModes;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800327 });
328
329 return error;
330}
331
332Error Composer::getDisplayAttribute(Display display, Config config,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800333 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800334{
335 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800336 mClient->getDisplayAttribute(display, config, attribute,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800337 [&](const auto& tmpError, const auto& tmpValue) {
338 error = tmpError;
339 if (error != Error::NONE) {
340 return;
341 }
342
Chia-I Wu67e376d2016-12-19 11:36:22 +0800343 *outValue = tmpValue;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800344 });
345
346 return error;
347}
348
349Error Composer::getDisplayConfigs(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800350 std::vector<Config>* outConfigs)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800351{
352 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800353 mClient->getDisplayConfigs(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800354 [&](const auto& tmpError, const auto& tmpConfigs) {
355 error = tmpError;
356 if (error != Error::NONE) {
357 return;
358 }
359
Chia-I Wu67e376d2016-12-19 11:36:22 +0800360 *outConfigs = tmpConfigs;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800361 });
362
363 return error;
364}
365
Chia-I Wu67e376d2016-12-19 11:36:22 +0800366Error Composer::getDisplayName(Display display, std::string* outName)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800367{
368 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800369 mClient->getDisplayName(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800370 [&](const auto& tmpError, const auto& tmpName) {
371 error = tmpError;
372 if (error != Error::NONE) {
373 return;
374 }
375
Chia-I Wu67e376d2016-12-19 11:36:22 +0800376 *outName = tmpName.c_str();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800377 });
378
379 return error;
380}
381
382Error Composer::getDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800383 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
384 std::vector<uint32_t>* outLayerRequestMasks)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800385{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800386 mReader.takeDisplayRequests(display, outDisplayRequestMask,
387 outLayers, outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800388 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800389}
390
Chia-I Wu67e376d2016-12-19 11:36:22 +0800391Error Composer::getDisplayType(Display display,
392 IComposerClient::DisplayType* outType)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800393{
394 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800395 mClient->getDisplayType(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800396 [&](const auto& tmpError, const auto& tmpType) {
397 error = tmpError;
398 if (error != Error::NONE) {
399 return;
400 }
401
Chia-I Wu67e376d2016-12-19 11:36:22 +0800402 *outType = tmpType;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800403 });
404
405 return error;
406}
407
Chia-I Wu67e376d2016-12-19 11:36:22 +0800408Error Composer::getDozeSupport(Display display, bool* outSupport)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800409{
410 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800411 mClient->getDozeSupport(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800412 [&](const auto& tmpError, const auto& tmpSupport) {
413 error = tmpError;
414 if (error != Error::NONE) {
415 return;
416 }
417
Chia-I Wu67e376d2016-12-19 11:36:22 +0800418 *outSupport = tmpSupport;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800419 });
420
421 return error;
422}
423
Chia-I Wu67e376d2016-12-19 11:36:22 +0800424Error Composer::getHdrCapabilities(Display display,
425 std::vector<Hdr>* outTypes, float* outMaxLuminance,
426 float* outMaxAverageLuminance, float* outMinLuminance)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800427{
428 Error error = kDefaultError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800429 mClient->getHdrCapabilities(display,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800430 [&](const auto& tmpError, const auto& tmpTypes,
431 const auto& tmpMaxLuminance,
432 const auto& tmpMaxAverageLuminance,
433 const auto& tmpMinLuminance) {
434 error = tmpError;
435 if (error != Error::NONE) {
436 return;
437 }
438
Chia-I Wu67e376d2016-12-19 11:36:22 +0800439 *outTypes = tmpTypes;
440 *outMaxLuminance = tmpMaxLuminance;
441 *outMaxAverageLuminance = tmpMaxAverageLuminance;
442 *outMinLuminance = tmpMinLuminance;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800443 });
444
445 return error;
446}
447
Chia-I Wu67e376d2016-12-19 11:36:22 +0800448Error Composer::getReleaseFences(Display display,
449 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800450{
Chia-I Wu67e376d2016-12-19 11:36:22 +0800451 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800452 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800453}
454
Chia-I Wu67e376d2016-12-19 11:36:22 +0800455Error Composer::presentDisplay(Display display, int* outPresentFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800456{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800457 mWriter.selectDisplay(display);
458 mWriter.presentDisplay();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800459
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800460 Error error = execute();
461 if (error != Error::NONE) {
462 return error;
463 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800464
Chia-I Wu67e376d2016-12-19 11:36:22 +0800465 mReader.takePresentFence(display, outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800466
467 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800468}
469
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800470Error Composer::setActiveConfig(Display display, Config config)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800471{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800472 auto ret = mClient->setActiveConfig(display, config);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800473 return unwrapRet(ret);
474}
475
Chia-I Wu06d63de2017-01-04 14:58:51 +0800476Error Composer::setClientTarget(Display display, uint32_t slot,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400477 const sp<GraphicBuffer>& target,
Chia-I Wuaab99f52016-10-05 12:59:58 +0800478 int acquireFence, Dataspace dataspace,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800479 const std::vector<IComposerClient::Rect>& damage)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800480{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800481 mWriter.selectDisplay(display);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400482 if (mIsUsingVrComposer && target.get()) {
483 IVrComposerClient::BufferMetadata metadata = {
484 .width = target->getWidth(),
485 .height = target->getHeight(),
486 .stride = target->getStride(),
487 .layerCount = target->getLayerCount(),
488 .format = static_cast<PixelFormat>(target->getPixelFormat()),
489 .usage = target->getUsage(),
490 };
491 mWriter.setClientTargetMetadata(metadata);
492 }
493
494 const native_handle_t* handle = nullptr;
495 if (target.get()) {
496 handle = target->getNativeBuffer()->handle;
497 }
498
499 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800500 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800501}
502
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800503Error Composer::setColorMode(Display display, ColorMode mode)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800504{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800505 auto ret = mClient->setColorMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800506 return unwrapRet(ret);
507}
508
509Error Composer::setColorTransform(Display display, const float* matrix,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800510 ColorTransform hint)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800511{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800512 mWriter.selectDisplay(display);
513 mWriter.setColorTransform(matrix, hint);
514 return Error::NONE;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800515}
516
517Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800518 int releaseFence)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800519{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800520 mWriter.selectDisplay(display);
521 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
522 return Error::NONE;
523}
Chia-I Wuaab99f52016-10-05 12:59:58 +0800524
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800525Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
526{
527 auto ret = mClient->setPowerMode(display, mode);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800528 return unwrapRet(ret);
529}
530
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800531Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800532{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800533 auto ret = mClient->setVsyncEnabled(display, enabled);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800534 return unwrapRet(ret);
535}
536
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800537Error Composer::setClientTargetSlotCount(Display display)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800538{
Chia-I Wu06d63de2017-01-04 14:58:51 +0800539 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800540 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
Chia-I Wuaab99f52016-10-05 12:59:58 +0800541 return unwrapRet(ret);
542}
543
Chia-I Wu67e376d2016-12-19 11:36:22 +0800544Error Composer::validateDisplay(Display display, uint32_t* outNumTypes,
545 uint32_t* outNumRequests)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800546{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800547 mWriter.selectDisplay(display);
548 mWriter.validateDisplay();
549
550 Error error = execute();
551 if (error != Error::NONE) {
552 return error;
553 }
554
Chia-I Wu67e376d2016-12-19 11:36:22 +0800555 mReader.hasChanges(display, outNumTypes, outNumRequests);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800556
557 return Error::NONE;
558}
559
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700560Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
561 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) {
562 mWriter.selectDisplay(display);
563 mWriter.presentOrvalidateDisplay();
564
565 Error error = execute();
566 if (error != Error::NONE) {
567 return error;
568 }
569
570 mReader.takePresentOrValidateStage(display, state);
571
572 if (*state == 1) { // Present succeeded
573 mReader.takePresentFence(display, outPresentFence);
574 }
575
576 if (*state == 0) { // Validate succeeded.
577 mReader.hasChanges(display, outNumTypes, outNumRequests);
578 }
579
580 return Error::NONE;
581}
582
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800583Error Composer::setCursorPosition(Display display, Layer layer,
584 int32_t x, int32_t y)
585{
586 mWriter.selectDisplay(display);
587 mWriter.selectLayer(layer);
588 mWriter.setLayerCursorPosition(x, y);
589 return Error::NONE;
590}
591
592Error Composer::setLayerBuffer(Display display, Layer layer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400593 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800594{
595 mWriter.selectDisplay(display);
596 mWriter.selectLayer(layer);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400597 if (mIsUsingVrComposer && buffer.get()) {
598 IVrComposerClient::BufferMetadata metadata = {
599 .width = buffer->getWidth(),
600 .height = buffer->getHeight(),
601 .stride = buffer->getStride(),
602 .layerCount = buffer->getLayerCount(),
603 .format = static_cast<PixelFormat>(buffer->getPixelFormat()),
604 .usage = buffer->getUsage(),
605 };
606 mWriter.setLayerBufferMetadata(metadata);
607 }
608
609 const native_handle_t* handle = nullptr;
610 if (buffer.get()) {
611 handle = buffer->getNativeBuffer()->handle;
612 }
613
614 mWriter.setLayerBuffer(slot, handle, acquireFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800615 return Error::NONE;
616}
617
618Error Composer::setLayerSurfaceDamage(Display display, Layer layer,
619 const std::vector<IComposerClient::Rect>& damage)
620{
621 mWriter.selectDisplay(display);
622 mWriter.selectLayer(layer);
623 mWriter.setLayerSurfaceDamage(damage);
624 return Error::NONE;
625}
626
627Error Composer::setLayerBlendMode(Display display, Layer layer,
628 IComposerClient::BlendMode mode)
629{
630 mWriter.selectDisplay(display);
631 mWriter.selectLayer(layer);
632 mWriter.setLayerBlendMode(mode);
633 return Error::NONE;
634}
635
636Error Composer::setLayerColor(Display display, Layer layer,
637 const IComposerClient::Color& color)
638{
639 mWriter.selectDisplay(display);
640 mWriter.selectLayer(layer);
641 mWriter.setLayerColor(color);
642 return Error::NONE;
643}
644
645Error Composer::setLayerCompositionType(Display display, Layer layer,
646 IComposerClient::Composition type)
647{
648 mWriter.selectDisplay(display);
649 mWriter.selectLayer(layer);
650 mWriter.setLayerCompositionType(type);
651 return Error::NONE;
652}
653
654Error Composer::setLayerDataspace(Display display, Layer layer,
655 Dataspace dataspace)
656{
657 mWriter.selectDisplay(display);
658 mWriter.selectLayer(layer);
659 mWriter.setLayerDataspace(dataspace);
660 return Error::NONE;
661}
662
663Error Composer::setLayerDisplayFrame(Display display, Layer layer,
664 const IComposerClient::Rect& frame)
665{
666 mWriter.selectDisplay(display);
667 mWriter.selectLayer(layer);
668 mWriter.setLayerDisplayFrame(frame);
669 return Error::NONE;
670}
671
672Error Composer::setLayerPlaneAlpha(Display display, Layer layer,
673 float alpha)
674{
675 mWriter.selectDisplay(display);
676 mWriter.selectLayer(layer);
677 mWriter.setLayerPlaneAlpha(alpha);
678 return Error::NONE;
679}
680
681Error Composer::setLayerSidebandStream(Display display, Layer layer,
682 const native_handle_t* stream)
683{
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerSidebandStream(stream);
687 return Error::NONE;
688}
689
690Error Composer::setLayerSourceCrop(Display display, Layer layer,
691 const IComposerClient::FRect& crop)
692{
693 mWriter.selectDisplay(display);
694 mWriter.selectLayer(layer);
695 mWriter.setLayerSourceCrop(crop);
696 return Error::NONE;
697}
698
699Error Composer::setLayerTransform(Display display, Layer layer,
700 Transform transform)
701{
702 mWriter.selectDisplay(display);
703 mWriter.selectLayer(layer);
704 mWriter.setLayerTransform(transform);
705 return Error::NONE;
706}
707
708Error Composer::setLayerVisibleRegion(Display display, Layer layer,
709 const std::vector<IComposerClient::Rect>& visible)
710{
711 mWriter.selectDisplay(display);
712 mWriter.selectLayer(layer);
713 mWriter.setLayerVisibleRegion(visible);
714 return Error::NONE;
715}
716
717Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z)
718{
719 mWriter.selectDisplay(display);
720 mWriter.selectLayer(layer);
721 mWriter.setLayerZOrder(z);
722 return Error::NONE;
723}
724
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500725Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type,
726 uint32_t appId)
727{
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800728 if (mIsUsingVrComposer) {
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731 mWriter.setLayerInfo(type, appId);
732 }
733 return Error::NONE;
734}
735
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800736Error Composer::execute()
737{
738 // prepare input command queue
739 bool queueChanged = false;
740 uint32_t commandLength = 0;
741 hidl_vec<hidl_handle> commandHandles;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800742 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800743 mWriter.reset();
744 return Error::NO_RESOURCES;
745 }
746
747 // set up new input command queue if necessary
748 if (queueChanged) {
749 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
750 auto error = unwrapRet(ret);
751 if (error != Error::NONE) {
752 mWriter.reset();
753 return error;
754 }
755 }
756
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700757 if (commandLength == 0) {
758 mWriter.reset();
759 return Error::NONE;
760 }
761
Chia-I Wuaab99f52016-10-05 12:59:58 +0800762 Error error = kDefaultError;
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700763 auto ret = mClient->executeCommands(commandLength, commandHandles,
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800764 [&](const auto& tmpError, const auto& tmpOutChanged,
765 const auto& tmpOutLength, const auto& tmpOutHandles)
766 {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800767 error = tmpError;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800768
769 // set up new output command queue if necessary
770 if (error == Error::NONE && tmpOutChanged) {
771 error = kDefaultError;
772 mClient->getOutputCommandQueue(
773 [&](const auto& tmpError,
774 const auto& tmpDescriptor)
775 {
776 error = tmpError;
777 if (error != Error::NONE) {
778 return;
779 }
780
781 mReader.setMQDescriptor(tmpDescriptor);
782 });
783 }
784
Chia-I Wuaab99f52016-10-05 12:59:58 +0800785 if (error != Error::NONE) {
786 return;
787 }
788
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800789 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
790 error = mReader.parse();
791 mReader.reset();
792 } else {
793 error = Error::NO_RESOURCES;
794 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800795 });
Chia-I Wuc0b2b0c2017-09-08 10:14:34 -0700796 // executeCommands can fail because of out-of-fd and we do not want to
797 // abort() in that case
798 if (!ret.isOk()) {
799 ALOGE("executeCommands failed because of %s", ret.description().c_str());
800 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800801
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800802 if (error == Error::NONE) {
803 std::vector<CommandReader::CommandError> commandErrors =
804 mReader.takeErrors();
805
806 for (const auto& cmdErr : commandErrors) {
807 auto command = mWriter.getCommand(cmdErr.location);
808
809 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700810 command == IComposerClient::Command::PRESENT_DISPLAY ||
811 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800812 error = cmdErr.error;
813 } else {
814 ALOGW("command 0x%x generated error %d",
815 command, cmdErr.error);
816 }
817 }
818 }
819
820 mWriter.reset();
821
Chia-I Wuaab99f52016-10-05 12:59:58 +0800822 return error;
823}
824
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800825CommandReader::~CommandReader()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800826{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800827 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800828}
829
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800830Error CommandReader::parse()
Chia-I Wuaab99f52016-10-05 12:59:58 +0800831{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800832 resetData();
Chia-I Wuaab99f52016-10-05 12:59:58 +0800833
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800834 IComposerClient::Command command;
835 uint16_t length = 0;
836
837 while (!isEmpty()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +0800838 if (!beginCommand(&command, &length)) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800839 break;
840 }
841
842 bool parsed = false;
843 switch (command) {
844 case IComposerClient::Command::SELECT_DISPLAY:
845 parsed = parseSelectDisplay(length);
846 break;
847 case IComposerClient::Command::SET_ERROR:
848 parsed = parseSetError(length);
849 break;
850 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
851 parsed = parseSetChangedCompositionTypes(length);
852 break;
853 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
854 parsed = parseSetDisplayRequests(length);
855 break;
856 case IComposerClient::Command::SET_PRESENT_FENCE:
857 parsed = parseSetPresentFence(length);
858 break;
859 case IComposerClient::Command::SET_RELEASE_FENCES:
860 parsed = parseSetReleaseFences(length);
861 break;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700862 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
863 parsed = parseSetPresentOrValidateDisplayResult(length);
864 break;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800865 default:
866 parsed = false;
867 break;
868 }
869
870 endCommand();
871
872 if (!parsed) {
873 ALOGE("failed to parse command 0x%x length %" PRIu16,
874 command, length);
875 break;
876 }
877 }
878
879 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800880}
881
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800882bool CommandReader::parseSelectDisplay(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800883{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500884 if (length != CommandWriterBase::kSelectDisplayLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800885 return false;
886 }
Chia-I Wuaab99f52016-10-05 12:59:58 +0800887
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800888 mCurrentReturnData = &mReturnData[read64()];
889
890 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800891}
892
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800893bool CommandReader::parseSetError(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800894{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500895 if (length != CommandWriterBase::kSetErrorLength) {
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800896 return false;
897 }
898
899 auto location = read();
900 auto error = static_cast<Error>(readSigned());
901
902 mErrors.emplace_back(CommandError{location, error});
903
904 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800905}
906
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800907bool CommandReader::parseSetChangedCompositionTypes(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800908{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800909 // (layer id, composition type) pairs
910 if (length % 3 != 0 || !mCurrentReturnData) {
911 return false;
912 }
913
914 uint32_t count = length / 3;
915 mCurrentReturnData->changedLayers.reserve(count);
916 mCurrentReturnData->compositionTypes.reserve(count);
917 while (count > 0) {
918 auto layer = read64();
919 auto type = static_cast<IComposerClient::Composition>(readSigned());
920
921 mCurrentReturnData->changedLayers.push_back(layer);
922 mCurrentReturnData->compositionTypes.push_back(type);
923
924 count--;
925 }
926
927 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800928}
929
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800930bool CommandReader::parseSetDisplayRequests(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800931{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800932 // display requests followed by (layer id, layer requests) pairs
933 if (length % 3 != 1 || !mCurrentReturnData) {
934 return false;
935 }
936
937 mCurrentReturnData->displayRequests = read();
938
939 uint32_t count = (length - 1) / 3;
940 mCurrentReturnData->requestedLayers.reserve(count);
941 mCurrentReturnData->requestMasks.reserve(count);
942 while (count > 0) {
943 auto layer = read64();
944 auto layerRequestMask = read();
945
946 mCurrentReturnData->requestedLayers.push_back(layer);
947 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
948
949 count--;
950 }
951
952 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800953}
954
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800955bool CommandReader::parseSetPresentFence(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800956{
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -0500957 if (length != CommandWriterBase::kSetPresentFenceLength ||
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800958 !mCurrentReturnData) {
959 return false;
960 }
961
962 if (mCurrentReturnData->presentFence >= 0) {
963 close(mCurrentReturnData->presentFence);
964 }
965 mCurrentReturnData->presentFence = readFence();
966
967 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800968}
969
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800970bool CommandReader::parseSetReleaseFences(uint16_t length)
Chia-I Wuaab99f52016-10-05 12:59:58 +0800971{
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800972 // (layer id, release fence index) pairs
973 if (length % 3 != 0 || !mCurrentReturnData) {
974 return false;
975 }
976
977 uint32_t count = length / 3;
978 mCurrentReturnData->releasedLayers.reserve(count);
979 mCurrentReturnData->releaseFences.reserve(count);
980 while (count > 0) {
981 auto layer = read64();
982 auto fence = readFence();
983
984 mCurrentReturnData->releasedLayers.push_back(layer);
985 mCurrentReturnData->releaseFences.push_back(fence);
986
987 count--;
988 }
989
990 return true;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800991}
992
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700993bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length)
994{
995 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
996 return false;
997 }
998 mCurrentReturnData->presentOrValidateState = read();
999 return true;
1000}
1001
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001002void CommandReader::resetData()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001003{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001004 mErrors.clear();
1005
1006 for (auto& data : mReturnData) {
1007 if (data.second.presentFence >= 0) {
1008 close(data.second.presentFence);
1009 }
1010 for (auto fence : data.second.releaseFences) {
1011 if (fence >= 0) {
1012 close(fence);
1013 }
1014 }
1015 }
1016
1017 mReturnData.clear();
1018 mCurrentReturnData = nullptr;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001019}
1020
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001021std::vector<CommandReader::CommandError> CommandReader::takeErrors()
Chia-I Wuaab99f52016-10-05 12:59:58 +08001022{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001023 return std::move(mErrors);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001024}
1025
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001026bool CommandReader::hasChanges(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001027 uint32_t* outNumChangedCompositionTypes,
1028 uint32_t* outNumLayerRequestMasks) const
Chia-I Wuaab99f52016-10-05 12:59:58 +08001029{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001030 auto found = mReturnData.find(display);
1031 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001032 *outNumChangedCompositionTypes = 0;
1033 *outNumLayerRequestMasks = 0;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001034 return false;
1035 }
1036
1037 const ReturnData& data = found->second;
1038
Chia-I Wu67e376d2016-12-19 11:36:22 +08001039 *outNumChangedCompositionTypes = data.compositionTypes.size();
1040 *outNumLayerRequestMasks = data.requestMasks.size();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001041
1042 return !(data.compositionTypes.empty() && data.requestMasks.empty());
Chia-I Wuaab99f52016-10-05 12:59:58 +08001043}
1044
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001045void CommandReader::takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001046 std::vector<Layer>* outLayers,
1047 std::vector<IComposerClient::Composition>* outTypes)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001048{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001049 auto found = mReturnData.find(display);
1050 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001051 outLayers->clear();
1052 outTypes->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001053 return;
1054 }
1055
1056 ReturnData& data = found->second;
1057
Chia-I Wu67e376d2016-12-19 11:36:22 +08001058 *outLayers = std::move(data.changedLayers);
1059 *outTypes = std::move(data.compositionTypes);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001060}
1061
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001062void CommandReader::takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001063 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
1064 std::vector<uint32_t>* outLayerRequestMasks)
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 *outDisplayRequestMask = 0;
1069 outLayers->clear();
1070 outLayerRequestMasks->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001071 return;
1072 }
Chia-I Wuaab99f52016-10-05 12:59:58 +08001073
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001074 ReturnData& data = found->second;
1075
Chia-I Wu67e376d2016-12-19 11:36:22 +08001076 *outDisplayRequestMask = data.displayRequests;
1077 *outLayers = std::move(data.requestedLayers);
1078 *outLayerRequestMasks = std::move(data.requestMasks);
Chia-I Wuaab99f52016-10-05 12:59:58 +08001079}
1080
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001081void CommandReader::takeReleaseFences(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +08001082 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
Chia-I Wuaab99f52016-10-05 12:59:58 +08001083{
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001084 auto found = mReturnData.find(display);
1085 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001086 outLayers->clear();
1087 outReleaseFences->clear();
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001088 return;
1089 }
1090
1091 ReturnData& data = found->second;
1092
Chia-I Wu67e376d2016-12-19 11:36:22 +08001093 *outLayers = std::move(data.releasedLayers);
1094 *outReleaseFences = std::move(data.releaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001095}
1096
Chia-I Wu67e376d2016-12-19 11:36:22 +08001097void CommandReader::takePresentFence(Display display, int* outPresentFence)
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001098{
1099 auto found = mReturnData.find(display);
1100 if (found == mReturnData.end()) {
Chia-I Wu67e376d2016-12-19 11:36:22 +08001101 *outPresentFence = -1;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001102 return;
1103 }
1104
1105 ReturnData& data = found->second;
1106
Chia-I Wu67e376d2016-12-19 11:36:22 +08001107 *outPresentFence = data.presentFence;
Chia-I Wucd8d7f02016-11-16 11:02:31 +08001108 data.presentFence = -1;
Chia-I Wuaab99f52016-10-05 12:59:58 +08001109}
1110
Fabien Sanglard249c0ae2017-06-19 19:22:36 -07001111void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1112 auto found = mReturnData.find(display);
1113 if (found == mReturnData.end()) {
1114 *state= -1;
1115 return;
1116 }
1117 ReturnData& data = found->second;
1118 *state = data.presentOrValidateState;
1119}
1120
Chia-I Wuaab99f52016-10-05 12:59:58 +08001121} // namespace Hwc2
1122
1123} // namespace android