• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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