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 <android-base/file.h>
24 #include <android/binder_ibinder_platform.h>
25 #include <android/binder_manager.h>
26 #include <log/log.h>
27 #include <utils/Trace.h>
28
29 #include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
30
31 #include <algorithm>
32 #include <cinttypes>
33
34 #include "HWC2.h"
35
36 namespace android {
37
38 using hardware::hidl_handle;
39 using hardware::hidl_vec;
40 using hardware::Return;
41
42 using aidl::android::hardware::graphics::composer3::BnComposerCallback;
43 using aidl::android::hardware::graphics::composer3::Capability;
44 using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
45 using aidl::android::hardware::graphics::composer3::PowerMode;
46 using aidl::android::hardware::graphics::composer3::VirtualDisplay;
47
48 using aidl::android::hardware::graphics::composer3::CommandResultPayload;
49
50 using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
51 using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
52 using AidlDisplayIdentification =
53 aidl::android::hardware::graphics::composer3::DisplayIdentification;
54 using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
55 using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
56 using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
57 using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
58 using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
59 using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
60 using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
61 using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
62 using AidlVsyncPeriodChangeConstraints =
63 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
64 using AidlVsyncPeriodChangeTimeline =
65 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
66 using AidlDisplayContentSamplingAttributes =
67 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
68 using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
69 using AidlDisplayConnectionType =
70 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
71
72 using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
73 using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
74 using AidlFRect = aidl::android::hardware::graphics::common::FRect;
75 using AidlRect = aidl::android::hardware::graphics::common::Rect;
76 using AidlTransform = aidl::android::hardware::graphics::common::Transform;
77
78 namespace Hwc2 {
79
80 namespace {
81
82 template <typename To, typename From>
translate(From x)83 To translate(From x) {
84 return static_cast<To>(x);
85 }
86
87 template <typename To, typename From>
translate(const std::vector<From> & in)88 std::vector<To> translate(const std::vector<From>& in) {
89 std::vector<To> out;
90 out.reserve(in.size());
91 std::transform(in.begin(), in.end(), std::back_inserter(out),
92 [](From x) { return translate<To>(x); });
93 return out;
94 }
95
96 template <>
translate(IComposerClient::Rect x)97 AidlRect translate(IComposerClient::Rect x) {
98 return AidlRect{
99 .left = x.left,
100 .top = x.top,
101 .right = x.right,
102 .bottom = x.bottom,
103 };
104 }
105
106 template <>
translate(IComposerClient::FRect x)107 AidlFRect translate(IComposerClient::FRect x) {
108 return AidlFRect{
109 .left = x.left,
110 .top = x.top,
111 .right = x.right,
112 .bottom = x.bottom,
113 };
114 }
115
116 template <>
translate(IComposerClient::PerFrameMetadataBlob x)117 AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
118 AidlPerFrameMetadataBlob blob;
119 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
120 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
121 return blob;
122 }
123
124 template <>
translate(IComposerClient::PerFrameMetadata x)125 AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
126 return AidlPerFrameMetadata{
127 .key = translate<AidlPerFrameMetadataKey>(x.key),
128 .value = x.value,
129 };
130 }
131
132 template <>
translate(AidlDisplayContentSample x)133 DisplayedFrameStats translate(AidlDisplayContentSample x) {
134 return DisplayedFrameStats{
135 .numFrames = static_cast<uint64_t>(x.frameCount),
136 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
137 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
138 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
139 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
140 };
141 }
142
143 template <>
translate(IComposerClient::VsyncPeriodChangeConstraints x)144 AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
145 return AidlVsyncPeriodChangeConstraints{
146 .desiredTimeNanos = x.desiredTimeNanos,
147 .seamlessRequired = x.seamlessRequired,
148 };
149 }
150
151 template <>
translate(AidlVsyncPeriodChangeTimeline x)152 VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
153 return VsyncPeriodChangeTimeline{
154 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
155 .refreshRequired = x.refreshRequired,
156 .refreshTimeNanos = x.refreshTimeNanos,
157 };
158 }
makeMat4(std::vector<float> in)159 mat4 makeMat4(std::vector<float> in) {
160 return mat4(static_cast<const float*>(in.data()));
161 }
162
163 } // namespace
164
165 class AidlIComposerCallbackWrapper : public BnComposerCallback {
166 public:
AidlIComposerCallbackWrapper(HWC2::ComposerCallback & callback)167 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
168
onHotplug(int64_t in_display,bool in_connected)169 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
170 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
171 : V2_4::IComposerCallback::Connection::DISCONNECTED;
172 mCallback.onComposerHalHotplug(translate<Display>(in_display), connection);
173 return ::ndk::ScopedAStatus::ok();
174 }
175
onRefresh(int64_t in_display)176 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
177 mCallback.onComposerHalRefresh(translate<Display>(in_display));
178 return ::ndk::ScopedAStatus::ok();
179 }
180
onSeamlessPossible(int64_t in_display)181 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
182 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
183 return ::ndk::ScopedAStatus::ok();
184 }
185
onVsync(int64_t in_display,int64_t in_timestamp,int32_t in_vsyncPeriodNanos)186 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
187 int32_t in_vsyncPeriodNanos) override {
188 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
189 static_cast<uint32_t>(in_vsyncPeriodNanos));
190 return ::ndk::ScopedAStatus::ok();
191 }
192
onVsyncPeriodTimingChanged(int64_t in_display,const AidlVsyncPeriodChangeTimeline & in_updatedTimeline)193 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
194 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
195 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
196 translate<V2_4::VsyncPeriodChangeTimeline>(
197 in_updatedTimeline));
198 return ::ndk::ScopedAStatus::ok();
199 }
200
onVsyncIdle(int64_t in_display)201 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
202 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
203 return ::ndk::ScopedAStatus::ok();
204 }
205
206 private:
207 HWC2::ComposerCallback& mCallback;
208 };
209
instance(const std::string & serviceName)210 std::string AidlComposer::instance(const std::string& serviceName) {
211 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
212 }
213
isDeclared(const std::string & serviceName)214 bool AidlComposer::isDeclared(const std::string& serviceName) {
215 return AServiceManager_isDeclared(instance(serviceName).c_str());
216 }
217
AidlComposer(const std::string & serviceName)218 AidlComposer::AidlComposer(const std::string& serviceName) {
219 // This only waits if the service is actually declared
220 mAidlComposer = AidlIComposer::fromBinder(
221 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
222 if (!mAidlComposer) {
223 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
224 return;
225 }
226
227 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
228 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
229 return;
230 }
231
232 ALOGI("Loaded AIDL composer3 HAL service");
233 }
234
235 AidlComposer::~AidlComposer() = default;
236
isSupported(OptionalFeature feature) const237 bool AidlComposer::isSupported(OptionalFeature feature) const {
238 switch (feature) {
239 case OptionalFeature::RefreshRateSwitching:
240 case OptionalFeature::ExpectedPresentTime:
241 case OptionalFeature::DisplayBrightnessCommand:
242 case OptionalFeature::KernelIdleTimer:
243 case OptionalFeature::PhysicalDisplayOrientation:
244 return true;
245 }
246 }
247
getCapabilities()248 std::vector<Capability> AidlComposer::getCapabilities() {
249 std::vector<Capability> capabilities;
250 const auto status = mAidlComposer->getCapabilities(&capabilities);
251 if (!status.isOk()) {
252 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
253 return {};
254 }
255 return capabilities;
256 }
257
dumpDebugInfo()258 std::string AidlComposer::dumpDebugInfo() {
259 int pipefds[2];
260 int result = pipe(pipefds);
261 if (result < 0) {
262 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
263 return {};
264 }
265
266 std::string str;
267 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
268 // Close the write-end of the pipe to make sure that when reading from the
269 // read-end we will get eof instead of blocking forever
270 close(pipefds[1]);
271
272 if (status == STATUS_OK) {
273 base::ReadFdToString(pipefds[0], &str);
274 } else {
275 ALOGE("dumpDebugInfo: dump failed: %d", status);
276 }
277
278 close(pipefds[0]);
279 return str;
280 }
281
registerCallback(HWC2::ComposerCallback & callback)282 void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
283 if (mAidlComposerCallback) {
284 ALOGE("Callback already registered");
285 }
286
287 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
288 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
289
290 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
291 if (!status.isOk()) {
292 ALOGE("registerCallback failed %s", status.getDescription().c_str());
293 }
294 }
295
resetCommands()296 void AidlComposer::resetCommands() {
297 mWriter.reset();
298 }
299
executeCommands()300 Error AidlComposer::executeCommands() {
301 return execute();
302 }
303
getMaxVirtualDisplayCount()304 uint32_t AidlComposer::getMaxVirtualDisplayCount() {
305 int32_t count = 0;
306 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
307 if (!status.isOk()) {
308 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
309 return 0;
310 }
311 return static_cast<uint32_t>(count);
312 }
313
createVirtualDisplay(uint32_t width,uint32_t height,PixelFormat * format,Display * outDisplay)314 Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
315 Display* outDisplay) {
316 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
317 const int32_t bufferSlotCount = 1;
318 VirtualDisplay virtualDisplay;
319 const auto status =
320 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
321 static_cast<int32_t>(height),
322 static_cast<AidlPixelFormat>(*format),
323 bufferSlotCount, &virtualDisplay);
324
325 if (!status.isOk()) {
326 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
327 return static_cast<Error>(status.getServiceSpecificError());
328 }
329
330 *outDisplay = translate<Display>(virtualDisplay.display);
331 *format = static_cast<PixelFormat>(virtualDisplay.format);
332 return Error::NONE;
333 }
334
destroyVirtualDisplay(Display display)335 Error AidlComposer::destroyVirtualDisplay(Display display) {
336 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
337 if (!status.isOk()) {
338 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
339 return static_cast<Error>(status.getServiceSpecificError());
340 }
341 return Error::NONE;
342 }
343
acceptDisplayChanges(Display display)344 Error AidlComposer::acceptDisplayChanges(Display display) {
345 mWriter.acceptDisplayChanges(translate<int64_t>(display));
346 return Error::NONE;
347 }
348
createLayer(Display display,Layer * outLayer)349 Error AidlComposer::createLayer(Display display, Layer* outLayer) {
350 int64_t layer;
351 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
352 kMaxLayerBufferCount, &layer);
353 if (!status.isOk()) {
354 ALOGE("createLayer failed %s", status.getDescription().c_str());
355 return static_cast<Error>(status.getServiceSpecificError());
356 }
357
358 *outLayer = translate<Layer>(layer);
359 return Error::NONE;
360 }
361
destroyLayer(Display display,Layer layer)362 Error AidlComposer::destroyLayer(Display display, Layer layer) {
363 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
364 translate<int64_t>(layer));
365 if (!status.isOk()) {
366 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
367 return static_cast<Error>(status.getServiceSpecificError());
368 }
369 return Error::NONE;
370 }
371
getActiveConfig(Display display,Config * outConfig)372 Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
373 int32_t config;
374 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
375 if (!status.isOk()) {
376 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
377 return static_cast<Error>(status.getServiceSpecificError());
378 }
379 *outConfig = translate<Config>(config);
380 return Error::NONE;
381 }
382
getChangedCompositionTypes(Display display,std::vector<Layer> * outLayers,std::vector<aidl::android::hardware::graphics::composer3::Composition> * outTypes)383 Error AidlComposer::getChangedCompositionTypes(
384 Display display, std::vector<Layer>* outLayers,
385 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
386 const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
387 outLayers->reserve(changedLayers.size());
388 outTypes->reserve(changedLayers.size());
389
390 for (const auto& layer : changedLayers) {
391 outLayers->emplace_back(translate<Layer>(layer.layer));
392 outTypes->emplace_back(layer.composition);
393 }
394 return Error::NONE;
395 }
396
getColorModes(Display display,std::vector<ColorMode> * outModes)397 Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
398 std::vector<AidlColorMode> modes;
399 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
400 if (!status.isOk()) {
401 ALOGE("getColorModes failed %s", status.getDescription().c_str());
402 return static_cast<Error>(status.getServiceSpecificError());
403 }
404 *outModes = translate<ColorMode>(modes);
405 return Error::NONE;
406 }
407
getDisplayAttribute(Display display,Config config,IComposerClient::Attribute attribute,int32_t * outValue)408 Error AidlComposer::getDisplayAttribute(Display display, Config config,
409 IComposerClient::Attribute attribute, int32_t* outValue) {
410 const auto status =
411 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
412 translate<int32_t>(config),
413 static_cast<AidlDisplayAttribute>(attribute),
414 outValue);
415 if (!status.isOk()) {
416 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
417 return static_cast<Error>(status.getServiceSpecificError());
418 }
419 return Error::NONE;
420 }
421
getDisplayConfigs(Display display,std::vector<Config> * outConfigs)422 Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
423 std::vector<int32_t> configs;
424 const auto status =
425 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
426 if (!status.isOk()) {
427 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
428 return static_cast<Error>(status.getServiceSpecificError());
429 }
430 *outConfigs = translate<Config>(configs);
431 return Error::NONE;
432 }
433
getDisplayName(Display display,std::string * outName)434 Error AidlComposer::getDisplayName(Display display, std::string* outName) {
435 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
436 if (!status.isOk()) {
437 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
438 return static_cast<Error>(status.getServiceSpecificError());
439 }
440 return Error::NONE;
441 }
442
getDisplayRequests(Display display,uint32_t * outDisplayRequestMask,std::vector<Layer> * outLayers,std::vector<uint32_t> * outLayerRequestMasks)443 Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
444 std::vector<Layer>* outLayers,
445 std::vector<uint32_t>* outLayerRequestMasks) {
446 const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
447 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
448 outLayers->reserve(displayRequests.layerRequests.size());
449 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
450
451 for (const auto& layer : displayRequests.layerRequests) {
452 outLayers->emplace_back(translate<Layer>(layer.layer));
453 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
454 }
455 return Error::NONE;
456 }
457
getDozeSupport(Display display,bool * outSupport)458 Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
459 std::vector<AidlDisplayCapability> capabilities;
460 const auto status =
461 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
462 if (!status.isOk()) {
463 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
464 return static_cast<Error>(status.getServiceSpecificError());
465 }
466 *outSupport = std::find(capabilities.begin(), capabilities.end(),
467 AidlDisplayCapability::DOZE) != capabilities.end();
468 return Error::NONE;
469 }
470
hasDisplayIdleTimerCapability(Display display,bool * outSupport)471 Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
472 std::vector<AidlDisplayCapability> capabilities;
473 const auto status =
474 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
475 if (!status.isOk()) {
476 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
477 return static_cast<Error>(status.getServiceSpecificError());
478 }
479 *outSupport = std::find(capabilities.begin(), capabilities.end(),
480 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
481 return Error::NONE;
482 }
483
getHdrCapabilities(Display display,std::vector<Hdr> * outTypes,float * outMaxLuminance,float * outMaxAverageLuminance,float * outMinLuminance)484 Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
485 float* outMaxLuminance, float* outMaxAverageLuminance,
486 float* outMinLuminance) {
487 AidlHdrCapabilities capabilities;
488 const auto status =
489 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
490 if (!status.isOk()) {
491 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
492 return static_cast<Error>(status.getServiceSpecificError());
493 }
494
495 *outTypes = translate<Hdr>(capabilities.types);
496 *outMaxLuminance = capabilities.maxLuminance;
497 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
498 *outMinLuminance = capabilities.minLuminance;
499 return Error::NONE;
500 }
501
getReleaseFences(Display display,std::vector<Layer> * outLayers,std::vector<int> * outReleaseFences)502 Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
503 std::vector<int>* outReleaseFences) {
504 auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
505 outLayers->reserve(fences.size());
506 outReleaseFences->reserve(fences.size());
507
508 for (auto& fence : fences) {
509 outLayers->emplace_back(translate<Layer>(fence.layer));
510 // take ownership
511 const int fenceOwner = fence.fence.get();
512 *fence.fence.getR() = -1;
513 outReleaseFences->emplace_back(fenceOwner);
514 }
515 return Error::NONE;
516 }
517
presentDisplay(Display display,int * outPresentFence)518 Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
519 ATRACE_NAME("HwcPresentDisplay");
520 mWriter.presentDisplay(translate<int64_t>(display));
521
522 Error error = execute();
523 if (error != Error::NONE) {
524 return error;
525 }
526
527 auto fence = mReader.takePresentFence(translate<int64_t>(display));
528 // take ownership
529 *outPresentFence = fence.get();
530 *fence.getR() = -1;
531 return Error::NONE;
532 }
533
setActiveConfig(Display display,Config config)534 Error AidlComposer::setActiveConfig(Display display, Config config) {
535 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
536 translate<int32_t>(config));
537 if (!status.isOk()) {
538 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
539 return static_cast<Error>(status.getServiceSpecificError());
540 }
541 return Error::NONE;
542 }
543
setClientTarget(Display display,uint32_t slot,const sp<GraphicBuffer> & target,int acquireFence,Dataspace dataspace,const std::vector<IComposerClient::Rect> & damage)544 Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
545 int acquireFence, Dataspace dataspace,
546 const std::vector<IComposerClient::Rect>& damage) {
547 const native_handle_t* handle = nullptr;
548 if (target.get()) {
549 handle = target->getNativeBuffer()->handle;
550 }
551
552 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
553 translate<aidl::android::hardware::graphics::common::Dataspace>(
554 dataspace),
555 translate<AidlRect>(damage));
556 return Error::NONE;
557 }
558
setColorMode(Display display,ColorMode mode,RenderIntent renderIntent)559 Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
560 const auto status =
561 mAidlComposerClient->setColorMode(translate<int64_t>(display),
562 translate<AidlColorMode>(mode),
563 translate<AidlRenderIntent>(renderIntent));
564 if (!status.isOk()) {
565 ALOGE("setColorMode failed %s", status.getDescription().c_str());
566 return static_cast<Error>(status.getServiceSpecificError());
567 }
568 return Error::NONE;
569 }
570
setColorTransform(Display display,const float * matrix)571 Error AidlComposer::setColorTransform(Display display, const float* matrix) {
572 mWriter.setColorTransform(translate<int64_t>(display), matrix);
573 return Error::NONE;
574 }
575
setOutputBuffer(Display display,const native_handle_t * buffer,int releaseFence)576 Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
577 int releaseFence) {
578 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
579 return Error::NONE;
580 }
581
setPowerMode(Display display,IComposerClient::PowerMode mode)582 Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
583 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
584 translate<PowerMode>(mode));
585 if (!status.isOk()) {
586 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
587 return static_cast<Error>(status.getServiceSpecificError());
588 }
589 return Error::NONE;
590 }
591
setVsyncEnabled(Display display,IComposerClient::Vsync enabled)592 Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
593 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
594 const auto status =
595 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
596 if (!status.isOk()) {
597 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
598 return static_cast<Error>(status.getServiceSpecificError());
599 }
600 return Error::NONE;
601 }
602
setClientTargetSlotCount(Display display)603 Error AidlComposer::setClientTargetSlotCount(Display display) {
604 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
605 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
606 bufferSlotCount);
607 if (!status.isOk()) {
608 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
609 return static_cast<Error>(status.getServiceSpecificError());
610 }
611 return Error::NONE;
612 }
613
validateDisplay(Display display,nsecs_t expectedPresentTime,uint32_t * outNumTypes,uint32_t * outNumRequests)614 Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
615 uint32_t* outNumTypes, uint32_t* outNumRequests) {
616 ATRACE_NAME("HwcValidateDisplay");
617 mWriter.validateDisplay(translate<int64_t>(display),
618 ClockMonotonicTimestamp{expectedPresentTime});
619
620 Error error = execute();
621 if (error != Error::NONE) {
622 return error;
623 }
624
625 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
626
627 return Error::NONE;
628 }
629
presentOrValidateDisplay(Display display,nsecs_t expectedPresentTime,uint32_t * outNumTypes,uint32_t * outNumRequests,int * outPresentFence,uint32_t * state)630 Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
631 uint32_t* outNumTypes, uint32_t* outNumRequests,
632 int* outPresentFence, uint32_t* state) {
633 ATRACE_NAME("HwcPresentOrValidateDisplay");
634 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
635 ClockMonotonicTimestamp{expectedPresentTime});
636
637 Error error = execute();
638 if (error != Error::NONE) {
639 return error;
640 }
641
642 const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
643 if (!result.has_value()) {
644 *state = translate<uint32_t>(-1);
645 return Error::NO_RESOURCES;
646 }
647
648 *state = translate<uint32_t>(*result);
649
650 if (*result == PresentOrValidate::Result::Presented) {
651 auto fence = mReader.takePresentFence(translate<int64_t>(display));
652 // take ownership
653 *outPresentFence = fence.get();
654 *fence.getR() = -1;
655 }
656
657 if (*result == PresentOrValidate::Result::Validated) {
658 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
659 }
660
661 return Error::NONE;
662 }
663
setCursorPosition(Display display,Layer layer,int32_t x,int32_t y)664 Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
665 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
666 return Error::NONE;
667 }
668
setLayerBuffer(Display display,Layer layer,uint32_t slot,const sp<GraphicBuffer> & buffer,int acquireFence)669 Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
670 const sp<GraphicBuffer>& buffer, int acquireFence) {
671 const native_handle_t* handle = nullptr;
672 if (buffer.get()) {
673 handle = buffer->getNativeBuffer()->handle;
674 }
675
676 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
677 acquireFence);
678 return Error::NONE;
679 }
680
setLayerSurfaceDamage(Display display,Layer layer,const std::vector<IComposerClient::Rect> & damage)681 Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
682 const std::vector<IComposerClient::Rect>& damage) {
683 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
684 translate<AidlRect>(damage));
685 return Error::NONE;
686 }
687
setLayerBlendMode(Display display,Layer layer,IComposerClient::BlendMode mode)688 Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
689 IComposerClient::BlendMode mode) {
690 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
691 translate<BlendMode>(mode));
692 return Error::NONE;
693 }
694
setLayerColor(Display display,Layer layer,const Color & color)695 Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
696 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
697 return Error::NONE;
698 }
699
setLayerCompositionType(Display display,Layer layer,aidl::android::hardware::graphics::composer3::Composition type)700 Error AidlComposer::setLayerCompositionType(
701 Display display, Layer layer,
702 aidl::android::hardware::graphics::composer3::Composition type) {
703 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
704 return Error::NONE;
705 }
706
setLayerDataspace(Display display,Layer layer,Dataspace dataspace)707 Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
708 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
709 translate<AidlDataspace>(dataspace));
710 return Error::NONE;
711 }
712
setLayerDisplayFrame(Display display,Layer layer,const IComposerClient::Rect & frame)713 Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
714 const IComposerClient::Rect& frame) {
715 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
716 translate<AidlRect>(frame));
717 return Error::NONE;
718 }
719
setLayerPlaneAlpha(Display display,Layer layer,float alpha)720 Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
721 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
722 return Error::NONE;
723 }
724
setLayerSidebandStream(Display display,Layer layer,const native_handle_t * stream)725 Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
726 const native_handle_t* stream) {
727 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
728 return Error::NONE;
729 }
730
setLayerSourceCrop(Display display,Layer layer,const IComposerClient::FRect & crop)731 Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
732 const IComposerClient::FRect& crop) {
733 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
734 translate<AidlFRect>(crop));
735 return Error::NONE;
736 }
737
setLayerTransform(Display display,Layer layer,Transform transform)738 Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
739 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
740 translate<AidlTransform>(transform));
741 return Error::NONE;
742 }
743
setLayerVisibleRegion(Display display,Layer layer,const std::vector<IComposerClient::Rect> & visible)744 Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
745 const std::vector<IComposerClient::Rect>& visible) {
746 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
747 translate<AidlRect>(visible));
748 return Error::NONE;
749 }
750
setLayerZOrder(Display display,Layer layer,uint32_t z)751 Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
752 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
753 return Error::NONE;
754 }
755
execute()756 Error AidlComposer::execute() {
757 const auto& commands = mWriter.getPendingCommands();
758 if (commands.empty()) {
759 mWriter.reset();
760 return Error::NONE;
761 }
762
763 { // scope for results
764 std::vector<CommandResultPayload> results;
765 auto status = mAidlComposerClient->executeCommands(commands, &results);
766 if (!status.isOk()) {
767 ALOGE("executeCommands failed %s", status.getDescription().c_str());
768 return static_cast<Error>(status.getServiceSpecificError());
769 }
770
771 mReader.parse(std::move(results));
772 }
773 const auto commandErrors = mReader.takeErrors();
774 Error error = Error::NONE;
775 for (const auto& cmdErr : commandErrors) {
776 const auto index = static_cast<size_t>(cmdErr.commandIndex);
777 if (index < 0 || index >= commands.size()) {
778 ALOGE("invalid command index %zu", index);
779 return Error::BAD_PARAMETER;
780 }
781
782 const auto& command = commands[index];
783 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
784 error = translate<Error>(cmdErr.errorCode);
785 } else {
786 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
787 cmdErr.errorCode);
788 }
789 }
790
791 mWriter.reset();
792
793 return error;
794 }
795
setLayerPerFrameMetadata(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadata> & perFrameMetadatas)796 Error AidlComposer::setLayerPerFrameMetadata(
797 Display display, Layer layer,
798 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
799 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
800 translate<AidlPerFrameMetadata>(perFrameMetadatas));
801 return Error::NONE;
802 }
803
getPerFrameMetadataKeys(Display display)804 std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
805 Display display) {
806 std::vector<AidlPerFrameMetadataKey> keys;
807 const auto status =
808 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
809 if (!status.isOk()) {
810 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
811 return {};
812 }
813 return translate<IComposerClient::PerFrameMetadataKey>(keys);
814 }
815
getRenderIntents(Display display,ColorMode colorMode,std::vector<RenderIntent> * outRenderIntents)816 Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
817 std::vector<RenderIntent>* outRenderIntents) {
818 std::vector<AidlRenderIntent> renderIntents;
819 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
820 translate<AidlColorMode>(colorMode),
821 &renderIntents);
822 if (!status.isOk()) {
823 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
824 return static_cast<Error>(status.getServiceSpecificError());
825 }
826 *outRenderIntents = translate<RenderIntent>(renderIntents);
827 return Error::NONE;
828 }
829
getDataspaceSaturationMatrix(Dataspace dataspace,mat4 * outMatrix)830 Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
831 std::vector<float> matrix;
832 const auto status =
833 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
834 &matrix);
835 if (!status.isOk()) {
836 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
837 return static_cast<Error>(status.getServiceSpecificError());
838 }
839 *outMatrix = makeMat4(matrix);
840 return Error::NONE;
841 }
842
getDisplayIdentificationData(Display display,uint8_t * outPort,std::vector<uint8_t> * outData)843 Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
844 std::vector<uint8_t>* outData) {
845 AidlDisplayIdentification displayIdentification;
846 const auto status =
847 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
848 &displayIdentification);
849 if (!status.isOk()) {
850 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
851 return static_cast<Error>(status.getServiceSpecificError());
852 }
853
854 *outPort = static_cast<uint8_t>(displayIdentification.port);
855 *outData = displayIdentification.data;
856
857 return Error::NONE;
858 }
859
setLayerColorTransform(Display display,Layer layer,const float * matrix)860 Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
861 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
862 return Error::NONE;
863 }
864
getDisplayedContentSamplingAttributes(Display display,PixelFormat * outFormat,Dataspace * outDataspace,uint8_t * outComponentMask)865 Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
866 Dataspace* outDataspace,
867 uint8_t* outComponentMask) {
868 if (!outFormat || !outDataspace || !outComponentMask) {
869 return Error::BAD_PARAMETER;
870 }
871
872 AidlDisplayContentSamplingAttributes attributes;
873 const auto status =
874 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
875 &attributes);
876 if (!status.isOk()) {
877 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
878 return static_cast<Error>(status.getServiceSpecificError());
879 }
880
881 *outFormat = translate<PixelFormat>(attributes.format);
882 *outDataspace = translate<Dataspace>(attributes.dataspace);
883 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
884 return Error::NONE;
885 }
886
setDisplayContentSamplingEnabled(Display display,bool enabled,uint8_t componentMask,uint64_t maxFrames)887 Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
888 uint8_t componentMask, uint64_t maxFrames) {
889 const auto status =
890 mAidlComposerClient
891 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
892 static_cast<AidlFormatColorComponent>(
893 componentMask),
894 static_cast<int64_t>(maxFrames));
895 if (!status.isOk()) {
896 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
897 return static_cast<Error>(status.getServiceSpecificError());
898 }
899 return Error::NONE;
900 }
901
getDisplayedContentSample(Display display,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats)902 Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
903 uint64_t timestamp, DisplayedFrameStats* outStats) {
904 if (!outStats) {
905 return Error::BAD_PARAMETER;
906 }
907
908 AidlDisplayContentSample sample;
909 const auto status =
910 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
911 static_cast<int64_t>(maxFrames),
912 static_cast<int64_t>(timestamp),
913 &sample);
914 if (!status.isOk()) {
915 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
916 return static_cast<Error>(status.getServiceSpecificError());
917 }
918 *outStats = translate<DisplayedFrameStats>(sample);
919 return Error::NONE;
920 }
921
setLayerPerFrameMetadataBlobs(Display display,Layer layer,const std::vector<IComposerClient::PerFrameMetadataBlob> & metadata)922 Error AidlComposer::setLayerPerFrameMetadataBlobs(
923 Display display, Layer layer,
924 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
925 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
926 translate<AidlPerFrameMetadataBlob>(metadata));
927 return Error::NONE;
928 }
929
setDisplayBrightness(Display display,float brightness,float brightnessNits,const DisplayBrightnessOptions & options)930 Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
931 const DisplayBrightnessOptions& options) {
932 mWriter.setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
933
934 if (options.applyImmediately) {
935 return execute();
936 }
937
938 return Error::NONE;
939 }
940
getDisplayCapabilities(Display display,std::vector<AidlDisplayCapability> * outCapabilities)941 Error AidlComposer::getDisplayCapabilities(Display display,
942 std::vector<AidlDisplayCapability>* outCapabilities) {
943 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
944 outCapabilities);
945 if (!status.isOk()) {
946 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
947 outCapabilities->clear();
948 return static_cast<Error>(status.getServiceSpecificError());
949 }
950 return Error::NONE;
951 }
952
getDisplayConnectionType(Display display,IComposerClient::DisplayConnectionType * outType)953 V2_4::Error AidlComposer::getDisplayConnectionType(
954 Display display, IComposerClient::DisplayConnectionType* outType) {
955 AidlDisplayConnectionType type;
956 const auto status =
957 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
958 if (!status.isOk()) {
959 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
960 return static_cast<V2_4::Error>(status.getServiceSpecificError());
961 }
962 *outType = translate<IComposerClient::DisplayConnectionType>(type);
963 return V2_4::Error::NONE;
964 }
965
getDisplayVsyncPeriod(Display display,VsyncPeriodNanos * outVsyncPeriod)966 V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
967 int32_t vsyncPeriod;
968 const auto status =
969 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
970 if (!status.isOk()) {
971 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
972 return static_cast<V2_4::Error>(status.getServiceSpecificError());
973 }
974 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
975 return V2_4::Error::NONE;
976 }
977
setActiveConfigWithConstraints(Display display,Config config,const IComposerClient::VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * outTimeline)978 V2_4::Error AidlComposer::setActiveConfigWithConstraints(
979 Display display, Config config,
980 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
981 VsyncPeriodChangeTimeline* outTimeline) {
982 AidlVsyncPeriodChangeTimeline timeline;
983 const auto status =
984 mAidlComposerClient
985 ->setActiveConfigWithConstraints(translate<int64_t>(display),
986 translate<int32_t>(config),
987 translate<AidlVsyncPeriodChangeConstraints>(
988 vsyncPeriodChangeConstraints),
989 &timeline);
990 if (!status.isOk()) {
991 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
992 return static_cast<V2_4::Error>(status.getServiceSpecificError());
993 }
994 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
995 return V2_4::Error::NONE;
996 }
997
setAutoLowLatencyMode(Display display,bool on)998 V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
999 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1000 if (!status.isOk()) {
1001 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1002 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1003 }
1004 return V2_4::Error::NONE;
1005 }
1006
getSupportedContentTypes(Display displayId,std::vector<IComposerClient::ContentType> * outSupportedContentTypes)1007 V2_4::Error AidlComposer::getSupportedContentTypes(
1008 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1009 std::vector<AidlContentType> types;
1010 const auto status =
1011 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1012 if (!status.isOk()) {
1013 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1014 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1015 }
1016 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1017 return V2_4::Error::NONE;
1018 }
1019
setContentType(Display display,IComposerClient::ContentType contentType)1020 V2_4::Error AidlComposer::setContentType(Display display,
1021 IComposerClient::ContentType contentType) {
1022 const auto status =
1023 mAidlComposerClient->setContentType(translate<int64_t>(display),
1024 translate<AidlContentType>(contentType));
1025 if (!status.isOk()) {
1026 ALOGE("setContentType failed %s", status.getDescription().c_str());
1027 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1028 }
1029 return V2_4::Error::NONE;
1030 }
1031
setLayerGenericMetadata(Display,Layer,const std::string &,bool,const std::vector<uint8_t> &)1032 V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1033 const std::vector<uint8_t>&) {
1034 // There are no users for this API. See b/209691612.
1035 return V2_4::Error::UNSUPPORTED;
1036 }
1037
getLayerGenericMetadataKeys(std::vector<IComposerClient::LayerGenericMetadataKey> *)1038 V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
1039 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1040 // There are no users for this API. See b/209691612.
1041 return V2_4::Error::UNSUPPORTED;
1042 }
1043
setBootDisplayConfig(Display display,Config config)1044 Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1045 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1046 translate<int32_t>(config));
1047 if (!status.isOk()) {
1048 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1049 return static_cast<Error>(status.getServiceSpecificError());
1050 }
1051 return Error::NONE;
1052 }
1053
clearBootDisplayConfig(Display display)1054 Error AidlComposer::clearBootDisplayConfig(Display display) {
1055 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1056 if (!status.isOk()) {
1057 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1058 return static_cast<Error>(status.getServiceSpecificError());
1059 }
1060 return Error::NONE;
1061 }
1062
getPreferredBootDisplayConfig(Display display,Config * config)1063 Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1064 int32_t displayConfig;
1065 const auto status =
1066 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1067 &displayConfig);
1068 if (!status.isOk()) {
1069 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1070 return static_cast<Error>(status.getServiceSpecificError());
1071 }
1072 *config = translate<uint32_t>(displayConfig);
1073 return Error::NONE;
1074 }
1075
getClientTargetProperty(Display display,ClientTargetPropertyWithBrightness * outClientTargetProperty)1076 Error AidlComposer::getClientTargetProperty(
1077 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1078 *outClientTargetProperty = mReader.takeClientTargetProperty(translate<int64_t>(display));
1079 return Error::NONE;
1080 }
1081
setLayerBrightness(Display display,Layer layer,float brightness)1082 Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
1083 mWriter.setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer), brightness);
1084 return Error::NONE;
1085 }
1086
setLayerBlockingRegion(Display display,Layer layer,const std::vector<IComposerClient::Rect> & blocking)1087 Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1088 const std::vector<IComposerClient::Rect>& blocking) {
1089 mWriter.setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1090 translate<AidlRect>(blocking));
1091 return Error::NONE;
1092 }
1093
getDisplayDecorationSupport(Display display,std::optional<DisplayDecorationSupport> * support)1094 Error AidlComposer::getDisplayDecorationSupport(Display display,
1095 std::optional<DisplayDecorationSupport>* support) {
1096 const auto status =
1097 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1098 if (!status.isOk()) {
1099 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1100 support->reset();
1101 return static_cast<Error>(status.getServiceSpecificError());
1102 }
1103 return Error::NONE;
1104 }
1105
setIdleTimerEnabled(Display displayId,std::chrono::milliseconds timeout)1106 Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1107 const auto status =
1108 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1109 translate<int32_t>(timeout.count()));
1110 if (!status.isOk()) {
1111 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1112 return static_cast<Error>(status.getServiceSpecificError());
1113 }
1114 return Error::NONE;
1115 }
1116
getPhysicalDisplayOrientation(Display displayId,AidlTransform * outDisplayOrientation)1117 Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1118 AidlTransform* outDisplayOrientation) {
1119 const auto status =
1120 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1121 outDisplayOrientation);
1122 if (!status.isOk()) {
1123 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1124 return static_cast<Error>(status.getServiceSpecificError());
1125 }
1126 return Error::NONE;
1127 }
1128
1129 } // namespace Hwc2
1130 } // namespace android
1131