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