• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
getMaxVirtualDisplayCount(int32_t * outCount)424 ndk::ScopedAStatus ComposerClient::getMaxVirtualDisplayCount(
425     int32_t* outCount) {
426   DEBUG_LOG("%s", __FUNCTION__);
427 
428   // Not supported.
429   *outCount = 0;
430 
431   return ToBinderStatus(HWC3::Error::None);
432 }
433 
getPerFrameMetadataKeys(int64_t displayId,std::vector<PerFrameMetadataKey> * outKeys)434 ndk::ScopedAStatus ComposerClient::getPerFrameMetadataKeys(
435     int64_t displayId, std::vector<PerFrameMetadataKey>* outKeys) {
436   DEBUG_LOG("%s", __FUNCTION__);
437 
438   std::unique_lock<std::mutex> lock(mStateMutex);
439 
440   GET_DISPLAY_OR_RETURN_ERROR();
441 
442   return ToBinderStatus(display->getPerFrameMetadataKeys(outKeys));
443 }
444 
getReadbackBufferAttributes(int64_t displayId,ReadbackBufferAttributes * outAttributes)445 ndk::ScopedAStatus ComposerClient::getReadbackBufferAttributes(
446     int64_t displayId, ReadbackBufferAttributes* outAttributes) {
447   DEBUG_LOG("%s", __FUNCTION__);
448 
449   std::unique_lock<std::mutex> lock(mStateMutex);
450 
451   GET_DISPLAY_OR_RETURN_ERROR();
452 
453   return ToBinderStatus(display->getReadbackBufferAttributes(outAttributes));
454 }
455 
getReadbackBufferFence(int64_t displayId,ndk::ScopedFileDescriptor * outAcquireFence)456 ndk::ScopedAStatus ComposerClient::getReadbackBufferFence(
457     int64_t displayId, ndk::ScopedFileDescriptor* outAcquireFence) {
458   DEBUG_LOG("%s", __FUNCTION__);
459 
460   std::unique_lock<std::mutex> lock(mStateMutex);
461 
462   GET_DISPLAY_OR_RETURN_ERROR();
463 
464   return ToBinderStatus(display->getReadbackBufferFence(outAcquireFence));
465 }
466 
getRenderIntents(int64_t displayId,ColorMode mode,std::vector<RenderIntent> * outIntents)467 ndk::ScopedAStatus ComposerClient::getRenderIntents(
468     int64_t displayId, ColorMode mode, std::vector<RenderIntent>* outIntents) {
469   DEBUG_LOG("%s", __FUNCTION__);
470 
471   std::unique_lock<std::mutex> lock(mStateMutex);
472 
473   GET_DISPLAY_OR_RETURN_ERROR();
474 
475   return ToBinderStatus(display->getRenderIntents(mode, outIntents));
476 }
477 
getSupportedContentTypes(int64_t displayId,std::vector<ContentType> * outTypes)478 ndk::ScopedAStatus ComposerClient::getSupportedContentTypes(
479     int64_t displayId, std::vector<ContentType>* outTypes) {
480   DEBUG_LOG("%s", __FUNCTION__);
481 
482   std::unique_lock<std::mutex> lock(mStateMutex);
483 
484   GET_DISPLAY_OR_RETURN_ERROR();
485 
486   return ToBinderStatus(display->getSupportedContentTypes(outTypes));
487 }
488 
getDisplayDecorationSupport(int64_t displayId,std::optional<common::DisplayDecorationSupport> * outSupport)489 ndk::ScopedAStatus ComposerClient::getDisplayDecorationSupport(
490     int64_t displayId,
491     std::optional<common::DisplayDecorationSupport>* outSupport) {
492   DEBUG_LOG("%s", __FUNCTION__);
493 
494   std::unique_lock<std::mutex> lock(mStateMutex);
495 
496   GET_DISPLAY_OR_RETURN_ERROR();
497 
498   return ToBinderStatus(display->getDecorationSupport(outSupport));
499 }
500 
registerCallback(const std::shared_ptr<IComposerCallback> & callback)501 ndk::ScopedAStatus ComposerClient::registerCallback(
502     const std::shared_ptr<IComposerCallback>& callback) {
503   DEBUG_LOG("%s", __FUNCTION__);
504 
505   std::unique_lock<std::mutex> lock(mStateMutex);
506 
507   const bool isFirstRegisterCallback = mCallbacks == nullptr;
508 
509   mCallbacks = callback;
510 
511   for (auto& [_, display] : mDisplays) {
512     display->registerCallback(callback);
513   }
514 
515   if (isFirstRegisterCallback) {
516     lock.unlock();
517     for (auto& [displayId, _] : mDisplays) {
518       mCallbacks->onHotplug(displayId, /*connected=*/true);
519     }
520   }
521 
522   return ndk::ScopedAStatus::ok();
523 }
524 
setActiveConfig(int64_t displayId,int32_t configId)525 ndk::ScopedAStatus ComposerClient::setActiveConfig(int64_t displayId,
526                                                    int32_t configId) {
527   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
528             configId);
529 
530   std::unique_lock<std::mutex> lock(mStateMutex);
531 
532   GET_DISPLAY_OR_RETURN_ERROR();
533 
534   return ToBinderStatus(display->setActiveConfig(configId));
535 }
536 
setActiveConfigWithConstraints(int64_t displayId,int32_t configId,const VsyncPeriodChangeConstraints & constraints,VsyncPeriodChangeTimeline * outTimeline)537 ndk::ScopedAStatus ComposerClient::setActiveConfigWithConstraints(
538     int64_t displayId, int32_t configId,
539     const VsyncPeriodChangeConstraints& constraints,
540     VsyncPeriodChangeTimeline* outTimeline) {
541   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
542             configId);
543 
544   std::unique_lock<std::mutex> lock(mStateMutex);
545 
546   GET_DISPLAY_OR_RETURN_ERROR();
547 
548   return ToBinderStatus(display->setActiveConfigWithConstraints(
549       configId, constraints, outTimeline));
550 }
551 
setBootDisplayConfig(int64_t displayId,int32_t configId)552 ndk::ScopedAStatus ComposerClient::setBootDisplayConfig(int64_t displayId,
553                                                         int32_t configId) {
554   DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId,
555             configId);
556 
557   std::unique_lock<std::mutex> lock(mStateMutex);
558 
559   GET_DISPLAY_OR_RETURN_ERROR();
560 
561   return ToBinderStatus(display->setBootConfig(configId));
562 }
563 
clearBootDisplayConfig(int64_t displayId)564 ndk::ScopedAStatus ComposerClient::clearBootDisplayConfig(int64_t displayId) {
565   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
566 
567   std::unique_lock<std::mutex> lock(mStateMutex);
568 
569   GET_DISPLAY_OR_RETURN_ERROR();
570 
571   return ToBinderStatus(display->clearBootConfig());
572 }
573 
getPreferredBootDisplayConfig(int64_t displayId,int32_t * outConfigId)574 ndk::ScopedAStatus ComposerClient::getPreferredBootDisplayConfig(
575     int64_t displayId, int32_t* outConfigId) {
576   DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
577 
578   std::unique_lock<std::mutex> lock(mStateMutex);
579 
580   GET_DISPLAY_OR_RETURN_ERROR();
581 
582   return ToBinderStatus(display->getPreferredBootConfig(outConfigId));
583 }
584 
setAutoLowLatencyMode(int64_t displayId,bool on)585 ndk::ScopedAStatus ComposerClient::setAutoLowLatencyMode(int64_t displayId,
586                                                          bool on) {
587   DEBUG_LOG("%s", __FUNCTION__);
588 
589   std::unique_lock<std::mutex> lock(mStateMutex);
590 
591   GET_DISPLAY_OR_RETURN_ERROR();
592 
593   return ToBinderStatus(display->setAutoLowLatencyMode(on));
594 }
595 
setClientTargetSlotCount(int64_t displayId,int32_t count)596 ndk::ScopedAStatus ComposerClient::setClientTargetSlotCount(int64_t displayId,
597                                                             int32_t count) {
598   DEBUG_LOG("%s", __FUNCTION__);
599 
600   std::unique_lock<std::mutex> lock(mStateMutex);
601 
602   GET_DISPLAY_OR_RETURN_ERROR();
603 
604   return ToBinderStatus(
605       mResources->setDisplayClientTargetCacheSize(displayId, count));
606 }
607 
setColorMode(int64_t displayId,ColorMode mode,RenderIntent intent)608 ndk::ScopedAStatus ComposerClient::setColorMode(int64_t displayId,
609                                                 ColorMode mode,
610                                                 RenderIntent intent) {
611   DEBUG_LOG("%s", __FUNCTION__);
612 
613   std::unique_lock<std::mutex> lock(mStateMutex);
614 
615   GET_DISPLAY_OR_RETURN_ERROR();
616 
617   return ToBinderStatus(display->setColorMode(mode, intent));
618 }
619 
setContentType(int64_t displayId,ContentType type)620 ndk::ScopedAStatus ComposerClient::setContentType(int64_t displayId,
621                                                   ContentType type) {
622   DEBUG_LOG("%s", __FUNCTION__);
623 
624   std::unique_lock<std::mutex> lock(mStateMutex);
625 
626   GET_DISPLAY_OR_RETURN_ERROR();
627 
628   return ToBinderStatus(display->setContentType(type));
629 }
630 
setDisplayedContentSamplingEnabled(int64_t displayId,bool enable,FormatColorComponent componentMask,int64_t maxFrames)631 ndk::ScopedAStatus ComposerClient::setDisplayedContentSamplingEnabled(
632     int64_t displayId, bool enable, FormatColorComponent componentMask,
633     int64_t maxFrames) {
634   DEBUG_LOG("%s", __FUNCTION__);
635 
636   std::unique_lock<std::mutex> lock(mStateMutex);
637 
638   GET_DISPLAY_OR_RETURN_ERROR();
639 
640   return ToBinderStatus(display->setDisplayedContentSamplingEnabled(
641       enable, componentMask, maxFrames));
642 }
643 
setPowerMode(int64_t displayId,PowerMode mode)644 ndk::ScopedAStatus ComposerClient::setPowerMode(int64_t displayId,
645                                                 PowerMode mode) {
646   DEBUG_LOG("%s", __FUNCTION__);
647 
648   std::unique_lock<std::mutex> lock(mStateMutex);
649 
650   GET_DISPLAY_OR_RETURN_ERROR();
651 
652   return ToBinderStatus(display->setPowerMode(mode));
653 }
654 
setReadbackBuffer(int64_t displayId,const aidl::android::hardware::common::NativeHandle & buffer,const ndk::ScopedFileDescriptor & releaseFence)655 ndk::ScopedAStatus ComposerClient::setReadbackBuffer(
656     int64_t displayId,
657     const aidl::android::hardware::common::NativeHandle& buffer,
658     const ndk::ScopedFileDescriptor& releaseFence) {
659   DEBUG_LOG("%s", __FUNCTION__);
660 
661   std::unique_lock<std::mutex> lock(mStateMutex);
662 
663   GET_DISPLAY_OR_RETURN_ERROR();
664 
665   // Owned by mResources.
666   buffer_handle_t importedBuffer = nullptr;
667 
668   auto releaser = mResources->createReleaser(true /* isBuffer */);
669   auto error = mResources->getDisplayReadbackBuffer(
670       displayId, buffer, &importedBuffer, releaser.get());
671   if (error != HWC3::Error::None) {
672     ALOGE("%s: failed to get readback buffer from resources.", __FUNCTION__);
673     return ToBinderStatus(error);
674   }
675 
676   error = display->setReadbackBuffer(importedBuffer, releaseFence);
677   if (error != HWC3::Error::None) {
678     ALOGE("%s: failed to set readback buffer to display.", __FUNCTION__);
679     return ToBinderStatus(error);
680   }
681 
682   return ToBinderStatus(HWC3::Error::None);
683 }
684 
setVsyncEnabled(int64_t displayId,bool enabled)685 ndk::ScopedAStatus ComposerClient::setVsyncEnabled(int64_t displayId,
686                                                    bool enabled) {
687   DEBUG_LOG("%s", __FUNCTION__);
688 
689   std::unique_lock<std::mutex> lock(mStateMutex);
690 
691   GET_DISPLAY_OR_RETURN_ERROR();
692 
693   return ToBinderStatus(display->setVsyncEnabled(enabled));
694 }
695 
setIdleTimerEnabled(int64_t displayId,int32_t timeoutMs)696 ndk::ScopedAStatus ComposerClient::setIdleTimerEnabled(int64_t displayId,
697                                                        int32_t timeoutMs) {
698   DEBUG_LOG("%s", __FUNCTION__);
699 
700   std::unique_lock<std::mutex> lock(mStateMutex);
701 
702   GET_DISPLAY_OR_RETURN_ERROR();
703 
704   return ToBinderStatus(display->setIdleTimerEnabled(timeoutMs));
705 }
706 
createBinder()707 ndk::SpAIBinder ComposerClient::createBinder() {
708   auto binder = BnComposerClient::createBinder();
709   AIBinder_setInheritRt(binder.get(), true);
710   return binder;
711 }
712 
713 namespace {
714 
715 #define DISPATCH_LAYER_COMMAND(layerCmd, display, layer, field, funcName)     \
716   do {                                                                        \
717     if (layerCmd.field) {                                                     \
718       ComposerClient::executeLayerCommandSetLayer##funcName(display, layer,   \
719                                                             *layerCmd.field); \
720     }                                                                         \
721   } while (0)
722 
723 #define DISPATCH_DISPLAY_COMMAND(displayCmd, display, field, funcName) \
724   do {                                                                 \
725     if (displayCmd.field) {                                            \
726       executeDisplayCommand##funcName(display, *displayCmd.field);     \
727     }                                                                  \
728   } while (0)
729 
730 #define DISPATCH_DISPLAY_BOOL_COMMAND(displayCmd, display, field, funcName) \
731   do {                                                                      \
732     if (displayCmd.field) {                                                 \
733       executeDisplayCommand##funcName(display);                             \
734     }                                                                       \
735   } while (0)
736 
737 #define DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCmd, display, field, \
738                                                data, funcName)             \
739   do {                                                                     \
740     if (displayCmd.field) {                                                \
741       executeDisplayCommand##funcName(display, displayCmd.data);           \
742     }                                                                      \
743   } while (0)
744 
745 #define LOG_DISPLAY_COMMAND_ERROR(display, error)                 \
746   do {                                                            \
747     const std::string errorString = toString(error);              \
748     ALOGE("%s: display:%" PRId64 " failed with:%s", __FUNCTION__, \
749           display->getId(), errorString.c_str());                 \
750   } while (0)
751 
752 #define LOG_LAYER_COMMAND_ERROR(display, layer, error)                \
753   do {                                                                \
754     const std::string errorString = toString(error);                  \
755     ALOGE("%s: display:%" PRId64 " layer:%" PRId64 " failed with:%s", \
756           __FUNCTION__, display->getId(), layer->getId(),             \
757           errorString.c_str());                                       \
758   } while (0)
759 
760 }  // namespace
761 
executeDisplayCommand(const DisplayCommand & displayCommand)762 void ComposerClient::executeDisplayCommand(
763     const DisplayCommand& displayCommand) {
764   Display* display = getDisplay(displayCommand.display);
765   if (display == nullptr) {
766     mCommandResults->addError(HWC3::Error::BadDisplay);
767     return;
768   }
769 
770   for (const LayerCommand& layerCmd : displayCommand.layers) {
771     executeLayerCommand(display, layerCmd);
772   }
773 
774   DISPATCH_DISPLAY_COMMAND(displayCommand, display, colorTransformMatrix,
775                            SetColorTransform);
776   DISPATCH_DISPLAY_COMMAND(displayCommand, display, brightness, SetBrightness);
777   DISPATCH_DISPLAY_COMMAND(displayCommand, display, clientTarget,
778                            SetClientTarget);
779   DISPATCH_DISPLAY_COMMAND(displayCommand, display, virtualDisplayOutputBuffer,
780                            SetOutputBuffer);
781   DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, display,
782                                          validateDisplay, expectedPresentTime,
783                                          ValidateDisplay);
784   DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, acceptDisplayChanges,
785                                 AcceptDisplayChanges);
786   DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, presentDisplay,
787                                 PresentDisplay);
788   DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(
789       displayCommand, display, presentOrValidateDisplay, expectedPresentTime,
790       PresentOrValidateDisplay);
791 }
792 
executeLayerCommand(Display * display,const LayerCommand & layerCommand)793 void ComposerClient::executeLayerCommand(Display* display,
794                                          const LayerCommand& layerCommand) {
795   Layer* layer = display->getLayer(layerCommand.layer);
796   if (layer == nullptr) {
797     mCommandResults->addError(HWC3::Error::BadLayer);
798     return;
799   }
800 
801   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, cursorPosition,
802                          CursorPosition);
803   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, buffer, Buffer);
804   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, damage, SurfaceDamage);
805   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, blendMode, BlendMode);
806   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, color, Color);
807   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, composition,
808                          Composition);
809   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, dataspace, Dataspace);
810   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, displayFrame,
811                          DisplayFrame);
812   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, planeAlpha, PlaneAlpha);
813   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sidebandStream,
814                          SidebandStream);
815   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sourceCrop, SourceCrop);
816   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, transform, Transform);
817   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, visibleRegion,
818                          VisibleRegion);
819   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, z, ZOrder);
820   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, colorTransform,
821                          ColorTransform);
822   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, brightness, Brightness);
823   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadata,
824                          PerFrameMetadata);
825   DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadataBlob,
826                          PerFrameMetadataBlobs);
827 }
828 
executeDisplayCommandSetColorTransform(Display * display,const std::vector<float> & matrix)829 void ComposerClient::executeDisplayCommandSetColorTransform(
830     Display* display, const std::vector<float>& matrix) {
831   DEBUG_LOG("%s", __FUNCTION__);
832 
833   auto error = display->setColorTransform(matrix);
834   if (error != HWC3::Error::None) {
835     LOG_DISPLAY_COMMAND_ERROR(display, error);
836     mCommandResults->addError(error);
837   }
838 }
839 
executeDisplayCommandSetBrightness(Display * display,const DisplayBrightness & brightness)840 void ComposerClient::executeDisplayCommandSetBrightness(
841     Display* display, const DisplayBrightness& brightness) {
842   DEBUG_LOG("%s", __FUNCTION__);
843 
844   auto error = display->setBrightness(brightness.brightness);
845   if (error != HWC3::Error::None) {
846     LOG_DISPLAY_COMMAND_ERROR(display, error);
847     mCommandResults->addError(error);
848   }
849 }
850 
executeDisplayCommandSetClientTarget(Display * display,const ClientTarget & clientTarget)851 void ComposerClient::executeDisplayCommandSetClientTarget(
852     Display* display, const ClientTarget& clientTarget) {
853   DEBUG_LOG("%s", __FUNCTION__);
854 
855   // Owned by mResources.
856   buffer_handle_t importedBuffer = nullptr;
857 
858   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
859   auto error = mResources->getDisplayClientTarget(
860       display->getId(), clientTarget.buffer, &importedBuffer, releaser.get());
861   if (error != HWC3::Error::None) {
862     LOG_DISPLAY_COMMAND_ERROR(display, error);
863     mCommandResults->addError(error);
864     return;
865   }
866 
867   error = display->setClientTarget(importedBuffer, clientTarget.buffer.fence,
868                                    clientTarget.dataspace, clientTarget.damage);
869   if (error != HWC3::Error::None) {
870     LOG_DISPLAY_COMMAND_ERROR(display, error);
871     mCommandResults->addError(error);
872     return;
873   }
874 }
875 
executeDisplayCommandSetOutputBuffer(Display * display,const Buffer & buffer)876 void ComposerClient::executeDisplayCommandSetOutputBuffer(
877     Display* display, const Buffer& buffer) {
878   DEBUG_LOG("%s", __FUNCTION__);
879 
880   // Owned by mResources.
881   buffer_handle_t importedBuffer = nullptr;
882 
883   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
884   auto error = mResources->getDisplayOutputBuffer(
885       display->getId(), buffer, &importedBuffer, releaser.get());
886   if (error != HWC3::Error::None) {
887     LOG_DISPLAY_COMMAND_ERROR(display, error);
888     mCommandResults->addError(error);
889     return;
890   }
891 
892   error = display->setOutputBuffer(importedBuffer, buffer.fence);
893   if (error != HWC3::Error::None) {
894     LOG_DISPLAY_COMMAND_ERROR(display, error);
895     mCommandResults->addError(error);
896     return;
897   }
898 }
899 
executeDisplayCommandValidateDisplay(Display * display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime)900 void ComposerClient::executeDisplayCommandValidateDisplay(
901     Display* display,
902     const std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
903   DEBUG_LOG("%s", __FUNCTION__);
904 
905   auto error = display->setExpectedPresentTime(expectedPresentTime);
906   if (error != HWC3::Error::None) {
907     LOG_DISPLAY_COMMAND_ERROR(display, error);
908     mCommandResults->addError(error);
909   }
910 
911   DisplayChanges changes;
912 
913   error = display->validate(&changes);
914   if (error != HWC3::Error::None) {
915     LOG_DISPLAY_COMMAND_ERROR(display, error);
916     mCommandResults->addError(error);
917   } else {
918     mCommandResults->addChanges(changes);
919   }
920 
921   mResources->setDisplayMustValidateState(display->getId(), false);
922 }
923 
executeDisplayCommandAcceptDisplayChanges(Display * display)924 void ComposerClient::executeDisplayCommandAcceptDisplayChanges(
925     Display* display) {
926   DEBUG_LOG("%s", __FUNCTION__);
927 
928   auto error = display->acceptChanges();
929   if (error != HWC3::Error::None) {
930     LOG_DISPLAY_COMMAND_ERROR(display, error);
931     mCommandResults->addError(error);
932   }
933 }
934 
executeDisplayCommandPresentOrValidateDisplay(Display * display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime)935 void ComposerClient::executeDisplayCommandPresentOrValidateDisplay(
936     Display* display,
937     const std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
938   DEBUG_LOG("%s", __FUNCTION__);
939 
940   // TODO: Support SKIP_VALIDATE.
941 
942   auto error = display->setExpectedPresentTime(expectedPresentTime);
943   if (error != HWC3::Error::None) {
944     LOG_DISPLAY_COMMAND_ERROR(display, error);
945     mCommandResults->addError(error);
946   }
947 
948   DisplayChanges changes;
949 
950   error = display->validate(&changes);
951   if (error != HWC3::Error::None) {
952     LOG_DISPLAY_COMMAND_ERROR(display, error);
953     mCommandResults->addError(error);
954   } else {
955     const int64_t displayId = display->getId();
956     mCommandResults->addChanges(changes);
957     mCommandResults->addPresentOrValidateResult(
958         displayId, PresentOrValidate::Result::Validated);
959   }
960 
961   mResources->setDisplayMustValidateState(display->getId(), false);
962 }
963 
executeDisplayCommandPresentDisplay(Display * display)964 void ComposerClient::executeDisplayCommandPresentDisplay(Display* display) {
965   DEBUG_LOG("%s", __FUNCTION__);
966 
967   if (mResources->mustValidateDisplay(display->getId())) {
968     ALOGE("%s: display:%" PRIu64 " not validated", __FUNCTION__,
969           display->getId());
970     mCommandResults->addError(HWC3::Error::NotValidated);
971     return;
972   }
973 
974   ::android::base::unique_fd displayFence;
975   std::unordered_map<int64_t, ::android::base::unique_fd> layerFences;
976 
977   auto error = display->present(&displayFence, &layerFences);
978   if (error != HWC3::Error::None) {
979     LOG_DISPLAY_COMMAND_ERROR(display, error);
980     mCommandResults->addError(error);
981   } else {
982     const int64_t displayId = display->getId();
983     mCommandResults->addPresentFence(displayId, std::move(displayFence));
984     mCommandResults->addReleaseFences(displayId, std::move(layerFences));
985   }
986 }
987 
executeLayerCommandSetLayerCursorPosition(Display * display,Layer * layer,const common::Point & cursorPosition)988 void ComposerClient::executeLayerCommandSetLayerCursorPosition(
989     Display* display, Layer* layer, const common::Point& cursorPosition) {
990   DEBUG_LOG("%s", __FUNCTION__);
991 
992   auto error = layer->setCursorPosition(cursorPosition);
993   if (error != HWC3::Error::None) {
994     LOG_LAYER_COMMAND_ERROR(display, layer, error);
995     mCommandResults->addError(error);
996   }
997 }
998 
executeLayerCommandSetLayerBuffer(Display * display,Layer * layer,const Buffer & buffer)999 void ComposerClient::executeLayerCommandSetLayerBuffer(Display* display,
1000                                                        Layer* layer,
1001                                                        const Buffer& buffer) {
1002   DEBUG_LOG("%s", __FUNCTION__);
1003 
1004   // Owned by mResources.
1005   buffer_handle_t importedBuffer = nullptr;
1006 
1007   auto releaser = mResources->createReleaser(/*isBuffer=*/true);
1008   auto error =
1009       mResources->getLayerBuffer(display->getId(), layer->getId(), buffer,
1010                                  &importedBuffer, releaser.get());
1011   if (error != HWC3::Error::None) {
1012     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1013     mCommandResults->addError(error);
1014     return;
1015   }
1016 
1017   error = layer->setBuffer(importedBuffer, buffer.fence);
1018   if (error != HWC3::Error::None) {
1019     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1020     mCommandResults->addError(error);
1021   }
1022 }
1023 
executeLayerCommandSetLayerSurfaceDamage(Display * display,Layer * layer,const std::vector<std::optional<common::Rect>> & damage)1024 void ComposerClient::executeLayerCommandSetLayerSurfaceDamage(
1025     Display* display, Layer* layer,
1026     const std::vector<std::optional<common::Rect>>& damage) {
1027   DEBUG_LOG("%s", __FUNCTION__);
1028 
1029   auto error = layer->setSurfaceDamage(damage);
1030   if (error != HWC3::Error::None) {
1031     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1032     mCommandResults->addError(error);
1033   }
1034 }
1035 
executeLayerCommandSetLayerBlendMode(Display * display,Layer * layer,const ParcelableBlendMode & blendMode)1036 void ComposerClient::executeLayerCommandSetLayerBlendMode(
1037     Display* display, Layer* layer, const ParcelableBlendMode& blendMode) {
1038   DEBUG_LOG("%s", __FUNCTION__);
1039 
1040   auto error = layer->setBlendMode(blendMode.blendMode);
1041   if (error != HWC3::Error::None) {
1042     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1043     mCommandResults->addError(error);
1044   }
1045 }
1046 
executeLayerCommandSetLayerColor(Display * display,Layer * layer,const Color & color)1047 void ComposerClient::executeLayerCommandSetLayerColor(Display* display,
1048                                                       Layer* layer,
1049                                                       const Color& color) {
1050   DEBUG_LOG("%s", __FUNCTION__);
1051 
1052   auto error = layer->setColor(color);
1053   if (error != HWC3::Error::None) {
1054     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1055     mCommandResults->addError(error);
1056   }
1057 }
1058 
executeLayerCommandSetLayerComposition(Display * display,Layer * layer,const ParcelableComposition & composition)1059 void ComposerClient::executeLayerCommandSetLayerComposition(
1060     Display* display, Layer* layer, const ParcelableComposition& composition) {
1061   DEBUG_LOG("%s", __FUNCTION__);
1062 
1063   auto error = layer->setCompositionType(composition.composition);
1064   if (error != HWC3::Error::None) {
1065     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1066     mCommandResults->addError(error);
1067   }
1068 }
1069 
executeLayerCommandSetLayerDataspace(Display * display,Layer * layer,const ParcelableDataspace & dataspace)1070 void ComposerClient::executeLayerCommandSetLayerDataspace(
1071     Display* display, Layer* layer, const ParcelableDataspace& dataspace) {
1072   DEBUG_LOG("%s", __FUNCTION__);
1073 
1074   auto error = layer->setDataspace(dataspace.dataspace);
1075   if (error != HWC3::Error::None) {
1076     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1077     mCommandResults->addError(error);
1078   }
1079 }
1080 
executeLayerCommandSetLayerDisplayFrame(Display * display,Layer * layer,const common::Rect & rect)1081 void ComposerClient::executeLayerCommandSetLayerDisplayFrame(
1082     Display* display, Layer* layer, const common::Rect& rect) {
1083   DEBUG_LOG("%s", __FUNCTION__);
1084 
1085   auto error = layer->setDisplayFrame(rect);
1086   if (error != HWC3::Error::None) {
1087     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1088     mCommandResults->addError(error);
1089   }
1090 }
1091 
executeLayerCommandSetLayerPlaneAlpha(Display * display,Layer * layer,const PlaneAlpha & planeAlpha)1092 void ComposerClient::executeLayerCommandSetLayerPlaneAlpha(
1093     Display* display, Layer* layer, const PlaneAlpha& planeAlpha) {
1094   DEBUG_LOG("%s", __FUNCTION__);
1095 
1096   auto error = layer->setPlaneAlpha(planeAlpha.alpha);
1097   if (error != HWC3::Error::None) {
1098     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1099     mCommandResults->addError(error);
1100   }
1101 }
1102 
executeLayerCommandSetLayerSidebandStream(Display * display,Layer * layer,const aidl::android::hardware::common::NativeHandle & handle)1103 void ComposerClient::executeLayerCommandSetLayerSidebandStream(
1104     Display* display, Layer* layer,
1105     const aidl::android::hardware::common::NativeHandle& handle) {
1106   DEBUG_LOG("%s", __FUNCTION__);
1107 
1108   // Owned by mResources.
1109   buffer_handle_t importedStream = nullptr;
1110 
1111   auto releaser = mResources->createReleaser(/*isBuffer=*/false);
1112   auto error = mResources->getLayerSidebandStream(
1113       display->getId(), layer->getId(), handle, &importedStream,
1114       releaser.get());
1115   if (error != HWC3::Error::None) {
1116     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1117     mCommandResults->addError(error);
1118     return;
1119   }
1120 
1121   error = layer->setSidebandStream(importedStream);
1122   if (error != HWC3::Error::None) {
1123     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1124     mCommandResults->addError(error);
1125   }
1126 }
1127 
executeLayerCommandSetLayerSourceCrop(Display * display,Layer * layer,const common::FRect & sourceCrop)1128 void ComposerClient::executeLayerCommandSetLayerSourceCrop(
1129     Display* display, Layer* layer, const common::FRect& sourceCrop) {
1130   DEBUG_LOG("%s", __FUNCTION__);
1131 
1132   auto error = layer->setSourceCrop(sourceCrop);
1133   if (error != HWC3::Error::None) {
1134     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1135     mCommandResults->addError(error);
1136   }
1137 }
1138 
executeLayerCommandSetLayerTransform(Display * display,Layer * layer,const ParcelableTransform & transform)1139 void ComposerClient::executeLayerCommandSetLayerTransform(
1140     Display* display, Layer* layer, const ParcelableTransform& transform) {
1141   DEBUG_LOG("%s", __FUNCTION__);
1142 
1143   auto error = layer->setTransform(transform.transform);
1144   if (error != HWC3::Error::None) {
1145     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1146     mCommandResults->addError(error);
1147   }
1148 }
1149 
executeLayerCommandSetLayerVisibleRegion(Display * display,Layer * layer,const std::vector<std::optional<common::Rect>> & visibleRegion)1150 void ComposerClient::executeLayerCommandSetLayerVisibleRegion(
1151     Display* display, Layer* layer,
1152     const std::vector<std::optional<common::Rect>>& visibleRegion) {
1153   DEBUG_LOG("%s", __FUNCTION__);
1154 
1155   auto error = layer->setVisibleRegion(visibleRegion);
1156   if (error != HWC3::Error::None) {
1157     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1158     mCommandResults->addError(error);
1159   }
1160 }
1161 
executeLayerCommandSetLayerZOrder(Display * display,Layer * layer,const ZOrder & zOrder)1162 void ComposerClient::executeLayerCommandSetLayerZOrder(Display* display,
1163                                                        Layer* layer,
1164                                                        const ZOrder& zOrder) {
1165   DEBUG_LOG("%s", __FUNCTION__);
1166 
1167   auto error = layer->setZOrder(zOrder.z);
1168   if (error != HWC3::Error::None) {
1169     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1170     mCommandResults->addError(error);
1171   }
1172 }
1173 
executeLayerCommandSetLayerPerFrameMetadata(Display * display,Layer * layer,const std::vector<std::optional<PerFrameMetadata>> & perFrameMetadata)1174 void ComposerClient::executeLayerCommandSetLayerPerFrameMetadata(
1175     Display* display, Layer* layer,
1176     const std::vector<std::optional<PerFrameMetadata>>& perFrameMetadata) {
1177   DEBUG_LOG("%s", __FUNCTION__);
1178 
1179   auto error = layer->setPerFrameMetadata(perFrameMetadata);
1180   if (error != HWC3::Error::None) {
1181     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1182     mCommandResults->addError(error);
1183   }
1184 }
1185 
executeLayerCommandSetLayerColorTransform(Display * display,Layer * layer,const std::vector<float> & colorTransform)1186 void ComposerClient::executeLayerCommandSetLayerColorTransform(
1187     Display* display, Layer* layer, const std::vector<float>& colorTransform) {
1188   DEBUG_LOG("%s", __FUNCTION__);
1189 
1190   auto error = layer->setColorTransform(colorTransform);
1191   if (error != HWC3::Error::None) {
1192     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1193     mCommandResults->addError(error);
1194   }
1195 }
1196 
executeLayerCommandSetLayerBrightness(Display * display,Layer * layer,const LayerBrightness & brightness)1197 void ComposerClient::executeLayerCommandSetLayerBrightness(
1198     Display* display, Layer* layer, const LayerBrightness& brightness) {
1199   DEBUG_LOG("%s", __FUNCTION__);
1200 
1201   auto error = layer->setBrightness(brightness.brightness);
1202   if (error != HWC3::Error::None) {
1203     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1204     mCommandResults->addError(error);
1205   }
1206 }
1207 
executeLayerCommandSetLayerPerFrameMetadataBlobs(Display * display,Layer * layer,const std::vector<std::optional<PerFrameMetadataBlob>> & perFrameMetadataBlob)1208 void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs(
1209     Display* display, Layer* layer,
1210     const std::vector<std::optional<PerFrameMetadataBlob>>&
1211         perFrameMetadataBlob) {
1212   DEBUG_LOG("%s", __FUNCTION__);
1213 
1214   auto error = layer->setPerFrameMetadataBlobs(perFrameMetadataBlob);
1215   if (error != HWC3::Error::None) {
1216     LOG_LAYER_COMMAND_ERROR(display, layer, error);
1217     mCommandResults->addError(error);
1218   }
1219 }
1220 
getDisplay(int64_t displayId)1221 Display* ComposerClient::getDisplay(int64_t displayId) {
1222   auto it = mDisplays.find(displayId);
1223   if (it == mDisplays.end()) {
1224     ALOGE("%s: no display:%" PRIu64, __FUNCTION__, displayId);
1225     return nullptr;
1226   }
1227   return it->second.get();
1228 }
1229 
createDisplaysLocked()1230 HWC3::Error ComposerClient::createDisplaysLocked() {
1231   DEBUG_LOG("%s", __FUNCTION__);
1232 
1233   if (!mComposer) {
1234     ALOGE("%s composer not initialized!", __FUNCTION__);
1235     return HWC3::Error::NoResources;
1236   }
1237 
1238   std::vector<DisplayMultiConfigs> displays;
1239 
1240   HWC3::Error error = findDisplays(mComposer->getDrmPresenter(), &displays);
1241   if (error != HWC3::Error::None) {
1242     ALOGE("%s failed to find display configs", __FUNCTION__);
1243     return error;
1244   }
1245 
1246   for (const auto& iter : displays) {
1247     error =
1248         createDisplayLocked(iter.displayId, iter.activeConfigId, iter.configs);
1249     if (error != HWC3::Error::None) {
1250       ALOGE("%s failed to create display from config", __FUNCTION__);
1251       return error;
1252     }
1253   }
1254 
1255   return HWC3::Error::None;
1256 }
1257 
createDisplayLocked(int64_t displayId,int32_t activeConfigId,const std::vector<DisplayConfig> & configs)1258 HWC3::Error ComposerClient::createDisplayLocked(
1259     int64_t displayId, int32_t activeConfigId,
1260     const std::vector<DisplayConfig>& configs) {
1261   DEBUG_LOG("%s", __FUNCTION__);
1262 
1263   if (!mComposer) {
1264     ALOGE("%s composer not initialized!", __FUNCTION__);
1265     return HWC3::Error::NoResources;
1266   }
1267 
1268   auto display = std::make_unique<Display>(mComposer, displayId);
1269   if (display == nullptr) {
1270     ALOGE("%s failed to allocate display", __FUNCTION__);
1271     return HWC3::Error::NoResources;
1272   }
1273 
1274   HWC3::Error error = display->init(configs, activeConfigId);
1275   if (error != HWC3::Error::None) {
1276     ALOGE("%s failed to initialize display:%" PRIu64, __FUNCTION__, displayId);
1277     return error;
1278   }
1279 
1280   error = mComposer->onDisplayCreate(display.get());
1281   if (error != HWC3::Error::None) {
1282     ALOGE("%s failed to register display:%" PRIu64 " with composer",
1283           __FUNCTION__, displayId);
1284     return error;
1285   }
1286 
1287   DEBUG_LOG("%s: adding display:%" PRIu64, __FUNCTION__, displayId);
1288   mDisplays.emplace(displayId, std::move(display));
1289 
1290   error = mResources->addPhysicalDisplay(displayId);
1291   if (error != HWC3::Error::None) {
1292     ALOGE("%s failed to initialize display:%" PRIu64 " resources", __FUNCTION__,
1293           displayId);
1294     return error;
1295   }
1296 
1297   return HWC3::Error::None;
1298 }
1299 
destroyDisplaysLocked()1300 HWC3::Error ComposerClient::destroyDisplaysLocked() {
1301   DEBUG_LOG("%s", __FUNCTION__);
1302 
1303   std::vector<int64_t> displayIds;
1304   for (const auto& [displayId, _] : mDisplays) {
1305     displayIds.push_back(displayId);
1306   }
1307   for (const int64_t displayId : displayIds) {
1308     destroyDisplayLocked(displayId);
1309   }
1310 
1311   return HWC3::Error::None;
1312 }
1313 
destroyDisplayLocked(int64_t displayId)1314 HWC3::Error ComposerClient::destroyDisplayLocked(int64_t displayId) {
1315   DEBUG_LOG("%s display:%" PRId64, __FUNCTION__, displayId);
1316 
1317   auto it = mDisplays.find(displayId);
1318   if (it == mDisplays.end()) {
1319     ALOGE("%s: display:%" PRId64 " no such display?", __FUNCTION__, displayId);
1320     return HWC3::Error::BadDisplay;
1321   }
1322 
1323   HWC3::Error error = mComposer->onDisplayDestroy(it->second.get());
1324   if (error != HWC3::Error::None) {
1325     ALOGE("%s: display:%" PRId64 " failed to destroy with frame composer",
1326           __FUNCTION__, displayId);
1327   }
1328 
1329   error = mResources->removeDisplay(displayId);
1330   if (error != HWC3::Error::None) {
1331     ALOGE("%s: display:%" PRId64 " failed to destroy with resources",
1332           __FUNCTION__, displayId);
1333   }
1334 
1335   mDisplays.erase(it);
1336 
1337   return HWC3::Error::None;
1338 }
1339 
handleHotplug(bool connected,uint32_t id,uint32_t width,uint32_t height,uint32_t dpiX,uint32_t dpiY,uint32_t refreshRate)1340 HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id,
1341                                           uint32_t width, uint32_t height,
1342                                           uint32_t dpiX, uint32_t dpiY,
1343                                           uint32_t refreshRate) {
1344   std::unique_lock<std::mutex> lock(mStateMutex);
1345 
1346   if (!mCallbacks) {
1347     return HWC3::Error::None;
1348   }
1349 
1350   const int64_t displayId = static_cast<int64_t>(id);
1351 
1352   Display* display = getDisplay(displayId);
1353   if (display != nullptr) {
1354     ALOGI("Disconnecting display:%" PRIu64, displayId);
1355     mCallbacks->onHotplug(displayId, /*connected=*/false);
1356 
1357     destroyDisplayLocked(displayId);
1358   }
1359 
1360   if (connected) {
1361     const int32_t configId = static_cast<int32_t>(id);
1362     const std::vector<DisplayConfig> configs = {
1363         DisplayConfig(configId, static_cast<int>(width),
1364                       static_cast<int>(height), static_cast<int>(dpiX),
1365                       static_cast<int>(dpiY), static_cast<int>(refreshRate))};
1366 
1367     createDisplayLocked(displayId, configId, configs);
1368 
1369     ALOGI("Connecting display:%" PRIu32 " w:%" PRIu32 " h:%" PRIu32
1370           " dpiX:%" PRIu32 " dpiY %" PRIu32 "fps %" PRIu32,
1371           id, width, height, dpiX, dpiY, refreshRate);
1372 
1373     mCallbacks->onHotplug(displayId, /*connected=*/true);
1374   }
1375 
1376   return HWC3::Error::None;
1377 }
1378 
1379 }  // namespace aidl::android::hardware::graphics::composer3::impl