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