blob: a28aeaad33b1366716bbde39ec3eaf68223efffb [file] [log] [blame]
Ady Abrahame7385f72021-09-05 00:54:25 -07001/*
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
Ady Abraham9fc28052021-10-14 17:21:38 -070021#include "AidlComposerHal.h"
Ady Abrahame7385f72021-09-05 00:54:25 -070022
23#include <android/binder_ibinder_platform.h>
24#include <android/binder_manager.h>
25#include <log/log.h>
26#include <utils/Trace.h>
27
28#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
29
30#include <algorithm>
31#include <cinttypes>
32
33namespace android {
34
35using hardware::hidl_handle;
36using hardware::hidl_vec;
37using hardware::Return;
38
39using aidl::android::hardware::graphics::composer3::BnComposerCallback;
40using aidl::android::hardware::graphics::composer3::Capability;
41using aidl::android::hardware::graphics::composer3::PowerMode;
42using aidl::android::hardware::graphics::composer3::VirtualDisplay;
43
Ady Abraham42977362021-12-07 21:04:49 -080044using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080045
Ady Abrahame7385f72021-09-05 00:54:25 -070046using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
47using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
48using AidlDisplayIdentification =
49 aidl::android::hardware::graphics::composer3::DisplayIdentification;
50using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
51using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
52using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070053using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
54using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
55using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
56using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
57using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
58using AidlVsyncPeriodChangeConstraints =
59 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
60using AidlVsyncPeriodChangeTimeline =
61 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
62using AidlLayerGenericMetadataKey =
63 aidl::android::hardware::graphics::composer3::LayerGenericMetadataKey;
64using AidlDisplayContentSamplingAttributes =
65 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
66using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
67using AidlDisplayConnectionType =
68 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
69using AidlIComposerClient = aidl::android::hardware::graphics::composer3::IComposerClient;
70
71using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
72using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
73using AidlFRect = aidl::android::hardware::graphics::common::FRect;
74using AidlRect = aidl::android::hardware::graphics::common::Rect;
75using AidlTransform = aidl::android::hardware::graphics::common::Transform;
76
77namespace Hwc2 {
78
79namespace {
80
81template <typename To, typename From>
82To translate(From x) {
83 return static_cast<To>(x);
84}
85
86template <typename To, typename From>
87std::vector<To> translate(const std::vector<From>& in) {
88 std::vector<To> out;
89 out.reserve(in.size());
90 std::transform(in.begin(), in.end(), std::back_inserter(out),
91 [](From x) { return translate<To>(x); });
92 return out;
93}
94
95template <>
96AidlRect translate(IComposerClient::Rect x) {
97 return AidlRect{
98 .left = x.left,
99 .top = x.top,
100 .right = x.right,
101 .bottom = x.bottom,
102 };
103}
104
105template <>
106AidlFRect translate(IComposerClient::FRect x) {
107 return AidlFRect{
108 .left = x.left,
109 .top = x.top,
110 .right = x.right,
111 .bottom = x.bottom,
112 };
113}
114
115template <>
116Color translate(IComposerClient::Color x) {
117 return Color{
118 .r = static_cast<int8_t>(x.r),
119 .g = static_cast<int8_t>(x.g),
120 .b = static_cast<int8_t>(x.b),
121 .a = static_cast<int8_t>(x.a),
122 };
123}
124
125template <>
126AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
127 AidlPerFrameMetadataBlob blob;
128 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
129 std::copy(blob.blob.begin(), blob.blob.end(), x.blob.begin());
130 return blob;
131}
132
133template <>
134AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
135 return AidlPerFrameMetadata{
136 .key = translate<AidlPerFrameMetadataKey>(x.key),
137 .value = x.value,
138 };
139}
140
141template <>
142DisplayedFrameStats translate(AidlDisplayContentSample x) {
143 return DisplayedFrameStats{
144 .numFrames = static_cast<uint64_t>(x.frameCount),
145 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
146 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
147 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
148 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
149 };
150}
151
152template <>
153AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
154 return AidlVsyncPeriodChangeConstraints{
155 .desiredTimeNanos = x.desiredTimeNanos,
156 .seamlessRequired = x.seamlessRequired,
157 };
158}
159
160template <>
161VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
162 return VsyncPeriodChangeTimeline{
163 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
164 .refreshRequired = x.refreshRequired,
165 .refreshTimeNanos = x.refreshTimeNanos,
166 };
167}
168
169template <>
170IComposerClient::LayerGenericMetadataKey translate(AidlLayerGenericMetadataKey x) {
171 return IComposerClient::LayerGenericMetadataKey{
172 .name = x.name,
173 .mandatory = x.mandatory,
174 };
175}
176
Ady Abrahama6388c02021-11-11 21:11:51 -0800177template <>
178IComposerClient::ClientTargetProperty translate(ClientTargetProperty x) {
179 return IComposerClient::ClientTargetProperty{
180 .pixelFormat = translate<PixelFormat>(x.pixelFormat),
181 .dataspace = translate<Dataspace>(x.dataspace),
182 };
183}
184
Ady Abrahame7385f72021-09-05 00:54:25 -0700185mat4 makeMat4(std::vector<float> in) {
186 return mat4(static_cast<const float*>(in.data()));
187}
188
189} // namespace
190
191class AidlIComposerCallbackWrapper : public BnComposerCallback {
192public:
193 AidlIComposerCallbackWrapper(sp<V2_4::IComposerCallback> callback)
194 : mCallback(std::move(callback)) {}
195
196 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
197 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
198 : V2_4::IComposerCallback::Connection::DISCONNECTED;
199 mCallback->onHotplug(translate<Display>(in_display), connection);
200 return ::ndk::ScopedAStatus::ok();
201 }
202
203 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
204 mCallback->onRefresh(translate<Display>(in_display));
205 return ::ndk::ScopedAStatus::ok();
206 }
207 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
208 mCallback->onSeamlessPossible(translate<Display>(in_display));
209 return ::ndk::ScopedAStatus::ok();
210 }
211 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
212 int32_t in_vsyncPeriodNanos) override {
213 mCallback->onVsync_2_4(translate<Display>(in_display), in_timestamp,
214 static_cast<uint32_t>(in_vsyncPeriodNanos));
215 return ::ndk::ScopedAStatus::ok();
216 }
217 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
218 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
219 mCallback->onVsyncPeriodTimingChanged(translate<Display>(in_display),
220 translate<V2_4::VsyncPeriodChangeTimeline>(
221 in_updatedTimeline));
222 return ::ndk::ScopedAStatus::ok();
223 }
224
225private:
226 sp<V2_4::IComposerCallback> mCallback;
227};
228
Ady Abraham9fc28052021-10-14 17:21:38 -0700229std::string AidlComposer::instance(const std::string& serviceName) {
230 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
231}
232
233bool AidlComposer::isDeclared(const std::string& serviceName) {
234 return AServiceManager_isDeclared(instance(serviceName).c_str());
235}
Ady Abrahame7385f72021-09-05 00:54:25 -0700236
Ady Abrahama6388c02021-11-11 21:11:51 -0800237AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700238 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700239 mAidlComposer = AidlIComposer::fromBinder(
240 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700241 if (!mAidlComposer) {
242 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
243 return;
244 }
245
246 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
247 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
248 return;
249 }
250
251 ALOGI("Loaded AIDL composer3 HAL service");
252}
253
254AidlComposer::~AidlComposer() = default;
255
Ady Abraham4d211cf2021-12-14 16:19:03 -0800256bool AidlComposer::isSupported(OptionalFeature feature) const {
257 switch (feature) {
258 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800259 case OptionalFeature::ExpectedPresentTime:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800260 return true;
261 }
262}
263
Ady Abrahame7385f72021-09-05 00:54:25 -0700264std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
265 std::vector<Capability> capabilities;
266 const auto status = mAidlComposer->getCapabilities(&capabilities);
267 if (!status.isOk()) {
268 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
269 return {};
270 }
271 return translate<IComposer::Capability>(capabilities);
272}
273
274std::string AidlComposer::dumpDebugInfo() {
275 std::string info;
276 const auto status = mAidlComposer->dumpDebugInfo(&info);
277 if (!status.isOk()) {
278 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
279 return {};
280 }
281 return info;
282}
283
284void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
285 if (mAidlComposerCallback) {
286 ALOGE("Callback already registered");
287 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700288 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700289 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
290
291 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
292 if (!status.isOk()) {
293 ALOGE("registerCallback failed %s", status.getDescription().c_str());
294 }
295}
296
297void AidlComposer::resetCommands() {
298 mWriter.reset();
299}
300
301Error AidlComposer::executeCommands() {
302 return execute();
303}
304
305uint32_t AidlComposer::getMaxVirtualDisplayCount() {
306 int32_t count = 0;
307 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
308 if (!status.isOk()) {
309 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
310 return 0;
311 }
312 return static_cast<uint32_t>(count);
313}
314
315Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
316 Display* outDisplay) {
317 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
318 const int32_t bufferSlotCount = 1;
319 VirtualDisplay virtualDisplay;
320 const auto status =
321 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
322 static_cast<int32_t>(height),
323 static_cast<AidlPixelFormat>(*format),
324 bufferSlotCount, &virtualDisplay);
325
326 if (!status.isOk()) {
327 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
328 return static_cast<Error>(status.getServiceSpecificError());
329 }
330
331 *outDisplay = translate<Display>(virtualDisplay.display);
332 *format = static_cast<PixelFormat>(virtualDisplay.format);
333 return Error::NONE;
334}
335
336Error AidlComposer::destroyVirtualDisplay(Display display) {
337 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
338 if (!status.isOk()) {
339 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
340 return static_cast<Error>(status.getServiceSpecificError());
341 }
342 return Error::NONE;
343}
344
345Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800346 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700347 return Error::NONE;
348}
349
350Error AidlComposer::createLayer(Display display, Layer* outLayer) {
351 int64_t layer;
352 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
353 kMaxLayerBufferCount, &layer);
354 if (!status.isOk()) {
355 ALOGE("createLayer failed %s", status.getDescription().c_str());
356 return static_cast<Error>(status.getServiceSpecificError());
357 }
358
359 *outLayer = translate<Layer>(layer);
360 return Error::NONE;
361}
362
363Error AidlComposer::destroyLayer(Display display, Layer layer) {
364 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
365 translate<int64_t>(layer));
366 if (!status.isOk()) {
367 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
368 return static_cast<Error>(status.getServiceSpecificError());
369 }
370 return Error::NONE;
371}
372
373Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
374 int32_t config;
375 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
376 if (!status.isOk()) {
377 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
378 return static_cast<Error>(status.getServiceSpecificError());
379 }
380 *outConfig = translate<Config>(config);
381 return Error::NONE;
382}
383
384Error AidlComposer::getChangedCompositionTypes(
385 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500386 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800387 std::vector<int64_t> layers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500388 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
Ady Abrahama6388c02021-11-11 21:11:51 -0800389
390 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700391 return Error::NONE;
392}
393
394Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
395 std::vector<AidlColorMode> modes;
396 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
397 if (!status.isOk()) {
398 ALOGE("getColorModes failed %s", status.getDescription().c_str());
399 return static_cast<Error>(status.getServiceSpecificError());
400 }
401 *outModes = translate<ColorMode>(modes);
402 return Error::NONE;
403}
404
405Error AidlComposer::getDisplayAttribute(Display display, Config config,
406 IComposerClient::Attribute attribute, int32_t* outValue) {
407 const auto status =
408 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
409 translate<int32_t>(config),
410 static_cast<AidlDisplayAttribute>(attribute),
411 outValue);
412 if (!status.isOk()) {
413 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
414 return static_cast<Error>(status.getServiceSpecificError());
415 }
416 return Error::NONE;
417}
418
419Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
420 std::vector<int32_t> configs;
421 const auto status =
422 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
423 if (!status.isOk()) {
424 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
425 return static_cast<Error>(status.getServiceSpecificError());
426 }
427 *outConfigs = translate<Config>(configs);
428 return Error::NONE;
429}
430
431Error AidlComposer::getDisplayName(Display display, std::string* outName) {
432 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
433 if (!status.isOk()) {
434 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
435 return static_cast<Error>(status.getServiceSpecificError());
436 }
437 return Error::NONE;
438}
439
440Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
441 std::vector<Layer>* outLayers,
442 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800443 std::vector<int64_t> layers;
444 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
445 outLayerRequestMasks);
446 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700447 return Error::NONE;
448}
449
450Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800451 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700452 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800453 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700454 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800455 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700456 return static_cast<Error>(status.getServiceSpecificError());
457 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800458 *outSupport = std::find(capabilities.begin(), capabilities.end(),
459 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700460 return Error::NONE;
461}
462
463Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
464 float* outMaxLuminance, float* outMaxAverageLuminance,
465 float* outMinLuminance) {
466 AidlHdrCapabilities capabilities;
467 const auto status =
468 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
469 if (!status.isOk()) {
470 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
471 return static_cast<Error>(status.getServiceSpecificError());
472 }
473
474 *outTypes = translate<Hdr>(capabilities.types);
475 *outMaxLuminance = capabilities.maxLuminance;
476 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
477 *outMinLuminance = capabilities.minLuminance;
478 return Error::NONE;
479}
480
481Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
482 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800483 std::vector<int64_t> layers;
484 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
485 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700486 return Error::NONE;
487}
488
489Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
490 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800491 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700492
493 Error error = execute();
494 if (error != Error::NONE) {
495 return error;
496 }
497
Ady Abrahama6388c02021-11-11 21:11:51 -0800498 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700499
500 return Error::NONE;
501}
502
503Error AidlComposer::setActiveConfig(Display display, Config config) {
504 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
505 translate<int32_t>(config));
506 if (!status.isOk()) {
507 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
508 return static_cast<Error>(status.getServiceSpecificError());
509 }
510 return Error::NONE;
511}
512
513Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
514 int acquireFence, Dataspace dataspace,
515 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700516 const native_handle_t* handle = nullptr;
517 if (target.get()) {
518 handle = target->getNativeBuffer()->handle;
519 }
520
Ady Abrahama6388c02021-11-11 21:11:51 -0800521 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700522 translate<aidl::android::hardware::graphics::common::Dataspace>(
523 dataspace),
524 translate<AidlRect>(damage));
525 return Error::NONE;
526}
527
528Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
529 const auto status =
530 mAidlComposerClient->setColorMode(translate<int64_t>(display),
531 translate<AidlColorMode>(mode),
532 translate<AidlRenderIntent>(renderIntent));
533 if (!status.isOk()) {
534 ALOGE("setColorMode failed %s", status.getDescription().c_str());
535 return static_cast<Error>(status.getServiceSpecificError());
536 }
537 return Error::NONE;
538}
539
Ady Abrahamdc011a92021-12-21 14:06:44 -0800540Error AidlComposer::setColorTransform(Display display, const float* matrix) {
541 mWriter.setColorTransform(translate<int64_t>(display), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700542 return Error::NONE;
543}
544
545Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
546 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800547 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700548 return Error::NONE;
549}
550
551Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
552 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
553 translate<PowerMode>(mode));
554 if (!status.isOk()) {
555 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
556 return static_cast<Error>(status.getServiceSpecificError());
557 }
558 return Error::NONE;
559}
560
561Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
562 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
563 const auto status =
564 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
565 if (!status.isOk()) {
566 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
567 return static_cast<Error>(status.getServiceSpecificError());
568 }
569 return Error::NONE;
570}
571
572Error AidlComposer::setClientTargetSlotCount(Display display) {
573 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
574 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
575 bufferSlotCount);
576 if (!status.isOk()) {
577 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
578 return static_cast<Error>(status.getServiceSpecificError());
579 }
580 return Error::NONE;
581}
582
Ady Abraham43065bd2021-12-10 17:22:15 -0800583Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
584 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700585 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800586 mWriter.validateDisplay(translate<int64_t>(display),
587 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700588
589 Error error = execute();
590 if (error != Error::NONE) {
591 return error;
592 }
593
Ady Abrahama6388c02021-11-11 21:11:51 -0800594 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700595
596 return Error::NONE;
597}
598
Ady Abraham43065bd2021-12-10 17:22:15 -0800599Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
600 uint32_t* outNumTypes, uint32_t* outNumRequests,
601 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700602 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800603 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
604 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700605
606 Error error = execute();
607 if (error != Error::NONE) {
608 return error;
609 }
610
Ady Abrahama6388c02021-11-11 21:11:51 -0800611 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700612
613 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800614 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700615 }
616
617 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800618 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700619 }
620
621 return Error::NONE;
622}
623
624Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800625 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700626 return Error::NONE;
627}
628
629Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
630 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700631 const native_handle_t* handle = nullptr;
632 if (buffer.get()) {
633 handle = buffer->getNativeBuffer()->handle;
634 }
635
Ady Abrahama6388c02021-11-11 21:11:51 -0800636 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
637 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700638 return Error::NONE;
639}
640
641Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
642 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800643 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
644 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700645 return Error::NONE;
646}
647
648Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
649 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800650 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
651 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700652 return Error::NONE;
653}
654
655Error AidlComposer::setLayerColor(Display display, Layer layer,
656 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800657 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
658 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700659 return Error::NONE;
660}
661
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500662Error AidlComposer::setLayerCompositionType(
663 Display display, Layer layer,
664 aidl::android::hardware::graphics::composer3::Composition type) {
665 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700666 return Error::NONE;
667}
668
669Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800670 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
671 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700672 return Error::NONE;
673}
674
675Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
676 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800677 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
678 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700679 return Error::NONE;
680}
681
682Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800683 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700684 return Error::NONE;
685}
686
687Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
688 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800689 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700690 return Error::NONE;
691}
692
693Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
694 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800695 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
696 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700697 return Error::NONE;
698}
699
700Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800701 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
702 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700703 return Error::NONE;
704}
705
706Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
707 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800708 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
709 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700710 return Error::NONE;
711}
712
713Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800714 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700715 return Error::NONE;
716}
717
718Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800719 const auto& commands = mWriter.getPendingCommands();
720 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700721 mWriter.reset();
722 return Error::NONE;
723 }
724
Ady Abrahama6388c02021-11-11 21:11:51 -0800725 std::vector<CommandResultPayload> results;
726 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700727 if (!status.isOk()) {
728 ALOGE("executeCommands failed %s", status.getDescription().c_str());
729 return static_cast<Error>(status.getServiceSpecificError());
730 }
731
Ady Abrahama6388c02021-11-11 21:11:51 -0800732 mReader.parse(results);
733 const auto commandErrors = mReader.takeErrors();
734 Error error = Error::NONE;
735 for (const auto& cmdErr : commandErrors) {
736 const auto index = static_cast<size_t>(cmdErr.commandIndex);
737 if (index < 0 || index >= commands.size()) {
738 ALOGE("invalid command index %zu", index);
739 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700740 }
741
Ady Abrahama6388c02021-11-11 21:11:51 -0800742 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800743 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
744 error = translate<Error>(cmdErr.errorCode);
745 } else {
746 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
747 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700748 }
749 }
750
751 mWriter.reset();
752
753 return error;
754}
755
756Error AidlComposer::setLayerPerFrameMetadata(
757 Display display, Layer layer,
758 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800759 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
760 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700761 return Error::NONE;
762}
763
764std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
765 Display display) {
766 std::vector<AidlPerFrameMetadataKey> keys;
767 const auto status =
768 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
769 if (!status.isOk()) {
770 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
771 return {};
772 }
773 return translate<IComposerClient::PerFrameMetadataKey>(keys);
774}
775
776Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
777 std::vector<RenderIntent>* outRenderIntents) {
778 std::vector<AidlRenderIntent> renderIntents;
779 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
780 translate<AidlColorMode>(colorMode),
781 &renderIntents);
782 if (!status.isOk()) {
783 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
784 return static_cast<Error>(status.getServiceSpecificError());
785 }
786 *outRenderIntents = translate<RenderIntent>(renderIntents);
787 return Error::NONE;
788}
789
790Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
791 std::vector<float> matrix;
792 const auto status =
793 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
794 &matrix);
795 if (!status.isOk()) {
796 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
797 return static_cast<Error>(status.getServiceSpecificError());
798 }
799 *outMatrix = makeMat4(matrix);
800 return Error::NONE;
801}
802
803Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
804 std::vector<uint8_t>* outData) {
805 AidlDisplayIdentification displayIdentification;
806 const auto status =
807 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
808 &displayIdentification);
809 if (!status.isOk()) {
810 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
811 return static_cast<Error>(status.getServiceSpecificError());
812 }
813
814 *outPort = static_cast<uint8_t>(displayIdentification.port);
815 *outData = displayIdentification.data;
816
817 return Error::NONE;
818}
819
820Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800821 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700822 return Error::NONE;
823}
824
825Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
826 Dataspace* outDataspace,
827 uint8_t* outComponentMask) {
828 if (!outFormat || !outDataspace || !outComponentMask) {
829 return Error::BAD_PARAMETER;
830 }
831
832 AidlDisplayContentSamplingAttributes attributes;
833 const auto status =
834 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
835 &attributes);
836 if (!status.isOk()) {
837 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
838 return static_cast<Error>(status.getServiceSpecificError());
839 }
840
841 *outFormat = translate<PixelFormat>(attributes.format);
842 *outDataspace = translate<Dataspace>(attributes.dataspace);
843 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
844 return Error::NONE;
845}
846
847Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
848 uint8_t componentMask, uint64_t maxFrames) {
849 const auto status =
850 mAidlComposerClient
851 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
852 static_cast<AidlFormatColorComponent>(
853 componentMask),
854 static_cast<int64_t>(maxFrames));
855 if (!status.isOk()) {
856 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
857 return static_cast<Error>(status.getServiceSpecificError());
858 }
859 return Error::NONE;
860}
861
862Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
863 uint64_t timestamp, DisplayedFrameStats* outStats) {
864 if (!outStats) {
865 return Error::BAD_PARAMETER;
866 }
867
868 AidlDisplayContentSample sample;
869 const auto status =
870 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
871 static_cast<int64_t>(maxFrames),
872 static_cast<int64_t>(timestamp),
873 &sample);
874 if (!status.isOk()) {
875 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
876 return static_cast<Error>(status.getServiceSpecificError());
877 }
878 *outStats = translate<DisplayedFrameStats>(sample);
879 return Error::NONE;
880}
881
882Error AidlComposer::setLayerPerFrameMetadataBlobs(
883 Display display, Layer layer,
884 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800885 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
886 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700887 return Error::NONE;
888}
889
890Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
891 const auto status =
892 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
893 if (!status.isOk()) {
894 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
895 return static_cast<Error>(status.getServiceSpecificError());
896 }
897 return Error::NONE;
898}
899
900Error AidlComposer::getDisplayCapabilities(Display display,
901 std::vector<DisplayCapability>* outCapabilities) {
902 std::vector<AidlDisplayCapability> capabilities;
903 const auto status =
904 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
905 if (!status.isOk()) {
906 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
907 return static_cast<Error>(status.getServiceSpecificError());
908 }
909 *outCapabilities = translate<DisplayCapability>(capabilities);
910 return Error::NONE;
911}
912
913V2_4::Error AidlComposer::getDisplayConnectionType(
914 Display display, IComposerClient::DisplayConnectionType* outType) {
915 AidlDisplayConnectionType type;
916 const auto status =
917 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
918 if (!status.isOk()) {
919 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
920 return static_cast<V2_4::Error>(status.getServiceSpecificError());
921 }
922 *outType = translate<IComposerClient::DisplayConnectionType>(type);
923 return V2_4::Error::NONE;
924}
925
926V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
927 int32_t vsyncPeriod;
928 const auto status =
929 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
930 if (!status.isOk()) {
931 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
932 return static_cast<V2_4::Error>(status.getServiceSpecificError());
933 }
934 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
935 return V2_4::Error::NONE;
936}
937
938V2_4::Error AidlComposer::setActiveConfigWithConstraints(
939 Display display, Config config,
940 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
941 VsyncPeriodChangeTimeline* outTimeline) {
942 AidlVsyncPeriodChangeTimeline timeline;
943 const auto status =
944 mAidlComposerClient
945 ->setActiveConfigWithConstraints(translate<int64_t>(display),
946 translate<int32_t>(config),
947 translate<AidlVsyncPeriodChangeConstraints>(
948 vsyncPeriodChangeConstraints),
949 &timeline);
950 if (!status.isOk()) {
951 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
952 return static_cast<V2_4::Error>(status.getServiceSpecificError());
953 }
954 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
955 return V2_4::Error::NONE;
956}
957
958V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
959 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
960 if (!status.isOk()) {
961 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
962 return static_cast<V2_4::Error>(status.getServiceSpecificError());
963 }
964 return V2_4::Error::NONE;
965}
966
967V2_4::Error AidlComposer::getSupportedContentTypes(
968 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
969 std::vector<AidlContentType> types;
970 const auto status =
971 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
972 if (!status.isOk()) {
973 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
974 return static_cast<V2_4::Error>(status.getServiceSpecificError());
975 }
976 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
977 return V2_4::Error::NONE;
978}
979
980V2_4::Error AidlComposer::setContentType(Display display,
981 IComposerClient::ContentType contentType) {
982 const auto status =
983 mAidlComposerClient->setContentType(translate<int64_t>(display),
984 translate<AidlContentType>(contentType));
985 if (!status.isOk()) {
986 ALOGE("setContentType failed %s", status.getDescription().c_str());
987 return static_cast<V2_4::Error>(status.getServiceSpecificError());
988 }
989 return V2_4::Error::NONE;
990}
991
992V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
993 const std::string& key, bool mandatory,
994 const std::vector<uint8_t>& value) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800995 mWriter.setLayerGenericMetadata(translate<int64_t>(display), translate<int64_t>(layer), key,
996 mandatory, value);
Ady Abrahame7385f72021-09-05 00:54:25 -0700997 return V2_4::Error::NONE;
998}
999
1000V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
1001 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1002 std::vector<AidlLayerGenericMetadataKey> keys;
1003 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
1004 if (!status.isOk()) {
1005 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
1006 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1007 }
1008 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
1009 return V2_4::Error::NONE;
1010}
1011
1012Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001013 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1014 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -08001015 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001016 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -08001017 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -07001018 return Error::NONE;
1019}
1020
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001021Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1022 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1023 whitePointNits);
1024 return Error::NONE;
1025}
1026
Ady Abrahame7385f72021-09-05 00:54:25 -07001027} // namespace Hwc2
1028} // namespace android