1 /*
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 <SurfaceFlingerProperties.h>
28 #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h>
29 #include <android/binder_manager.h>
30 #include <android/hardware/graphics/composer/2.1/types.h>
31 #include <common/FlagManager.h>
32 #include <common/trace.h>
33 #include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
34 #include <hidl/HidlTransportSupport.h>
35 #include <hidl/HidlTransportUtils.h>
36 #include <log/log.h>
37
38 #include "HWC2.h"
39 #include "Hal.h"
40
41 #include <algorithm>
42 #include <cinttypes>
43
44 using aidl::android::hardware::graphics::common::DisplayHotplugEvent;
45 using aidl::android::hardware::graphics::common::HdrConversionCapability;
46 using aidl::android::hardware::graphics::common::HdrConversionStrategy;
47 using aidl::android::hardware::graphics::composer3::Capability;
48 using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
49 using aidl::android::hardware::graphics::composer3::DimmingStage;
50 using aidl::android::hardware::graphics::composer3::DisplayCapability;
51 using aidl::android::hardware::graphics::composer3::DisplayLuts;
52 using aidl::android::hardware::graphics::composer3::Luts;
53 using aidl::android::hardware::graphics::composer3::OverlayProperties;
54
55 namespace android {
56
57 using hardware::hidl_handle;
58 using hardware::hidl_vec;
59 using hardware::Return;
60
61 namespace Hwc2 {
62 namespace {
63
64 using android::hardware::Return;
65 using android::hardware::Void;
66 using android::HWC2::ComposerCallback;
67
68 class ComposerCallbackBridge : public IComposerCallback {
69 public:
ComposerCallbackBridge(ComposerCallback & callback,bool vsyncSwitchingSupported)70 ComposerCallbackBridge(ComposerCallback& callback, bool vsyncSwitchingSupported)
71 : mCallback(callback), mVsyncSwitchingSupported(vsyncSwitchingSupported) {}
72
73 // For code sharing purposes, `ComposerCallback` (implemented by SurfaceFlinger)
74 // replaced `onComposerHalHotplug` with `onComposerHalHotplugEvent` by converting
75 // from HIDL's connection into an AIDL DisplayHotplugEvent.
onHotplug(Display display,Connection connection)76 Return<void> onHotplug(Display display, Connection connection) override {
77 const auto event = connection == Connection::CONNECTED ? DisplayHotplugEvent::CONNECTED
78 : DisplayHotplugEvent::DISCONNECTED;
79 mCallback.onComposerHalHotplugEvent(display, event);
80 return Void();
81 }
82
onRefresh(Display display)83 Return<void> onRefresh(Display display) override {
84 mCallback.onComposerHalRefresh(display);
85 return Void();
86 }
87
onVsync(Display display,int64_t timestamp)88 Return<void> onVsync(Display display, int64_t timestamp) override {
89 if (!mVsyncSwitchingSupported) {
90 mCallback.onComposerHalVsync(display, timestamp, std::nullopt);
91 } else {
92 ALOGW("Unexpected onVsync callback on composer >= 2.4, ignoring.");
93 }
94 return Void();
95 }
96
onVsync_2_4(Display display,int64_t timestamp,VsyncPeriodNanos vsyncPeriodNanos)97 Return<void> onVsync_2_4(Display display, int64_t timestamp,
98 VsyncPeriodNanos vsyncPeriodNanos) override {
99 if (mVsyncSwitchingSupported) {
100 mCallback.onComposerHalVsync(display, timestamp, vsyncPeriodNanos);
101 } else {
102 ALOGW("Unexpected onVsync_2_4 callback on composer <= 2.3, ignoring.");
103 }
104 return Void();
105 }
106
onVsyncPeriodTimingChanged(Display display,const VsyncPeriodChangeTimeline & timeline)107 Return<void> onVsyncPeriodTimingChanged(Display display,
108 const VsyncPeriodChangeTimeline& timeline) override {
109 mCallback.onComposerHalVsyncPeriodTimingChanged(display, timeline);
110 return Void();
111 }
112
onSeamlessPossible(Display display)113 Return<void> onSeamlessPossible(Display display) override {
114 mCallback.onComposerHalSeamlessPossible(display);
115 return Void();
116 }
117
118 private:
119 ComposerCallback& mCallback;
120 const bool mVsyncSwitchingSupported;
121 };
122
123 } // namespace
124
125 HidlComposer::~HidlComposer() = default;
126
127 namespace {
128
129 class BufferHandle {
130 public:
BufferHandle(const native_handle_t * buffer)131 explicit BufferHandle(const native_handle_t* buffer) {
132 // nullptr is not a valid handle to HIDL
133 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
134 }
135
operator const hidl_handle&() const136 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
137 {
138 return mHandle;
139 }
140
141 private:
142 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
143 hidl_handle mHandle;
144 };
145
146 class FenceHandle {
147 public:
FenceHandle(int fd,bool owned)148 FenceHandle(int fd, bool owned) : mOwned(owned) {
149 native_handle_t* handle;
150 if (fd >= 0) {
151 handle = native_handle_init(mStorage, 1, 0);
152 handle->data[0] = fd;
153 } else {
154 // nullptr is not a valid handle to HIDL
155 handle = native_handle_init(mStorage, 0, 0);
156 }
157 mHandle = handle;
158 }
159
~FenceHandle()160 ~FenceHandle() {
161 if (mOwned) {
162 native_handle_close(mHandle);
163 }
164 }
165
operator const hidl_handle&() const166 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
167 {
168 return mHandle;
169 }
170
171 private:
172 bool mOwned;
173 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
174 hidl_handle mHandle;
175 };
176
177 // assume NO_RESOURCES when Status::isOk returns false
178 constexpr V2_1::Error kDefaultError = V2_1::Error::NO_RESOURCES;
179 constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
180
181 template <typename T, typename U>
unwrapRet(Return<T> & ret,const U & default_val)182 T unwrapRet(Return<T>& ret, const U& default_val) {
183 return (ret.isOk()) ? static_cast<T>(ret) : static_cast<T>(default_val);
184 }
185
unwrapRet(Return<V2_1::Error> & ret)186 V2_1::Error unwrapRet(Return<V2_1::Error>& ret) {
187 return unwrapRet(ret, kDefaultError);
188 }
189
190 template <typename To, typename From>
translate(From x)191 To translate(From x) {
192 return static_cast<To>(x);
193 }
194
195 template <typename To, typename From>
translate(const hidl_vec<From> & in)196 std::vector<To> translate(const hidl_vec<From>& in) {
197 std::vector<To> out;
198 out.reserve(in.size());
199 std::transform(in.begin(), in.end(), std::back_inserter(out),
200 [](From x) { return translate<To>(x); });
201 return out;
202 }
203
allocateClearSlotBuffer()204 sp<GraphicBuffer> allocateClearSlotBuffer() {
205 if (!sysprop::clear_slots_with_set_layer_buffer(false)) {
206 return nullptr;
207 }
208 sp<GraphicBuffer> buffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
209 GraphicBuffer::USAGE_HW_COMPOSER |
210 GraphicBuffer::USAGE_SW_READ_OFTEN |
211 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
212 "HidlComposer");
213 if (!buffer || buffer->initCheck() != ::android::OK) {
214 return nullptr;
215 }
216 return buffer;
217 }
218
219 } // anonymous namespace
220
HidlComposer(const std::string & serviceName)221 HidlComposer::HidlComposer(const std::string& serviceName)
222 : mClearSlotBuffer(allocateClearSlotBuffer()), mWriter(kWriterInitialSize) {
223 mComposer = V2_1::IComposer::getService(serviceName);
224
225 if (mComposer == nullptr) {
226 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
227 }
228
229 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
230 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
231 if (tmpError == V2_4::Error::NONE) {
232 mClient = tmpClient;
233 mClient_2_2 = tmpClient;
234 mClient_2_3 = tmpClient;
235 mClient_2_4 = tmpClient;
236 }
237 });
238 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
239 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
240 if (tmpError == V2_1::Error::NONE) {
241 mClient = tmpClient;
242 mClient_2_2 = tmpClient;
243 mClient_2_3 = tmpClient;
244 }
245 });
246 } else {
247 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
248 if (tmpError != V2_1::Error::NONE) {
249 return;
250 }
251
252 mClient = tmpClient;
253 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
254 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
255 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
256 "IComposer 2.2 did not return IComposerClient 2.2");
257 }
258 });
259 }
260
261 if (mClient == nullptr) {
262 LOG_ALWAYS_FATAL("failed to create composer client");
263 }
264
265 if (!mClearSlotBuffer && sysprop::clear_slots_with_set_layer_buffer(false)) {
266 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
267 return;
268 }
269 }
270
isSupported(OptionalFeature feature) const271 bool HidlComposer::isSupported(OptionalFeature feature) const {
272 switch (feature) {
273 case OptionalFeature::RefreshRateSwitching:
274 return mClient_2_4 != nullptr;
275 case OptionalFeature::ExpectedPresentTime:
276 case OptionalFeature::DisplayBrightnessCommand:
277 case OptionalFeature::KernelIdleTimer:
278 case OptionalFeature::PhysicalDisplayOrientation:
279 return false;
280 }
281 }
282
isVrrSupported() const283 bool HidlComposer::isVrrSupported() const {
284 // VRR is not supported on the HIDL composer.
285 return false;
286 };
287
getCapabilities()288 std::vector<Capability> HidlComposer::getCapabilities() {
289 std::vector<Capability> capabilities;
290 mComposer->getCapabilities([&](const auto& tmpCapabilities) {
291 capabilities = translate<Capability>(tmpCapabilities);
292 });
293 return capabilities;
294 }
295
dumpDebugInfo()296 std::string HidlComposer::dumpDebugInfo() {
297 std::string info;
298 info += std::string(mComposer->descriptor) + "\n";
299 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { info = tmpInfo.c_str(); });
300
301 return info;
302 }
303
registerCallback(const sp<IComposerCallback> & callback)304 void HidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
305 if (!FlagManager::getInstance().disable_sched_fifo_composer_callback()) {
306 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
307 }
308
309 auto ret = [&]() {
310 if (mClient_2_4) {
311 return mClient_2_4->registerCallback_2_4(callback);
312 }
313 return mClient->registerCallback(callback);
314 }();
315 if (!ret.isOk()) {
316 ALOGE("failed to register IComposerCallback");
317 }
318 }
319
executeCommands(Display)320 Error HidlComposer::executeCommands(Display) {
321 return execute();
322 }
323
getMaxVirtualDisplayCount()324 uint32_t HidlComposer::getMaxVirtualDisplayCount() {
325 auto ret = mClient->getMaxVirtualDisplayCount();
326 return unwrapRet(ret, 0);
327 }
328
createVirtualDisplay(uint32_t width,uint32_t height,PixelFormat * format,Display * outDisplay)329 Error HidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
330 Display* outDisplay) {
331 const uint32_t bufferSlotCount = 1;
332 Error error = static_cast<Error>(kDefaultError);
333 if (mClient_2_2) {
334 mClient_2_2->createVirtualDisplay_2_2(width, height,
335 static_cast<types::V1_1::PixelFormat>(*format),
336 bufferSlotCount,
337 [&](const auto& tmpError, const auto& tmpDisplay,
338 const auto& tmpFormat) {
339 error = static_cast<Error>(tmpError);
340 if (error != Error::NONE) {
341 return;
342 }
343
344 *outDisplay = tmpDisplay;
345 *format = static_cast<types::V1_2::PixelFormat>(
346 tmpFormat);
347 });
348 } else {
349 mClient->createVirtualDisplay(width, height, static_cast<types::V1_0::PixelFormat>(*format),
350 bufferSlotCount,
351 [&](const auto& tmpError, const auto& tmpDisplay,
352 const auto& tmpFormat) {
353 error = static_cast<Error>(tmpError);
354 if (error != Error::NONE) {
355 return;
356 }
357
358 *outDisplay = tmpDisplay;
359 *format = static_cast<PixelFormat>(tmpFormat);
360 });
361 }
362
363 return error;
364 }
365
destroyVirtualDisplay(Display display)366 Error HidlComposer::destroyVirtualDisplay(Display display) {
367 auto ret = mClient->destroyVirtualDisplay(display);
368 return static_cast<Error>(unwrapRet(ret));
369 }
370
acceptDisplayChanges(Display display)371 Error HidlComposer::acceptDisplayChanges(Display display) {
372 mWriter.selectDisplay(display);
373 mWriter.acceptDisplayChanges();
374 return Error::NONE;
375 }
376
createLayer(Display display,Layer * outLayer)377 Error HidlComposer::createLayer(Display display, Layer* outLayer) {
378 Error error = static_cast<Error>(kDefaultError);
379 mClient->createLayer(display, kMaxLayerBufferCount,
380 [&](const auto& tmpError, const auto& tmpLayer) {
381 error = static_cast<Error>(tmpError);
382 if (error != Error::NONE) {
383 return;
384 }
385
386 *outLayer = tmpLayer;
387 });
388
389 return error;
390 }
391
destroyLayer(Display display,Layer layer)392 Error HidlComposer::destroyLayer(Display display, Layer layer) {
393 auto ret = mClient->destroyLayer(display, layer);
394 return static_cast<Error>(unwrapRet(ret));
395 }
396
getActiveConfig(Display display,Config * outConfig)397 Error HidlComposer::getActiveConfig(Display display, Config* outConfig) {
398 Error error = static_cast<Error>(kDefaultError);
399 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
400 error = static_cast<Error>(tmpError);
401 if (error != Error::NONE) {
402 return;
403 }
404
405 *outConfig = tmpConfig;
406 });
407
408 return error;
409 }
410
getChangedCompositionTypes(Display display,std::vector<Layer> * outLayers,std::vector<aidl::android::hardware::graphics::composer3::Composition> * outTypes)411 Error HidlComposer::getChangedCompositionTypes(
412 Display display, std::vector<Layer>* outLayers,
413 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
414 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
415 return Error::NONE;
416 }
417
getColorModes(Display display,std::vector<ColorMode> * outModes)418 Error HidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
419 Error error = static_cast<Error>(kDefaultError);
420
421 if (mClient_2_3) {
422 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
423 error = static_cast<Error>(tmpError);
424 if (error != Error::NONE) {
425 return;
426 }
427
428 *outModes = tmpModes;
429 });
430 } else if (mClient_2_2) {
431 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
432 error = static_cast<Error>(tmpError);
433 if (error != Error::NONE) {
434 return;
435 }
436
437 for (types::V1_1::ColorMode colorMode : tmpModes) {
438 outModes->push_back(static_cast<ColorMode>(colorMode));
439 }
440 });
441 } else {
442 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpModes) {
443 error = static_cast<Error>(tmpError);
444 if (error != Error::NONE) {
445 return;
446 }
447 for (types::V1_0::ColorMode colorMode : tmpModes) {
448 outModes->push_back(static_cast<ColorMode>(colorMode));
449 }
450 });
451 }
452
453 return error;
454 }
455
getDisplayAttribute(Display display,Config config,IComposerClient::Attribute attribute,int32_t * outValue)456 Error HidlComposer::getDisplayAttribute(Display display, Config config,
457 IComposerClient::Attribute attribute, int32_t* outValue) {
458 Error error = static_cast<Error>(kDefaultError);
459 if (mClient_2_4) {
460 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
461 [&](const auto& tmpError, const auto& tmpValue) {
462 error = static_cast<Error>(tmpError);
463 if (error != Error::NONE) {
464 return;
465 }
466
467 *outValue = tmpValue;
468 });
469 } else {
470 mClient->getDisplayAttribute(display, config,
471 static_cast<V2_1::IComposerClient::Attribute>(attribute),
472 [&](const auto& tmpError, const auto& tmpValue) {
473 error = static_cast<Error>(tmpError);
474 if (error != Error::NONE) {
475 return;
476 }
477
478 *outValue = tmpValue;
479 });
480 }
481
482 return error;
483 }
484
getDisplayConfigs(Display display,std::vector<Config> * outConfigs)485 Error HidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
486 Error error = static_cast<Error>(kDefaultError);
487 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
488 error = static_cast<Error>(tmpError);
489 if (error != Error::NONE) {
490 return;
491 }
492
493 *outConfigs = tmpConfigs;
494 });
495
496 return error;
497 }
498
getDisplayConfigurations(Display,int32_t,std::vector<DisplayConfiguration> *)499 Error HidlComposer::getDisplayConfigurations(Display, int32_t /*maxFrameIntervalNs*/,
500 std::vector<DisplayConfiguration>*) {
501 LOG_ALWAYS_FATAL("getDisplayConfigurations should not have been called on this, as "
502 "it's a HWC3 interface version 3 feature");
503 }
504
getDisplayName(Display display,std::string * outName)505 Error HidlComposer::getDisplayName(Display display, std::string* outName) {
506 Error error = static_cast<Error>(kDefaultError);
507 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
508 error = static_cast<Error>(tmpError);
509 if (error != Error::NONE) {
510 return;
511 }
512
513 *outName = tmpName.c_str();
514 });
515
516 return error;
517 }
518
getDisplayRequests(Display display,uint32_t * outDisplayRequestMask,std::vector<Layer> * outLayers,std::vector<uint32_t> * outLayerRequestMasks)519 Error HidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
520 std::vector<Layer>* outLayers,
521 std::vector<uint32_t>* outLayerRequestMasks) {
522 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
523 return Error::NONE;
524 }
525
getDozeSupport(Display display,bool * outSupport)526 Error HidlComposer::getDozeSupport(Display display, bool* outSupport) {
527 Error error = static_cast<Error>(kDefaultError);
528 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
529 error = static_cast<Error>(tmpError);
530 if (error != Error::NONE) {
531 return;
532 }
533
534 *outSupport = tmpSupport;
535 });
536
537 return error;
538 }
539
hasDisplayIdleTimerCapability(Display,bool *)540 Error HidlComposer::hasDisplayIdleTimerCapability(Display, bool*) {
541 LOG_ALWAYS_FATAL("hasDisplayIdleTimerCapability should have never been called on this as "
542 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
543 }
544
getHdrCapabilities(Display display,std::vector<Hdr> * outHdrTypes,float * outMaxLuminance,float * outMaxAverageLuminance,float * outMinLuminance)545 Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outHdrTypes,
546 float* outMaxLuminance, float* outMaxAverageLuminance,
547 float* outMinLuminance) {
548 Error error = static_cast<Error>(kDefaultError);
549 if (mClient_2_3) {
550 mClient_2_3->getHdrCapabilities_2_3(display,
551 [&](const auto& tmpError, const auto& tmpHdrTypes,
552 const auto& tmpMaxLuminance,
553 const auto& tmpMaxAverageLuminance,
554 const auto& tmpMinLuminance) {
555 error = static_cast<Error>(tmpError);
556 if (error != Error::NONE) {
557 return;
558 }
559 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
560
561 *outMaxLuminance = tmpMaxLuminance;
562 *outMaxAverageLuminance = tmpMaxAverageLuminance;
563 *outMinLuminance = tmpMinLuminance;
564 });
565 } else {
566 mClient->getHdrCapabilities(display,
567 [&](const auto& tmpError, const auto& tmpHdrTypes,
568 const auto& tmpMaxLuminance,
569 const auto& tmpMaxAverageLuminance,
570 const auto& tmpMinLuminance) {
571 error = static_cast<Error>(tmpError);
572 if (error != Error::NONE) {
573 return;
574 }
575 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
576
577 *outMaxLuminance = tmpMaxLuminance;
578 *outMaxAverageLuminance = tmpMaxAverageLuminance;
579 *outMinLuminance = tmpMinLuminance;
580 });
581 }
582
583 return error;
584 }
585
getOverlaySupport(OverlayProperties *)586 Error HidlComposer::getOverlaySupport(OverlayProperties* /*outProperties*/) {
587 return Error::NONE;
588 }
589
getReleaseFences(Display display,std::vector<Layer> * outLayers,std::vector<int> * outReleaseFences)590 Error HidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
591 std::vector<int>* outReleaseFences) {
592 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
593 return Error::NONE;
594 }
595
getLayerPresentFences(Display,std::vector<Layer> *,std::vector<int> *,std::vector<int64_t> *)596 Error HidlComposer::getLayerPresentFences(Display, std::vector<Layer>*, std::vector<int>*,
597 std::vector<int64_t>*) {
598 return Error::UNSUPPORTED;
599 }
600
presentDisplay(Display display,int * outPresentFence)601 Error HidlComposer::presentDisplay(Display display, int* outPresentFence) {
602 SFTRACE_NAME("HwcPresentDisplay");
603 mWriter.selectDisplay(display);
604 mWriter.presentDisplay();
605
606 Error error = execute();
607 if (error != Error::NONE) {
608 return error;
609 }
610
611 mReader.takePresentFence(display, outPresentFence);
612
613 return Error::NONE;
614 }
615
setActiveConfig(Display display,Config config)616 Error HidlComposer::setActiveConfig(Display display, Config config) {
617 auto ret = mClient->setActiveConfig(display, config);
618 return static_cast<Error>(unwrapRet(ret));
619 }
620
setClientTarget(Display display,uint32_t slot,const sp<GraphicBuffer> & target,int acquireFence,Dataspace dataspace,const std::vector<IComposerClient::Rect> & damage,float)621 Error HidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
622 int acquireFence, Dataspace dataspace,
623 const std::vector<IComposerClient::Rect>& damage,
624 float /*hdrSdrRatio*/) {
625 mWriter.selectDisplay(display);
626
627 const native_handle_t* handle = nullptr;
628 if (target.get()) {
629 handle = target->getNativeBuffer()->handle;
630 }
631
632 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
633 return Error::NONE;
634 }
635
setColorMode(Display display,ColorMode mode,RenderIntent renderIntent)636 Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
637 hardware::Return<V2_1::Error> ret(kDefaultError);
638 if (mClient_2_3) {
639 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
640 } else if (mClient_2_2) {
641 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
642 renderIntent);
643 } else {
644 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
645 }
646 return static_cast<Error>(unwrapRet(ret));
647 }
648
setColorTransform(Display display,const float * matrix)649 Error HidlComposer::setColorTransform(Display display, const float* matrix) {
650 mWriter.selectDisplay(display);
651 const bool isIdentity = (mat4(matrix) == mat4());
652 mWriter.setColorTransform(matrix,
653 isIdentity ? ColorTransform::IDENTITY
654 : ColorTransform::ARBITRARY_MATRIX);
655 return Error::NONE;
656 }
657
setOutputBuffer(Display display,const native_handle_t * buffer,int releaseFence)658 Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
659 int releaseFence) {
660 mWriter.selectDisplay(display);
661 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
662 return Error::NONE;
663 }
664
setPowerMode(Display display,IComposerClient::PowerMode mode)665 Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
666 Return<V2_1::Error> ret(V2_1::Error::UNSUPPORTED);
667 if (mClient_2_2) {
668 ret = mClient_2_2->setPowerMode_2_2(display, mode);
669 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
670 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
671 }
672
673 return static_cast<Error>(unwrapRet(ret));
674 }
675
setVsyncEnabled(Display display,IComposerClient::Vsync enabled)676 Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
677 auto ret = mClient->setVsyncEnabled(display, enabled);
678 return static_cast<Error>(unwrapRet(ret));
679 }
680
setClientTargetSlotCount(Display display)681 Error HidlComposer::setClientTargetSlotCount(Display display) {
682 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
683 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
684 return static_cast<Error>(unwrapRet(ret));
685 }
686
validateDisplay(Display display,nsecs_t,int32_t,uint32_t * outNumTypes,uint32_t * outNumRequests)687 Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
688 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
689 uint32_t* outNumRequests) {
690 SFTRACE_NAME("HwcValidateDisplay");
691 mWriter.selectDisplay(display);
692 mWriter.validateDisplay();
693
694 Error error = execute();
695 if (error != Error::NONE) {
696 return error;
697 }
698
699 mReader.hasChanges(display, outNumTypes, outNumRequests);
700
701 return Error::NONE;
702 }
703
presentOrValidateDisplay(Display display,nsecs_t,int32_t,uint32_t * outNumTypes,uint32_t * outNumRequests,int * outPresentFence,uint32_t * state)704 Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
705 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
706 uint32_t* outNumRequests, int* outPresentFence,
707 uint32_t* state) {
708 SFTRACE_NAME("HwcPresentOrValidateDisplay");
709 mWriter.selectDisplay(display);
710 mWriter.presentOrvalidateDisplay();
711
712 Error error = execute();
713 if (error != Error::NONE) {
714 return error;
715 }
716
717 mReader.takePresentOrValidateStage(display, state);
718
719 if (*state == 1) { // Present succeeded
720 mReader.takePresentFence(display, outPresentFence);
721 }
722
723 if (*state == 0) { // Validate succeeded.
724 mReader.hasChanges(display, outNumTypes, outNumRequests);
725 }
726
727 return Error::NONE;
728 }
729
setCursorPosition(Display display,Layer layer,int32_t x,int32_t y)730 Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
731 mWriter.selectDisplay(display);
732 mWriter.selectLayer(layer);
733 mWriter.setLayerCursorPosition(x, y);
734 return Error::NONE;
735 }
736
setLayerBuffer(Display display,Layer layer,uint32_t slot,const sp<GraphicBuffer> & buffer,int acquireFence)737 Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
738 const sp<GraphicBuffer>& buffer, int acquireFence) {
739 mWriter.selectDisplay(display);
740 mWriter.selectLayer(layer);
741
742 const native_handle_t* handle = nullptr;
743 if (buffer.get()) {
744 handle = buffer->getNativeBuffer()->handle;
745 }
746
747 mWriter.setLayerBuffer(slot, handle, acquireFence);
748 return Error::NONE;
749 }
750
setLayerBufferSlotsToClear(Display display,Layer layer,const std::vector<uint32_t> & slotsToClear,uint32_t activeBufferSlot)751 Error HidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
752 const std::vector<uint32_t>& slotsToClear,
753 uint32_t activeBufferSlot) {
754 if (slotsToClear.empty()) {
755 return Error::NONE;
756 }
757 // This can be null when the HAL hasn't explicitly enabled this feature.
758 if (mClearSlotBuffer == nullptr) {
759 return Error::NONE;
760 }
761 // Backwards compatible way of clearing buffer is to set the layer buffer with a placeholder
762 // buffer, using the slot that needs to cleared... tricky.
763 for (uint32_t slot : slotsToClear) {
764 // Don't clear the active buffer slot because we need to restore the active buffer after
765 // setting the requested buffer slots with a placeholder buffer.
766 if (slot != activeBufferSlot) {
767 mWriter.selectDisplay(display);
768 mWriter.selectLayer(layer);
769 mWriter.setLayerBuffer(slot, mClearSlotBuffer->handle, /*fence*/ -1);
770 }
771 }
772 // Since we clear buffers by setting them to a placeholder buffer, we want to make sure that the
773 // last setLayerBuffer command is sent with the currently active buffer, not the placeholder
774 // buffer, so that there is no perceptual change.
775 mWriter.selectDisplay(display);
776 mWriter.selectLayer(layer);
777 mWriter.setLayerBuffer(activeBufferSlot, /*buffer*/ nullptr, /*fence*/ -1);
778 return Error::NONE;
779 }
780
setLayerSurfaceDamage(Display display,Layer layer,const std::vector<IComposerClient::Rect> & damage)781 Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
782 const std::vector<IComposerClient::Rect>& damage) {
783 mWriter.selectDisplay(display);
784 mWriter.selectLayer(layer);
785 mWriter.setLayerSurfaceDamage(damage);
786 return Error::NONE;
787 }
788
setLayerBlendMode(Display display,Layer layer,IComposerClient::BlendMode mode)789 Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
790 IComposerClient::BlendMode mode) {
791 mWriter.selectDisplay(display);
792 mWriter.selectLayer(layer);
793 mWriter.setLayerBlendMode(mode);
794 return Error::NONE;
795 }
796
to_hidl_type(aidl::android::hardware::graphics::composer3::Color color)797 static IComposerClient::Color to_hidl_type(
798 aidl::android::hardware::graphics::composer3::Color color) {
799 const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
800 const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
801 const auto minVal = static_cast<uint64_t>(0);
802 const auto maxVal = static_cast<uint64_t>(255);
803 return std::clamp(intVal, minVal, maxVal);
804 };
805
806 return IComposerClient::Color{
807 floatColorToUint8Clamped(color.r),
808 floatColorToUint8Clamped(color.g),
809 floatColorToUint8Clamped(color.b),
810 floatColorToUint8Clamped(color.a),
811 };
812 }
813
setLayerColor(Display display,Layer layer,const aidl::android::hardware::graphics::composer3::Color & color)814 Error HidlComposer::setLayerColor(
815 Display display, Layer layer,
816 const aidl::android::hardware::graphics::composer3::Color& color) {
817 mWriter.selectDisplay(display);
818 mWriter.selectLayer(layer);
819 mWriter.setLayerColor(to_hidl_type(color));
820 return Error::NONE;
821 }
822
to_hidl_type(aidl::android::hardware::graphics::composer3::Composition type)823 static IComposerClient::Composition to_hidl_type(
824 aidl::android::hardware::graphics::composer3::Composition type) {
825 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
826 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
827 "Trying to use %s, which is not supported by HidlComposer!",
828 android::to_string(type).c_str());
829
830 return static_cast<IComposerClient::Composition>(type);
831 }
832
setLayerCompositionType(Display display,Layer layer,aidl::android::hardware::graphics::composer3::Composition type)833 Error HidlComposer::setLayerCompositionType(
834 Display display, Layer layer,
835 aidl::android::hardware::graphics::composer3::Composition type) {
836 mWriter.selectDisplay(display);
837 mWriter.selectLayer(layer);
838 mWriter.setLayerCompositionType(to_hidl_type(type));
839 return Error::NONE;
840 }
841
setLayerDataspace(Display display,Layer layer,Dataspace dataspace)842 Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
843 mWriter.selectDisplay(display);
844 mWriter.selectLayer(layer);
845 mWriter.setLayerDataspace(dataspace);
846 return Error::NONE;
847 }
848
setLayerDisplayFrame(Display display,Layer layer,const IComposerClient::Rect & frame)849 Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
850 const IComposerClient::Rect& frame) {
851 mWriter.selectDisplay(display);
852 mWriter.selectLayer(layer);
853 mWriter.setLayerDisplayFrame(frame);
854 return Error::NONE;
855 }
856
setLayerPlaneAlpha(Display display,Layer layer,float alpha)857 Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
858 mWriter.selectDisplay(display);
859 mWriter.selectLayer(layer);
860 mWriter.setLayerPlaneAlpha(alpha);
861 return Error::NONE;
862 }
863
setLayerSidebandStream(Display display,Layer layer,const native_handle_t * stream)864 Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
865 const native_handle_t* stream) {
866 mWriter.selectDisplay(display);
867 mWriter.selectLayer(layer);
868 mWriter.setLayerSidebandStream(stream);
869 return Error::NONE;
870 }
871
setLayerSourceCrop(Display display,Layer layer,const IComposerClient::FRect & crop)872 Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
873 const IComposerClient::FRect& crop) {
874 mWriter.selectDisplay(display);
875 mWriter.selectLayer(layer);
876 mWriter.setLayerSourceCrop(crop);
877 return Error::NONE;
878 }
879
setLayerTransform(Display display,Layer layer,Transform transform)880 Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
881 mWriter.selectDisplay(display);
882 mWriter.selectLayer(layer);
883 mWriter.setLayerTransform(transform);
884 return Error::NONE;
885 }
886
setLayerVisibleRegion(Display display,Layer layer,const std::vector<IComposerClient::Rect> & visible)887 Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
888 const std::vector<IComposerClient::Rect>& visible) {
889 mWriter.selectDisplay(display);
890 mWriter.selectLayer(layer);
891 mWriter.setLayerVisibleRegion(visible);
892 return Error::NONE;
893 }
894
setLayerZOrder(Display display,Layer layer,uint32_t z)895 Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
896 mWriter.selectDisplay(display);
897 mWriter.selectLayer(layer);
898 mWriter.setLayerZOrder(z);
899 return Error::NONE;
900 }
901
execute()902 Error HidlComposer::execute() {
903 // prepare input command queue
904 bool queueChanged = false;
905 uint32_t commandLength = 0;
906 hidl_vec<hidl_handle> commandHandles;
907 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
908 mWriter.reset();
909 return Error::NO_RESOURCES;
910 }
911
912 // set up new input command queue if necessary
913 if (queueChanged) {
914 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
915 auto error = static_cast<Error>(unwrapRet(ret));
916 if (error != Error::NONE) {
917 mWriter.reset();
918 return error;
919 }
920 }
921
922 if (commandLength == 0) {
923 mWriter.reset();
924 return Error::NONE;
925 }
926
927 Error error = static_cast<Error>(kDefaultError);
928 hardware::Return<void> ret;
929 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
930 const auto& tmpOutLength, const auto& tmpOutHandles) {
931 error = static_cast<Error>(tmpError);
932
933 // set up new output command queue if necessary
934 if (error == Error::NONE && tmpOutChanged) {
935 error = static_cast<Error>(kDefaultError);
936 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
937 error = static_cast<Error>(tmpError);
938 if (error != Error::NONE) {
939 return;
940 }
941
942 mReader.setMQDescriptor(tmpDescriptor);
943 });
944 }
945
946 if (error != Error::NONE) {
947 return;
948 }
949
950 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
951 error = mReader.parse();
952 mReader.reset();
953 } else {
954 error = Error::NO_RESOURCES;
955 }
956 };
957 if (mClient_2_2) {
958 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
959 } else {
960 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
961 }
962 // executeCommands can fail because of out-of-fd and we do not want to
963 // abort() in that case
964 if (!ret.isOk()) {
965 ALOGE("executeCommands failed because of %s", ret.description().c_str());
966 }
967
968 if (error == Error::NONE) {
969 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
970
971 for (const auto& cmdErr : commandErrors) {
972 auto command =
973 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
974
975 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
976 command == IComposerClient::Command::PRESENT_DISPLAY ||
977 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
978 error = cmdErr.error;
979 } else {
980 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
981 }
982 }
983 }
984
985 mWriter.reset();
986
987 return error;
988 }
989
990 // Composer HAL 2.2
991
setLayerPerFrameMetadata(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadata> & perFrameMetadatas)992 Error HidlComposer::setLayerPerFrameMetadata(
993 Display display, Layer layer,
994 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
995 if (!mClient_2_2) {
996 return Error::UNSUPPORTED;
997 }
998
999 mWriter.selectDisplay(display);
1000 mWriter.selectLayer(layer);
1001 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
1002 return Error::NONE;
1003 }
1004
getPerFrameMetadataKeys(Display display)1005 std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
1006 Display display) {
1007 std::vector<IComposerClient::PerFrameMetadataKey> keys;
1008 if (!mClient_2_2) {
1009 return keys;
1010 }
1011
1012 Error error = static_cast<Error>(kDefaultError);
1013 if (mClient_2_3) {
1014 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
1015 [&](const auto& tmpError, const auto& tmpKeys) {
1016 error = static_cast<Error>(tmpError);
1017 if (error != Error::NONE) {
1018 ALOGW("getPerFrameMetadataKeys failed "
1019 "with %d",
1020 tmpError);
1021 return;
1022 }
1023 keys = tmpKeys;
1024 });
1025 } else {
1026 mClient_2_2
1027 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
1028 error = static_cast<Error>(tmpError);
1029 if (error != Error::NONE) {
1030 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
1031 return;
1032 }
1033
1034 keys.clear();
1035 for (auto key : tmpKeys) {
1036 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
1037 }
1038 });
1039 }
1040
1041 return keys;
1042 }
1043
getRenderIntents(Display display,ColorMode colorMode,std::vector<RenderIntent> * outRenderIntents)1044 Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1045 std::vector<RenderIntent>* outRenderIntents) {
1046 if (!mClient_2_2) {
1047 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1048 return Error::NONE;
1049 }
1050
1051 Error error = static_cast<Error>(kDefaultError);
1052
1053 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
1054 error = static_cast<Error>(tmpError);
1055 if (error != Error::NONE) {
1056 return;
1057 }
1058
1059 *outRenderIntents = tmpKeys;
1060 };
1061
1062 if (mClient_2_3) {
1063 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1064 } else {
1065 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1066 getRenderIntentsLambda);
1067 }
1068
1069 return error;
1070 }
1071
getDataspaceSaturationMatrix(Dataspace dataspace,mat4 * outMatrix)1072 Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1073 if (!mClient_2_2) {
1074 *outMatrix = mat4();
1075 return Error::NONE;
1076 }
1077
1078 Error error = static_cast<Error>(kDefaultError);
1079 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1080 [&](const auto& tmpError, const auto& tmpMatrix) {
1081 error = static_cast<Error>(tmpError);
1082 if (error != Error::NONE) {
1083 return;
1084 }
1085 *outMatrix = mat4(tmpMatrix.data());
1086 });
1087
1088 return error;
1089 }
1090
1091 // Composer HAL 2.3
1092
getDisplayIdentificationData(Display display,uint8_t * outPort,std::vector<uint8_t> * outData)1093 Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1094 std::vector<uint8_t>* outData) {
1095 if (!mClient_2_3) {
1096 return Error::UNSUPPORTED;
1097 }
1098
1099 Error error = static_cast<Error>(kDefaultError);
1100 mClient_2_3->getDisplayIdentificationData(display,
1101 [&](const auto& tmpError, const auto& tmpPort,
1102 const auto& tmpData) {
1103 error = static_cast<Error>(tmpError);
1104 if (error != Error::NONE) {
1105 return;
1106 }
1107
1108 *outPort = tmpPort;
1109 *outData = tmpData;
1110 });
1111
1112 return error;
1113 }
1114
setLayerColorTransform(Display display,Layer layer,const float * matrix)1115 Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
1116 if (!mClient_2_3) {
1117 return Error::UNSUPPORTED;
1118 }
1119
1120 mWriter.selectDisplay(display);
1121 mWriter.selectLayer(layer);
1122 mWriter.setLayerColorTransform(matrix);
1123 return Error::NONE;
1124 }
1125
getDisplayedContentSamplingAttributes(Display display,PixelFormat * outFormat,Dataspace * outDataspace,uint8_t * outComponentMask)1126 Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1127 Dataspace* outDataspace,
1128 uint8_t* outComponentMask) {
1129 if (!outFormat || !outDataspace || !outComponentMask) {
1130 return Error::BAD_PARAMETER;
1131 }
1132 if (!mClient_2_3) {
1133 return Error::UNSUPPORTED;
1134 }
1135 Error error = static_cast<Error>(kDefaultError);
1136 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1137 [&](const auto tmpError,
1138 const auto& tmpFormat,
1139 const auto& tmpDataspace,
1140 const auto& tmpComponentMask) {
1141 error = static_cast<Error>(tmpError);
1142 if (error == Error::NONE) {
1143 *outFormat = tmpFormat;
1144 *outDataspace = tmpDataspace;
1145 *outComponentMask =
1146 static_cast<uint8_t>(
1147 tmpComponentMask);
1148 }
1149 });
1150 return error;
1151 }
1152
setDisplayContentSamplingEnabled(Display display,bool enabled,uint8_t componentMask,uint64_t maxFrames)1153 Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1154 uint8_t componentMask, uint64_t maxFrames) {
1155 if (!mClient_2_3) {
1156 return Error::UNSUPPORTED;
1157 }
1158
1159 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1160 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1161 auto ret = mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1162 maxFrames);
1163 return static_cast<Error>(unwrapRet(ret));
1164 }
1165
getDisplayedContentSample(Display display,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats)1166 Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1167 uint64_t timestamp, DisplayedFrameStats* outStats) {
1168 if (!outStats) {
1169 return Error::BAD_PARAMETER;
1170 }
1171 if (!mClient_2_3) {
1172 return Error::UNSUPPORTED;
1173 }
1174 Error error = static_cast<Error>(kDefaultError);
1175 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1176 [&](const auto tmpError, auto tmpNumFrames,
1177 const auto& tmpSamples0, const auto& tmpSamples1,
1178 const auto& tmpSamples2, const auto& tmpSamples3) {
1179 error = static_cast<Error>(tmpError);
1180 if (error == Error::NONE) {
1181 outStats->numFrames = tmpNumFrames;
1182 outStats->component_0_sample = tmpSamples0;
1183 outStats->component_1_sample = tmpSamples1;
1184 outStats->component_2_sample = tmpSamples2;
1185 outStats->component_3_sample = tmpSamples3;
1186 }
1187 });
1188 return error;
1189 }
1190
setLayerPerFrameMetadataBlobs(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadataBlob> & metadata)1191 Error HidlComposer::setLayerPerFrameMetadataBlobs(
1192 Display display, Layer layer,
1193 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1194 if (!mClient_2_3) {
1195 return Error::UNSUPPORTED;
1196 }
1197
1198 mWriter.selectDisplay(display);
1199 mWriter.selectLayer(layer);
1200 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1201 return Error::NONE;
1202 }
1203
setDisplayBrightness(Display display,float brightness,float,const DisplayBrightnessOptions &)1204 Error HidlComposer::setDisplayBrightness(Display display, float brightness, float,
1205 const DisplayBrightnessOptions&) {
1206 if (!mClient_2_3) {
1207 return Error::UNSUPPORTED;
1208 }
1209 auto ret = mClient_2_3->setDisplayBrightness(display, brightness);
1210 return static_cast<Error>(unwrapRet(ret));
1211 }
1212
1213 // Composer HAL 2.4
1214
getDisplayCapabilities(Display display,std::vector<DisplayCapability> * outCapabilities)1215 Error HidlComposer::getDisplayCapabilities(Display display,
1216 std::vector<DisplayCapability>* outCapabilities) {
1217 if (!mClient_2_3) {
1218 return Error::UNSUPPORTED;
1219 }
1220
1221 V2_4::Error error = kDefaultError_2_4;
1222 if (mClient_2_4) {
1223 mClient_2_4->getDisplayCapabilities_2_4(display,
1224 [&](const auto& tmpError, const auto& tmpCaps) {
1225 error = tmpError;
1226 if (error != V2_4::Error::NONE) {
1227 return;
1228 }
1229 *outCapabilities =
1230 translate<DisplayCapability>(tmpCaps);
1231 });
1232 } else {
1233 mClient_2_3->getDisplayCapabilities(display,
1234 [&](const auto& tmpError, const auto& tmpCaps) {
1235 error = static_cast<V2_4::Error>(tmpError);
1236 if (error != V2_4::Error::NONE) {
1237 return;
1238 }
1239
1240 *outCapabilities =
1241 translate<DisplayCapability>(tmpCaps);
1242 });
1243 }
1244
1245 return static_cast<Error>(error);
1246 }
1247
getDisplayConnectionType(Display display,IComposerClient::DisplayConnectionType * outType)1248 V2_4::Error HidlComposer::getDisplayConnectionType(
1249 Display display, IComposerClient::DisplayConnectionType* outType) {
1250 using Error = V2_4::Error;
1251 if (!mClient_2_4) {
1252 return Error::UNSUPPORTED;
1253 }
1254
1255 Error error = kDefaultError_2_4;
1256 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1257 error = tmpError;
1258 if (error != V2_4::Error::NONE) {
1259 return;
1260 }
1261
1262 *outType = tmpType;
1263 });
1264
1265 return error;
1266 }
1267
getDisplayVsyncPeriod(Display display,VsyncPeriodNanos * outVsyncPeriod)1268 V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1269 using Error = V2_4::Error;
1270 if (!mClient_2_4) {
1271 return Error::UNSUPPORTED;
1272 }
1273
1274 Error error = kDefaultError_2_4;
1275 mClient_2_4->getDisplayVsyncPeriod(display,
1276 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1277 error = tmpError;
1278 if (error != Error::NONE) {
1279 return;
1280 }
1281
1282 *outVsyncPeriod = tmpVsyncPeriod;
1283 });
1284
1285 return error;
1286 }
1287
setActiveConfigWithConstraints(Display display,Config config,const IComposerClient::VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * outTimeline)1288 Error HidlComposer::setActiveConfigWithConstraints(
1289 Display display, Config config,
1290 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1291 VsyncPeriodChangeTimeline* outTimeline) {
1292 if (!mClient_2_4) {
1293 return Error::UNSUPPORTED;
1294 }
1295
1296 Error error = static_cast<Error>(kDefaultError_2_4);
1297 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1298 [&](const auto& tmpError, const auto& tmpTimeline) {
1299 error = static_cast<Error>(tmpError);
1300 if (error != Error::NONE) {
1301 return;
1302 }
1303
1304 *outTimeline = tmpTimeline;
1305 });
1306
1307 return error;
1308 }
1309
setAutoLowLatencyMode(Display display,bool on)1310 V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1311 using Error = V2_4::Error;
1312 if (!mClient_2_4) {
1313 return Error::UNSUPPORTED;
1314 }
1315
1316 return mClient_2_4->setAutoLowLatencyMode(display, on);
1317 }
1318
getSupportedContentTypes(Display displayId,std::vector<IComposerClient::ContentType> * outSupportedContentTypes)1319 V2_4::Error HidlComposer::getSupportedContentTypes(
1320 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1321 using Error = V2_4::Error;
1322 if (!mClient_2_4) {
1323 return Error::UNSUPPORTED;
1324 }
1325
1326 Error error = kDefaultError_2_4;
1327 mClient_2_4->getSupportedContentTypes(displayId,
1328 [&](const auto& tmpError,
1329 const auto& tmpSupportedContentTypes) {
1330 error = tmpError;
1331 if (error != Error::NONE) {
1332 return;
1333 }
1334
1335 *outSupportedContentTypes = tmpSupportedContentTypes;
1336 });
1337 return error;
1338 }
1339
setContentType(Display display,IComposerClient::ContentType contentType)1340 V2_4::Error HidlComposer::setContentType(Display display,
1341 IComposerClient::ContentType contentType) {
1342 using Error = V2_4::Error;
1343 if (!mClient_2_4) {
1344 return Error::UNSUPPORTED;
1345 }
1346
1347 return mClient_2_4->setContentType(display, contentType);
1348 }
1349
setLayerGenericMetadata(Display display,Layer layer,const std::string & key,bool mandatory,const std::vector<uint8_t> & value)1350 V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1351 const std::string& key, bool mandatory,
1352 const std::vector<uint8_t>& value) {
1353 using Error = V2_4::Error;
1354 if (!mClient_2_4) {
1355 return Error::UNSUPPORTED;
1356 }
1357 mWriter.selectDisplay(display);
1358 mWriter.selectLayer(layer);
1359 mWriter.setLayerGenericMetadata(key, mandatory, value);
1360 return Error::NONE;
1361 }
1362
getLayerGenericMetadataKeys(std::vector<IComposerClient::LayerGenericMetadataKey> * outKeys)1363 V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1364 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1365 using Error = V2_4::Error;
1366 if (!mClient_2_4) {
1367 return Error::UNSUPPORTED;
1368 }
1369 Error error = kDefaultError_2_4;
1370 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1371 error = tmpError;
1372 if (error != Error::NONE) {
1373 return;
1374 }
1375
1376 *outKeys = tmpKeys;
1377 });
1378 return error;
1379 }
1380
setBootDisplayConfig(Display,Config)1381 Error HidlComposer::setBootDisplayConfig(Display /*displayId*/, Config) {
1382 return Error::UNSUPPORTED;
1383 }
1384
clearBootDisplayConfig(Display)1385 Error HidlComposer::clearBootDisplayConfig(Display /*displayId*/) {
1386 return Error::UNSUPPORTED;
1387 }
1388
getPreferredBootDisplayConfig(Display,Config *)1389 Error HidlComposer::getPreferredBootDisplayConfig(Display /*displayId*/, Config*) {
1390 return Error::UNSUPPORTED;
1391 }
1392
getHdrConversionCapabilities(std::vector<HdrConversionCapability> *)1393 Error HidlComposer::getHdrConversionCapabilities(std::vector<HdrConversionCapability>*) {
1394 return Error::UNSUPPORTED;
1395 }
1396
setHdrConversionStrategy(HdrConversionStrategy,Hdr *)1397 Error HidlComposer::setHdrConversionStrategy(HdrConversionStrategy, Hdr*) {
1398 return Error::UNSUPPORTED;
1399 }
1400
setRefreshRateChangedCallbackDebugEnabled(Display,bool)1401 Error HidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display, bool) {
1402 return Error::UNSUPPORTED;
1403 }
1404
notifyExpectedPresent(Display,nsecs_t,int32_t)1405 Error HidlComposer::notifyExpectedPresent(Display, nsecs_t, int32_t) {
1406 return Error::UNSUPPORTED;
1407 }
1408
getClientTargetProperty(Display display,ClientTargetPropertyWithBrightness * outClientTargetProperty)1409 Error HidlComposer::getClientTargetProperty(
1410 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1411 IComposerClient::ClientTargetProperty property;
1412 mReader.takeClientTargetProperty(display, &property);
1413 outClientTargetProperty->display = display;
1414 outClientTargetProperty->clientTargetProperty.dataspace =
1415 static_cast<::aidl::android::hardware::graphics::common::Dataspace>(property.dataspace);
1416 outClientTargetProperty->clientTargetProperty.pixelFormat =
1417 static_cast<::aidl::android::hardware::graphics::common::PixelFormat>(
1418 property.pixelFormat);
1419 outClientTargetProperty->brightness = 1.f;
1420 outClientTargetProperty->dimmingStage = DimmingStage::NONE;
1421 return Error::NONE;
1422 }
1423
getRequestedLuts(Display,std::vector<Layer> *,std::vector<DisplayLuts::LayerLut> *)1424 Error HidlComposer::getRequestedLuts(Display, std::vector<Layer>*,
1425 std::vector<DisplayLuts::LayerLut>*) {
1426 return Error::NONE;
1427 }
1428
setLayerLuts(Display,Layer,Luts &)1429 Error HidlComposer::setLayerLuts(Display, Layer, Luts&) {
1430 return Error::NONE;
1431 }
1432
setLayerBrightness(Display,Layer,float)1433 Error HidlComposer::setLayerBrightness(Display, Layer, float) {
1434 return Error::NONE;
1435 }
1436
setLayerBlockingRegion(Display,Layer,const std::vector<IComposerClient::Rect> &)1437 Error HidlComposer::setLayerBlockingRegion(Display, Layer,
1438 const std::vector<IComposerClient::Rect>&) {
1439 return Error::NONE;
1440 }
1441
getDisplayDecorationSupport(Display,std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport> * support)1442 Error HidlComposer::getDisplayDecorationSupport(
1443 Display,
1444 std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
1445 support) {
1446 support->reset();
1447 return Error::UNSUPPORTED;
1448 }
1449
setIdleTimerEnabled(Display,std::chrono::milliseconds)1450 Error HidlComposer::setIdleTimerEnabled(Display, std::chrono::milliseconds) {
1451 LOG_ALWAYS_FATAL("setIdleTimerEnabled should have never been called on this as "
1452 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
1453 }
1454
getPhysicalDisplayOrientation(Display,AidlTransform *)1455 Error HidlComposer::getPhysicalDisplayOrientation(Display, AidlTransform*) {
1456 LOG_ALWAYS_FATAL("getPhysicalDisplayOrientation should have never been called on this as "
1457 "OptionalFeature::PhysicalDisplayOrientation is not supported on HIDL");
1458 }
1459
getMaxLayerPictureProfiles(Display,int32_t *)1460 Error HidlComposer::getMaxLayerPictureProfiles(Display, int32_t*) {
1461 return Error::UNSUPPORTED;
1462 }
1463
startHdcpNegotiation(Display,const aidl::android::hardware::drm::HdcpLevels &)1464 Error HidlComposer::startHdcpNegotiation(Display, const aidl::android::hardware::drm::HdcpLevels&) {
1465 return Error::UNSUPPORTED;
1466 }
1467
getLuts(Display,const std::vector<sp<GraphicBuffer>> &,std::vector<aidl::android::hardware::graphics::composer3::Luts> *)1468 Error HidlComposer::getLuts(Display, const std::vector<sp<GraphicBuffer>>&,
1469 std::vector<aidl::android::hardware::graphics::composer3::Luts>*) {
1470 return Error::UNSUPPORTED;
1471 }
1472
setDisplayPictureProfileId(Display,PictureProfileId)1473 Error HidlComposer::setDisplayPictureProfileId(Display, PictureProfileId) {
1474 return Error::UNSUPPORTED;
1475 }
1476
setLayerPictureProfileId(Display,Layer,PictureProfileId)1477 Error HidlComposer::setLayerPictureProfileId(Display, Layer, PictureProfileId) {
1478 return Error::UNSUPPORTED;
1479 }
1480
registerCallback(ComposerCallback & callback)1481 void HidlComposer::registerCallback(ComposerCallback& callback) {
1482 const bool vsyncSwitchingSupported =
1483 isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
1484
1485 registerCallback(sp<ComposerCallbackBridge>::make(callback, vsyncSwitchingSupported));
1486 }
1487
onHotplugConnect(Display)1488 void HidlComposer::onHotplugConnect(Display) {}
onHotplugDisconnect(Display)1489 void HidlComposer::onHotplugDisconnect(Display) {}
1490
~CommandReader()1491 CommandReader::~CommandReader() {
1492 resetData();
1493 }
1494
parse()1495 Error CommandReader::parse() {
1496 resetData();
1497
1498 IComposerClient::Command command;
1499 uint16_t length = 0;
1500
1501 while (!isEmpty()) {
1502 if (!beginCommand(&command, &length)) {
1503 break;
1504 }
1505
1506 bool parsed = false;
1507 switch (command) {
1508 case IComposerClient::Command::SELECT_DISPLAY:
1509 parsed = parseSelectDisplay(length);
1510 break;
1511 case IComposerClient::Command::SET_ERROR:
1512 parsed = parseSetError(length);
1513 break;
1514 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1515 parsed = parseSetChangedCompositionTypes(length);
1516 break;
1517 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1518 parsed = parseSetDisplayRequests(length);
1519 break;
1520 case IComposerClient::Command::SET_PRESENT_FENCE:
1521 parsed = parseSetPresentFence(length);
1522 break;
1523 case IComposerClient::Command::SET_RELEASE_FENCES:
1524 parsed = parseSetReleaseFences(length);
1525 break;
1526 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1527 parsed = parseSetPresentOrValidateDisplayResult(length);
1528 break;
1529 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1530 parsed = parseSetClientTargetProperty(length);
1531 break;
1532 default:
1533 parsed = false;
1534 break;
1535 }
1536
1537 endCommand();
1538
1539 if (!parsed) {
1540 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1541 break;
1542 }
1543 }
1544
1545 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1546 }
1547
parseSelectDisplay(uint16_t length)1548 bool CommandReader::parseSelectDisplay(uint16_t length) {
1549 if (length != CommandWriterBase::kSelectDisplayLength) {
1550 return false;
1551 }
1552
1553 mCurrentReturnData = &mReturnData[read64()];
1554
1555 return true;
1556 }
1557
parseSetError(uint16_t length)1558 bool CommandReader::parseSetError(uint16_t length) {
1559 if (length != CommandWriterBase::kSetErrorLength) {
1560 return false;
1561 }
1562
1563 auto location = read();
1564 auto error = static_cast<Error>(readSigned());
1565
1566 mErrors.emplace_back(CommandError{location, error});
1567
1568 return true;
1569 }
1570
parseSetChangedCompositionTypes(uint16_t length)1571 bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1572 // (layer id, composition type) pairs
1573 if (length % 3 != 0 || !mCurrentReturnData) {
1574 return false;
1575 }
1576
1577 uint32_t count = length / 3;
1578 mCurrentReturnData->changedLayers.reserve(count);
1579 mCurrentReturnData->compositionTypes.reserve(count);
1580 while (count > 0) {
1581 auto layer = read64();
1582 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1583 readSigned());
1584
1585 mCurrentReturnData->changedLayers.push_back(layer);
1586 mCurrentReturnData->compositionTypes.push_back(type);
1587
1588 count--;
1589 }
1590
1591 return true;
1592 }
1593
parseSetDisplayRequests(uint16_t length)1594 bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1595 // display requests followed by (layer id, layer requests) pairs
1596 if (length % 3 != 1 || !mCurrentReturnData) {
1597 return false;
1598 }
1599
1600 mCurrentReturnData->displayRequests = read();
1601
1602 uint32_t count = (length - 1) / 3;
1603 mCurrentReturnData->requestedLayers.reserve(count);
1604 mCurrentReturnData->requestMasks.reserve(count);
1605 while (count > 0) {
1606 auto layer = read64();
1607 auto layerRequestMask = read();
1608
1609 mCurrentReturnData->requestedLayers.push_back(layer);
1610 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1611
1612 count--;
1613 }
1614
1615 return true;
1616 }
1617
parseSetPresentFence(uint16_t length)1618 bool CommandReader::parseSetPresentFence(uint16_t length) {
1619 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1620 return false;
1621 }
1622
1623 if (mCurrentReturnData->presentFence >= 0) {
1624 close(mCurrentReturnData->presentFence);
1625 }
1626 mCurrentReturnData->presentFence = readFence();
1627
1628 return true;
1629 }
1630
parseSetReleaseFences(uint16_t length)1631 bool CommandReader::parseSetReleaseFences(uint16_t length) {
1632 // (layer id, release fence index) pairs
1633 if (length % 3 != 0 || !mCurrentReturnData) {
1634 return false;
1635 }
1636
1637 uint32_t count = length / 3;
1638 mCurrentReturnData->releasedLayers.reserve(count);
1639 mCurrentReturnData->releaseFences.reserve(count);
1640 while (count > 0) {
1641 auto layer = read64();
1642 auto fence = readFence();
1643
1644 mCurrentReturnData->releasedLayers.push_back(layer);
1645 mCurrentReturnData->releaseFences.push_back(fence);
1646
1647 count--;
1648 }
1649
1650 return true;
1651 }
1652
parseSetPresentOrValidateDisplayResult(uint16_t length)1653 bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1654 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1655 return false;
1656 }
1657 mCurrentReturnData->presentOrValidateState = read();
1658 return true;
1659 }
1660
parseSetClientTargetProperty(uint16_t length)1661 bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1662 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1663 return false;
1664 }
1665 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1666 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1667 return true;
1668 }
1669
resetData()1670 void CommandReader::resetData() {
1671 mErrors.clear();
1672
1673 for (auto& data : mReturnData) {
1674 if (data.second.presentFence >= 0) {
1675 close(data.second.presentFence);
1676 }
1677 for (auto fence : data.second.releaseFences) {
1678 if (fence >= 0) {
1679 close(fence);
1680 }
1681 }
1682 }
1683
1684 mReturnData.clear();
1685 mCurrentReturnData = nullptr;
1686 }
1687
takeErrors()1688 std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1689 return std::move(mErrors);
1690 }
1691
hasChanges(Display display,uint32_t * outNumChangedCompositionTypes,uint32_t * outNumLayerRequestMasks) const1692 bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1693 uint32_t* outNumLayerRequestMasks) const {
1694 auto found = mReturnData.find(display);
1695 if (found == mReturnData.end()) {
1696 *outNumChangedCompositionTypes = 0;
1697 *outNumLayerRequestMasks = 0;
1698 return false;
1699 }
1700
1701 const ReturnData& data = found->second;
1702
1703 *outNumChangedCompositionTypes = data.compositionTypes.size();
1704 *outNumLayerRequestMasks = data.requestMasks.size();
1705
1706 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1707 }
1708
takeChangedCompositionTypes(Display display,std::vector<Layer> * outLayers,std::vector<aidl::android::hardware::graphics::composer3::Composition> * outTypes)1709 void CommandReader::takeChangedCompositionTypes(
1710 Display display, std::vector<Layer>* outLayers,
1711 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
1712 auto found = mReturnData.find(display);
1713 if (found == mReturnData.end()) {
1714 outLayers->clear();
1715 outTypes->clear();
1716 return;
1717 }
1718
1719 ReturnData& data = found->second;
1720
1721 *outLayers = std::move(data.changedLayers);
1722 *outTypes = std::move(data.compositionTypes);
1723 }
1724
takeDisplayRequests(Display display,uint32_t * outDisplayRequestMask,std::vector<Layer> * outLayers,std::vector<uint32_t> * outLayerRequestMasks)1725 void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1726 std::vector<Layer>* outLayers,
1727 std::vector<uint32_t>* outLayerRequestMasks) {
1728 auto found = mReturnData.find(display);
1729 if (found == mReturnData.end()) {
1730 *outDisplayRequestMask = 0;
1731 outLayers->clear();
1732 outLayerRequestMasks->clear();
1733 return;
1734 }
1735
1736 ReturnData& data = found->second;
1737
1738 *outDisplayRequestMask = data.displayRequests;
1739 *outLayers = std::move(data.requestedLayers);
1740 *outLayerRequestMasks = std::move(data.requestMasks);
1741 }
1742
takeReleaseFences(Display display,std::vector<Layer> * outLayers,std::vector<int> * outReleaseFences)1743 void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1744 std::vector<int>* outReleaseFences) {
1745 auto found = mReturnData.find(display);
1746 if (found == mReturnData.end()) {
1747 outLayers->clear();
1748 outReleaseFences->clear();
1749 return;
1750 }
1751
1752 ReturnData& data = found->second;
1753
1754 *outLayers = std::move(data.releasedLayers);
1755 *outReleaseFences = std::move(data.releaseFences);
1756 }
1757
takePresentFence(Display display,int * outPresentFence)1758 void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1759 auto found = mReturnData.find(display);
1760 if (found == mReturnData.end()) {
1761 *outPresentFence = -1;
1762 return;
1763 }
1764
1765 ReturnData& data = found->second;
1766
1767 *outPresentFence = data.presentFence;
1768 data.presentFence = -1;
1769 }
1770
takePresentOrValidateStage(Display display,uint32_t * state)1771 void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1772 auto found = mReturnData.find(display);
1773 if (found == mReturnData.end()) {
1774 *state = -1;
1775 return;
1776 }
1777 ReturnData& data = found->second;
1778 *state = data.presentOrValidateState;
1779 }
1780
takeClientTargetProperty(Display display,IComposerClient::ClientTargetProperty * outClientTargetProperty)1781 void CommandReader::takeClientTargetProperty(
1782 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1783 auto found = mReturnData.find(display);
1784
1785 // If not found, return the default values.
1786 if (found == mReturnData.end()) {
1787 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1788 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1789 return;
1790 }
1791
1792 ReturnData& data = found->second;
1793 *outClientTargetProperty = data.clientTargetProperty;
1794 }
1795
1796 } // namespace Hwc2
1797 } // namespace android
1798
1799 // TODO(b/129481165): remove the #pragma below and fix conversion issues
1800 #pragma clang diagnostic pop // ignored "-Wconversion"
1801