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