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