1 /*
2  * Copyright (C) 2022 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 #include "ComposerClient.h"
18 
19 #include <aidlcommonsupport/NativeHandle.h>
20 #include <android/binder_ibinder_platform.h>
21 
22 #include "Common.h"
23 #include "Device.h"
24 #include "GuestFrameComposer.h"
25 #include "HostFrameComposer.h"
26 
27 namespace aidl::android::hardware::graphics::composer3::impl {
28 namespace {
29 
30 #define GET_DISPLAY_OR_RETURN_ERROR()                                    \
31   Display* display = getDisplay(displayId);                              \
32   if (display == nullptr) {                                              \
33     ALOGE("%s failed to get display:%" PRIu64, __FUNCTION__, displayId); \
34     return ToBinderStatus(HWC3::Error::BadDisplay);                      \
35   }
36 
37 }  // namespace
38 
39 using ::aidl::android::hardware::graphics::common::PixelFormat;
40 
41 class ComposerClient::CommandResultWriter {
42  public:
CommandResultWriter(std::vector<CommandResultPayload> * results)43   CommandResultWriter(std::vector<CommandResultPayload>* results)
44       : mIndex(0), mResults(results) {}
45 
nextCommand()46   void nextCommand() { ++mIndex; }
47 
addError(HWC3::Error error)48   void addError(HWC3::Error error) {
49     CommandError commandErrorResult;
50     commandErrorResult.commandIndex = mIndex;
51     commandErrorResult.errorCode = static_cast<int32_t>(error);
52     mResults->emplace_back(std::move(commandErrorResult));
53   }
54 
addPresentFence(int64_t displayId,::android::base::unique_fd fence)55   void addPresentFence(int64_t displayId, ::android::base::unique_fd fence) {
56     if (fence >= 0) {
57       PresentFence presentFenceResult;
58       presentFenceResult.display = displayId;
59       presentFenceResult.fence = ndk::ScopedFileDescriptor(fence.release());
60       mResults->emplace_back(std::move(presentFenceResult));
61     }
62   }
63 
addReleaseFences(int64_t displayId,std::unordered_map<int64_t,::android::base::unique_fd> layerFences)64   void addReleaseFences(
65       int64_t displayId,
66       std::unordered_map<int64_t, ::android::base::unique_fd> layerFences) {
67     ReleaseFences releaseFencesResult;
68     releaseFencesResult.display = displayId;
69     for (auto& [layer, layerFence] : layerFences) {
70       if (layerFence >= 0) {
71         ReleaseFences::Layer releaseFencesLayerResult;
72         releaseFencesLayerResult.layer = layer;
73         releaseFencesLayerResult.fence =
74             ndk::ScopedFileDescriptor(layerFence.release());
75         releaseFencesResult.layers.emplace_back(
76             std::move(releaseFencesLayerResult));
77       }
78     }
79     mResults->emplace_back(std::move(releaseFencesResult));
80   }
81 
addChanges(const DisplayChanges & changes)82   void addChanges(const DisplayChanges& changes) {
83     if (changes.compositionChanges) {
84       mResults->emplace_back(*changes.compositionChanges);
85     }
86     if (changes.displayRequestChanges) {
87       mResults->emplace_back(*changes.displayRequestChanges);
88     }
89   }
90 
addPresentOrValidateResult(int64_t displayId,PresentOrValidate::Result pov)91   void addPresentOrValidateResult(int64_t displayId,
92                                   PresentOrValidate::Result pov) {
93     PresentOrValidate result;
94     result.display = displayId;
95     result.result = pov;
96     mResults->emplace_back(std::move(result));
97   }
98 
99  private:
100   int32_t mIndex = 0;
101   std::vector<CommandResultPayload>* mResults = nullptr;
102 };
103 
ComposerClient()104 ComposerClient::ComposerClient() { DEBUG_LOG("%s", __FUNCTION__); }
105 
~ComposerClient()106 ComposerClient::~ComposerClient() {
107   DEBUG_LOG("%s", __FUNCTION__);
108 
109   std::unique_lock<std::mutex> lock(mStateMutex);
110 
111   destroyDisplaysLocked();
112 
113   if (mOnClientDestroyed) {
114     mOnClientDestroyed();
115   }
116 }
117 
init()118 HWC3::Error ComposerClient::init() {
119   DEBUG_LOG("%s", __FUNCTION__);
120 
121   HWC3::Error error = HWC3::Error::None;
122 
123   std::unique_lock<std::mutex> lock(mStateMutex);
124 
125   mResources = std::make_unique<ComposerResources>();
126   if (!mResources) {
127     ALOGE("%s failed to allocate ComposerResources", __FUNCTION__);
128     return HWC3::Error::NoResources;
129   }
130 
131   error = mResources->init();
132   if (error != HWC3::Error::None) {
133     ALOGE("%s failed to initialize ComposerResources", __FUNCTION__);
134     return error;
135   }
136 
137   error = Device::getInstance().getComposer(&mComposer);
138   if (error != HWC3::Error::None) {
139     ALOGE("%s failed to get FrameComposer", __FUNCTION__);
140     return error;
141   }
142 
143   const auto HotplugCallback = [this](bool connected,   //
144                                       int32_t id,       //
145                                       uint32_t width,   //
146                                       uint32_t height,  //
147                                       uint32_t dpiX,    //
148                                       uint32_t dpiY,    //
149                                       uint32_t refreshRate) {
150     handleHotplug(connected, id, width, height, dpiX, dpiY, refreshRate);
151   };
152   error = mComposer->registerOnHotplugCallback(HotplugCallback);
153   if (error != HWC3::Error::None) {
154     ALOGE("%s failed to register hotplug callback", __FUNCTION__);
155     return error;
156   }
157 
158   error = createDisplaysLocked();
159   if (error != HWC3::Error::None) {
160     ALOGE("%s failed to create displays.", __FUNCTION__);
161     return error;
162   }
163 
164   DEBUG_LOG("%s initialized!", __FUNCTION__);
165   return HWC3::Error::None;
166 }
167 
createLayer(int64_t displayId,int32_t bufferSlotCount,int64_t * layerId)168 ndk::ScopedAStatus ComposerClient::createLayer(int64_t displayId,
169                                                int32_t bufferSlotCount,
170                                                int64_t* layerId) {
171   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
172 
173   std::unique_lock<std::mutex> lock(mStateMutex);
174 
175   GET_DISPLAY_OR_RETURN_ERROR();
176 
177   HWC3::Error error = display->createLayer(layerId);
178   if (error != HWC3::Error::None) {
179     ALOGE("%s: display:%" PRIu64 " failed to create layer", __FUNCTION__,
180           displayId);
181     return ToBinderStatus(error);
182   }
183 
184   error = mResources->addLayer(displayId, *layerId, bufferSlotCount);
185   if (error != HWC3::Error::None) {
186     ALOGE("%s: display:%" PRIu64 " resources failed to create layer",
187           __FUNCTION__, displayId);
188     return ToBinderStatus(error);
189   }
190 
191   return ToBinderStatus(HWC3::Error::None);
192 }
193 
createVirtualDisplay(int32_t,int32_t,PixelFormat,int32_t,VirtualDisplay *)194 ndk::ScopedAStatus ComposerClient::createVirtualDisplay(
195     int32_t /*width*/, int32_t /*height*/, PixelFormat /*formatHint*/,
196     int32_t /*outputBufferSlotCount*/, VirtualDisplay* /*display*/) {
197   DEBUG_LOG("%s", __FUNCTION__);
198 
199   return ToBinderStatus(HWC3::Error::Unsupported);
200 }
201 
destroyLayer(int64_t displayId,int64_t layerId)202 ndk::ScopedAStatus ComposerClient::destroyLayer(int64_t displayId,
203                                                 int64_t layerId) {
204   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
205 
206   std::unique_lock<std::mutex> lock(mStateMutex);
207 
208   GET_DISPLAY_OR_RETURN_ERROR();
209 
210   HWC3::Error error = display->destroyLayer(layerId);
211   if (error != HWC3::Error::None) {
212     ALOGE("%s: display:%" PRIu64 " failed to destroy layer:%" PRIu64,
213           __FUNCTION__, displayId, layerId);
214     return ToBinderStatus(error);
215   }
216 
217   error = mResources->removeLayer(displayId, layerId);
218   if (error != HWC3::Error::None) {
219     ALOGE("%s: display:%" PRIu64 " resources failed to destroy layer:%" PRIu64,
220           __FUNCTION__, displayId, layerId);
221     return ToBinderStatus(error);
222   }
223 
224   return ToBinderStatus(HWC3::Error::None);
225 }
226 
destroyVirtualDisplay(int64_t)227 ndk::ScopedAStatus ComposerClient::destroyVirtualDisplay(
228     int64_t /*displayId*/) {
229   DEBUG_LOG("%s", __FUNCTION__);
230 
231   return ToBinderStatus(HWC3::Error::Unsupported);
232 }
233 
executeCommands(const std::vector<DisplayCommand> & commands,std::vector<CommandResultPayload> * commandResultPayloads)234 ndk::ScopedAStatus ComposerClient::executeCommands(
235     const std::vector<DisplayCommand>& commands,
236     std::vector<CommandResultPayload>* commandResultPayloads) {
237   DEBUG_LOG("%s", __FUNCTION__);
238 
239   std::unique_lock<std::mutex> lock(mStateMutex);
240 
241   mCommandResults =
242       std::make_unique<CommandResultWriter>(commandResultPayloads);
243 
244   for (const DisplayCommand& command : commands) {
245     executeDisplayCommand(command);
246     mCommandResults->nextCommand();
247   }
248 
249   mCommandResults.reset();
250 
251   return ToBinderStatus(HWC3::Error::None);
252 }
253 
getActiveConfig(int64_t displayId,int32_t * config)254 ndk::ScopedAStatus ComposerClient::getActiveConfig(int64_t displayId,
255                                                    int32_t* config) {
256   DEBUG_LOG("%s", __FUNCTION__);
257 
258   std::unique_lock<std::mutex> lock(mStateMutex);
259 
260   GET_DISPLAY_OR_RETURN_ERROR();
261 
262   return ToBinderStatus(display->getActiveConfig(config));
263 }
264 
getColorModes(int64_t displayId,std::vector<ColorMode> * colorModes)265 ndk::ScopedAStatus ComposerClient::getColorModes(
266     int64_t displayId, std::vector<ColorMode>* colorModes) {
267   DEBUG_LOG("%s", __FUNCTION__);
268 
269   std::unique_lock<std::mutex> lock(mStateMutex);
270 
271   GET_DISPLAY_OR_RETURN_ERROR();
272 
273   return ToBinderStatus(display->getColorModes(colorModes));
274 }
275 
getDataspaceSaturationMatrix(common::Dataspace dataspace,std::vector<float> * matrix)276 ndk::ScopedAStatus ComposerClient::getDataspaceSaturationMatrix(
277     common::Dataspace dataspace, std::vector<float>* matrix) {
278   DEBUG_LOG("%s", __FUNCTION__);
279 
280   if (dataspace != common::Dataspace::SRGB_LINEAR) {
281     return ToBinderStatus(HWC3::Error::BadParameter);
282   }
283 
284   // clang-format off
285   constexpr std::array<float, 16> kUnit {
286     1.0f, 0.0f, 0.0f, 0.0f,
287     0.0f, 1.0f, 0.0f, 0.0f,
288     0.0f, 0.0f, 1.0f, 0.0f,
289     0.0f, 0.0f, 0.0f, 1.0f,
290   };
291   // clang-format on
292   matrix->clear();
293   matrix->insert(matrix->begin(), kUnit.begin(), kUnit.end());
294 
295   return ToBinderStatus(HWC3::Error::None);
296 }
297 
getDisplayAttribute(int64_t displayId,int32_t config,DisplayAttribute attribute,int32_t * value)298 ndk::ScopedAStatus ComposerClient::getDisplayAttribute(
299     int64_t displayId, int32_t config, DisplayAttribute attribute,
300     int32_t* value) {
301   DEBUG_LOG("%s", __FUNCTION__);
302 
303   std::unique_lock<std::mutex> lock(mStateMutex);
304 
305   GET_DISPLAY_OR_RETURN_ERROR();
306 
307   return ToBinderStatus(display->getDisplayAttribute(config, attribute, value));
308 }
309 
getDisplayCapabilities(int64_t displayId,std::vector<DisplayCapability> * outCaps)310 ndk::ScopedAStatus ComposerClient::getDisplayCapabilities(
311     int64_t displayId, std::vector<DisplayCapability>* outCaps) {
312   DEBUG_LOG("%s", __FUNCTION__);
313 
314   std::unique_lock<std::mutex> lock(mStateMutex);
315 
316   GET_DISPLAY_OR_RETURN_ERROR();
317 
318   return ToBinderStatus(display->getDisplayCapabilities(outCaps));
319 }
320 
getDisplayConfigs(int64_t displayId,std::vector<int32_t> * outConfigs)321 ndk::ScopedAStatus ComposerClient::getDisplayConfigs(
322     int64_t displayId, std::vector<int32_t>* outConfigs) {
323   DEBUG_LOG("%s", __FUNCTION__);
324 
325   std::unique_lock<std::mutex> lock(mStateMutex);
326 
327   GET_DISPLAY_OR_RETURN_ERROR();
328 
329   return ToBinderStatus(display->getDisplayConfigs(outConfigs));
330 }
331 
getDisplayConnectionType(int64_t displayId,DisplayConnectionType * outType)332 ndk::ScopedAStatus ComposerClient::getDisplayConnectionType(
333     int64_t displayId, DisplayConnectionType* outType) {
334   DEBUG_LOG("%s", __FUNCTION__);
335 
336   std::unique_lock<std::mutex> lock(mStateMutex);
337 
338   GET_DISPLAY_OR_RETURN_ERROR();
339 
340   return ToBinderStatus(display->getDisplayConnectionType(outType));
341 }
342 
getDisplayIdentificationData(int64_t displayId,DisplayIdentification * outIdentification)343 ndk::ScopedAStatus ComposerClient::getDisplayIdentificationData(
344     int64_t displayId, DisplayIdentification* outIdentification) {
345   DEBUG_LOG("%s", __FUNCTION__);
346 
347   std::unique_lock<std::mutex> lock(mStateMutex);
348 
349   GET_DISPLAY_OR_RETURN_ERROR();
350 
351   return ToBinderStatus(
352       display->getDisplayIdentificationData(outIdentification));
353 }
354 
getDisplayName(int64_t displayId,std::string * outName)355 ndk::ScopedAStatus ComposerClient::getDisplayName(int64_t displayId,
356                                                   std::string* outName) {
357   DEBUG_LOG("%s", __FUNCTION__);
358 
359   std::unique_lock<std::mutex> lock(mStateMutex);
360 
361   GET_DISPLAY_OR_RETURN_ERROR();
362 
363   return ToBinderStatus(display->getDisplayName(outName));
364 }
365 
getDisplayVsyncPeriod(int64_t displayId,int32_t * outVsyncPeriod)366 ndk::ScopedAStatus ComposerClient::getDisplayVsyncPeriod(
367     int64_t displayId, int32_t* outVsyncPeriod) {
368   DEBUG_LOG("%s", __FUNCTION__);
369 
370   std::unique_lock<std::mutex> lock(mStateMutex);
371 
372   GET_DISPLAY_OR_RETURN_ERROR();
373 
374   return ToBinderStatus(display->getDisplayVsyncPeriod(outVsyncPeriod));
375 }
376 
getDisplayedContentSample(int64_t displayId,int64_t maxFrames,int64_t timestamp,DisplayContentSample * outSamples)377 ndk::ScopedAStatus ComposerClient::getDisplayedContentSample(
378     int64_t displayId, int64_t maxFrames, int64_t timestamp,
379     DisplayContentSample* outSamples) {
380   DEBUG_LOG("%s", __FUNCTION__);
381 
382   std::unique_lock<std::mutex> lock(mStateMutex);
383 
384   GET_DISPLAY_OR_RETURN_ERROR();
385 
386   return ToBinderStatus(
387       display->getDisplayedContentSample(maxFrames, timestamp, outSamples));
388 }
389 
getDisplayedContentSamplingAttributes(int64_t displayId,DisplayContentSamplingAttributes * outAttributes)390 ndk::ScopedAStatus ComposerClient::getDisplayedContentSamplingAttributes(
391     int64_t displayId, DisplayContentSamplingAttributes* outAttributes) {
392   DEBUG_LOG("%s", __FUNCTION__);
393 
394   std::unique_lock<std::mutex> lock(mStateMutex);
395 
396   GET_DISPLAY_OR_RETURN_ERROR();
397 
398   return ToBinderStatus(
399       display->getDisplayedContentSamplingAttributes(outAttributes));
400 }
401 
getDisplayPhysicalOrientation(int64_t displayId,common::Transform * outOrientation)402 ndk::ScopedAStatus ComposerClient::getDisplayPhysicalOrientation(
403     int64_t displayId, common::Transform* outOrientation) {
404   DEBUG_LOG("%s", __FUNCTION__);
405 
406   std::unique_lock<std::mutex> lock(mStateMutex);
407 
408   GET_DISPLAY_OR_RETURN_ERROR();
409 
410   return ToBinderStatus(display->getDisplayPhysicalOrientation(outOrientation));
411 }
412 
getHdrCapabilities(int64_t displayId,HdrCapabilities * outCapabilities)413 ndk::ScopedAStatus ComposerClient::getHdrCapabilities(
414     int64_t displayId, HdrCapabilities* outCapabilities) {
415   DEBUG_LOG("%s", __FUNCTION__);
416 
417   std::unique_lock<std::mutex> lock(mStateMutex);
418 
419   GET_DISPLAY_OR_RETURN_ERROR();
420 
421   return ToBinderStatus(display->getHdrCapabilities(outCapabilities));
422 }
423 
getOverlaySupport(OverlayProperties * properties)424 ndk::ScopedAStatus ComposerClient::getOverlaySupport(
425     OverlayProperties* properties) {
426   DEBUG_LOG("%s", __FUNCTION__);
427 
428   // no supported combinations
429   properties->combinations.clear();
430 
431   return ToBinderStatus(HWC3::Error::None);
432 }
433 
getMaxVirtualDisplayCount(int32_t * outCount)434 ndk::ScopedAStatus ComposerClient::getMaxVirtualDisplayCount(
435     int32_t* outCount) {
436   DEBUG_LOG("%s", __FUNCTION__);
437 
438   // Not supported.
439   *outCount = 0;
440 
441   return ToBinderStatus(HWC3::Error::None);
442 }
443 
getPerFrameMetadataKeys(int64_t displayId,std::vector<PerFrameMetadataKey> * outKeys)444 ndk::ScopedAStatus ComposerClient::getPerFrameMetadataKeys(
445     int64_t displayId, std::vector<PerFrameMetadataKey>* outKeys) {
446   DEBUG_LOG("%s", __FUNCTION__);
447 
448   std::unique_lock<std::mutex> lock(mStateMutex);
449 
450   GET_DISPLAY_OR_RETURN_ERROR();
451 
452   return ToBinderStatus(display->getPerFrameMetadataKeys(outKeys));
453 }
454 
getReadbackBufferAttributes(int64_t displayId,ReadbackBufferAttributes * outAttributes)455 ndk::ScopedAStatus ComposerClient::getReadbackBufferAttributes(
456     int64_t displayId, ReadbackBufferAttributes* outAttributes) {
457   DEBUG_LOG("%s", __FUNCTION__);
458 
459   std::unique_lock<std::mutex> lock(mStateMutex);
460 
461   GET_DISPLAY_OR_RETURN_ERROR();
462 
463   return ToBinderStatus(display->getReadbackBufferAttributes(outAttributes));
464 }
465 
getReadbackBufferFence(int64_t displayId,ndk::ScopedFileDescriptor * outAcquireFence)466 ndk::ScopedAStatus ComposerClient::getReadbackBufferFence(
467     int64_t displayId, ndk::ScopedFileDescriptor* outAcquireFence) {
468   DEBUG_LOG("%s", __FUNCTION__);
469 
470   std::unique_lock<std::mutex> lock(mStateMutex);
471 
472   GET_DISPLAY_OR_RETURN_ERROR();
473 
474   return ToBinderStatus(display->getReadbackBufferFence(outAcquireFence));
475 }
476 
getRenderIntents(int64_t displayId,ColorMode mode,std::vector<RenderIntent> * outIntents)477 ndk::ScopedAStatus ComposerClient::getRenderIntents(
478     int64_t displayId, ColorMode mode, std::vector<RenderIntent>* outIntents) {
479   DEBUG_LOG("%s", __FUNCTION__);
480 
481   std::unique_lock<std::mutex> lock(mStateMutex);
482 
483   GET_DISPLAY_OR_RETURN_ERROR();
484 
485   return ToBinderStatus(display->getRenderIntents(mode, outIntents));
486 }
487 
getSupportedContentTypes(int64_t displayId,std::vector<ContentType> * outTypes)488 ndk::ScopedAStatus ComposerClient::getSupportedContentTypes(
489     int64_t displayId, std::vector<ContentType>* outTypes) {
490   DEBUG_LOG("%s", __FUNCTION__);
491 
492   std::unique_lock<std::mutex> lock(mStateMutex);
493 
494   GET_DISPLAY_OR_RETURN_ERROR();
495 
496   return ToBinderStatus(display->getSupportedContentTypes(outTypes));
497 }
498 
getDisplayDecorationSupport(int64_t displayId,std::optional<common::DisplayDecorationSupport> * outSupport)499 ndk::ScopedAStatus ComposerClient::getDisplayDecorationSupport(
500     int64_t displayId,
501     std::optional<common::DisplayDecorationSupport>* outSupport) {
502   DEBUG_LOG("%s", __FUNCTION__);
503 
504   std::unique_lock<std::mutex> lock(mStateMutex);
505 
506   GET_DISPLAY_OR_RETURN_ERROR();
507 
508   return ToBinderStatus(display->getDecorationSupport(outSupport));
509 }
510 
registerCallback(const std::shared_ptr<IComposerCallback> & callback)511 ndk::ScopedAStatus ComposerClient::registerCallback(
512     const std::shared_ptr<IComposerCallback>& callback) {
513   DEBUG_LOG("%s", __FUNCTION__);
514 
515   std::unique_lock<std::mutex> lock(mStateMutex);
516 
517   const bool isFirstRegisterCallback = mCallbacks == nullptr;
518 
519   mCallbacks = callback;
520 
521   for (auto& [_, display] : mDisplays) {
522     display->registerCallback(callback);
523   }
524 
525   if (isFirstRegisterCallback) {
526     lock.unlock();
527     for (auto& [displayId, _] : mDisplays) {
528       mCallbacks->onHotplug(displayId, /*connected=*/true);
529     }
530   }
531 
532   return ndk::ScopedAStatus::ok();
533 }
534 
setActiveConfig(int64_t displayId,int32_t configId)535 ndk::ScopedAStatus ComposerClient::setActiveConfig(int64_t displayId,
536                                                    int32_t configId) {
537   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
538             configId);
539 
540   std::unique_lock<std::mutex> lock(mStateMutex);
541 
542   GET_DISPLAY_OR_RETURN_ERROR();
543 
544   return ToBinderStatus(display->setActiveConfig(configId));
545 }
546 
setActiveConfigWithConstraints(int64_t displayId,int32_t configId,const VsyncPeriodChangeConstraints & constraints,VsyncPeriodChangeTimeline * outTimeline)547 ndk::ScopedAStatus ComposerClient::setActiveConfigWithConstraints(
548     int64_t displayId, int32_t configId,
549     const VsyncPeriodChangeConstraints& constraints,
550     VsyncPeriodChangeTimeline* outTimeline) {
551   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
552             configId);
553 
554   std::unique_lock<std::mutex> lock(mStateMutex);
555 
556   GET_DISPLAY_OR_RETURN_ERROR();
557 
558   return ToBinderStatus(display->setActiveConfigWithConstraints(
559       configId, constraints, outTimeline));
560 }
561 
setBootDisplayConfig(int64_t displayId,int32_t configId)562 ndk::ScopedAStatus ComposerClient::setBootDisplayConfig(int64_t displayId,
563                                                         int32_t configId) {
564   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
565             configId);
566 
567   std::unique_lock<std::mutex> lock(mStateMutex);
568 
569   GET_DISPLAY_OR_RETURN_ERROR();
570 
571   return ToBinderStatus(display->setBootConfig(configId));
572 }
573 
clearBootDisplayConfig(int64_t displayId)574 ndk::ScopedAStatus ComposerClient::clearBootDisplayConfig(int64_t displayId) {
575   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
576 
577   std::unique_lock<std::mutex> lock(mStateMutex);
578 
579   GET_DISPLAY_OR_RETURN_ERROR();
580 
581   return ToBinderStatus(display->clearBootConfig());
582 }
583 
getPreferredBootDisplayConfig(int64_t displayId,int32_t * outConfigId)584 ndk::ScopedAStatus ComposerClient::getPreferredBootDisplayConfig(
585     int64_t displayId, int32_t* outConfigId) {
586   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
587 
588   std::unique_lock<std::mutex> lock(mStateMutex);
589 
590   GET_DISPLAY_OR_RETURN_ERROR();
591 
592   return ToBinderStatus(display->getPreferredBootConfig(outConfigId));
593 }
594 
getHdrConversionCapabilities(std::vector<aidl::android::hardware::graphics::common::HdrConversionCapability> * capabilities)595 ndk::ScopedAStatus ComposerClient::getHdrConversionCapabilities(
596     std::vector<aidl::android::hardware::graphics::common::HdrConversionCapability>* capabilities) {
597   DEBUG_LOG("%s", __FUNCTION__);
598   capabilities->clear();
599   return ToBinderStatus(HWC3::Error::None);
600 }
601 
setHdrConversionStrategy(const aidl::android::hardware::graphics::common::HdrConversionStrategy & conversionStrategy,aidl::android::hardware::graphics::common::Hdr * preferredHdrOutputType)602 ndk::ScopedAStatus ComposerClient::setHdrConversionStrategy(
603     const aidl::android::hardware::graphics::common::HdrConversionStrategy& conversionStrategy,
604     aidl::android::hardware::graphics::common::Hdr* preferredHdrOutputType) {
605   DEBUG_LOG("%s", __FUNCTION__);
606   using HdrConversionStrategyTag = aidl::android::hardware::graphics::common::HdrConversionStrategy::Tag;
607   switch (conversionStrategy.getTag() == HdrConversionStrategyTag::autoAllowedHdrTypes) {
608       auto autoHdrTypes = conversionStrategy.get<HdrConversionStrategyTag::autoAllowedHdrTypes>();
609       if (autoHdrTypes.size() != 0) {
610           return ToBinderStatus(HWC3::Error::Unsupported);
611       }
612   }
613   *preferredHdrOutputType = aidl::android::hardware::graphics::common::Hdr::INVALID;
614   return ToBinderStatus(HWC3::Error::None);
615 }
616 
setAutoLowLatencyMode(int64_t displayId,bool on)617 ndk::ScopedAStatus ComposerClient::setAutoLowLatencyMode(int64_t displayId,
618                                                          bool on) {
619   DEBUG_LOG("%s", __FUNCTION__);
620 
621   std::unique_lock<std::mutex> lock(mStateMutex);
622 
623   GET_DISPLAY_OR_RETURN_ERROR();
624 
625   return ToBinderStatus(display->setAutoLowLatencyMode(on));
626 }
627 
setClientTargetSlotCount(int64_t displayId,int32_t count)628 ndk::ScopedAStatus ComposerClient::setClientTargetSlotCount(int64_t displayId,
629                                                             int32_t count) {
630   DEBUG_LOG("%s", __FUNCTION__);
631 
632   std::unique_lock<std::mutex> lock(mStateMutex);
633 
634   GET_DISPLAY_OR_RETURN_ERROR();
635 
636   return ToBinderStatus(
637       mResources->setDisplayClientTargetCacheSize(displayId, count));
638 }
639 
setColorMode(int64_t displayId,ColorMode mode,RenderIntent intent)640 ndk::ScopedAStatus ComposerClient::setColorMode(int64_t displayId,
641                                                 ColorMode mode,
642                                                 RenderIntent intent) {
643   DEBUG_LOG("%s", __FUNCTION__);
644 
645   std::unique_lock<std::mutex> lock(mStateMutex);
646 
647   GET_DISPLAY_OR_RETURN_ERROR();
648 
649   return ToBinderStatus(display->setColorMode(mode, intent));
650 }
651 
setContentType(int64_t displayId,ContentType type)652 ndk::ScopedAStatus ComposerClient::setContentType(int64_t displayId,
653                                                   ContentType type) {
654   DEBUG_LOG("%s", __FUNCTION__);
655 
656   std::unique_lock<std::mutex> lock(mStateMutex);
657 
658   GET_DISPLAY_OR_RETURN_ERROR();
659 
660   return ToBinderStatus(display->setContentType(type));
661 }
662 
setDisplayedContentSamplingEnabled(int64_t displayId,bool enable,FormatColorComponent componentMask,int64_t maxFrames)663 ndk::ScopedAStatus ComposerClient::setDisplayedContentSamplingEnabled(
664     int64_t displayId, bool enable, FormatColorComponent componentMask,
665     int64_t maxFrames) {
666   DEBUG_LOG("%s", __FUNCTION__);
667 
668   std::unique_lock<std::mutex> lock(mStateMutex);
669 
670   GET_DISPLAY_OR_RETURN_ERROR();
671 
672   return ToBinderStatus(display->setDisplayedContentSamplingEnabled(
673       enable, componentMask, maxFrames));
674 }
675 
setPowerMode(int64_t displayId,PowerMode mode)676 ndk::ScopedAStatus ComposerClient::setPowerMode(int64_t displayId,
677                                                 PowerMode mode) {
678   DEBUG_LOG("%s", __FUNCTION__);
679 
680   std::unique_lock<std::mutex> lock(mStateMutex);
681 
682   GET_DISPLAY_OR_RETURN_ERROR();
683 
684   return ToBinderStatus(display->setPowerMode(mode));
685 }
686 
setReadbackBuffer(int64_t displayId,const aidl::android::hardware::common::NativeHandle & buffer,const ndk::ScopedFileDescriptor & releaseFence)687 ndk::ScopedAStatus ComposerClient::setReadbackBuffer(
688     int64_t displayId,
689     const aidl::android::hardware::common::NativeHandle& buffer,
690     const ndk::ScopedFileDescriptor& releaseFence) {
691   DEBUG_LOG("%s", __FUNCTION__);
692 
693   std::unique_lock<std::mutex> lock(mStateMutex);
694 
695   GET_DISPLAY_OR_RETURN_ERROR();
696 
697   // Owned by mResources.
698   buffer_handle_t importedBuffer = nullptr;
699 
700   auto releaser = mResources->createReleaser(true /* isBuffer */);
701   auto error = mResources->getDisplayReadbackBuffer(
702       displayId, buffer, &importedBuffer, releaser.get());
703   if (error != HWC3::Error::None) {
704     ALOGE("%s: failed to get readback buffer from resources.", __FUNCTION__);
705     return ToBinderStatus(error);
706   }
707 
708   error = display->setReadbackBuffer(importedBuffer, releaseFence);
709   if (error != HWC3::Error::None) {
710     ALOGE("%s: failed to set readback buffer to display.", __FUNCTION__);
711     return ToBinderStatus(error);
712   }
713 
714   return ToBinderStatus(HWC3::Error::None);
715 }
716 
setVsyncEnabled(int64_t displayId,bool enabled)717 ndk::ScopedAStatus ComposerClient::setVsyncEnabled(int64_t displayId,
718                                                    bool enabled) {
719   DEBUG_LOG("%s", __FUNCTION__);
720 
721   std::unique_lock<std::mutex> lock(mStateMutex);
722 
723   GET_DISPLAY_OR_RETURN_ERROR();
724 
725   return ToBinderStatus(display->setVsyncEnabled(enabled));
726 }
727 
setIdleTimerEnabled(int64_t displayId,int32_t timeoutMs)728 ndk::ScopedAStatus ComposerClient::setIdleTimerEnabled(int64_t displayId,
729                                                        int32_t timeoutMs) {
730   DEBUG_LOG("%s", __FUNCTION__);
731 
732   std::unique_lock<std::mutex> lock(mStateMutex);
733 
734   GET_DISPLAY_OR_RETURN_ERROR();
735 
736   return ToBinderStatus(display->setIdleTimerEnabled(timeoutMs));
737 }
738 
setRefreshRateChangedCallbackDebugEnabled(int64_t displayId,bool)739 ndk::ScopedAStatus ComposerClient::setRefreshRateChangedCallbackDebugEnabled(
740         int64_t displayId, bool) {
741     DEBUG_LOG("%s", __FUNCTION__);
742 
743     GET_DISPLAY_OR_RETURN_ERROR();
744 
745     return ToBinderStatus(HWC3::Error::Unsupported);
746 }
747 
createBinder()748 ndk::SpAIBinder ComposerClient::createBinder() {
749   auto binder = BnComposerClient::createBinder();
750   AIBinder_setInheritRt(binder.get(), true);
751   return binder;
752 }
753 
754 namespace {
755 
756 #define DISPATCH_LAYER_COMMAND(layerCmd, display, layer, field, funcName)     \
757   do {                                                                        \
758     if (layerCmd.field) {                                                     \
759       ComposerClient::executeLayerCommandSetLayer##funcName(display, layer,   \
760                                                             *layerCmd.field); \
761     }                                                                         \
762   } while (0)
763 
764 #define DISPATCH_DISPLAY_COMMAND(displayCmd, display, field, funcName) \
765   do {                                                                 \
766     if (displayCmd.field) {                                            \
767       executeDisplayCommand##funcName(display, *displayCmd.field);     \
768     }                                                                  \
769   } while (0)
770 
771 #define DISPATCH_DISPLAY_BOOL_COMMAND(displayCmd, display, field, funcName) \
772   do {                                                                      \
773     if (displayCmd.field) {                                                 \
774       executeDisplayCommand##funcName(display);                             \
775     }                                                                       \
776   } while (0)
777 
778 #define DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCmd, display, field, \
779                                                data, funcName)             \
780   do {                                                                     \
781     if (displayCmd.field) {                                                \
782       executeDisplayCommand##funcName(display, displayCmd.data);           \
783     }                                                                      \
784   } while (0)
785 
786 #define LOG_DISPLAY_COMMAND_ERROR(display, error)                 \
787   do {                                                            \
788     const std::string errorString = toString(error);              \
789     ALOGE("%s: display:%" PRId64 " failed with:%s", __FUNCTION__, \
790           display->getId(), errorString.c_str());                 \
791   } while (0)
792 
793 #define LOG_LAYER_COMMAND_ERROR(display, layer, error)                \
794   do {                                                                \
795     const std::string errorString = toString(error);                  \
796     ALOGE("%s: display:%" PRId64 " layer:%" PRId64 " failed with:%s", \
797           __FUNCTION__, display->getId(), layer->getId(),             \
798           errorString.c_str());                                       \
799   } while (0)
800 
801 }  // namespace
802 
executeDisplayCommand(const DisplayCommand & displayCommand)803 void ComposerClient::executeDisplayCommand(
804     const DisplayCommand& displayCommand) {
805   Display* display = getDisplay(displayCommand.display);
806   if (display == nullptr) {
807     mCommandResults->addError(HWC3::Error::BadDisplay);
808     return;
809   }
810 
811   for (const LayerCommand& layerCmd : displayCommand.layers) {
812     executeLayerCommand(display, layerCmd);
813   }
814 
815   DISPATCH_DISPLAY_COMMAND(displayCommand, display, colorTransformMatrix,
816                            SetColorTransform);
817   DISPATCH_DISPLAY_COMMAND(displayCommand, display, brightness, SetBrightness);
818   DISPATCH_DISPLAY_COMMAND(displayCommand, display, clientTarget,
819                            SetClientTarget);
820   DISPATCH_DISPLAY_COMMAND(displayCommand, display, virtualDisplayOutputBuffer,
821                            SetOutputBuffer);
822   DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, display,
823                                          validateDisplay, expectedPresentTime,
824                                          ValidateDisplay);
825   DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, acceptDisplayChanges,
826                                 AcceptDisplayChanges);
827   DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, presentDisplay,
828                                 PresentDisplay);
829   DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(
830       displayCommand, display, presentOrValidateDisplay, expectedPresentTime,
831       PresentOrValidateDisplay);
832 }
833 
executeLayerCommand(Display * display,const LayerCommand & layerCommand)834 void ComposerClient::executeLayerCommand(Display* display,
835                                          const LayerCommand& layerCommand) {
836   Layer* layer = display->getLayer(layerCommand.layer);
837   if (layer == nullptr) {
838     mCommandResults->addError(HWC3::Error::BadLayer);
839     return;
840   }
841 
842   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, cursorPosition,
843                          CursorPosition);
844   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, buffer, Buffer);
845   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, damage, SurfaceDamage);
846   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, blendMode, BlendMode);
847   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, color, Color);
848   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, composition,
849                          Composition);
850   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, dataspace, Dataspace);
851   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, displayFrame,
852                          DisplayFrame);
853   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, planeAlpha, PlaneAlpha);
854   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sidebandStream,
855                          SidebandStream);
856   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sourceCrop, SourceCrop);
857   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, transform, Transform);
858   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, visibleRegion,
859                          VisibleRegion);
860   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, z, ZOrder);
861   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, colorTransform,
862                          ColorTransform);
863   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, brightness, Brightness);
864   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadata,
865                          PerFrameMetadata);
866   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadataBlob,
867                          PerFrameMetadataBlobs);
868 }
869 
executeDisplayCommandSetColorTransform(Display * display,const std::vector<float> & matrix)870 void ComposerClient::executeDisplayCommandSetColorTransform(
871     Display* display, const std::vector<float>& matrix) {
872   DEBUG_LOG("%s", __FUNCTION__);
873 
874   auto error = display->setColorTransform(matrix);
875   if (error != HWC3::Error::None) {
876     LOG_DISPLAY_COMMAND_ERROR(display, error);
877     mCommandResults->addError(error);
878   }
879 }
880 
executeDisplayCommandSetBrightness(Display * display,const DisplayBrightness & brightness)881 void ComposerClient::executeDisplayCommandSetBrightness(
882     Display* display, const DisplayBrightness& brightness) {
883   DEBUG_LOG("%s", __FUNCTION__);
884 
885   auto error = display->setBrightness(brightness.brightness);
886   if (error != HWC3::Error::None) {
887     LOG_DISPLAY_COMMAND_ERROR(display, error);
888     mCommandResults->addError(error);
889   }
890 }
891 
executeDisplayCommandSetClientTarget(Display * display,const ClientTarget & clientTarget)892 void ComposerClient::executeDisplayCommandSetClientTarget(
893     Display* display, const ClientTarget& clientTarget) {
894   DEBUG_LOG("%s", __FUNCTION__);
895 
896   // Owned by mResources.
897   buffer_handle_t importedBuffer = nullptr;
898 
899   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
900   auto error = mResources->getDisplayClientTarget(
901       display->getId(), clientTarget.buffer, &importedBuffer, releaser.get());
902   if (error != HWC3::Error::None) {
903     LOG_DISPLAY_COMMAND_ERROR(display, error);
904     mCommandResults->addError(error);
905     return;
906   }
907 
908   error = display->setClientTarget(importedBuffer, clientTarget.buffer.fence,
909                                    clientTarget.dataspace, clientTarget.damage);
910   if (error != HWC3::Error::None) {
911     LOG_DISPLAY_COMMAND_ERROR(display, error);
912     mCommandResults->addError(error);
913     return;
914   }
915 }
916 
executeDisplayCommandSetOutputBuffer(Display * display,const Buffer & buffer)917 void ComposerClient::executeDisplayCommandSetOutputBuffer(
918     Display* display, const Buffer& buffer) {
919   DEBUG_LOG("%s", __FUNCTION__);
920 
921   // Owned by mResources.
922   buffer_handle_t importedBuffer = nullptr;
923 
924   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
925   auto error = mResources->getDisplayOutputBuffer(
926       display->getId(), buffer, &importedBuffer, releaser.get());
927   if (error != HWC3::Error::None) {
928     LOG_DISPLAY_COMMAND_ERROR(display, error);
929     mCommandResults->addError(error);
930     return;
931   }
932 
933   error = display->setOutputBuffer(importedBuffer, buffer.fence);
934   if (error != HWC3::Error::None) {
935     LOG_DISPLAY_COMMAND_ERROR(display, error);
936     mCommandResults->addError(error);
937     return;
938   }
939 }
940 
executeDisplayCommandValidateDisplay(Display * display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime)941 void ComposerClient::executeDisplayCommandValidateDisplay(
942     Display* display,
943     const std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
944   DEBUG_LOG("%s", __FUNCTION__);
945 
946   auto error = display->setExpectedPresentTime(expectedPresentTime);
947   if (error != HWC3::Error::None) {
948     LOG_DISPLAY_COMMAND_ERROR(display, error);
949     mCommandResults->addError(error);
950   }
951 
952   DisplayChanges changes;
953 
954   error = display->validate(&changes);
955   if (error != HWC3::Error::None) {
956     LOG_DISPLAY_COMMAND_ERROR(display, error);
957     mCommandResults->addError(error);
958   } else {
959     mCommandResults->addChanges(changes);
960   }
961 
962   mResources->setDisplayMustValidateState(display->getId(), false);
963 }
964 
executeDisplayCommandAcceptDisplayChanges(Display * display)965 void ComposerClient::executeDisplayCommandAcceptDisplayChanges(
966     Display* display) {
967   DEBUG_LOG("%s", __FUNCTION__);
968 
969   auto error = display->acceptChanges();
970   if (error != HWC3::Error::None) {
971     LOG_DISPLAY_COMMAND_ERROR(display, error);
972     mCommandResults->addError(error);
973   }
974 }
975 
executeDisplayCommandPresentOrValidateDisplay(Display * display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime)976 void ComposerClient::executeDisplayCommandPresentOrValidateDisplay(
977     Display* display,
978     const std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
979   DEBUG_LOG("%s", __FUNCTION__);
980 
981   // TODO: Support SKIP_VALIDATE.
982 
983   auto error = display->setExpectedPresentTime(expectedPresentTime);
984   if (error != HWC3::Error::None) {
985     LOG_DISPLAY_COMMAND_ERROR(display, error);
986     mCommandResults->addError(error);
987   }
988 
989   DisplayChanges changes;
990 
991   error = display->validate(&changes);
992   if (error != HWC3::Error::None) {
993     LOG_DISPLAY_COMMAND_ERROR(display, error);
994     mCommandResults->addError(error);
995   } else {
996     const int64_t displayId = display->getId();
997     mCommandResults->addChanges(changes);
998     mCommandResults->addPresentOrValidateResult(
999         displayId, PresentOrValidate::Result::Validated);
1000   }
1001 
1002   mResources->setDisplayMustValidateState(display->getId(), false);
1003 }
1004 
executeDisplayCommandPresentDisplay(Display * display)1005 void ComposerClient::executeDisplayCommandPresentDisplay(Display* display) {
1006   DEBUG_LOG("%s", __FUNCTION__);
1007 
1008   if (mResources->mustValidateDisplay(display->getId())) {
1009     ALOGE("%s: display:%" PRIu64 " not validated", __FUNCTION__,
1010           display->getId());
1011     mCommandResults->addError(HWC3::Error::NotValidated);
1012     return;
1013   }
1014 
1015   ::android::base::unique_fd displayFence;
1016   std::unordered_map<int64_t, ::android::base::unique_fd> layerFences;
1017 
1018   auto error = display->present(&displayFence, &layerFences);
1019   if (error != HWC3::Error::None) {
1020     LOG_DISPLAY_COMMAND_ERROR(display, error);
1021     mCommandResults->addError(error);
1022   } else {
1023     const int64_t displayId = display->getId();
1024     mCommandResults->addPresentFence(displayId, std::move(displayFence));
1025     mCommandResults->addReleaseFences(displayId, std::move(layerFences));
1026   }
1027 }
1028 
executeLayerCommandSetLayerCursorPosition(Display * display,Layer * layer,const common::Point & cursorPosition)1029 void ComposerClient::executeLayerCommandSetLayerCursorPosition(
1030     Display* display, Layer* layer, const common::Point& cursorPosition) {
1031   DEBUG_LOG("%s", __FUNCTION__);
1032 
1033   auto error = layer->setCursorPosition(cursorPosition);
1034   if (error != HWC3::Error::None) {
1035     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1036     mCommandResults->addError(error);
1037   }
1038 }
1039 
executeLayerCommandSetLayerBuffer(Display * display,Layer * layer,const Buffer & buffer)1040 void ComposerClient::executeLayerCommandSetLayerBuffer(Display* display,
1041                                                        Layer* layer,
1042                                                        const Buffer& buffer) {
1043   DEBUG_LOG("%s", __FUNCTION__);
1044 
1045   // Owned by mResources.
1046   buffer_handle_t importedBuffer = nullptr;
1047 
1048   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
1049   auto error =
1050       mResources->getLayerBuffer(display->getId(), layer->getId(), buffer,
1051                                  &importedBuffer, releaser.get());
1052   if (error != HWC3::Error::None) {
1053     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1054     mCommandResults->addError(error);
1055     return;
1056   }
1057 
1058   error = layer->setBuffer(importedBuffer, buffer.fence);
1059   if (error != HWC3::Error::None) {
1060     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1061     mCommandResults->addError(error);
1062   }
1063 }
1064 
executeLayerCommandSetLayerSurfaceDamage(Display * display,Layer * layer,const std::vector<std::optional<common::Rect>> & damage)1065 void ComposerClient::executeLayerCommandSetLayerSurfaceDamage(
1066     Display* display, Layer* layer,
1067     const std::vector<std::optional<common::Rect>>& damage) {
1068   DEBUG_LOG("%s", __FUNCTION__);
1069 
1070   auto error = layer->setSurfaceDamage(damage);
1071   if (error != HWC3::Error::None) {
1072     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1073     mCommandResults->addError(error);
1074   }
1075 }
1076 
executeLayerCommandSetLayerBlendMode(Display * display,Layer * layer,const ParcelableBlendMode & blendMode)1077 void ComposerClient::executeLayerCommandSetLayerBlendMode(
1078     Display* display, Layer* layer, const ParcelableBlendMode& blendMode) {
1079   DEBUG_LOG("%s", __FUNCTION__);
1080 
1081   auto error = layer->setBlendMode(blendMode.blendMode);
1082   if (error != HWC3::Error::None) {
1083     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1084     mCommandResults->addError(error);
1085   }
1086 }
1087 
executeLayerCommandSetLayerColor(Display * display,Layer * layer,const Color & color)1088 void ComposerClient::executeLayerCommandSetLayerColor(Display* display,
1089                                                       Layer* layer,
1090                                                       const Color& color) {
1091   DEBUG_LOG("%s", __FUNCTION__);
1092 
1093   auto error = layer->setColor(color);
1094   if (error != HWC3::Error::None) {
1095     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1096     mCommandResults->addError(error);
1097   }
1098 }
1099 
executeLayerCommandSetLayerComposition(Display * display,Layer * layer,const ParcelableComposition & composition)1100 void ComposerClient::executeLayerCommandSetLayerComposition(
1101     Display* display, Layer* layer, const ParcelableComposition& composition) {
1102   DEBUG_LOG("%s", __FUNCTION__);
1103 
1104   auto error = layer->setCompositionType(composition.composition);
1105   if (error != HWC3::Error::None) {
1106     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1107     mCommandResults->addError(error);
1108   }
1109 }
1110 
executeLayerCommandSetLayerDataspace(Display * display,Layer * layer,const ParcelableDataspace & dataspace)1111 void ComposerClient::executeLayerCommandSetLayerDataspace(
1112     Display* display, Layer* layer, const ParcelableDataspace& dataspace) {
1113   DEBUG_LOG("%s", __FUNCTION__);
1114 
1115   auto error = layer->setDataspace(dataspace.dataspace);
1116   if (error != HWC3::Error::None) {
1117     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1118     mCommandResults->addError(error);
1119   }
1120 }
1121 
executeLayerCommandSetLayerDisplayFrame(Display * display,Layer * layer,const common::Rect & rect)1122 void ComposerClient::executeLayerCommandSetLayerDisplayFrame(
1123     Display* display, Layer* layer, const common::Rect& rect) {
1124   DEBUG_LOG("%s", __FUNCTION__);
1125 
1126   auto error = layer->setDisplayFrame(rect);
1127   if (error != HWC3::Error::None) {
1128     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1129     mCommandResults->addError(error);
1130   }
1131 }
1132 
executeLayerCommandSetLayerPlaneAlpha(Display * display,Layer * layer,const PlaneAlpha & planeAlpha)1133 void ComposerClient::executeLayerCommandSetLayerPlaneAlpha(
1134     Display* display, Layer* layer, const PlaneAlpha& planeAlpha) {
1135   DEBUG_LOG("%s", __FUNCTION__);
1136 
1137   auto error = layer->setPlaneAlpha(planeAlpha.alpha);
1138   if (error != HWC3::Error::None) {
1139     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1140     mCommandResults->addError(error);
1141   }
1142 }
1143 
executeLayerCommandSetLayerSidebandStream(Display * display,Layer * layer,const aidl::android::hardware::common::NativeHandle & handle)1144 void ComposerClient::executeLayerCommandSetLayerSidebandStream(
1145     Display* display, Layer* layer,
1146     const aidl::android::hardware::common::NativeHandle& handle) {
1147   DEBUG_LOG("%s", __FUNCTION__);
1148 
1149   // Owned by mResources.
1150   buffer_handle_t importedStream = nullptr;
1151 
1152   auto releaser = mResources->createReleaser(/*isBuffer=*/false);
1153   auto error = mResources->getLayerSidebandStream(
1154       display->getId(), layer->getId(), handle, &importedStream,
1155       releaser.get());
1156   if (error != HWC3::Error::None) {
1157     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1158     mCommandResults->addError(error);
1159     return;
1160   }
1161 
1162   error = layer->setSidebandStream(importedStream);
1163   if (error != HWC3::Error::None) {
1164     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1165     mCommandResults->addError(error);
1166   }
1167 }
1168 
executeLayerCommandSetLayerSourceCrop(Display * display,Layer * layer,const common::FRect & sourceCrop)1169 void ComposerClient::executeLayerCommandSetLayerSourceCrop(
1170     Display* display, Layer* layer, const common::FRect& sourceCrop) {
1171   DEBUG_LOG("%s", __FUNCTION__);
1172 
1173   auto error = layer->setSourceCrop(sourceCrop);
1174   if (error != HWC3::Error::None) {
1175     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1176     mCommandResults->addError(error);
1177   }
1178 }
1179 
executeLayerCommandSetLayerTransform(Display * display,Layer * layer,const ParcelableTransform & transform)1180 void ComposerClient::executeLayerCommandSetLayerTransform(
1181     Display* display, Layer* layer, const ParcelableTransform& transform) {
1182   DEBUG_LOG("%s", __FUNCTION__);
1183 
1184   auto error = layer->setTransform(transform.transform);
1185   if (error != HWC3::Error::None) {
1186     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1187     mCommandResults->addError(error);
1188   }
1189 }
1190 
executeLayerCommandSetLayerVisibleRegion(Display * display,Layer * layer,const std::vector<std::optional<common::Rect>> & visibleRegion)1191 void ComposerClient::executeLayerCommandSetLayerVisibleRegion(
1192     Display* display, Layer* layer,
1193     const std::vector<std::optional<common::Rect>>& visibleRegion) {
1194   DEBUG_LOG("%s", __FUNCTION__);
1195 
1196   auto error = layer->setVisibleRegion(visibleRegion);
1197   if (error != HWC3::Error::None) {
1198     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1199     mCommandResults->addError(error);
1200   }
1201 }
1202 
executeLayerCommandSetLayerZOrder(Display * display,Layer * layer,const ZOrder & zOrder)1203 void ComposerClient::executeLayerCommandSetLayerZOrder(Display* display,
1204                                                        Layer* layer,
1205                                                        const ZOrder& zOrder) {
1206   DEBUG_LOG("%s", __FUNCTION__);
1207 
1208   auto error = layer->setZOrder(zOrder.z);
1209   if (error != HWC3::Error::None) {
1210     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1211     mCommandResults->addError(error);
1212   }
1213 }
1214 
executeLayerCommandSetLayerPerFrameMetadata(Display * display,Layer * layer,const std::vector<std::optional<PerFrameMetadata>> & perFrameMetadata)1215 void ComposerClient::executeLayerCommandSetLayerPerFrameMetadata(
1216     Display* display, Layer* layer,
1217     const std::vector<std::optional<PerFrameMetadata>>& perFrameMetadata) {
1218   DEBUG_LOG("%s", __FUNCTION__);
1219 
1220   auto error = layer->setPerFrameMetadata(perFrameMetadata);
1221   if (error != HWC3::Error::None) {
1222     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1223     mCommandResults->addError(error);
1224   }
1225 }
1226 
executeLayerCommandSetLayerColorTransform(Display * display,Layer * layer,const std::vector<float> & colorTransform)1227 void ComposerClient::executeLayerCommandSetLayerColorTransform(
1228     Display* display, Layer* layer, const std::vector<float>& colorTransform) {
1229   DEBUG_LOG("%s", __FUNCTION__);
1230 
1231   auto error = layer->setColorTransform(colorTransform);
1232   if (error != HWC3::Error::None) {
1233     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1234     mCommandResults->addError(error);
1235   }
1236 }
1237 
executeLayerCommandSetLayerBrightness(Display * display,Layer * layer,const LayerBrightness & brightness)1238 void ComposerClient::executeLayerCommandSetLayerBrightness(
1239     Display* display, Layer* layer, const LayerBrightness& brightness) {
1240   DEBUG_LOG("%s", __FUNCTION__);
1241 
1242   auto error = layer->setBrightness(brightness.brightness);
1243   if (error != HWC3::Error::None) {
1244     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1245     mCommandResults->addError(error);
1246   }
1247 }
1248 
executeLayerCommandSetLayerPerFrameMetadataBlobs(Display * display,Layer * layer,const std::vector<std::optional<PerFrameMetadataBlob>> & perFrameMetadataBlob)1249 void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs(
1250     Display* display, Layer* layer,
1251     const std::vector<std::optional<PerFrameMetadataBlob>>&
1252         perFrameMetadataBlob) {
1253   DEBUG_LOG("%s", __FUNCTION__);
1254 
1255   auto error = layer->setPerFrameMetadataBlobs(perFrameMetadataBlob);
1256   if (error != HWC3::Error::None) {
1257     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1258     mCommandResults->addError(error);
1259   }
1260 }
1261 
getDisplay(int64_t displayId)1262 Display* ComposerClient::getDisplay(int64_t displayId) {
1263   auto it = mDisplays.find(displayId);
1264   if (it == mDisplays.end()) {
1265     ALOGE("%s: no display:%" PRIu64, __FUNCTION__, displayId);
1266     return nullptr;
1267   }
1268   return it->second.get();
1269 }
1270 
createDisplaysLocked()1271 HWC3::Error ComposerClient::createDisplaysLocked() {
1272   DEBUG_LOG("%s", __FUNCTION__);
1273 
1274   if (!mComposer) {
1275     ALOGE("%s composer not initialized!", __FUNCTION__);
1276     return HWC3::Error::NoResources;
1277   }
1278 
1279   std::vector<DisplayMultiConfigs> displays;
1280 
1281   HWC3::Error error = findDisplays(mComposer->getDrmPresenter(), &displays);
1282   if (error != HWC3::Error::None) {
1283     ALOGE("%s failed to find display configs", __FUNCTION__);
1284     return error;
1285   }
1286 
1287   for (const auto& iter : displays) {
1288     error =
1289         createDisplayLocked(iter.displayId, iter.activeConfigId, iter.configs);
1290     if (error != HWC3::Error::None) {
1291       ALOGE("%s failed to create display from config", __FUNCTION__);
1292       return error;
1293     }
1294   }
1295 
1296   return HWC3::Error::None;
1297 }
1298 
createDisplayLocked(int64_t displayId,int32_t activeConfigId,const std::vector<DisplayConfig> & configs)1299 HWC3::Error ComposerClient::createDisplayLocked(
1300     int64_t displayId, int32_t activeConfigId,
1301     const std::vector<DisplayConfig>& configs) {
1302   DEBUG_LOG("%s", __FUNCTION__);
1303 
1304   if (!mComposer) {
1305     ALOGE("%s composer not initialized!", __FUNCTION__);
1306     return HWC3::Error::NoResources;
1307   }
1308 
1309   auto display = std::make_unique<Display>(mComposer, displayId);
1310   if (display == nullptr) {
1311     ALOGE("%s failed to allocate display", __FUNCTION__);
1312     return HWC3::Error::NoResources;
1313   }
1314 
1315   HWC3::Error error = display->init(configs, activeConfigId);
1316   if (error != HWC3::Error::None) {
1317     ALOGE("%s failed to initialize display:%" PRIu64, __FUNCTION__, displayId);
1318     return error;
1319   }
1320 
1321   error = mComposer->onDisplayCreate(display.get());
1322   if (error != HWC3::Error::None) {
1323     ALOGE("%s failed to register display:%" PRIu64 " with composer",
1324           __FUNCTION__, displayId);
1325     return error;
1326   }
1327 
1328   display->setPowerMode(PowerMode::ON);
1329 
1330   DEBUG_LOG("%s: adding display:%" PRIu64, __FUNCTION__, displayId);
1331   mDisplays.emplace(displayId, std::move(display));
1332 
1333   error = mResources->addPhysicalDisplay(displayId);
1334   if (error != HWC3::Error::None) {
1335     ALOGE("%s failed to initialize display:%" PRIu64 " resources", __FUNCTION__,
1336           displayId);
1337     return error;
1338   }
1339 
1340   return HWC3::Error::None;
1341 }
1342 
destroyDisplaysLocked()1343 HWC3::Error ComposerClient::destroyDisplaysLocked() {
1344   DEBUG_LOG("%s", __FUNCTION__);
1345 
1346   std::vector<int64_t> displayIds;
1347   for (const auto& [displayId, _] : mDisplays) {
1348     displayIds.push_back(displayId);
1349   }
1350   for (const int64_t displayId : displayIds) {
1351     destroyDisplayLocked(displayId);
1352   }
1353 
1354   return HWC3::Error::None;
1355 }
1356 
destroyDisplayLocked(int64_t displayId)1357 HWC3::Error ComposerClient::destroyDisplayLocked(int64_t displayId) {
1358   DEBUG_LOG("%s display:%" PRId64, __FUNCTION__, displayId);
1359 
1360   auto it = mDisplays.find(displayId);
1361   if (it == mDisplays.end()) {
1362     ALOGE("%s: display:%" PRId64 " no such display?", __FUNCTION__, displayId);
1363     return HWC3::Error::BadDisplay;
1364   }
1365 
1366   Display* display = it->second.get();
1367 
1368   display->setPowerMode(PowerMode::OFF);
1369 
1370   HWC3::Error error = mComposer->onDisplayDestroy(it->second.get());
1371   if (error != HWC3::Error::None) {
1372     ALOGE("%s: display:%" PRId64 " failed to destroy with frame composer",
1373           __FUNCTION__, displayId);
1374   }
1375 
1376   error = mResources->removeDisplay(displayId);
1377   if (error != HWC3::Error::None) {
1378     ALOGE("%s: display:%" PRId64 " failed to destroy with resources",
1379           __FUNCTION__, displayId);
1380   }
1381 
1382   mDisplays.erase(it);
1383 
1384   return HWC3::Error::None;
1385 }
1386 
handleHotplug(bool connected,uint32_t id,uint32_t width,uint32_t height,uint32_t dpiX,uint32_t dpiY,uint32_t refreshRate)1387 HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id,
1388                                           uint32_t width, uint32_t height,
1389                                           uint32_t dpiX, uint32_t dpiY,
1390                                           uint32_t refreshRate) {
1391   if (!mCallbacks) {
1392     return HWC3::Error::None;
1393   }
1394 
1395   const int64_t displayId = static_cast<int64_t>(id);
1396 
1397   if (connected) {
1398     const int32_t configId = static_cast<int32_t>(id);
1399     const std::vector<DisplayConfig> configs = {
1400         DisplayConfig(configId, static_cast<int>(width),
1401                       static_cast<int>(height), static_cast<int>(dpiX),
1402                       static_cast<int>(dpiY), static_cast<int>(refreshRate))};
1403     {
1404       std::unique_lock<std::mutex> lock(mStateMutex);
1405       createDisplayLocked(displayId, configId, configs);
1406     }
1407 
1408     ALOGI("Connecting display:%" PRIu32 " w:%" PRIu32 " h:%" PRIu32
1409           " dpiX:%" PRIu32 " dpiY %" PRIu32 "fps %" PRIu32,
1410           id, width, height, dpiX, dpiY, refreshRate);
1411     mCallbacks->onHotplug(displayId, /*connected=*/true);
1412   } else {
1413     ALOGI("Disconnecting display:%" PRIu64, displayId);
1414     mCallbacks->onHotplug(displayId, /*connected=*/false);
1415 
1416     Display* display = getDisplay(displayId);
1417     if (display != nullptr) {
1418       std::unique_lock<std::mutex> lock(mStateMutex);
1419       destroyDisplayLocked(displayId);
1420     }
1421   }
1422 
1423   return HWC3::Error::None;
1424 }
1425 
1426 }  // namespace aidl::android::hardware::graphics::composer3::impl