blob: c3214d83440225f14c5b62f0ed54f5f64070a171 [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
510Error HidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
511 mWriter.selectDisplay(display);
512 mWriter.setColorTransform(matrix, hint);
513 return Error::NONE;
514}
515
516Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
517 int releaseFence) {
518 mWriter.selectDisplay(display);
519 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
520 return Error::NONE;
521}
522
523Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
524 Return<Error> ret(Error::UNSUPPORTED);
525 if (mClient_2_2) {
526 ret = mClient_2_2->setPowerMode_2_2(display, mode);
527 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
528 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
529 }
530
531 return unwrapRet(ret);
532}
533
534Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
535 auto ret = mClient->setVsyncEnabled(display, enabled);
536 return unwrapRet(ret);
537}
538
539Error HidlComposer::setClientTargetSlotCount(Display display) {
540 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
541 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
542 return unwrapRet(ret);
543}
544
Ady Abraham43065bd2021-12-10 17:22:15 -0800545Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
546 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700547 ATRACE_NAME("HwcValidateDisplay");
548 mWriter.selectDisplay(display);
549 mWriter.validateDisplay();
550
551 Error error = execute();
552 if (error != Error::NONE) {
553 return error;
554 }
555
556 mReader.hasChanges(display, outNumTypes, outNumRequests);
557
558 return Error::NONE;
559}
560
Ady Abraham43065bd2021-12-10 17:22:15 -0800561Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
562 uint32_t* outNumTypes, uint32_t* outNumRequests,
563 int* outPresentFence, uint32_t* state) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700564 ATRACE_NAME("HwcPresentOrValidateDisplay");
565 mWriter.selectDisplay(display);
566 mWriter.presentOrvalidateDisplay();
567
568 Error error = execute();
569 if (error != Error::NONE) {
570 return error;
571 }
572
573 mReader.takePresentOrValidateStage(display, state);
574
575 if (*state == 1) { // Present succeeded
576 mReader.takePresentFence(display, outPresentFence);
577 }
578
579 if (*state == 0) { // Validate succeeded.
580 mReader.hasChanges(display, outNumTypes, outNumRequests);
581 }
582
583 return Error::NONE;
584}
585
586Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
587 mWriter.selectDisplay(display);
588 mWriter.selectLayer(layer);
589 mWriter.setLayerCursorPosition(x, y);
590 return Error::NONE;
591}
592
593Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
594 const sp<GraphicBuffer>& buffer, int acquireFence) {
595 mWriter.selectDisplay(display);
596 mWriter.selectLayer(layer);
597
598 const native_handle_t* handle = nullptr;
599 if (buffer.get()) {
600 handle = buffer->getNativeBuffer()->handle;
601 }
602
603 mWriter.setLayerBuffer(slot, handle, acquireFence);
604 return Error::NONE;
605}
606
607Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
608 const std::vector<IComposerClient::Rect>& damage) {
609 mWriter.selectDisplay(display);
610 mWriter.selectLayer(layer);
611 mWriter.setLayerSurfaceDamage(damage);
612 return Error::NONE;
613}
614
615Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
616 IComposerClient::BlendMode mode) {
617 mWriter.selectDisplay(display);
618 mWriter.selectLayer(layer);
619 mWriter.setLayerBlendMode(mode);
620 return Error::NONE;
621}
622
623Error HidlComposer::setLayerColor(Display display, Layer layer,
624 const IComposerClient::Color& color) {
625 mWriter.selectDisplay(display);
626 mWriter.selectLayer(layer);
627 mWriter.setLayerColor(color);
628 return Error::NONE;
629}
630
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500631static IComposerClient::Composition to_hidl_type(
632 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500633 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
634 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
635 "Trying to use %s, which is not supported by HidlComposer!",
636 android::to_string(type).c_str());
637
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500638 return static_cast<IComposerClient::Composition>(type);
639}
640
641Error HidlComposer::setLayerCompositionType(
642 Display display, Layer layer,
643 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700644 mWriter.selectDisplay(display);
645 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500646 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700647 return Error::NONE;
648}
649
650Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
651 mWriter.selectDisplay(display);
652 mWriter.selectLayer(layer);
653 mWriter.setLayerDataspace(dataspace);
654 return Error::NONE;
655}
656
657Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
658 const IComposerClient::Rect& frame) {
659 mWriter.selectDisplay(display);
660 mWriter.selectLayer(layer);
661 mWriter.setLayerDisplayFrame(frame);
662 return Error::NONE;
663}
664
665Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
666 mWriter.selectDisplay(display);
667 mWriter.selectLayer(layer);
668 mWriter.setLayerPlaneAlpha(alpha);
669 return Error::NONE;
670}
671
672Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
673 const native_handle_t* stream) {
674 mWriter.selectDisplay(display);
675 mWriter.selectLayer(layer);
676 mWriter.setLayerSidebandStream(stream);
677 return Error::NONE;
678}
679
680Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
681 const IComposerClient::FRect& crop) {
682 mWriter.selectDisplay(display);
683 mWriter.selectLayer(layer);
684 mWriter.setLayerSourceCrop(crop);
685 return Error::NONE;
686}
687
688Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
689 mWriter.selectDisplay(display);
690 mWriter.selectLayer(layer);
691 mWriter.setLayerTransform(transform);
692 return Error::NONE;
693}
694
695Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
696 const std::vector<IComposerClient::Rect>& visible) {
697 mWriter.selectDisplay(display);
698 mWriter.selectLayer(layer);
699 mWriter.setLayerVisibleRegion(visible);
700 return Error::NONE;
701}
702
703Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
704 mWriter.selectDisplay(display);
705 mWriter.selectLayer(layer);
706 mWriter.setLayerZOrder(z);
707 return Error::NONE;
708}
709
710Error HidlComposer::execute() {
711 // prepare input command queue
712 bool queueChanged = false;
713 uint32_t commandLength = 0;
714 hidl_vec<hidl_handle> commandHandles;
715 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
716 mWriter.reset();
717 return Error::NO_RESOURCES;
718 }
719
720 // set up new input command queue if necessary
721 if (queueChanged) {
722 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
723 auto error = unwrapRet(ret);
724 if (error != Error::NONE) {
725 mWriter.reset();
726 return error;
727 }
728 }
729
730 if (commandLength == 0) {
731 mWriter.reset();
732 return Error::NONE;
733 }
734
735 Error error = kDefaultError;
736 hardware::Return<void> ret;
737 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
738 const auto& tmpOutLength, const auto& tmpOutHandles) {
739 error = tmpError;
740
741 // set up new output command queue if necessary
742 if (error == Error::NONE && tmpOutChanged) {
743 error = kDefaultError;
744 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
745 error = tmpError;
746 if (error != Error::NONE) {
747 return;
748 }
749
750 mReader.setMQDescriptor(tmpDescriptor);
751 });
752 }
753
754 if (error != Error::NONE) {
755 return;
756 }
757
758 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
759 error = mReader.parse();
760 mReader.reset();
761 } else {
762 error = Error::NO_RESOURCES;
763 }
764 };
765 if (mClient_2_2) {
766 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
767 } else {
768 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
769 }
770 // executeCommands can fail because of out-of-fd and we do not want to
771 // abort() in that case
772 if (!ret.isOk()) {
773 ALOGE("executeCommands failed because of %s", ret.description().c_str());
774 }
775
776 if (error == Error::NONE) {
777 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
778
779 for (const auto& cmdErr : commandErrors) {
780 auto command =
781 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
782
783 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
784 command == IComposerClient::Command::PRESENT_DISPLAY ||
785 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
786 error = cmdErr.error;
787 } else {
788 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
789 }
790 }
791 }
792
793 mWriter.reset();
794
795 return error;
796}
797
798// Composer HAL 2.2
799
800Error HidlComposer::setLayerPerFrameMetadata(
801 Display display, Layer layer,
802 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
803 if (!mClient_2_2) {
804 return Error::UNSUPPORTED;
805 }
806
807 mWriter.selectDisplay(display);
808 mWriter.selectLayer(layer);
809 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
810 return Error::NONE;
811}
812
813std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
814 Display display) {
815 std::vector<IComposerClient::PerFrameMetadataKey> keys;
816 if (!mClient_2_2) {
817 return keys;
818 }
819
820 Error error = kDefaultError;
821 if (mClient_2_3) {
822 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
823 [&](const auto& tmpError, const auto& tmpKeys) {
824 error = tmpError;
825 if (error != Error::NONE) {
826 ALOGW("getPerFrameMetadataKeys failed "
827 "with %d",
828 tmpError);
829 return;
830 }
831 keys = tmpKeys;
832 });
833 } else {
834 mClient_2_2
835 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
836 error = tmpError;
837 if (error != Error::NONE) {
838 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
839 return;
840 }
841
842 keys.clear();
843 for (auto key : tmpKeys) {
844 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
845 }
846 });
847 }
848
849 return keys;
850}
851
852Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
853 std::vector<RenderIntent>* outRenderIntents) {
854 if (!mClient_2_2) {
855 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
856 return Error::NONE;
857 }
858
859 Error error = kDefaultError;
860
861 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
862 error = tmpError;
863 if (error != Error::NONE) {
864 return;
865 }
866
867 *outRenderIntents = tmpKeys;
868 };
869
870 if (mClient_2_3) {
871 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
872 } else {
873 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
874 getRenderIntentsLambda);
875 }
876
877 return error;
878}
879
880Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
881 if (!mClient_2_2) {
882 *outMatrix = mat4();
883 return Error::NONE;
884 }
885
886 Error error = kDefaultError;
887 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
888 [&](const auto& tmpError, const auto& tmpMatrix) {
889 error = tmpError;
890 if (error != Error::NONE) {
891 return;
892 }
893 *outMatrix = mat4(tmpMatrix.data());
894 });
895
896 return error;
897}
898
899// Composer HAL 2.3
900
901Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
902 std::vector<uint8_t>* outData) {
903 if (!mClient_2_3) {
904 return Error::UNSUPPORTED;
905 }
906
907 Error error = kDefaultError;
908 mClient_2_3->getDisplayIdentificationData(display,
909 [&](const auto& tmpError, const auto& tmpPort,
910 const auto& tmpData) {
911 error = tmpError;
912 if (error != Error::NONE) {
913 return;
914 }
915
916 *outPort = tmpPort;
917 *outData = tmpData;
918 });
919
920 return error;
921}
922
923Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
924 if (!mClient_2_3) {
925 return Error::UNSUPPORTED;
926 }
927
928 mWriter.selectDisplay(display);
929 mWriter.selectLayer(layer);
930 mWriter.setLayerColorTransform(matrix);
931 return Error::NONE;
932}
933
934Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
935 Dataspace* outDataspace,
936 uint8_t* outComponentMask) {
937 if (!outFormat || !outDataspace || !outComponentMask) {
938 return Error::BAD_PARAMETER;
939 }
940 if (!mClient_2_3) {
941 return Error::UNSUPPORTED;
942 }
943 Error error = kDefaultError;
944 mClient_2_3->getDisplayedContentSamplingAttributes(display,
945 [&](const auto tmpError,
946 const auto& tmpFormat,
947 const auto& tmpDataspace,
948 const auto& tmpComponentMask) {
949 error = tmpError;
950 if (error == Error::NONE) {
951 *outFormat = tmpFormat;
952 *outDataspace = tmpDataspace;
953 *outComponentMask =
954 static_cast<uint8_t>(
955 tmpComponentMask);
956 }
957 });
958 return error;
959}
960
961Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
962 uint8_t componentMask, uint64_t maxFrames) {
963 if (!mClient_2_3) {
964 return Error::UNSUPPORTED;
965 }
966
967 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
968 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
969 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
970 maxFrames);
971}
972
973Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
974 uint64_t timestamp, DisplayedFrameStats* outStats) {
975 if (!outStats) {
976 return Error::BAD_PARAMETER;
977 }
978 if (!mClient_2_3) {
979 return Error::UNSUPPORTED;
980 }
981 Error error = kDefaultError;
982 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
983 [&](const auto tmpError, auto tmpNumFrames,
984 const auto& tmpSamples0, const auto& tmpSamples1,
985 const auto& tmpSamples2, const auto& tmpSamples3) {
986 error = tmpError;
987 if (error == Error::NONE) {
988 outStats->numFrames = tmpNumFrames;
989 outStats->component_0_sample = tmpSamples0;
990 outStats->component_1_sample = tmpSamples1;
991 outStats->component_2_sample = tmpSamples2;
992 outStats->component_3_sample = tmpSamples3;
993 }
994 });
995 return error;
996}
997
998Error HidlComposer::setLayerPerFrameMetadataBlobs(
999 Display display, Layer layer,
1000 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1001 if (!mClient_2_3) {
1002 return Error::UNSUPPORTED;
1003 }
1004
1005 mWriter.selectDisplay(display);
1006 mWriter.selectLayer(layer);
1007 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1008 return Error::NONE;
1009}
1010
1011Error HidlComposer::setDisplayBrightness(Display display, float brightness) {
1012 if (!mClient_2_3) {
1013 return Error::UNSUPPORTED;
1014 }
1015 return mClient_2_3->setDisplayBrightness(display, brightness);
1016}
1017
1018// Composer HAL 2.4
1019
1020Error HidlComposer::getDisplayCapabilities(Display display,
1021 std::vector<DisplayCapability>* outCapabilities) {
1022 if (!mClient_2_3) {
1023 return Error::UNSUPPORTED;
1024 }
1025
1026 V2_4::Error error = kDefaultError_2_4;
1027 if (mClient_2_4) {
1028 mClient_2_4->getDisplayCapabilities_2_4(display,
1029 [&](const auto& tmpError, const auto& tmpCaps) {
1030 error = tmpError;
1031 if (error != V2_4::Error::NONE) {
1032 return;
1033 }
1034 *outCapabilities = tmpCaps;
1035 });
1036 } else {
1037 mClient_2_3
1038 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1039 error = static_cast<V2_4::Error>(tmpError);
1040 if (error != V2_4::Error::NONE) {
1041 return;
1042 }
1043
1044 outCapabilities->resize(tmpCaps.size());
1045 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1046 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1047 });
1048 }
1049
1050 return static_cast<Error>(error);
1051}
1052
1053V2_4::Error HidlComposer::getDisplayConnectionType(
1054 Display display, IComposerClient::DisplayConnectionType* outType) {
1055 using Error = V2_4::Error;
1056 if (!mClient_2_4) {
1057 return Error::UNSUPPORTED;
1058 }
1059
1060 Error error = kDefaultError_2_4;
1061 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1062 error = tmpError;
1063 if (error != V2_4::Error::NONE) {
1064 return;
1065 }
1066
1067 *outType = tmpType;
1068 });
1069
1070 return error;
1071}
1072
1073V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1074 using Error = V2_4::Error;
1075 if (!mClient_2_4) {
1076 return Error::UNSUPPORTED;
1077 }
1078
1079 Error error = kDefaultError_2_4;
1080 mClient_2_4->getDisplayVsyncPeriod(display,
1081 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1082 error = tmpError;
1083 if (error != Error::NONE) {
1084 return;
1085 }
1086
1087 *outVsyncPeriod = tmpVsyncPeriod;
1088 });
1089
1090 return error;
1091}
1092
1093V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1094 Display display, Config config,
1095 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1096 VsyncPeriodChangeTimeline* outTimeline) {
1097 using Error = V2_4::Error;
1098 if (!mClient_2_4) {
1099 return Error::UNSUPPORTED;
1100 }
1101
1102 Error error = kDefaultError_2_4;
1103 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1104 [&](const auto& tmpError, const auto& tmpTimeline) {
1105 error = tmpError;
1106 if (error != Error::NONE) {
1107 return;
1108 }
1109
1110 *outTimeline = tmpTimeline;
1111 });
1112
1113 return error;
1114}
1115
1116V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1117 using Error = V2_4::Error;
1118 if (!mClient_2_4) {
1119 return Error::UNSUPPORTED;
1120 }
1121
1122 return mClient_2_4->setAutoLowLatencyMode(display, on);
1123}
1124
1125V2_4::Error HidlComposer::getSupportedContentTypes(
1126 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1127 using Error = V2_4::Error;
1128 if (!mClient_2_4) {
1129 return Error::UNSUPPORTED;
1130 }
1131
1132 Error error = kDefaultError_2_4;
1133 mClient_2_4->getSupportedContentTypes(displayId,
1134 [&](const auto& tmpError,
1135 const auto& tmpSupportedContentTypes) {
1136 error = tmpError;
1137 if (error != Error::NONE) {
1138 return;
1139 }
1140
1141 *outSupportedContentTypes = tmpSupportedContentTypes;
1142 });
1143 return error;
1144}
1145
1146V2_4::Error HidlComposer::setContentType(Display display,
1147 IComposerClient::ContentType contentType) {
1148 using Error = V2_4::Error;
1149 if (!mClient_2_4) {
1150 return Error::UNSUPPORTED;
1151 }
1152
1153 return mClient_2_4->setContentType(display, contentType);
1154}
1155
1156V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1157 const std::string& key, bool mandatory,
1158 const std::vector<uint8_t>& value) {
1159 using Error = V2_4::Error;
1160 if (!mClient_2_4) {
1161 return Error::UNSUPPORTED;
1162 }
1163 mWriter.selectDisplay(display);
1164 mWriter.selectLayer(layer);
1165 mWriter.setLayerGenericMetadata(key, mandatory, value);
1166 return Error::NONE;
1167}
1168
1169V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1170 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1171 using Error = V2_4::Error;
1172 if (!mClient_2_4) {
1173 return Error::UNSUPPORTED;
1174 }
1175 Error error = kDefaultError_2_4;
1176 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1177 error = tmpError;
1178 if (error != Error::NONE) {
1179 return;
1180 }
1181
1182 *outKeys = tmpKeys;
1183 });
1184 return error;
1185}
1186
1187Error HidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001188 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1189 float* outWhitePointNits) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001190 mReader.takeClientTargetProperty(display, outClientTargetProperty);
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001191 *outWhitePointNits = -1.f;
1192 return Error::NONE;
1193}
1194
1195Error HidlComposer::setLayerWhitePointNits(Display, Layer, float) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001196 return Error::NONE;
1197}
1198
1199CommandReader::~CommandReader() {
1200 resetData();
1201}
1202
1203Error CommandReader::parse() {
1204 resetData();
1205
1206 IComposerClient::Command command;
1207 uint16_t length = 0;
1208
1209 while (!isEmpty()) {
1210 if (!beginCommand(&command, &length)) {
1211 break;
1212 }
1213
1214 bool parsed = false;
1215 switch (command) {
1216 case IComposerClient::Command::SELECT_DISPLAY:
1217 parsed = parseSelectDisplay(length);
1218 break;
1219 case IComposerClient::Command::SET_ERROR:
1220 parsed = parseSetError(length);
1221 break;
1222 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1223 parsed = parseSetChangedCompositionTypes(length);
1224 break;
1225 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1226 parsed = parseSetDisplayRequests(length);
1227 break;
1228 case IComposerClient::Command::SET_PRESENT_FENCE:
1229 parsed = parseSetPresentFence(length);
1230 break;
1231 case IComposerClient::Command::SET_RELEASE_FENCES:
1232 parsed = parseSetReleaseFences(length);
1233 break;
1234 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1235 parsed = parseSetPresentOrValidateDisplayResult(length);
1236 break;
1237 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1238 parsed = parseSetClientTargetProperty(length);
1239 break;
1240 default:
1241 parsed = false;
1242 break;
1243 }
1244
1245 endCommand();
1246
1247 if (!parsed) {
1248 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1249 break;
1250 }
1251 }
1252
1253 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1254}
1255
1256bool CommandReader::parseSelectDisplay(uint16_t length) {
1257 if (length != CommandWriterBase::kSelectDisplayLength) {
1258 return false;
1259 }
1260
1261 mCurrentReturnData = &mReturnData[read64()];
1262
1263 return true;
1264}
1265
1266bool CommandReader::parseSetError(uint16_t length) {
1267 if (length != CommandWriterBase::kSetErrorLength) {
1268 return false;
1269 }
1270
1271 auto location = read();
1272 auto error = static_cast<Error>(readSigned());
1273
1274 mErrors.emplace_back(CommandError{location, error});
1275
1276 return true;
1277}
1278
1279bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1280 // (layer id, composition type) pairs
1281 if (length % 3 != 0 || !mCurrentReturnData) {
1282 return false;
1283 }
1284
1285 uint32_t count = length / 3;
1286 mCurrentReturnData->changedLayers.reserve(count);
1287 mCurrentReturnData->compositionTypes.reserve(count);
1288 while (count > 0) {
1289 auto layer = read64();
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001290 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1291 readSigned());
Ady Abraham9fc28052021-10-14 17:21:38 -07001292
1293 mCurrentReturnData->changedLayers.push_back(layer);
1294 mCurrentReturnData->compositionTypes.push_back(type);
1295
1296 count--;
1297 }
1298
1299 return true;
1300}
1301
1302bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1303 // display requests followed by (layer id, layer requests) pairs
1304 if (length % 3 != 1 || !mCurrentReturnData) {
1305 return false;
1306 }
1307
1308 mCurrentReturnData->displayRequests = read();
1309
1310 uint32_t count = (length - 1) / 3;
1311 mCurrentReturnData->requestedLayers.reserve(count);
1312 mCurrentReturnData->requestMasks.reserve(count);
1313 while (count > 0) {
1314 auto layer = read64();
1315 auto layerRequestMask = read();
1316
1317 mCurrentReturnData->requestedLayers.push_back(layer);
1318 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1319
1320 count--;
1321 }
1322
1323 return true;
1324}
1325
1326bool CommandReader::parseSetPresentFence(uint16_t length) {
1327 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1328 return false;
1329 }
1330
1331 if (mCurrentReturnData->presentFence >= 0) {
1332 close(mCurrentReturnData->presentFence);
1333 }
1334 mCurrentReturnData->presentFence = readFence();
1335
1336 return true;
1337}
1338
1339bool CommandReader::parseSetReleaseFences(uint16_t length) {
1340 // (layer id, release fence index) pairs
1341 if (length % 3 != 0 || !mCurrentReturnData) {
1342 return false;
1343 }
1344
1345 uint32_t count = length / 3;
1346 mCurrentReturnData->releasedLayers.reserve(count);
1347 mCurrentReturnData->releaseFences.reserve(count);
1348 while (count > 0) {
1349 auto layer = read64();
1350 auto fence = readFence();
1351
1352 mCurrentReturnData->releasedLayers.push_back(layer);
1353 mCurrentReturnData->releaseFences.push_back(fence);
1354
1355 count--;
1356 }
1357
1358 return true;
1359}
1360
1361bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1362 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1363 return false;
1364 }
1365 mCurrentReturnData->presentOrValidateState = read();
1366 return true;
1367}
1368
1369bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1370 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1371 return false;
1372 }
1373 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1374 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1375 return true;
1376}
1377
1378void CommandReader::resetData() {
1379 mErrors.clear();
1380
1381 for (auto& data : mReturnData) {
1382 if (data.second.presentFence >= 0) {
1383 close(data.second.presentFence);
1384 }
1385 for (auto fence : data.second.releaseFences) {
1386 if (fence >= 0) {
1387 close(fence);
1388 }
1389 }
1390 }
1391
1392 mReturnData.clear();
1393 mCurrentReturnData = nullptr;
1394}
1395
1396std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1397 return std::move(mErrors);
1398}
1399
1400bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1401 uint32_t* outNumLayerRequestMasks) const {
1402 auto found = mReturnData.find(display);
1403 if (found == mReturnData.end()) {
1404 *outNumChangedCompositionTypes = 0;
1405 *outNumLayerRequestMasks = 0;
1406 return false;
1407 }
1408
1409 const ReturnData& data = found->second;
1410
1411 *outNumChangedCompositionTypes = data.compositionTypes.size();
1412 *outNumLayerRequestMasks = data.requestMasks.size();
1413
1414 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1415}
1416
1417void CommandReader::takeChangedCompositionTypes(
1418 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001419 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001420 auto found = mReturnData.find(display);
1421 if (found == mReturnData.end()) {
1422 outLayers->clear();
1423 outTypes->clear();
1424 return;
1425 }
1426
1427 ReturnData& data = found->second;
1428
1429 *outLayers = std::move(data.changedLayers);
1430 *outTypes = std::move(data.compositionTypes);
1431}
1432
1433void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1434 std::vector<Layer>* outLayers,
1435 std::vector<uint32_t>* outLayerRequestMasks) {
1436 auto found = mReturnData.find(display);
1437 if (found == mReturnData.end()) {
1438 *outDisplayRequestMask = 0;
1439 outLayers->clear();
1440 outLayerRequestMasks->clear();
1441 return;
1442 }
1443
1444 ReturnData& data = found->second;
1445
1446 *outDisplayRequestMask = data.displayRequests;
1447 *outLayers = std::move(data.requestedLayers);
1448 *outLayerRequestMasks = std::move(data.requestMasks);
1449}
1450
1451void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1452 std::vector<int>* outReleaseFences) {
1453 auto found = mReturnData.find(display);
1454 if (found == mReturnData.end()) {
1455 outLayers->clear();
1456 outReleaseFences->clear();
1457 return;
1458 }
1459
1460 ReturnData& data = found->second;
1461
1462 *outLayers = std::move(data.releasedLayers);
1463 *outReleaseFences = std::move(data.releaseFences);
1464}
1465
1466void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1467 auto found = mReturnData.find(display);
1468 if (found == mReturnData.end()) {
1469 *outPresentFence = -1;
1470 return;
1471 }
1472
1473 ReturnData& data = found->second;
1474
1475 *outPresentFence = data.presentFence;
1476 data.presentFence = -1;
1477}
1478
1479void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1480 auto found = mReturnData.find(display);
1481 if (found == mReturnData.end()) {
1482 *state = -1;
1483 return;
1484 }
1485 ReturnData& data = found->second;
1486 *state = data.presentOrValidateState;
1487}
1488
1489void CommandReader::takeClientTargetProperty(
1490 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1491 auto found = mReturnData.find(display);
1492
1493 // If not found, return the default values.
1494 if (found == mReturnData.end()) {
1495 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1496 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1497 return;
1498 }
1499
1500 ReturnData& data = found->second;
1501 *outClientTargetProperty = data.clientTargetProperty;
1502}
1503
1504} // namespace Hwc2
1505} // namespace android
1506
1507// TODO(b/129481165): remove the #pragma below and fix conversion issues
1508#pragma clang diagnostic pop // ignored "-Wconversion"