xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1 /*
2  * Copyright 2021 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 #undef LOG_TAG
18 #define LOG_TAG "HwcComposer"
19 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
20 
21 #include "AidlComposerHal.h"
22 
23 #include <SurfaceFlingerProperties.h>
24 #include <android-base/file.h>
25 #include <android/binder_ibinder_platform.h>
26 #include <android/binder_manager.h>
27 #include <common/FlagManager.h>
28 #include <common/trace.h>
29 #include <log/log.h>
30 
31 #include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
32 
33 #include <algorithm>
34 #include <cinttypes>
35 
36 #include "HWC2.h"
37 
38 namespace android {
39 
40 using aidl::android::hardware::graphics::composer3::BnComposerCallback;
41 using aidl::android::hardware::graphics::composer3::Capability;
42 using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
43 using aidl::android::hardware::graphics::composer3::CommandResultPayload;
44 using aidl::android::hardware::graphics::composer3::Luts;
45 using aidl::android::hardware::graphics::composer3::PowerMode;
46 using aidl::android::hardware::graphics::composer3::VirtualDisplay;
47 
48 using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
49 using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
50 using AidlDisplayIdentification =
51         aidl::android::hardware::graphics::composer3::DisplayIdentification;
52 using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
53 using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
54 using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
55 using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
56 using AidlHdrConversionCapability =
57         aidl::android::hardware::graphics::common::HdrConversionCapability;
58 using AidlHdcpLevels = aidl::android::hardware::drm::HdcpLevels;
59 using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
60 using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
61 using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
62 using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
63 using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
64 using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
65 using AidlVsyncPeriodChangeConstraints =
66         aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
67 using AidlVsyncPeriodChangeTimeline =
68         aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
69 using AidlDisplayContentSamplingAttributes =
70         aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
71 using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
72 using AidlDisplayConnectionType =
73         aidl::android::hardware::graphics::composer3::DisplayConnectionType;
74 
75 using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
76 using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
77 using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
78 using AidlFRect = aidl::android::hardware::graphics::common::FRect;
79 using AidlRect = aidl::android::hardware::graphics::common::Rect;
80 using AidlTransform = aidl::android::hardware::graphics::common::Transform;
81 
82 namespace Hwc2 {
83 
84 namespace {
85 
86 template <typename To, typename From>
translate(From x)87 To translate(From x) {
88     return static_cast<To>(x);
89 }
90 
91 template <typename To, typename From>
translate(const std::vector<From> & in)92 std::vector<To> translate(const std::vector<From>& in) {
93     std::vector<To> out;
94     out.reserve(in.size());
95     std::transform(in.begin(), in.end(), std::back_inserter(out),
96                    [](From x) { return translate<To>(x); });
97     return out;
98 }
99 
100 template <>
translate(IComposerClient::Rect x)101 AidlRect translate(IComposerClient::Rect x) {
102     return AidlRect{
103             .left = x.left,
104             .top = x.top,
105             .right = x.right,
106             .bottom = x.bottom,
107     };
108 }
109 
110 template <>
translate(IComposerClient::FRect x)111 AidlFRect translate(IComposerClient::FRect x) {
112     return AidlFRect{
113             .left = x.left,
114             .top = x.top,
115             .right = x.right,
116             .bottom = x.bottom,
117     };
118 }
119 
120 template <>
translate(IComposerClient::PerFrameMetadataBlob x)121 AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
122     AidlPerFrameMetadataBlob blob;
123     blob.key = translate<AidlPerFrameMetadataKey>(x.key),
124     std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
125     return blob;
126 }
127 
128 template <>
translate(IComposerClient::PerFrameMetadata x)129 AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
130     return AidlPerFrameMetadata{
131             .key = translate<AidlPerFrameMetadataKey>(x.key),
132             .value = x.value,
133     };
134 }
135 
136 template <>
translate(AidlDisplayContentSample x)137 DisplayedFrameStats translate(AidlDisplayContentSample x) {
138     return DisplayedFrameStats{
139             .numFrames = static_cast<uint64_t>(x.frameCount),
140             .component_0_sample = translate<uint64_t>(x.sampleComponent0),
141             .component_1_sample = translate<uint64_t>(x.sampleComponent1),
142             .component_2_sample = translate<uint64_t>(x.sampleComponent2),
143             .component_3_sample = translate<uint64_t>(x.sampleComponent3),
144     };
145 }
146 
147 template <>
translate(IComposerClient::VsyncPeriodChangeConstraints x)148 AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
149     return AidlVsyncPeriodChangeConstraints{
150             .desiredTimeNanos = x.desiredTimeNanos,
151             .seamlessRequired = x.seamlessRequired,
152     };
153 }
154 
155 template <>
translate(AidlVsyncPeriodChangeTimeline x)156 VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
157     return VsyncPeriodChangeTimeline{
158             .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
159             .refreshRequired = x.refreshRequired,
160             .refreshTimeNanos = x.refreshTimeNanos,
161     };
162 }
makeMat4(std::vector<float> in)163 mat4 makeMat4(std::vector<float> in) {
164     return mat4(static_cast<const float*>(in.data()));
165 }
166 
167 } // namespace
168 
169 class AidlIComposerCallbackWrapper : public BnComposerCallback {
170 public:
AidlIComposerCallbackWrapper(HWC2::ComposerCallback & callback)171     AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
172 
onHotplug(int64_t in_display,bool in_connected)173     ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
174         const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
175                                         : AidlDisplayHotplugEvent::DISCONNECTED;
176         mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
177         return ::ndk::ScopedAStatus::ok();
178     }
179 
onRefresh(int64_t in_display)180     ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
181         mCallback.onComposerHalRefresh(translate<Display>(in_display));
182         return ::ndk::ScopedAStatus::ok();
183     }
184 
onSeamlessPossible(int64_t in_display)185     ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
186         mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
187         return ::ndk::ScopedAStatus::ok();
188     }
189 
onVsync(int64_t in_display,int64_t in_timestamp,int32_t in_vsyncPeriodNanos)190     ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
191                                  int32_t in_vsyncPeriodNanos) override {
192         mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
193                                      static_cast<uint32_t>(in_vsyncPeriodNanos));
194         return ::ndk::ScopedAStatus::ok();
195     }
196 
onVsyncPeriodTimingChanged(int64_t in_display,const AidlVsyncPeriodChangeTimeline & in_updatedTimeline)197     ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
198             int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
199         mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
200                                                         translate<V2_4::VsyncPeriodChangeTimeline>(
201                                                                 in_updatedTimeline));
202         return ::ndk::ScopedAStatus::ok();
203     }
204 
onVsyncIdle(int64_t in_display)205     ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
206         mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
207         return ::ndk::ScopedAStatus::ok();
208     }
209 
onRefreshRateChangedDebug(const RefreshRateChangedDebugData & refreshRateChangedDebugData)210     ::ndk::ScopedAStatus onRefreshRateChangedDebug(
211             const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
212         mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
213         return ::ndk::ScopedAStatus::ok();
214     }
215 
onHotplugEvent(int64_t in_display,AidlDisplayHotplugEvent event)216     ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
217                                         AidlDisplayHotplugEvent event) override {
218         mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
219         return ::ndk::ScopedAStatus::ok();
220     }
221 
onHdcpLevelsChanged(int64_t in_display,const AidlHdcpLevels & levels)222     ::ndk::ScopedAStatus onHdcpLevelsChanged(int64_t in_display,
223                                              const AidlHdcpLevels& levels) override {
224         mCallback.onComposerHalHdcpLevelsChanged(translate<Display>(in_display), levels);
225         return ::ndk::ScopedAStatus::ok();
226     }
227 
228 private:
229     HWC2::ComposerCallback& mCallback;
230 };
231 
instance(const std::string & serviceName)232 std::string AidlComposer::instance(const std::string& serviceName) {
233     return std::string(AidlIComposer::descriptor) + "/" + serviceName;
234 }
235 
isDeclared(const std::string & serviceName)236 bool AidlComposer::isDeclared(const std::string& serviceName) {
237     return AServiceManager_isDeclared(instance(serviceName).c_str());
238 }
239 
AidlComposer(const std::string & serviceName)240 AidlComposer::AidlComposer(const std::string& serviceName) {
241     // This only waits if the service is actually declared
242     mAidlComposer = AidlIComposer::fromBinder(
243             ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
244     if (!mAidlComposer) {
245         LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
246         return;
247     }
248 
249     if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
250         LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
251         return;
252     }
253 
254     addReader(translate<Display>(kSingleReaderKey));
255 
256     // If unable to read interface version, then become backwards compatible.
257     const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
258     if (!status.isOk()) {
259         ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
260               status.getDescription().c_str());
261     }
262 
263     if (mComposerInterfaceVersion <= 1) {
264         if (sysprop::clear_slots_with_set_layer_buffer(false)) {
265             mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
266                                                        GraphicBuffer::USAGE_HW_COMPOSER |
267                                                                GraphicBuffer::USAGE_SW_READ_OFTEN |
268                                                                GraphicBuffer::USAGE_SW_WRITE_OFTEN,
269                                                        "AidlComposer");
270             if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
271                 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
272                 return;
273             }
274         }
275     }
276     if (getLayerLifecycleBatchCommand()) {
277         mEnableLayerCommandBatchingFlag =
278                 FlagManager::getInstance().enable_layer_command_batching();
279     }
280     ALOGI("Loaded AIDL composer3 HAL service");
281 }
282 
283 AidlComposer::~AidlComposer() = default;
284 
isSupported(OptionalFeature feature) const285 bool AidlComposer::isSupported(OptionalFeature feature) const {
286     switch (feature) {
287         case OptionalFeature::RefreshRateSwitching:
288         case OptionalFeature::ExpectedPresentTime:
289         case OptionalFeature::DisplayBrightnessCommand:
290         case OptionalFeature::KernelIdleTimer:
291         case OptionalFeature::PhysicalDisplayOrientation:
292             return true;
293     }
294 }
295 
isVrrSupported() const296 bool AidlComposer::isVrrSupported() const {
297     return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
298 }
299 
getCapabilities()300 std::vector<Capability> AidlComposer::getCapabilities() {
301     std::vector<Capability> capabilities;
302     const auto status = mAidlComposer->getCapabilities(&capabilities);
303     if (!status.isOk()) {
304         ALOGE("getCapabilities failed %s", status.getDescription().c_str());
305         return {};
306     }
307     return capabilities;
308 }
309 
dumpDebugInfo()310 std::string AidlComposer::dumpDebugInfo() {
311     int pipefds[2];
312     int result = pipe(pipefds);
313     if (result < 0) {
314         ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
315         return {};
316     }
317 
318     std::string str;
319     // Use other thread to read pipe to prevent
320     // pipe is full, making HWC be blocked in writing.
321     std::thread t([&]() {
322         base::ReadFdToString(pipefds[0], &str);
323     });
324     const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
325     // Close the write-end of the pipe to make sure that when reading from the
326     // read-end we will get eof instead of blocking forever
327     close(pipefds[1]);
328 
329     if (status != STATUS_OK) {
330         ALOGE("dumpDebugInfo: dump failed: %d", status);
331     }
332 
333     t.join();
334     close(pipefds[0]);
335 
336     std::string hash;
337     mAidlComposer->getInterfaceHash(&hash);
338     return std::string(mAidlComposer->descriptor) +
339             " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
340 }
341 
registerCallback(HWC2::ComposerCallback & callback)342 void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
343     if (mAidlComposerCallback) {
344         ALOGE("Callback already registered");
345     }
346 
347     mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
348 
349     ndk::SpAIBinder binder = mAidlComposerCallback->asBinder();
350     AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_FIFO, 2);
351 
352     const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
353     if (!status.isOk()) {
354         ALOGE("registerCallback failed %s", status.getDescription().c_str());
355     }
356 }
357 
executeCommands(Display display)358 Error AidlComposer::executeCommands(Display display) {
359     mMutex.lock_shared();
360     auto error = execute(display);
361     mMutex.unlock_shared();
362     return error;
363 }
364 
getMaxVirtualDisplayCount()365 uint32_t AidlComposer::getMaxVirtualDisplayCount() {
366     int32_t count = 0;
367     const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
368     if (!status.isOk()) {
369         ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
370         return 0;
371     }
372     return static_cast<uint32_t>(count);
373 }
374 
createVirtualDisplay(uint32_t width,uint32_t height,PixelFormat * format,Display * outDisplay)375 Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
376                                          Display* outDisplay) {
377     using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
378     const int32_t bufferSlotCount = 1;
379     VirtualDisplay virtualDisplay;
380     const auto status =
381             mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
382                                                       static_cast<int32_t>(height),
383                                                       static_cast<AidlPixelFormat>(*format),
384                                                       bufferSlotCount, &virtualDisplay);
385 
386     if (!status.isOk()) {
387         ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
388         return static_cast<Error>(status.getServiceSpecificError());
389     }
390 
391     *outDisplay = translate<Display>(virtualDisplay.display);
392     *format = static_cast<PixelFormat>(virtualDisplay.format);
393     addDisplay(translate<Display>(virtualDisplay.display));
394     return Error::NONE;
395 }
396 
destroyVirtualDisplay(Display display)397 Error AidlComposer::destroyVirtualDisplay(Display display) {
398     const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
399     if (!status.isOk()) {
400         ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
401         return static_cast<Error>(status.getServiceSpecificError());
402     }
403     removeDisplay(display);
404     return Error::NONE;
405 }
406 
acceptDisplayChanges(Display display)407 Error AidlComposer::acceptDisplayChanges(Display display) {
408     Error error = Error::NONE;
409     mMutex.lock_shared();
410     if (auto writer = getWriter(display)) {
411         writer->get().acceptDisplayChanges(translate<int64_t>(display));
412     } else {
413         error = Error::BAD_DISPLAY;
414     }
415     mMutex.unlock_shared();
416     return error;
417 }
418 
createLayer(Display display,Layer * outLayer)419 Error AidlComposer::createLayer(Display display, Layer* outLayer) {
420     int64_t layer;
421     Error error = Error::NONE;
422     if (!mEnableLayerCommandBatchingFlag) {
423         const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
424                                                              kMaxLayerBufferCount, &layer);
425         if (!status.isOk()) {
426             ALOGE("createLayer failed %s", status.getDescription().c_str());
427             return static_cast<Error>(status.getServiceSpecificError());
428         }
429     } else {
430         // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
431         // Add this as a new displayCommand in execute command.
432         // return the SF generated layerID instead of calling HWC
433         layer = mLayerID++;
434         mMutex.lock_shared();
435         if (auto writer = getWriter(display)) {
436             writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
437                                                             translate<int64_t>(layer),
438                                                             LayerLifecycleBatchCommandType::CREATE);
439             writer->get().setNewBufferSlotCount(translate<int64_t>(display),
440                                                 translate<int64_t>(layer), kMaxLayerBufferCount);
441         } else {
442             error = Error::BAD_DISPLAY;
443         }
444         mMutex.unlock_shared();
445     }
446     *outLayer = translate<Layer>(layer);
447     return error;
448 }
449 
destroyLayer(Display display,Layer layer)450 Error AidlComposer::destroyLayer(Display display, Layer layer) {
451     Error error = Error::NONE;
452     if (!mEnableLayerCommandBatchingFlag) {
453         const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
454                                                               translate<int64_t>(layer));
455         if (!status.isOk()) {
456             ALOGE("destroyLayer failed %s", status.getDescription().c_str());
457             return static_cast<Error>(status.getServiceSpecificError());
458         }
459     } else {
460         mMutex.lock_shared();
461         if (auto writer = getWriter(display)) {
462             writer->get()
463                     .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
464                                                        translate<int64_t>(layer),
465                                                        LayerLifecycleBatchCommandType::DESTROY);
466         } else {
467             error = Error::BAD_DISPLAY;
468         }
469         mMutex.unlock_shared();
470     }
471 
472     return error;
473 }
474 
getActiveConfig(Display display,Config * outConfig)475 Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
476     int32_t config;
477     const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
478     if (!status.isOk()) {
479         ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
480         return static_cast<Error>(status.getServiceSpecificError());
481     }
482     *outConfig = translate<Config>(config);
483     return Error::NONE;
484 }
485 
getChangedCompositionTypes(Display display,std::vector<Layer> * outLayers,std::vector<aidl::android::hardware::graphics::composer3::Composition> * outTypes)486 Error AidlComposer::getChangedCompositionTypes(
487         Display display, std::vector<Layer>* outLayers,
488         std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
489     std::vector<ChangedCompositionLayer> changedLayers;
490     Error error = Error::NONE;
491     {
492         mMutex.lock_shared();
493         if (auto reader = getReader(display)) {
494             changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
495         } else {
496             error = Error::BAD_DISPLAY;
497         }
498         mMutex.unlock_shared();
499     }
500     outLayers->reserve(changedLayers.size());
501     outTypes->reserve(changedLayers.size());
502 
503     for (const auto& layer : changedLayers) {
504         outLayers->emplace_back(translate<Layer>(layer.layer));
505         outTypes->emplace_back(layer.composition);
506     }
507     return error;
508 }
509 
getColorModes(Display display,std::vector<ColorMode> * outModes)510 Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
511     std::vector<AidlColorMode> modes;
512     const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
513     if (!status.isOk()) {
514         ALOGE("getColorModes failed %s", status.getDescription().c_str());
515         return static_cast<Error>(status.getServiceSpecificError());
516     }
517     *outModes = translate<ColorMode>(modes);
518     return Error::NONE;
519 }
520 
getDisplayAttribute(Display display,Config config,IComposerClient::Attribute attribute,int32_t * outValue)521 Error AidlComposer::getDisplayAttribute(Display display, Config config,
522                                         IComposerClient::Attribute attribute, int32_t* outValue) {
523 #pragma clang diagnostic push
524 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
525     const auto status =
526             mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
527                                                      translate<int32_t>(config),
528                                                      static_cast<AidlDisplayAttribute>(attribute),
529                                                      outValue);
530 #pragma clang diagnostic pop
531 
532     if (!status.isOk()) {
533         ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
534         return static_cast<Error>(status.getServiceSpecificError());
535     }
536     return Error::NONE;
537 }
538 
getDisplayConfigs(Display display,std::vector<Config> * outConfigs)539 Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
540     std::vector<int32_t> configs;
541 
542 #pragma clang diagnostic push
543 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
544     const auto status =
545             mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
546 #pragma clang diagnostic pop
547 
548     if (!status.isOk()) {
549         ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
550         return static_cast<Error>(status.getServiceSpecificError());
551     }
552     *outConfigs = translate<Config>(configs);
553     return Error::NONE;
554 }
555 
getDisplayConfigurations(Display display,int32_t maxFrameIntervalNs,std::vector<DisplayConfiguration> * outConfigs)556 Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
557                                              std::vector<DisplayConfiguration>* outConfigs) {
558     const auto status =
559             mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
560                                                           maxFrameIntervalNs, outConfigs);
561     if (!status.isOk()) {
562         ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
563         return static_cast<Error>(status.getServiceSpecificError());
564     }
565 
566     return Error::NONE;
567 }
568 
getDisplayName(Display display,std::string * outName)569 Error AidlComposer::getDisplayName(Display display, std::string* outName) {
570     const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
571     if (!status.isOk()) {
572         ALOGE("getDisplayName failed %s", status.getDescription().c_str());
573         return static_cast<Error>(status.getServiceSpecificError());
574     }
575     return Error::NONE;
576 }
577 
getDisplayRequests(Display display,uint32_t * outDisplayRequestMask,std::vector<Layer> * outLayers,std::vector<uint32_t> * outLayerRequestMasks)578 Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
579                                        std::vector<Layer>* outLayers,
580                                        std::vector<uint32_t>* outLayerRequestMasks) {
581     Error error = Error::NONE;
582     DisplayRequest displayRequests;
583     {
584         mMutex.lock_shared();
585         if (auto reader = getReader(display)) {
586             displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
587         } else {
588             error = Error::BAD_DISPLAY;
589         }
590         mMutex.unlock_shared();
591     }
592     *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
593     outLayers->reserve(displayRequests.layerRequests.size());
594     outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
595 
596     for (const auto& layer : displayRequests.layerRequests) {
597         outLayers->emplace_back(translate<Layer>(layer.layer));
598         outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
599     }
600     return error;
601 }
602 
getDozeSupport(Display display,bool * outSupport)603 Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
604     std::vector<AidlDisplayCapability> capabilities;
605     const auto status =
606             mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
607     if (!status.isOk()) {
608         ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
609         return static_cast<Error>(status.getServiceSpecificError());
610     }
611     *outSupport = std::find(capabilities.begin(), capabilities.end(),
612                             AidlDisplayCapability::DOZE) != capabilities.end();
613     return Error::NONE;
614 }
615 
hasDisplayIdleTimerCapability(Display display,bool * outSupport)616 Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
617     std::vector<AidlDisplayCapability> capabilities;
618     const auto status =
619             mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
620     if (!status.isOk()) {
621         ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
622         return static_cast<Error>(status.getServiceSpecificError());
623     }
624     *outSupport = std::find(capabilities.begin(), capabilities.end(),
625                             AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
626     return Error::NONE;
627 }
628 
getHdrCapabilities(Display display,std::vector<Hdr> * outTypes,float * outMaxLuminance,float * outMaxAverageLuminance,float * outMinLuminance)629 Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
630                                        float* outMaxLuminance, float* outMaxAverageLuminance,
631                                        float* outMinLuminance) {
632     AidlHdrCapabilities capabilities;
633     const auto status =
634             mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
635     if (!status.isOk()) {
636         ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
637         return static_cast<Error>(status.getServiceSpecificError());
638     }
639 
640     *outTypes = capabilities.types;
641     *outMaxLuminance = capabilities.maxLuminance;
642     *outMaxAverageLuminance = capabilities.maxAverageLuminance;
643     *outMinLuminance = capabilities.minLuminance;
644     return Error::NONE;
645 }
646 
getLayerLifecycleBatchCommand()647 bool AidlComposer::getLayerLifecycleBatchCommand() {
648     std::vector<Capability> capabilities = getCapabilities();
649     bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
650                                    Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
651     return hasCapability;
652 }
653 
getOverlaySupport(AidlOverlayProperties * outProperties)654 Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
655     const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
656     if (!status.isOk()) {
657         ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
658         return static_cast<Error>(status.getServiceSpecificError());
659     }
660     return Error::NONE;
661 }
662 
getReleaseFences(Display display,std::vector<Layer> * outLayers,std::vector<int> * outReleaseFences)663 Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
664                                      std::vector<int>* outReleaseFences) {
665     Error error = Error::NONE;
666     std::vector<ReleaseFences::Layer> fences;
667     {
668         mMutex.lock_shared();
669         if (auto reader = getReader(display)) {
670             fences = reader->get().takeReleaseFences(translate<int64_t>(display));
671         } else {
672             error = Error::BAD_DISPLAY;
673         }
674         mMutex.unlock_shared();
675     }
676     outLayers->reserve(fences.size());
677     outReleaseFences->reserve(fences.size());
678 
679     for (auto& fence : fences) {
680         outLayers->emplace_back(translate<Layer>(fence.layer));
681         // take ownership
682         const int fenceOwner = fence.fence.get();
683         *fence.fence.getR() = -1;
684         outReleaseFences->emplace_back(fenceOwner);
685     }
686     return error;
687 }
688 
presentDisplay(Display display,int * outPresentFence)689 Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
690     const auto displayId = translate<int64_t>(display);
691     SFTRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
692 
693     Error error = Error::NONE;
694     mMutex.lock_shared();
695     auto writer = getWriter(display);
696     auto reader = getReader(display);
697     if (writer && reader) {
698         writer->get().presentDisplay(displayId);
699         error = execute(display);
700     } else {
701         error = Error::BAD_DISPLAY;
702     }
703 
704     if (error != Error::NONE) {
705         mMutex.unlock_shared();
706         return error;
707     }
708 
709     auto fence = reader->get().takePresentFence(displayId);
710     mMutex.unlock_shared();
711     // take ownership
712     *outPresentFence = fence.get();
713     *fence.getR() = -1;
714     return Error::NONE;
715 }
716 
setActiveConfig(Display display,Config config)717 Error AidlComposer::setActiveConfig(Display display, Config config) {
718     const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
719                                                              translate<int32_t>(config));
720     if (!status.isOk()) {
721         ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
722         return static_cast<Error>(status.getServiceSpecificError());
723     }
724     return Error::NONE;
725 }
726 
setClientTarget(Display display,uint32_t slot,const sp<GraphicBuffer> & target,int acquireFence,Dataspace dataspace,const std::vector<IComposerClient::Rect> & damage,float hdrSdrRatio)727 Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
728                                     int acquireFence, Dataspace dataspace,
729                                     const std::vector<IComposerClient::Rect>& damage,
730                                     float hdrSdrRatio) {
731     const native_handle_t* handle = nullptr;
732     if (target.get()) {
733         handle = target->getNativeBuffer()->handle;
734     }
735 
736     Error error = Error::NONE;
737     mMutex.lock_shared();
738     if (auto writer = getWriter(display)) {
739         writer->get()
740                 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
741                                  translate<aidl::android::hardware::graphics::common::Dataspace>(
742                                          dataspace),
743                                  translate<AidlRect>(damage), hdrSdrRatio);
744     } else {
745         error = Error::BAD_DISPLAY;
746     }
747     mMutex.unlock_shared();
748     return error;
749 }
750 
setColorMode(Display display,ColorMode mode,RenderIntent renderIntent)751 Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
752     const auto status =
753             mAidlComposerClient->setColorMode(translate<int64_t>(display),
754                                               translate<AidlColorMode>(mode),
755                                               translate<AidlRenderIntent>(renderIntent));
756     if (!status.isOk()) {
757         ALOGE("setColorMode failed %s", status.getDescription().c_str());
758         return static_cast<Error>(status.getServiceSpecificError());
759     }
760     return Error::NONE;
761 }
762 
setColorTransform(Display display,const float * matrix)763 Error AidlComposer::setColorTransform(Display display, const float* matrix) {
764     auto error = Error::NONE;
765     mMutex.lock_shared();
766     if (auto writer = getWriter(display)) {
767         writer->get().setColorTransform(translate<int64_t>(display), matrix);
768     } else {
769         error = Error::BAD_DISPLAY;
770     }
771     mMutex.unlock_shared();
772     return error;
773 }
774 
setOutputBuffer(Display display,const native_handle_t * buffer,int releaseFence)775 Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
776                                     int releaseFence) {
777     auto error = Error::NONE;
778     mMutex.lock_shared();
779     if (auto writer = getWriter(display)) {
780         writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
781     } else {
782         error = Error::BAD_DISPLAY;
783     }
784     mMutex.unlock_shared();
785     return error;
786 }
787 
setPowerMode(Display display,IComposerClient::PowerMode mode)788 Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
789     const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
790                                                           translate<PowerMode>(mode));
791     if (!status.isOk()) {
792         ALOGE("setPowerMode failed %s", status.getDescription().c_str());
793         return static_cast<Error>(status.getServiceSpecificError());
794     }
795     return Error::NONE;
796 }
797 
setVsyncEnabled(Display display,IComposerClient::Vsync enabled)798 Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
799     const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
800     const auto status =
801             mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
802     if (!status.isOk()) {
803         ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
804         return static_cast<Error>(status.getServiceSpecificError());
805     }
806     return Error::NONE;
807 }
808 
setClientTargetSlotCount(Display display)809 Error AidlComposer::setClientTargetSlotCount(Display display) {
810     const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
811     const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
812                                                                       bufferSlotCount);
813     if (!status.isOk()) {
814         ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
815         return static_cast<Error>(status.getServiceSpecificError());
816     }
817     return Error::NONE;
818 }
819 
validateDisplay(Display display,nsecs_t expectedPresentTime,int32_t frameIntervalNs,uint32_t * outNumTypes,uint32_t * outNumRequests)820 Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
821                                     int32_t frameIntervalNs, uint32_t* outNumTypes,
822                                     uint32_t* outNumRequests) {
823     const auto displayId = translate<int64_t>(display);
824     SFTRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
825 
826     Error error = Error::NONE;
827     mMutex.lock_shared();
828     auto writer = getWriter(display);
829     auto reader = getReader(display);
830     if (writer && reader) {
831         writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
832                                       frameIntervalNs);
833         error = execute(display);
834     } else {
835         error = Error::BAD_DISPLAY;
836     }
837 
838     if (error != Error::NONE) {
839         mMutex.unlock_shared();
840         return error;
841     }
842 
843     reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
844 
845     mMutex.unlock_shared();
846     return Error::NONE;
847 }
848 
presentOrValidateDisplay(Display display,nsecs_t expectedPresentTime,int32_t frameIntervalNs,uint32_t * outNumTypes,uint32_t * outNumRequests,int * outPresentFence,uint32_t * state)849 Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
850                                              int32_t frameIntervalNs, uint32_t* outNumTypes,
851                                              uint32_t* outNumRequests, int* outPresentFence,
852                                              uint32_t* state) {
853     const auto displayId = translate<int64_t>(display);
854     SFTRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
855 
856     Error error = Error::NONE;
857     mMutex.lock_shared();
858     auto writer = getWriter(display);
859     auto reader = getReader(display);
860     if (writer && reader) {
861         writer->get().presentOrvalidateDisplay(displayId,
862                                                ClockMonotonicTimestamp{expectedPresentTime},
863                                                frameIntervalNs);
864         error = execute(display);
865     } else {
866         error = Error::BAD_DISPLAY;
867     }
868 
869     if (error != Error::NONE) {
870         mMutex.unlock_shared();
871         return error;
872     }
873 
874     const auto result = reader->get().takePresentOrValidateStage(displayId);
875     if (!result.has_value()) {
876         *state = translate<uint32_t>(-1);
877         mMutex.unlock_shared();
878         return Error::NO_RESOURCES;
879     }
880 
881     *state = translate<uint32_t>(*result);
882 
883     if (*result == PresentOrValidate::Result::Presented) {
884         auto fence = reader->get().takePresentFence(displayId);
885         // take ownership
886         *outPresentFence = fence.get();
887         *fence.getR() = -1;
888     }
889 
890     if (*result == PresentOrValidate::Result::Validated) {
891         reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
892     }
893 
894     mMutex.unlock_shared();
895     return Error::NONE;
896 }
897 
setCursorPosition(Display display,Layer layer,int32_t x,int32_t y)898 Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
899     Error error = Error::NONE;
900     mMutex.lock_shared();
901     if (auto writer = getWriter(display)) {
902         writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
903                                              x, y);
904     } else {
905         error = Error::BAD_DISPLAY;
906     }
907     mMutex.unlock_shared();
908     return error;
909 }
910 
setLayerBuffer(Display display,Layer layer,uint32_t slot,const sp<GraphicBuffer> & buffer,int acquireFence)911 Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
912                                    const sp<GraphicBuffer>& buffer, int acquireFence) {
913     const native_handle_t* handle = nullptr;
914     if (buffer.get()) {
915         handle = buffer->getNativeBuffer()->handle;
916     }
917 
918     Error error = Error::NONE;
919     mMutex.lock_shared();
920     if (auto writer = getWriter(display)) {
921         writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
922                                      handle, acquireFence);
923     } else {
924         error = Error::BAD_DISPLAY;
925     }
926     mMutex.unlock_shared();
927     return error;
928 }
929 
setLayerBufferSlotsToClear(Display display,Layer layer,const std::vector<uint32_t> & slotsToClear,uint32_t activeBufferSlot)930 Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
931                                                const std::vector<uint32_t>& slotsToClear,
932                                                uint32_t activeBufferSlot) {
933     if (slotsToClear.empty()) {
934         return Error::NONE;
935     }
936 
937     Error error = Error::NONE;
938     mMutex.lock_shared();
939     if (auto writer = getWriter(display)) {
940         if (mComposerInterfaceVersion > 1) {
941             writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
942                                                      translate<int64_t>(layer), slotsToClear);
943             // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
944             // placeholder buffer, using the slot that needs to cleared... tricky.
945         } else if (mClearSlotBuffer != nullptr) {
946             for (uint32_t slot : slotsToClear) {
947                 // Don't clear the active buffer slot because we need to restore the active buffer
948                 // after clearing the requested buffer slots with a placeholder buffer.
949                 if (slot != activeBufferSlot) {
950                     writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
951                                                                translate<int64_t>(layer), slot,
952                                                                mClearSlotBuffer->handle,
953                                                                /*fence*/ -1);
954                 }
955             }
956             // Since we clear buffers by setting them to a placeholder buffer, we want to make
957             // sure that the last setLayerBuffer command is sent with the currently active
958             // buffer, not the placeholder buffer, so that there is no perceptual change when
959             // buffers are discarded.
960             writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
961                                                        translate<int64_t>(layer), activeBufferSlot,
962                                                        // The active buffer is still cached in
963                                                        // its slot and doesn't need a fence.
964                                                        /*buffer*/ nullptr, /*fence*/ -1);
965         }
966     } else {
967         error = Error::BAD_DISPLAY;
968     }
969     mMutex.unlock_shared();
970     return error;
971 }
972 
setLayerSurfaceDamage(Display display,Layer layer,const std::vector<IComposerClient::Rect> & damage)973 Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
974                                           const std::vector<IComposerClient::Rect>& damage) {
975     Error error = Error::NONE;
976     mMutex.lock_shared();
977     if (auto writer = getWriter(display)) {
978         writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
979                                             translate<AidlRect>(damage));
980     } else {
981         error = Error::BAD_DISPLAY;
982     }
983     mMutex.unlock_shared();
984     return error;
985 }
986 
setLayerBlendMode(Display display,Layer layer,IComposerClient::BlendMode mode)987 Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
988                                       IComposerClient::BlendMode mode) {
989     Error error = Error::NONE;
990     mMutex.lock_shared();
991     if (auto writer = getWriter(display)) {
992         writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
993                                         translate<BlendMode>(mode));
994     } else {
995         error = Error::BAD_DISPLAY;
996     }
997     mMutex.unlock_shared();
998     return error;
999 }
1000 
setLayerColor(Display display,Layer layer,const Color & color)1001 Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
1002     Error error = Error::NONE;
1003     mMutex.lock_shared();
1004     if (auto writer = getWriter(display)) {
1005         writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
1006     } else {
1007         error = Error::BAD_DISPLAY;
1008     }
1009     mMutex.unlock_shared();
1010     return error;
1011 }
1012 
setLayerCompositionType(Display display,Layer layer,aidl::android::hardware::graphics::composer3::Composition type)1013 Error AidlComposer::setLayerCompositionType(
1014         Display display, Layer layer,
1015         aidl::android::hardware::graphics::composer3::Composition type) {
1016     Error error = Error::NONE;
1017     mMutex.lock_shared();
1018     if (auto writer = getWriter(display)) {
1019         writer->get().setLayerCompositionType(translate<int64_t>(display),
1020                                               translate<int64_t>(layer), type);
1021     } else {
1022         error = Error::BAD_DISPLAY;
1023     }
1024     mMutex.unlock_shared();
1025     return error;
1026 }
1027 
setLayerDataspace(Display display,Layer layer,Dataspace dataspace)1028 Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
1029     Error error = Error::NONE;
1030     mMutex.lock_shared();
1031     if (auto writer = getWriter(display)) {
1032         writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1033                                         translate<AidlDataspace>(dataspace));
1034     } else {
1035         error = Error::BAD_DISPLAY;
1036     }
1037     mMutex.unlock_shared();
1038     return error;
1039 }
1040 
setLayerDisplayFrame(Display display,Layer layer,const IComposerClient::Rect & frame)1041 Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
1042                                          const IComposerClient::Rect& frame) {
1043     Error error = Error::NONE;
1044     mMutex.lock_shared();
1045     if (auto writer = getWriter(display)) {
1046         writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1047                                            translate<AidlRect>(frame));
1048     } else {
1049         error = Error::BAD_DISPLAY;
1050     }
1051     mMutex.unlock_shared();
1052     return error;
1053 }
1054 
setLayerPlaneAlpha(Display display,Layer layer,float alpha)1055 Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
1056     Error error = Error::NONE;
1057     mMutex.lock_shared();
1058     if (auto writer = getWriter(display)) {
1059         writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1060                                          alpha);
1061     } else {
1062         error = Error::BAD_DISPLAY;
1063     }
1064     mMutex.unlock_shared();
1065     return error;
1066 }
1067 
setLayerSidebandStream(Display display,Layer layer,const native_handle_t * stream)1068 Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
1069                                            const native_handle_t* stream) {
1070     Error error = Error::NONE;
1071     mMutex.lock_shared();
1072     if (auto writer = getWriter(display)) {
1073         writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1074                                              stream);
1075     } else {
1076         error = Error::BAD_DISPLAY;
1077     }
1078     mMutex.unlock_shared();
1079     return error;
1080 }
1081 
setLayerSourceCrop(Display display,Layer layer,const IComposerClient::FRect & crop)1082 Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1083                                        const IComposerClient::FRect& crop) {
1084     Error error = Error::NONE;
1085     mMutex.lock_shared();
1086     if (auto writer = getWriter(display)) {
1087         writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1088                                          translate<AidlFRect>(crop));
1089     } else {
1090         error = Error::BAD_DISPLAY;
1091     }
1092     mMutex.unlock_shared();
1093     return error;
1094 }
1095 
setLayerTransform(Display display,Layer layer,Transform transform)1096 Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
1097     Error error = Error::NONE;
1098     mMutex.lock_shared();
1099     if (auto writer = getWriter(display)) {
1100         writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1101                                         translate<AidlTransform>(transform));
1102     } else {
1103         error = Error::BAD_DISPLAY;
1104     }
1105     mMutex.unlock_shared();
1106     return error;
1107 }
1108 
setLayerVisibleRegion(Display display,Layer layer,const std::vector<IComposerClient::Rect> & visible)1109 Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1110                                           const std::vector<IComposerClient::Rect>& visible) {
1111     Error error = Error::NONE;
1112     mMutex.lock_shared();
1113     if (auto writer = getWriter(display)) {
1114         writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1115                                             translate<AidlRect>(visible));
1116     } else {
1117         error = Error::BAD_DISPLAY;
1118     }
1119     mMutex.unlock_shared();
1120     return error;
1121 }
1122 
setLayerZOrder(Display display,Layer layer,uint32_t z)1123 Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
1124     Error error = Error::NONE;
1125     mMutex.lock_shared();
1126     if (auto writer = getWriter(display)) {
1127         writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1128     } else {
1129         error = Error::BAD_DISPLAY;
1130     }
1131     mMutex.unlock_shared();
1132     return error;
1133 }
1134 
execute(Display display)1135 Error AidlComposer::execute(Display display) {
1136     auto writer = getWriter(display);
1137     auto reader = getReader(display);
1138     if (!writer || !reader) {
1139         return Error::BAD_DISPLAY;
1140     }
1141 
1142     auto commands = writer->get().takePendingCommands();
1143     if (commands.empty()) {
1144         return Error::NONE;
1145     }
1146 
1147     { // scope for results
1148         std::vector<CommandResultPayload> results;
1149         auto status = mAidlComposerClient->executeCommands(commands, &results);
1150         if (!status.isOk()) {
1151             ALOGE("executeCommands failed %s", status.getDescription().c_str());
1152             return static_cast<Error>(status.getServiceSpecificError());
1153         }
1154 
1155         reader->get().parse(std::move(results));
1156     }
1157     const auto commandErrors = reader->get().takeErrors();
1158     Error error = Error::NONE;
1159     for (const auto& cmdErr : commandErrors) {
1160         const auto index = static_cast<size_t>(cmdErr.commandIndex);
1161         if (index < 0 || index >= commands.size()) {
1162             ALOGE("invalid command index %zu", index);
1163             return Error::BAD_PARAMETER;
1164         }
1165 
1166         const auto& command = commands[index];
1167         if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1168             error = translate<Error>(cmdErr.errorCode);
1169         } else {
1170             ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1171                   cmdErr.errorCode);
1172         }
1173     }
1174 
1175     return error;
1176 }
1177 
setLayerPerFrameMetadata(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadata> & perFrameMetadatas)1178 Error AidlComposer::setLayerPerFrameMetadata(
1179         Display display, Layer layer,
1180         const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
1181     Error error = Error::NONE;
1182     mMutex.lock_shared();
1183     if (auto writer = getWriter(display)) {
1184         writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1185                                                translate<int64_t>(layer),
1186                                                translate<AidlPerFrameMetadata>(perFrameMetadatas));
1187     } else {
1188         error = Error::BAD_DISPLAY;
1189     }
1190     mMutex.unlock_shared();
1191     return error;
1192 }
1193 
getPerFrameMetadataKeys(Display display)1194 std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1195         Display display) {
1196     std::vector<AidlPerFrameMetadataKey> keys;
1197     const auto status =
1198             mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1199     if (!status.isOk()) {
1200         ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1201         return {};
1202     }
1203     return translate<IComposerClient::PerFrameMetadataKey>(keys);
1204 }
1205 
getRenderIntents(Display display,ColorMode colorMode,std::vector<RenderIntent> * outRenderIntents)1206 Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1207                                      std::vector<RenderIntent>* outRenderIntents) {
1208     std::vector<AidlRenderIntent> renderIntents;
1209     const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1210                                                               translate<AidlColorMode>(colorMode),
1211                                                               &renderIntents);
1212     if (!status.isOk()) {
1213         ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1214         return static_cast<Error>(status.getServiceSpecificError());
1215     }
1216     *outRenderIntents = translate<RenderIntent>(renderIntents);
1217     return Error::NONE;
1218 }
1219 
getDataspaceSaturationMatrix(Dataspace dataspace,mat4 * outMatrix)1220 Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1221     std::vector<float> matrix;
1222     const auto status =
1223             mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1224                                                               &matrix);
1225     if (!status.isOk()) {
1226         ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1227         return static_cast<Error>(status.getServiceSpecificError());
1228     }
1229     *outMatrix = makeMat4(matrix);
1230     return Error::NONE;
1231 }
1232 
getDisplayIdentificationData(Display display,uint8_t * outPort,std::vector<uint8_t> * outData)1233 Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1234                                                  std::vector<uint8_t>* outData) {
1235     AidlDisplayIdentification displayIdentification;
1236     const auto status =
1237             mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1238                                                               &displayIdentification);
1239     if (!status.isOk()) {
1240         ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1241         return static_cast<Error>(status.getServiceSpecificError());
1242     }
1243 
1244     *outPort = static_cast<uint8_t>(displayIdentification.port);
1245     *outData = displayIdentification.data;
1246 
1247     return Error::NONE;
1248 }
1249 
setLayerColorTransform(Display display,Layer layer,const float * matrix)1250 Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
1251     Error error = Error::NONE;
1252     mMutex.lock_shared();
1253     if (auto writer = getWriter(display)) {
1254         writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1255                                              matrix);
1256     } else {
1257         error = Error::BAD_DISPLAY;
1258     }
1259     mMutex.unlock_shared();
1260     return error;
1261 }
1262 
getDisplayedContentSamplingAttributes(Display display,PixelFormat * outFormat,Dataspace * outDataspace,uint8_t * outComponentMask)1263 Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1264                                                           Dataspace* outDataspace,
1265                                                           uint8_t* outComponentMask) {
1266     if (!outFormat || !outDataspace || !outComponentMask) {
1267         return Error::BAD_PARAMETER;
1268     }
1269 
1270     AidlDisplayContentSamplingAttributes attributes;
1271     const auto status =
1272             mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1273                                                                        &attributes);
1274     if (!status.isOk()) {
1275         ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1276         return static_cast<Error>(status.getServiceSpecificError());
1277     }
1278 
1279     *outFormat = translate<PixelFormat>(attributes.format);
1280     *outDataspace = translate<Dataspace>(attributes.dataspace);
1281     *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1282     return Error::NONE;
1283 }
1284 
setDisplayContentSamplingEnabled(Display display,bool enabled,uint8_t componentMask,uint64_t maxFrames)1285 Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1286                                                      uint8_t componentMask, uint64_t maxFrames) {
1287     const auto status =
1288             mAidlComposerClient
1289                     ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1290                                                          static_cast<AidlFormatColorComponent>(
1291                                                                  componentMask),
1292                                                          static_cast<int64_t>(maxFrames));
1293     if (!status.isOk()) {
1294         ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1295         return static_cast<Error>(status.getServiceSpecificError());
1296     }
1297     return Error::NONE;
1298 }
1299 
getDisplayedContentSample(Display display,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats)1300 Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1301                                               uint64_t timestamp, DisplayedFrameStats* outStats) {
1302     if (!outStats) {
1303         return Error::BAD_PARAMETER;
1304     }
1305 
1306     AidlDisplayContentSample sample;
1307     const auto status =
1308             mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1309                                                            static_cast<int64_t>(maxFrames),
1310                                                            static_cast<int64_t>(timestamp),
1311                                                            &sample);
1312     if (!status.isOk()) {
1313         ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1314         return static_cast<Error>(status.getServiceSpecificError());
1315     }
1316     *outStats = translate<DisplayedFrameStats>(sample);
1317     return Error::NONE;
1318 }
1319 
setLayerPerFrameMetadataBlobs(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadataBlob> & metadata)1320 Error AidlComposer::setLayerPerFrameMetadataBlobs(
1321         Display display, Layer layer,
1322         const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1323     Error error = Error::NONE;
1324     mMutex.lock_shared();
1325     if (auto writer = getWriter(display)) {
1326         writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1327                                                     translate<int64_t>(layer),
1328                                                     translate<AidlPerFrameMetadataBlob>(metadata));
1329     } else {
1330         error = Error::BAD_DISPLAY;
1331     }
1332     mMutex.unlock_shared();
1333     return error;
1334 }
1335 
setDisplayBrightness(Display display,float brightness,float brightnessNits,const DisplayBrightnessOptions & options)1336 Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
1337                                          const DisplayBrightnessOptions& options) {
1338     Error error = Error::NONE;
1339     mMutex.lock_shared();
1340     if (auto writer = getWriter(display)) {
1341         writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
1342 
1343         if (options.applyImmediately) {
1344             error = execute(display);
1345             mMutex.unlock_shared();
1346             return error;
1347         }
1348     } else {
1349         error = Error::BAD_DISPLAY;
1350     }
1351     mMutex.unlock_shared();
1352     return error;
1353 }
1354 
getDisplayCapabilities(Display display,std::vector<AidlDisplayCapability> * outCapabilities)1355 Error AidlComposer::getDisplayCapabilities(Display display,
1356                                            std::vector<AidlDisplayCapability>* outCapabilities) {
1357     const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1358                                                                     outCapabilities);
1359     if (!status.isOk()) {
1360         ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1361         outCapabilities->clear();
1362         return static_cast<Error>(status.getServiceSpecificError());
1363     }
1364     return Error::NONE;
1365 }
1366 
getDisplayConnectionType(Display display,IComposerClient::DisplayConnectionType * outType)1367 V2_4::Error AidlComposer::getDisplayConnectionType(
1368         Display display, IComposerClient::DisplayConnectionType* outType) {
1369     AidlDisplayConnectionType type;
1370     const auto status =
1371             mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1372     if (!status.isOk()) {
1373         ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1374         return static_cast<V2_4::Error>(status.getServiceSpecificError());
1375     }
1376     *outType = translate<IComposerClient::DisplayConnectionType>(type);
1377     return V2_4::Error::NONE;
1378 }
1379 
getDisplayVsyncPeriod(Display display,VsyncPeriodNanos * outVsyncPeriod)1380 V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1381     int32_t vsyncPeriod;
1382     const auto status =
1383             mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1384     if (!status.isOk()) {
1385         ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1386         return static_cast<V2_4::Error>(status.getServiceSpecificError());
1387     }
1388     *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1389     return V2_4::Error::NONE;
1390 }
1391 
setActiveConfigWithConstraints(Display display,Config config,const IComposerClient::VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * outTimeline)1392 Error AidlComposer::setActiveConfigWithConstraints(
1393         Display display, Config config,
1394         const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1395         VsyncPeriodChangeTimeline* outTimeline) {
1396     AidlVsyncPeriodChangeTimeline timeline;
1397     const auto status =
1398             mAidlComposerClient
1399                     ->setActiveConfigWithConstraints(translate<int64_t>(display),
1400                                                      translate<int32_t>(config),
1401                                                      translate<AidlVsyncPeriodChangeConstraints>(
1402                                                              vsyncPeriodChangeConstraints),
1403                                                      &timeline);
1404     if (!status.isOk()) {
1405         ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1406         return static_cast<Error>(status.getServiceSpecificError());
1407     }
1408     *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1409     return Error::NONE;
1410 }
1411 
setAutoLowLatencyMode(Display display,bool on)1412 V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1413     const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1414     if (!status.isOk()) {
1415         ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1416         return static_cast<V2_4::Error>(status.getServiceSpecificError());
1417     }
1418     return V2_4::Error::NONE;
1419 }
1420 
getSupportedContentTypes(Display displayId,std::vector<IComposerClient::ContentType> * outSupportedContentTypes)1421 V2_4::Error AidlComposer::getSupportedContentTypes(
1422         Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1423     std::vector<AidlContentType> types;
1424     const auto status =
1425             mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1426     if (!status.isOk()) {
1427         ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1428         return static_cast<V2_4::Error>(status.getServiceSpecificError());
1429     }
1430     *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1431     return V2_4::Error::NONE;
1432 }
1433 
setContentType(Display display,IComposerClient::ContentType contentType)1434 V2_4::Error AidlComposer::setContentType(Display display,
1435                                          IComposerClient::ContentType contentType) {
1436     const auto status =
1437             mAidlComposerClient->setContentType(translate<int64_t>(display),
1438                                                 translate<AidlContentType>(contentType));
1439     if (!status.isOk()) {
1440         ALOGE("setContentType failed %s", status.getDescription().c_str());
1441         return static_cast<V2_4::Error>(status.getServiceSpecificError());
1442     }
1443     return V2_4::Error::NONE;
1444 }
1445 
setLayerGenericMetadata(Display,Layer,const std::string &,bool,const std::vector<uint8_t> &)1446 V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1447                                                   const std::vector<uint8_t>&) {
1448     // There are no users for this API. See b/209691612.
1449     return V2_4::Error::UNSUPPORTED;
1450 }
1451 
getLayerGenericMetadataKeys(std::vector<IComposerClient::LayerGenericMetadataKey> *)1452 V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
1453         std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1454     // There are no users for this API. See b/209691612.
1455     return V2_4::Error::UNSUPPORTED;
1456 }
1457 
setBootDisplayConfig(Display display,Config config)1458 Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1459     const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1460                                                                   translate<int32_t>(config));
1461     if (!status.isOk()) {
1462         ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1463         return static_cast<Error>(status.getServiceSpecificError());
1464     }
1465     return Error::NONE;
1466 }
1467 
clearBootDisplayConfig(Display display)1468 Error AidlComposer::clearBootDisplayConfig(Display display) {
1469     const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1470     if (!status.isOk()) {
1471         ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1472         return static_cast<Error>(status.getServiceSpecificError());
1473     }
1474     return Error::NONE;
1475 }
1476 
getPreferredBootDisplayConfig(Display display,Config * config)1477 Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1478     int32_t displayConfig;
1479     const auto status =
1480             mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1481                                                                &displayConfig);
1482     if (!status.isOk()) {
1483         ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1484         return static_cast<Error>(status.getServiceSpecificError());
1485     }
1486     *config = translate<uint32_t>(displayConfig);
1487     return Error::NONE;
1488 }
1489 
getHdrConversionCapabilities(std::vector<AidlHdrConversionCapability> * hdrConversionCapabilities)1490 Error AidlComposer::getHdrConversionCapabilities(
1491         std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1492     const auto status =
1493             mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1494     if (!status.isOk()) {
1495         hdrConversionCapabilities = {};
1496         ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1497         return static_cast<Error>(status.getServiceSpecificError());
1498     }
1499     return Error::NONE;
1500 }
1501 
setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,Hdr * outPreferredHdrOutputType)1502 Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1503                                              Hdr* outPreferredHdrOutputType) {
1504     const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1505                                                                       outPreferredHdrOutputType);
1506     if (!status.isOk()) {
1507         ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1508         return static_cast<Error>(status.getServiceSpecificError());
1509     }
1510     return Error::NONE;
1511 }
1512 
setRefreshRateChangedCallbackDebugEnabled(Display displayId,bool enabled)1513 Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1514     const auto status =
1515             mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1516                                                                                    displayId),
1517                                                                            enabled);
1518     if (!status.isOk()) {
1519         ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1520               status.getDescription().c_str());
1521         return static_cast<Error>(status.getServiceSpecificError());
1522     }
1523     return Error::NONE;
1524 }
1525 
notifyExpectedPresent(Display displayId,nsecs_t expectedPresentTime,int32_t frameIntervalNs)1526 Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1527                                           int32_t frameIntervalNs) {
1528     const auto status =
1529             mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1530                                                        ClockMonotonicTimestamp{expectedPresentTime},
1531                                                        frameIntervalNs);
1532 
1533     if (!status.isOk()) {
1534         ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1535         return static_cast<Error>(status.getServiceSpecificError());
1536     }
1537     return Error::NONE;
1538 }
1539 
getClientTargetProperty(Display display,ClientTargetPropertyWithBrightness * outClientTargetProperty)1540 Error AidlComposer::getClientTargetProperty(
1541         Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1542     Error error = Error::NONE;
1543     mMutex.lock_shared();
1544     if (auto reader = getReader(display)) {
1545         *outClientTargetProperty =
1546                 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1547     } else {
1548         error = Error::BAD_DISPLAY;
1549     }
1550     mMutex.unlock_shared();
1551     return error;
1552 }
1553 
getRequestedLuts(Display display,std::vector<Layer> * outLayers,std::vector<DisplayLuts::LayerLut> * outLuts)1554 Error AidlComposer::getRequestedLuts(Display display, std::vector<Layer>* outLayers,
1555                                      std::vector<DisplayLuts::LayerLut>* outLuts) {
1556     Error error = Error::NONE;
1557     mMutex.lock_shared();
1558     if (auto reader = getReader(display)) {
1559         *outLuts = reader->get().takeDisplayLuts(translate<int64_t>(display));
1560     } else {
1561         error = Error::BAD_DISPLAY;
1562     }
1563     mMutex.unlock_shared();
1564 
1565     outLayers->reserve(outLuts->size());
1566     for (const auto& layerLut : *outLuts) {
1567         outLayers->emplace_back(translate<Layer>(layerLut.layer));
1568     }
1569     return error;
1570 }
1571 
setLayerLuts(Display display,Layer layer,Luts & luts)1572 Error AidlComposer::setLayerLuts(Display display, Layer layer, Luts& luts) {
1573     Error error = Error::NONE;
1574     mMutex.lock_shared();
1575     if (auto writer = getWriter(display)) {
1576         writer->get().setLayerLuts(translate<int64_t>(display), translate<int64_t>(layer), luts);
1577     } else {
1578         error = Error::BAD_DISPLAY;
1579     }
1580     mMutex.unlock_shared();
1581     return error;
1582 }
1583 
setLayerBrightness(Display display,Layer layer,float brightness)1584 Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
1585     Error error = Error::NONE;
1586     mMutex.lock_shared();
1587     if (auto writer = getWriter(display)) {
1588         writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1589                                          brightness);
1590     } else {
1591         error = Error::BAD_DISPLAY;
1592     }
1593     mMutex.unlock_shared();
1594     return error;
1595 }
1596 
setLayerBlockingRegion(Display display,Layer layer,const std::vector<IComposerClient::Rect> & blocking)1597 Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1598                                            const std::vector<IComposerClient::Rect>& blocking) {
1599     Error error = Error::NONE;
1600     mMutex.lock_shared();
1601     if (auto writer = getWriter(display)) {
1602         writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1603                                              translate<AidlRect>(blocking));
1604     } else {
1605         error = Error::BAD_DISPLAY;
1606     }
1607     mMutex.unlock_shared();
1608     return error;
1609 }
1610 
getDisplayDecorationSupport(Display display,std::optional<DisplayDecorationSupport> * support)1611 Error AidlComposer::getDisplayDecorationSupport(Display display,
1612                                                 std::optional<DisplayDecorationSupport>* support) {
1613     const auto status =
1614             mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1615     if (!status.isOk()) {
1616         ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1617         support->reset();
1618         return static_cast<Error>(status.getServiceSpecificError());
1619     }
1620     return Error::NONE;
1621 }
1622 
setIdleTimerEnabled(Display displayId,std::chrono::milliseconds timeout)1623 Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1624     const auto status =
1625             mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1626                                                      translate<int32_t>(timeout.count()));
1627     if (!status.isOk()) {
1628         ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1629         return static_cast<Error>(status.getServiceSpecificError());
1630     }
1631     return Error::NONE;
1632 }
1633 
getPhysicalDisplayOrientation(Display displayId,AidlTransform * outDisplayOrientation)1634 Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1635                                                   AidlTransform* outDisplayOrientation) {
1636     const auto status =
1637             mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1638                                                                outDisplayOrientation);
1639     if (!status.isOk()) {
1640         ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1641         return static_cast<Error>(status.getServiceSpecificError());
1642     }
1643     return Error::NONE;
1644 }
1645 
getMaxLayerPictureProfiles(Display display,int32_t * outMaxProfiles)1646 Error AidlComposer::getMaxLayerPictureProfiles(Display display, int32_t* outMaxProfiles) {
1647     const auto status = mAidlComposerClient->getMaxLayerPictureProfiles(translate<int64_t>(display),
1648                                                                         outMaxProfiles);
1649     if (!status.isOk()) {
1650         ALOGE("getMaxLayerPictureProfiles failed %s", status.getDescription().c_str());
1651         return static_cast<Error>(status.getServiceSpecificError());
1652     }
1653     return Error::NONE;
1654 }
1655 
setDisplayPictureProfileId(Display display,PictureProfileId id)1656 Error AidlComposer::setDisplayPictureProfileId(Display display, PictureProfileId id) {
1657     Error error = Error::NONE;
1658     mMutex.lock_shared();
1659     if (auto writer = getWriter(display)) {
1660         writer->get().setDisplayPictureProfileId(translate<int64_t>(display), id);
1661     } else {
1662         error = Error::BAD_DISPLAY;
1663     }
1664     mMutex.unlock_shared();
1665     return error;
1666 }
1667 
setLayerPictureProfileId(Display display,Layer layer,PictureProfileId id)1668 Error AidlComposer::setLayerPictureProfileId(Display display, Layer layer, PictureProfileId id) {
1669     Error error = Error::NONE;
1670     mMutex.lock_shared();
1671     if (auto writer = getWriter(display)) {
1672         writer->get().setLayerPictureProfileId(translate<int64_t>(display),
1673                                                translate<int64_t>(layer), id);
1674     } else {
1675         error = Error::BAD_DISPLAY;
1676     }
1677     mMutex.unlock_shared();
1678     return error;
1679 }
1680 
getWriter(Display display)1681 ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1682         REQUIRES_SHARED(mMutex) {
1683     return mWriters.get(display);
1684 }
1685 
getReader(Display display)1686 ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1687         REQUIRES_SHARED(mMutex) {
1688     if (mSingleReader) {
1689         display = translate<Display>(kSingleReaderKey);
1690     }
1691     return mReaders.get(display);
1692 }
1693 
removeDisplay(Display display)1694 void AidlComposer::removeDisplay(Display display) {
1695     mMutex.lock();
1696     bool wasErased = mWriters.erase(display);
1697     ALOGW_IF(!wasErased,
1698              "Attempting to remove writer for display %" PRId64 " which is not connected",
1699              translate<int64_t>(display));
1700     if (!mSingleReader) {
1701         removeReader(display);
1702     }
1703     mMutex.unlock();
1704 }
1705 
onHotplugDisconnect(Display display)1706 void AidlComposer::onHotplugDisconnect(Display display) {
1707     removeDisplay(display);
1708 }
1709 
hasMultiThreadedPresentSupport(Display display)1710 bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
1711     if (!FlagManager::getInstance().multithreaded_present()) return false;
1712     const auto displayId = translate<int64_t>(display);
1713     std::vector<AidlDisplayCapability> capabilities;
1714     const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1715     if (!status.isOk()) {
1716         ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1717         return false;
1718     }
1719     return std::find(capabilities.begin(), capabilities.end(),
1720                      AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1721 }
1722 
addReader(Display display)1723 void AidlComposer::addReader(Display display) {
1724     const auto displayId = translate<int64_t>(display);
1725     std::optional<int64_t> displayOpt;
1726     if (displayId != kSingleReaderKey) {
1727         displayOpt.emplace(displayId);
1728     }
1729     auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1730     ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1731              displayId);
1732 }
1733 
removeReader(Display display)1734 void AidlComposer::removeReader(Display display) {
1735     bool wasErased = mReaders.erase(display);
1736     ALOGW_IF(!wasErased,
1737              "Attempting to remove reader for display %" PRId64 " which is not connected",
1738              translate<int64_t>(display));
1739 }
1740 
addDisplay(Display display)1741 void AidlComposer::addDisplay(Display display) {
1742     const auto displayId = translate<int64_t>(display);
1743     mMutex.lock();
1744     auto [it, added] = mWriters.try_emplace(display, displayId);
1745     ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1746              displayId);
1747     if (mSingleReader) {
1748         if (hasMultiThreadedPresentSupport(display)) {
1749             mSingleReader = false;
1750             removeReader(translate<Display>(kSingleReaderKey));
1751             // Note that this includes the new display.
1752             for (const auto& [existingDisplay, _] : mWriters) {
1753                 addReader(existingDisplay);
1754             }
1755         }
1756     } else {
1757         addReader(display);
1758     }
1759     mMutex.unlock();
1760 }
1761 
onHotplugConnect(Display display)1762 void AidlComposer::onHotplugConnect(Display display) {
1763     addDisplay(display);
1764 }
1765 } // namespace Hwc2
1766 } // namespace android
1767