blob: 96f4496eb6f862aa5724544ef67894f2c16b4097 [file] [log] [blame]
Ady Abraham9fc28052021-10-14 17:21:38 -07001/*
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// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
21#undef LOG_TAG
22#define LOG_TAG "HwcComposer"
23#define ATRACE_TAG ATRACE_TAG_GRAPHICS
24
25#include "HidlComposerHal.h"
26
27#include <android/binder_manager.h>
28#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
29#include <hidl/HidlTransportSupport.h>
30#include <hidl/HidlTransportUtils.h>
31#include <log/log.h>
32#include <utils/Trace.h>
Leon Scroggins III09c25412021-12-02 14:49:56 -050033#include "Hal.h"
Ady Abraham9fc28052021-10-14 17:21:38 -070034
35#include <algorithm>
36#include <cinttypes>
37
38namespace android {
39
40using hardware::hidl_handle;
41using hardware::hidl_vec;
42using hardware::Return;
43
44namespace Hwc2 {
45
46HidlComposer::~HidlComposer() = default;
47
48namespace {
49
50class BufferHandle {
51public:
52 explicit BufferHandle(const native_handle_t* buffer) {
53 // nullptr is not a valid handle to HIDL
54 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
55 }
56
57 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
58 {
59 return mHandle;
60 }
61
62private:
63 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
64 hidl_handle mHandle;
65};
66
67class FenceHandle {
68public:
69 FenceHandle(int fd, bool owned) : mOwned(owned) {
70 native_handle_t* handle;
71 if (fd >= 0) {
72 handle = native_handle_init(mStorage, 1, 0);
73 handle->data[0] = fd;
74 } else {
75 // nullptr is not a valid handle to HIDL
76 handle = native_handle_init(mStorage, 0, 0);
77 }
78 mHandle = handle;
79 }
80
81 ~FenceHandle() {
82 if (mOwned) {
83 native_handle_close(mHandle);
84 }
85 }
86
87 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
88 {
89 return mHandle;
90 }
91
92private:
93 bool mOwned;
94 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
95 hidl_handle mHandle;
96};
97
98// assume NO_RESOURCES when Status::isOk returns false
99constexpr Error kDefaultError = Error::NO_RESOURCES;
100constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
101
102template <typename T, typename U>
103T unwrapRet(Return<T>& ret, const U& default_val) {
104 return (ret.isOk()) ? static_cast<T>(ret) : static_cast<T>(default_val);
105}
106
107Error unwrapRet(Return<Error>& ret) {
108 return unwrapRet(ret, kDefaultError);
109}
110
111} // anonymous namespace
112
113HidlComposer::HidlComposer(const std::string& serviceName) : mWriter(kWriterInitialSize) {
114 mComposer = V2_1::IComposer::getService(serviceName);
115
116 if (mComposer == nullptr) {
117 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
118 }
119
120 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
121 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
122 if (tmpError == V2_4::Error::NONE) {
123 mClient = tmpClient;
124 mClient_2_2 = tmpClient;
125 mClient_2_3 = tmpClient;
126 mClient_2_4 = tmpClient;
127 }
128 });
129 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
130 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
131 if (tmpError == Error::NONE) {
132 mClient = tmpClient;
133 mClient_2_2 = tmpClient;
134 mClient_2_3 = tmpClient;
135 }
136 });
137 } else {
138 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
139 if (tmpError != Error::NONE) {
140 return;
141 }
142
143 mClient = tmpClient;
144 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
145 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
146 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
147 "IComposer 2.2 did not return IComposerClient 2.2");
148 }
149 });
150 }
151
152 if (mClient == nullptr) {
153 LOG_ALWAYS_FATAL("failed to create composer client");
154 }
155}
156
Ady Abraham4d211cf2021-12-14 16:19:03 -0800157bool HidlComposer::isSupported(OptionalFeature feature) const {
158 switch (feature) {
159 case OptionalFeature::RefreshRateSwitching:
160 return mClient_2_4 != nullptr;
Ady Abraham43065bd2021-12-10 17:22:15 -0800161 case OptionalFeature::ExpectedPresentTime:
162 return false;
Ady Abraham4d211cf2021-12-14 16:19:03 -0800163 }
164}
165
Ady Abraham9fc28052021-10-14 17:21:38 -0700166std::vector<IComposer::Capability> HidlComposer::getCapabilities() {
167 std::vector<IComposer::Capability> capabilities;
168 mComposer->getCapabilities(
169 [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
170 return capabilities;
171}
172
173std::string HidlComposer::dumpDebugInfo() {
174 std::string info;
175 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { info = tmpInfo.c_str(); });
176
177 return info;
178}
179
180void HidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
181 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
182
183 auto ret = [&]() {
184 if (mClient_2_4) {
185 return mClient_2_4->registerCallback_2_4(callback);
186 }
187 return mClient->registerCallback(callback);
188 }();
189 if (!ret.isOk()) {
190 ALOGE("failed to register IComposerCallback");
191 }
192}
193
194void HidlComposer::resetCommands() {
195 mWriter.reset();
196}
197
198Error HidlComposer::executeCommands() {
199 return execute();
200}
201
202uint32_t HidlComposer::getMaxVirtualDisplayCount() {
203 auto ret = mClient->getMaxVirtualDisplayCount();
204 return unwrapRet(ret, 0);
205}
206
207Error HidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
208 Display* outDisplay) {
209 const uint32_t bufferSlotCount = 1;
210 Error error = kDefaultError;
211 if (mClient_2_2) {
212 mClient_2_2->createVirtualDisplay_2_2(width, height,
213 static_cast<types::V1_1::PixelFormat>(*format),
214 bufferSlotCount,
215 [&](const auto& tmpError, const auto& tmpDisplay,
216 const auto& tmpFormat) {
217 error = tmpError;
218 if (error != Error::NONE) {
219 return;
220 }
221
222 *outDisplay = tmpDisplay;
223 *format = static_cast<types::V1_2::PixelFormat>(
224 tmpFormat);
225 });
226 } else {
227 mClient->createVirtualDisplay(width, height, static_cast<types::V1_0::PixelFormat>(*format),
228 bufferSlotCount,
229 [&](const auto& tmpError, const auto& tmpDisplay,
230 const auto& tmpFormat) {
231 error = tmpError;
232 if (error != Error::NONE) {
233 return;
234 }
235
236 *outDisplay = tmpDisplay;
237 *format = static_cast<PixelFormat>(tmpFormat);
238 });
239 }
240
241 return error;
242}
243
244Error HidlComposer::destroyVirtualDisplay(Display display) {
245 auto ret = mClient->destroyVirtualDisplay(display);
246 return unwrapRet(ret);
247}
248
249Error HidlComposer::acceptDisplayChanges(Display display) {
250 mWriter.selectDisplay(display);
251 mWriter.acceptDisplayChanges();
252 return Error::NONE;
253}
254
255Error HidlComposer::createLayer(Display display, Layer* outLayer) {
256 Error error = kDefaultError;
257 mClient->createLayer(display, kMaxLayerBufferCount,
258 [&](const auto& tmpError, const auto& tmpLayer) {
259 error = tmpError;
260 if (error != Error::NONE) {
261 return;
262 }
263
264 *outLayer = tmpLayer;
265 });
266
267 return error;
268}
269
270Error HidlComposer::destroyLayer(Display display, Layer layer) {
271 auto ret = mClient->destroyLayer(display, layer);
272 return unwrapRet(ret);
273}
274
275Error HidlComposer::getActiveConfig(Display display, Config* outConfig) {
276 Error error = kDefaultError;
277 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
278 error = tmpError;
279 if (error != Error::NONE) {
280 return;
281 }
282
283 *outConfig = tmpConfig;
284 });
285
286 return error;
287}
288
289Error HidlComposer::getChangedCompositionTypes(
290 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500291 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700292 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
293 return Error::NONE;
294}
295
296Error HidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
297 Error error = kDefaultError;
298
299 if (mClient_2_3) {
300 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
301 error = tmpError;
302 if (error != Error::NONE) {
303 return;
304 }
305
306 *outModes = tmpModes;
307 });
308 } else if (mClient_2_2) {
309 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
310 error = tmpError;
311 if (error != Error::NONE) {
312 return;
313 }
314
315 for (types::V1_1::ColorMode colorMode : tmpModes) {
316 outModes->push_back(static_cast<ColorMode>(colorMode));
317 }
318 });
319 } else {
320 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpModes) {
321 error = tmpError;
322 if (error != Error::NONE) {
323 return;
324 }
325 for (types::V1_0::ColorMode colorMode : tmpModes) {
326 outModes->push_back(static_cast<ColorMode>(colorMode));
327 }
328 });
329 }
330
331 return error;
332}
333
334Error HidlComposer::getDisplayAttribute(Display display, Config config,
335 IComposerClient::Attribute attribute, int32_t* outValue) {
336 Error error = kDefaultError;
337 if (mClient_2_4) {
338 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
339 [&](const auto& tmpError, const auto& tmpValue) {
340 error = static_cast<Error>(tmpError);
341 if (error != Error::NONE) {
342 return;
343 }
344
345 *outValue = tmpValue;
346 });
347 } else {
348 mClient->getDisplayAttribute(display, config,
349 static_cast<V2_1::IComposerClient::Attribute>(attribute),
350 [&](const auto& tmpError, const auto& tmpValue) {
351 error = tmpError;
352 if (error != Error::NONE) {
353 return;
354 }
355
356 *outValue = tmpValue;
357 });
358 }
359
360 return error;
361}
362
363Error HidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
364 Error error = kDefaultError;
365 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
366 error = tmpError;
367 if (error != Error::NONE) {
368 return;
369 }
370
371 *outConfigs = tmpConfigs;
372 });
373
374 return error;
375}
376
377Error HidlComposer::getDisplayName(Display display, std::string* outName) {
378 Error error = kDefaultError;
379 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
380 error = tmpError;
381 if (error != Error::NONE) {
382 return;
383 }
384
385 *outName = tmpName.c_str();
386 });
387
388 return error;
389}
390
391Error HidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
392 std::vector<Layer>* outLayers,
393 std::vector<uint32_t>* outLayerRequestMasks) {
394 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
395 return Error::NONE;
396}
397
398Error HidlComposer::getDozeSupport(Display display, bool* outSupport) {
399 Error error = kDefaultError;
400 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
401 error = tmpError;
402 if (error != Error::NONE) {
403 return;
404 }
405
406 *outSupport = tmpSupport;
407 });
408
409 return error;
410}
411
412Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
413 float* outMaxLuminance, float* outMaxAverageLuminance,
414 float* outMinLuminance) {
415 Error error = kDefaultError;
416 if (mClient_2_3) {
417 mClient_2_3->getHdrCapabilities_2_3(display,
418 [&](const auto& tmpError, const auto& tmpTypes,
419 const auto& tmpMaxLuminance,
420 const auto& tmpMaxAverageLuminance,
421 const auto& tmpMinLuminance) {
422 error = tmpError;
423 if (error != Error::NONE) {
424 return;
425 }
426
427 *outTypes = tmpTypes;
428 *outMaxLuminance = tmpMaxLuminance;
429 *outMaxAverageLuminance = tmpMaxAverageLuminance;
430 *outMinLuminance = tmpMinLuminance;
431 });
432 } else {
433 mClient->getHdrCapabilities(display,
434 [&](const auto& tmpError, const auto& tmpTypes,
435 const auto& tmpMaxLuminance,
436 const auto& tmpMaxAverageLuminance,
437 const auto& tmpMinLuminance) {
438 error = tmpError;
439 if (error != Error::NONE) {
440 return;
441 }
442
443 outTypes->clear();
444 for (auto type : tmpTypes) {
445 outTypes->push_back(static_cast<Hdr>(type));
446 }
447
448 *outMaxLuminance = tmpMaxLuminance;
449 *outMaxAverageLuminance = tmpMaxAverageLuminance;
450 *outMinLuminance = tmpMinLuminance;
451 });
452 }
453
454 return error;
455}
456
457Error HidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
458 std::vector<int>* outReleaseFences) {
459 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
460 return Error::NONE;
461}
462
463Error HidlComposer::presentDisplay(Display display, int* outPresentFence) {
464 ATRACE_NAME("HwcPresentDisplay");
465 mWriter.selectDisplay(display);
466 mWriter.presentDisplay();
467
468 Error error = execute();
469 if (error != Error::NONE) {
470 return error;
471 }
472
473 mReader.takePresentFence(display, outPresentFence);
474
475 return Error::NONE;
476}
477
478Error HidlComposer::setActiveConfig(Display display, Config config) {
479 auto ret = mClient->setActiveConfig(display, config);
480 return unwrapRet(ret);
481}
482
483Error HidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
484 int acquireFence, Dataspace dataspace,
485 const std::vector<IComposerClient::Rect>& damage) {
486 mWriter.selectDisplay(display);
487
488 const native_handle_t* handle = nullptr;
489 if (target.get()) {
490 handle = target->getNativeBuffer()->handle;
491 }
492
493 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
494 return Error::NONE;
495}
496
497Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
498 hardware::Return<Error> ret(kDefaultError);
499 if (mClient_2_3) {
500 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
501 } else if (mClient_2_2) {
502 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
503 renderIntent);
504 } else {
505 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
506 }
507 return unwrapRet(ret);
508}
509
Ady Abrahamdc011a92021-12-21 14:06:44 -0800510Error HidlComposer::setColorTransform(Display display, const float* matrix) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700511 mWriter.selectDisplay(display);
Ady Abrahamdc011a92021-12-21 14:06:44 -0800512 const bool isIdentity = (mat4(matrix) == mat4());
513 mWriter.setColorTransform(matrix,
514 isIdentity ? ColorTransform::IDENTITY
515 : ColorTransform::ARBITRARY_MATRIX);
Ady Abraham9fc28052021-10-14 17:21:38 -0700516 return Error::NONE;
517}
518
519Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
520 int releaseFence) {
521 mWriter.selectDisplay(display);
522 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
523 return Error::NONE;
524}
525
526Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
527 Return<Error> ret(Error::UNSUPPORTED);
528 if (mClient_2_2) {
529 ret = mClient_2_2->setPowerMode_2_2(display, mode);
530 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
531 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
532 }
533
534 return unwrapRet(ret);
535}
536
537Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
538 auto ret = mClient->setVsyncEnabled(display, enabled);
539 return unwrapRet(ret);
540}
541
542Error HidlComposer::setClientTargetSlotCount(Display display) {
543 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
544 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
545 return unwrapRet(ret);
546}
547
Ady Abraham43065bd2021-12-10 17:22:15 -0800548Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
549 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700550 ATRACE_NAME("HwcValidateDisplay");
551 mWriter.selectDisplay(display);
552 mWriter.validateDisplay();
553
554 Error error = execute();
555 if (error != Error::NONE) {
556 return error;
557 }
558
559 mReader.hasChanges(display, outNumTypes, outNumRequests);
560
561 return Error::NONE;
562}
563
Ady Abraham43065bd2021-12-10 17:22:15 -0800564Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
565 uint32_t* outNumTypes, uint32_t* outNumRequests,
566 int* outPresentFence, uint32_t* state) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700567 ATRACE_NAME("HwcPresentOrValidateDisplay");
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
589Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
590 mWriter.selectDisplay(display);
591 mWriter.selectLayer(layer);
592 mWriter.setLayerCursorPosition(x, y);
593 return Error::NONE;
594}
595
596Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
597 const sp<GraphicBuffer>& buffer, int acquireFence) {
598 mWriter.selectDisplay(display);
599 mWriter.selectLayer(layer);
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);
607 return Error::NONE;
608}
609
610Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
611 const std::vector<IComposerClient::Rect>& damage) {
612 mWriter.selectDisplay(display);
613 mWriter.selectLayer(layer);
614 mWriter.setLayerSurfaceDamage(damage);
615 return Error::NONE;
616}
617
618Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
619 IComposerClient::BlendMode mode) {
620 mWriter.selectDisplay(display);
621 mWriter.selectLayer(layer);
622 mWriter.setLayerBlendMode(mode);
623 return Error::NONE;
624}
625
626Error HidlComposer::setLayerColor(Display display, Layer layer,
627 const IComposerClient::Color& color) {
628 mWriter.selectDisplay(display);
629 mWriter.selectLayer(layer);
630 mWriter.setLayerColor(color);
631 return Error::NONE;
632}
633
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500634static IComposerClient::Composition to_hidl_type(
635 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500636 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
637 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
638 "Trying to use %s, which is not supported by HidlComposer!",
639 android::to_string(type).c_str());
640
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500641 return static_cast<IComposerClient::Composition>(type);
642}
643
644Error HidlComposer::setLayerCompositionType(
645 Display display, Layer layer,
646 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700647 mWriter.selectDisplay(display);
648 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500649 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700650 return Error::NONE;
651}
652
653Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
654 mWriter.selectDisplay(display);
655 mWriter.selectLayer(layer);
656 mWriter.setLayerDataspace(dataspace);
657 return Error::NONE;
658}
659
660Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
661 const IComposerClient::Rect& frame) {
662 mWriter.selectDisplay(display);
663 mWriter.selectLayer(layer);
664 mWriter.setLayerDisplayFrame(frame);
665 return Error::NONE;
666}
667
668Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
669 mWriter.selectDisplay(display);
670 mWriter.selectLayer(layer);
671 mWriter.setLayerPlaneAlpha(alpha);
672 return Error::NONE;
673}
674
675Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
676 const native_handle_t* stream) {
677 mWriter.selectDisplay(display);
678 mWriter.selectLayer(layer);
679 mWriter.setLayerSidebandStream(stream);
680 return Error::NONE;
681}
682
683Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
684 const IComposerClient::FRect& crop) {
685 mWriter.selectDisplay(display);
686 mWriter.selectLayer(layer);
687 mWriter.setLayerSourceCrop(crop);
688 return Error::NONE;
689}
690
691Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
692 mWriter.selectDisplay(display);
693 mWriter.selectLayer(layer);
694 mWriter.setLayerTransform(transform);
695 return Error::NONE;
696}
697
698Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
699 const std::vector<IComposerClient::Rect>& visible) {
700 mWriter.selectDisplay(display);
701 mWriter.selectLayer(layer);
702 mWriter.setLayerVisibleRegion(visible);
703 return Error::NONE;
704}
705
706Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
707 mWriter.selectDisplay(display);
708 mWriter.selectLayer(layer);
709 mWriter.setLayerZOrder(z);
710 return Error::NONE;
711}
712
713Error HidlComposer::execute() {
714 // prepare input command queue
715 bool queueChanged = false;
716 uint32_t commandLength = 0;
717 hidl_vec<hidl_handle> commandHandles;
718 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
719 mWriter.reset();
720 return Error::NO_RESOURCES;
721 }
722
723 // set up new input command queue if necessary
724 if (queueChanged) {
725 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
726 auto error = unwrapRet(ret);
727 if (error != Error::NONE) {
728 mWriter.reset();
729 return error;
730 }
731 }
732
733 if (commandLength == 0) {
734 mWriter.reset();
735 return Error::NONE;
736 }
737
738 Error error = kDefaultError;
739 hardware::Return<void> ret;
740 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
741 const auto& tmpOutLength, const auto& tmpOutHandles) {
742 error = tmpError;
743
744 // set up new output command queue if necessary
745 if (error == Error::NONE && tmpOutChanged) {
746 error = kDefaultError;
747 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
748 error = tmpError;
749 if (error != Error::NONE) {
750 return;
751 }
752
753 mReader.setMQDescriptor(tmpDescriptor);
754 });
755 }
756
757 if (error != Error::NONE) {
758 return;
759 }
760
761 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
762 error = mReader.parse();
763 mReader.reset();
764 } else {
765 error = Error::NO_RESOURCES;
766 }
767 };
768 if (mClient_2_2) {
769 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
770 } else {
771 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
772 }
773 // executeCommands can fail because of out-of-fd and we do not want to
774 // abort() in that case
775 if (!ret.isOk()) {
776 ALOGE("executeCommands failed because of %s", ret.description().c_str());
777 }
778
779 if (error == Error::NONE) {
780 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
781
782 for (const auto& cmdErr : commandErrors) {
783 auto command =
784 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
785
786 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
787 command == IComposerClient::Command::PRESENT_DISPLAY ||
788 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
789 error = cmdErr.error;
790 } else {
791 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
792 }
793 }
794 }
795
796 mWriter.reset();
797
798 return error;
799}
800
801// Composer HAL 2.2
802
803Error HidlComposer::setLayerPerFrameMetadata(
804 Display display, Layer layer,
805 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
806 if (!mClient_2_2) {
807 return Error::UNSUPPORTED;
808 }
809
810 mWriter.selectDisplay(display);
811 mWriter.selectLayer(layer);
812 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
813 return Error::NONE;
814}
815
816std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
817 Display display) {
818 std::vector<IComposerClient::PerFrameMetadataKey> keys;
819 if (!mClient_2_2) {
820 return keys;
821 }
822
823 Error error = kDefaultError;
824 if (mClient_2_3) {
825 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
826 [&](const auto& tmpError, const auto& tmpKeys) {
827 error = tmpError;
828 if (error != Error::NONE) {
829 ALOGW("getPerFrameMetadataKeys failed "
830 "with %d",
831 tmpError);
832 return;
833 }
834 keys = tmpKeys;
835 });
836 } else {
837 mClient_2_2
838 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
839 error = tmpError;
840 if (error != Error::NONE) {
841 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
842 return;
843 }
844
845 keys.clear();
846 for (auto key : tmpKeys) {
847 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
848 }
849 });
850 }
851
852 return keys;
853}
854
855Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
856 std::vector<RenderIntent>* outRenderIntents) {
857 if (!mClient_2_2) {
858 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
859 return Error::NONE;
860 }
861
862 Error error = kDefaultError;
863
864 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
865 error = tmpError;
866 if (error != Error::NONE) {
867 return;
868 }
869
870 *outRenderIntents = tmpKeys;
871 };
872
873 if (mClient_2_3) {
874 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
875 } else {
876 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
877 getRenderIntentsLambda);
878 }
879
880 return error;
881}
882
883Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
884 if (!mClient_2_2) {
885 *outMatrix = mat4();
886 return Error::NONE;
887 }
888
889 Error error = kDefaultError;
890 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
891 [&](const auto& tmpError, const auto& tmpMatrix) {
892 error = tmpError;
893 if (error != Error::NONE) {
894 return;
895 }
896 *outMatrix = mat4(tmpMatrix.data());
897 });
898
899 return error;
900}
901
902// Composer HAL 2.3
903
904Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
905 std::vector<uint8_t>* outData) {
906 if (!mClient_2_3) {
907 return Error::UNSUPPORTED;
908 }
909
910 Error error = kDefaultError;
911 mClient_2_3->getDisplayIdentificationData(display,
912 [&](const auto& tmpError, const auto& tmpPort,
913 const auto& tmpData) {
914 error = tmpError;
915 if (error != Error::NONE) {
916 return;
917 }
918
919 *outPort = tmpPort;
920 *outData = tmpData;
921 });
922
923 return error;
924}
925
926Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
927 if (!mClient_2_3) {
928 return Error::UNSUPPORTED;
929 }
930
931 mWriter.selectDisplay(display);
932 mWriter.selectLayer(layer);
933 mWriter.setLayerColorTransform(matrix);
934 return Error::NONE;
935}
936
937Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
938 Dataspace* outDataspace,
939 uint8_t* outComponentMask) {
940 if (!outFormat || !outDataspace || !outComponentMask) {
941 return Error::BAD_PARAMETER;
942 }
943 if (!mClient_2_3) {
944 return Error::UNSUPPORTED;
945 }
946 Error error = kDefaultError;
947 mClient_2_3->getDisplayedContentSamplingAttributes(display,
948 [&](const auto tmpError,
949 const auto& tmpFormat,
950 const auto& tmpDataspace,
951 const auto& tmpComponentMask) {
952 error = tmpError;
953 if (error == Error::NONE) {
954 *outFormat = tmpFormat;
955 *outDataspace = tmpDataspace;
956 *outComponentMask =
957 static_cast<uint8_t>(
958 tmpComponentMask);
959 }
960 });
961 return error;
962}
963
964Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
965 uint8_t componentMask, uint64_t maxFrames) {
966 if (!mClient_2_3) {
967 return Error::UNSUPPORTED;
968 }
969
970 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
971 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
972 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
973 maxFrames);
974}
975
976Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
977 uint64_t timestamp, DisplayedFrameStats* outStats) {
978 if (!outStats) {
979 return Error::BAD_PARAMETER;
980 }
981 if (!mClient_2_3) {
982 return Error::UNSUPPORTED;
983 }
984 Error error = kDefaultError;
985 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
986 [&](const auto tmpError, auto tmpNumFrames,
987 const auto& tmpSamples0, const auto& tmpSamples1,
988 const auto& tmpSamples2, const auto& tmpSamples3) {
989 error = tmpError;
990 if (error == Error::NONE) {
991 outStats->numFrames = tmpNumFrames;
992 outStats->component_0_sample = tmpSamples0;
993 outStats->component_1_sample = tmpSamples1;
994 outStats->component_2_sample = tmpSamples2;
995 outStats->component_3_sample = tmpSamples3;
996 }
997 });
998 return error;
999}
1000
1001Error HidlComposer::setLayerPerFrameMetadataBlobs(
1002 Display display, Layer layer,
1003 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1004 if (!mClient_2_3) {
1005 return Error::UNSUPPORTED;
1006 }
1007
1008 mWriter.selectDisplay(display);
1009 mWriter.selectLayer(layer);
1010 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1011 return Error::NONE;
1012}
1013
1014Error HidlComposer::setDisplayBrightness(Display display, float brightness) {
1015 if (!mClient_2_3) {
1016 return Error::UNSUPPORTED;
1017 }
1018 return mClient_2_3->setDisplayBrightness(display, brightness);
1019}
1020
1021// Composer HAL 2.4
1022
1023Error HidlComposer::getDisplayCapabilities(Display display,
1024 std::vector<DisplayCapability>* outCapabilities) {
1025 if (!mClient_2_3) {
1026 return Error::UNSUPPORTED;
1027 }
1028
1029 V2_4::Error error = kDefaultError_2_4;
1030 if (mClient_2_4) {
1031 mClient_2_4->getDisplayCapabilities_2_4(display,
1032 [&](const auto& tmpError, const auto& tmpCaps) {
1033 error = tmpError;
1034 if (error != V2_4::Error::NONE) {
1035 return;
1036 }
1037 *outCapabilities = tmpCaps;
1038 });
1039 } else {
1040 mClient_2_3
1041 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1042 error = static_cast<V2_4::Error>(tmpError);
1043 if (error != V2_4::Error::NONE) {
1044 return;
1045 }
1046
1047 outCapabilities->resize(tmpCaps.size());
1048 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1049 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1050 });
1051 }
1052
1053 return static_cast<Error>(error);
1054}
1055
1056V2_4::Error HidlComposer::getDisplayConnectionType(
1057 Display display, IComposerClient::DisplayConnectionType* outType) {
1058 using Error = V2_4::Error;
1059 if (!mClient_2_4) {
1060 return Error::UNSUPPORTED;
1061 }
1062
1063 Error error = kDefaultError_2_4;
1064 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1065 error = tmpError;
1066 if (error != V2_4::Error::NONE) {
1067 return;
1068 }
1069
1070 *outType = tmpType;
1071 });
1072
1073 return error;
1074}
1075
1076V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1077 using Error = V2_4::Error;
1078 if (!mClient_2_4) {
1079 return Error::UNSUPPORTED;
1080 }
1081
1082 Error error = kDefaultError_2_4;
1083 mClient_2_4->getDisplayVsyncPeriod(display,
1084 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1085 error = tmpError;
1086 if (error != Error::NONE) {
1087 return;
1088 }
1089
1090 *outVsyncPeriod = tmpVsyncPeriod;
1091 });
1092
1093 return error;
1094}
1095
1096V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1097 Display display, Config config,
1098 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1099 VsyncPeriodChangeTimeline* outTimeline) {
1100 using Error = V2_4::Error;
1101 if (!mClient_2_4) {
1102 return Error::UNSUPPORTED;
1103 }
1104
1105 Error error = kDefaultError_2_4;
1106 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1107 [&](const auto& tmpError, const auto& tmpTimeline) {
1108 error = tmpError;
1109 if (error != Error::NONE) {
1110 return;
1111 }
1112
1113 *outTimeline = tmpTimeline;
1114 });
1115
1116 return error;
1117}
1118
1119V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1120 using Error = V2_4::Error;
1121 if (!mClient_2_4) {
1122 return Error::UNSUPPORTED;
1123 }
1124
1125 return mClient_2_4->setAutoLowLatencyMode(display, on);
1126}
1127
1128V2_4::Error HidlComposer::getSupportedContentTypes(
1129 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1130 using Error = V2_4::Error;
1131 if (!mClient_2_4) {
1132 return Error::UNSUPPORTED;
1133 }
1134
1135 Error error = kDefaultError_2_4;
1136 mClient_2_4->getSupportedContentTypes(displayId,
1137 [&](const auto& tmpError,
1138 const auto& tmpSupportedContentTypes) {
1139 error = tmpError;
1140 if (error != Error::NONE) {
1141 return;
1142 }
1143
1144 *outSupportedContentTypes = tmpSupportedContentTypes;
1145 });
1146 return error;
1147}
1148
1149V2_4::Error HidlComposer::setContentType(Display display,
1150 IComposerClient::ContentType contentType) {
1151 using Error = V2_4::Error;
1152 if (!mClient_2_4) {
1153 return Error::UNSUPPORTED;
1154 }
1155
1156 return mClient_2_4->setContentType(display, contentType);
1157}
1158
1159V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1160 const std::string& key, bool mandatory,
1161 const std::vector<uint8_t>& value) {
1162 using Error = V2_4::Error;
1163 if (!mClient_2_4) {
1164 return Error::UNSUPPORTED;
1165 }
1166 mWriter.selectDisplay(display);
1167 mWriter.selectLayer(layer);
1168 mWriter.setLayerGenericMetadata(key, mandatory, value);
1169 return Error::NONE;
1170}
1171
1172V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1173 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1174 using Error = V2_4::Error;
1175 if (!mClient_2_4) {
1176 return Error::UNSUPPORTED;
1177 }
1178 Error error = kDefaultError_2_4;
1179 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1180 error = tmpError;
1181 if (error != Error::NONE) {
1182 return;
1183 }
1184
1185 *outKeys = tmpKeys;
1186 });
1187 return error;
1188}
1189
1190Error HidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001191 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1192 float* outWhitePointNits) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001193 mReader.takeClientTargetProperty(display, outClientTargetProperty);
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001194 *outWhitePointNits = -1.f;
1195 return Error::NONE;
1196}
1197
1198Error HidlComposer::setLayerWhitePointNits(Display, Layer, float) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001199 return Error::NONE;
1200}
1201
1202CommandReader::~CommandReader() {
1203 resetData();
1204}
1205
1206Error CommandReader::parse() {
1207 resetData();
1208
1209 IComposerClient::Command command;
1210 uint16_t length = 0;
1211
1212 while (!isEmpty()) {
1213 if (!beginCommand(&command, &length)) {
1214 break;
1215 }
1216
1217 bool parsed = false;
1218 switch (command) {
1219 case IComposerClient::Command::SELECT_DISPLAY:
1220 parsed = parseSelectDisplay(length);
1221 break;
1222 case IComposerClient::Command::SET_ERROR:
1223 parsed = parseSetError(length);
1224 break;
1225 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1226 parsed = parseSetChangedCompositionTypes(length);
1227 break;
1228 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1229 parsed = parseSetDisplayRequests(length);
1230 break;
1231 case IComposerClient::Command::SET_PRESENT_FENCE:
1232 parsed = parseSetPresentFence(length);
1233 break;
1234 case IComposerClient::Command::SET_RELEASE_FENCES:
1235 parsed = parseSetReleaseFences(length);
1236 break;
1237 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1238 parsed = parseSetPresentOrValidateDisplayResult(length);
1239 break;
1240 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1241 parsed = parseSetClientTargetProperty(length);
1242 break;
1243 default:
1244 parsed = false;
1245 break;
1246 }
1247
1248 endCommand();
1249
1250 if (!parsed) {
1251 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1252 break;
1253 }
1254 }
1255
1256 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1257}
1258
1259bool CommandReader::parseSelectDisplay(uint16_t length) {
1260 if (length != CommandWriterBase::kSelectDisplayLength) {
1261 return false;
1262 }
1263
1264 mCurrentReturnData = &mReturnData[read64()];
1265
1266 return true;
1267}
1268
1269bool CommandReader::parseSetError(uint16_t length) {
1270 if (length != CommandWriterBase::kSetErrorLength) {
1271 return false;
1272 }
1273
1274 auto location = read();
1275 auto error = static_cast<Error>(readSigned());
1276
1277 mErrors.emplace_back(CommandError{location, error});
1278
1279 return true;
1280}
1281
1282bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1283 // (layer id, composition type) pairs
1284 if (length % 3 != 0 || !mCurrentReturnData) {
1285 return false;
1286 }
1287
1288 uint32_t count = length / 3;
1289 mCurrentReturnData->changedLayers.reserve(count);
1290 mCurrentReturnData->compositionTypes.reserve(count);
1291 while (count > 0) {
1292 auto layer = read64();
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001293 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1294 readSigned());
Ady Abraham9fc28052021-10-14 17:21:38 -07001295
1296 mCurrentReturnData->changedLayers.push_back(layer);
1297 mCurrentReturnData->compositionTypes.push_back(type);
1298
1299 count--;
1300 }
1301
1302 return true;
1303}
1304
1305bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1306 // display requests followed by (layer id, layer requests) pairs
1307 if (length % 3 != 1 || !mCurrentReturnData) {
1308 return false;
1309 }
1310
1311 mCurrentReturnData->displayRequests = read();
1312
1313 uint32_t count = (length - 1) / 3;
1314 mCurrentReturnData->requestedLayers.reserve(count);
1315 mCurrentReturnData->requestMasks.reserve(count);
1316 while (count > 0) {
1317 auto layer = read64();
1318 auto layerRequestMask = read();
1319
1320 mCurrentReturnData->requestedLayers.push_back(layer);
1321 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1322
1323 count--;
1324 }
1325
1326 return true;
1327}
1328
1329bool CommandReader::parseSetPresentFence(uint16_t length) {
1330 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1331 return false;
1332 }
1333
1334 if (mCurrentReturnData->presentFence >= 0) {
1335 close(mCurrentReturnData->presentFence);
1336 }
1337 mCurrentReturnData->presentFence = readFence();
1338
1339 return true;
1340}
1341
1342bool CommandReader::parseSetReleaseFences(uint16_t length) {
1343 // (layer id, release fence index) pairs
1344 if (length % 3 != 0 || !mCurrentReturnData) {
1345 return false;
1346 }
1347
1348 uint32_t count = length / 3;
1349 mCurrentReturnData->releasedLayers.reserve(count);
1350 mCurrentReturnData->releaseFences.reserve(count);
1351 while (count > 0) {
1352 auto layer = read64();
1353 auto fence = readFence();
1354
1355 mCurrentReturnData->releasedLayers.push_back(layer);
1356 mCurrentReturnData->releaseFences.push_back(fence);
1357
1358 count--;
1359 }
1360
1361 return true;
1362}
1363
1364bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1365 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1366 return false;
1367 }
1368 mCurrentReturnData->presentOrValidateState = read();
1369 return true;
1370}
1371
1372bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1373 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1374 return false;
1375 }
1376 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1377 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1378 return true;
1379}
1380
1381void CommandReader::resetData() {
1382 mErrors.clear();
1383
1384 for (auto& data : mReturnData) {
1385 if (data.second.presentFence >= 0) {
1386 close(data.second.presentFence);
1387 }
1388 for (auto fence : data.second.releaseFences) {
1389 if (fence >= 0) {
1390 close(fence);
1391 }
1392 }
1393 }
1394
1395 mReturnData.clear();
1396 mCurrentReturnData = nullptr;
1397}
1398
1399std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1400 return std::move(mErrors);
1401}
1402
1403bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1404 uint32_t* outNumLayerRequestMasks) const {
1405 auto found = mReturnData.find(display);
1406 if (found == mReturnData.end()) {
1407 *outNumChangedCompositionTypes = 0;
1408 *outNumLayerRequestMasks = 0;
1409 return false;
1410 }
1411
1412 const ReturnData& data = found->second;
1413
1414 *outNumChangedCompositionTypes = data.compositionTypes.size();
1415 *outNumLayerRequestMasks = data.requestMasks.size();
1416
1417 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1418}
1419
1420void CommandReader::takeChangedCompositionTypes(
1421 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001422 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001423 auto found = mReturnData.find(display);
1424 if (found == mReturnData.end()) {
1425 outLayers->clear();
1426 outTypes->clear();
1427 return;
1428 }
1429
1430 ReturnData& data = found->second;
1431
1432 *outLayers = std::move(data.changedLayers);
1433 *outTypes = std::move(data.compositionTypes);
1434}
1435
1436void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1437 std::vector<Layer>* outLayers,
1438 std::vector<uint32_t>* outLayerRequestMasks) {
1439 auto found = mReturnData.find(display);
1440 if (found == mReturnData.end()) {
1441 *outDisplayRequestMask = 0;
1442 outLayers->clear();
1443 outLayerRequestMasks->clear();
1444 return;
1445 }
1446
1447 ReturnData& data = found->second;
1448
1449 *outDisplayRequestMask = data.displayRequests;
1450 *outLayers = std::move(data.requestedLayers);
1451 *outLayerRequestMasks = std::move(data.requestMasks);
1452}
1453
1454void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1455 std::vector<int>* outReleaseFences) {
1456 auto found = mReturnData.find(display);
1457 if (found == mReturnData.end()) {
1458 outLayers->clear();
1459 outReleaseFences->clear();
1460 return;
1461 }
1462
1463 ReturnData& data = found->second;
1464
1465 *outLayers = std::move(data.releasedLayers);
1466 *outReleaseFences = std::move(data.releaseFences);
1467}
1468
1469void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1470 auto found = mReturnData.find(display);
1471 if (found == mReturnData.end()) {
1472 *outPresentFence = -1;
1473 return;
1474 }
1475
1476 ReturnData& data = found->second;
1477
1478 *outPresentFence = data.presentFence;
1479 data.presentFence = -1;
1480}
1481
1482void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1483 auto found = mReturnData.find(display);
1484 if (found == mReturnData.end()) {
1485 *state = -1;
1486 return;
1487 }
1488 ReturnData& data = found->second;
1489 *state = data.presentOrValidateState;
1490}
1491
1492void CommandReader::takeClientTargetProperty(
1493 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1494 auto found = mReturnData.find(display);
1495
1496 // If not found, return the default values.
1497 if (found == mReturnData.end()) {
1498 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1499 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1500 return;
1501 }
1502
1503 ReturnData& data = found->second;
1504 *outClientTargetProperty = data.clientTargetProperty;
1505}
1506
1507} // namespace Hwc2
1508} // namespace android
1509
1510// TODO(b/129481165): remove the #pragma below and fix conversion issues
1511#pragma clang diagnostic pop // ignored "-Wconversion"