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