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