blob: 6f2880d3ee9286cf7e7d318b6bfe1a72e026d63e [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
540Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800541 mWriter.setColorTransform(translate<int64_t>(display), matrix,
542 translate<AidlColorTransform>(hint));
Ady Abrahame7385f72021-09-05 00:54:25 -0700543 return Error::NONE;
544}
545
546Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
547 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800548 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700549 return Error::NONE;
550}
551
552Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
553 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
554 translate<PowerMode>(mode));
555 if (!status.isOk()) {
556 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
557 return static_cast<Error>(status.getServiceSpecificError());
558 }
559 return Error::NONE;
560}
561
562Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
563 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
564 const auto status =
565 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
566 if (!status.isOk()) {
567 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
568 return static_cast<Error>(status.getServiceSpecificError());
569 }
570 return Error::NONE;
571}
572
573Error AidlComposer::setClientTargetSlotCount(Display display) {
574 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
575 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
576 bufferSlotCount);
577 if (!status.isOk()) {
578 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
579 return static_cast<Error>(status.getServiceSpecificError());
580 }
581 return Error::NONE;
582}
583
Ady Abraham43065bd2021-12-10 17:22:15 -0800584Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
585 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700586 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800587 mWriter.validateDisplay(translate<int64_t>(display),
588 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700589
590 Error error = execute();
591 if (error != Error::NONE) {
592 return error;
593 }
594
Ady Abrahama6388c02021-11-11 21:11:51 -0800595 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700596
597 return Error::NONE;
598}
599
Ady Abraham43065bd2021-12-10 17:22:15 -0800600Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
601 uint32_t* outNumTypes, uint32_t* outNumRequests,
602 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700603 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800604 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
605 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700606
607 Error error = execute();
608 if (error != Error::NONE) {
609 return error;
610 }
611
Ady Abrahama6388c02021-11-11 21:11:51 -0800612 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700613
614 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800615 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700616 }
617
618 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800619 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700620 }
621
622 return Error::NONE;
623}
624
625Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800626 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700627 return Error::NONE;
628}
629
630Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
631 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700632 const native_handle_t* handle = nullptr;
633 if (buffer.get()) {
634 handle = buffer->getNativeBuffer()->handle;
635 }
636
Ady Abrahama6388c02021-11-11 21:11:51 -0800637 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
638 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700639 return Error::NONE;
640}
641
642Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
643 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800644 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
645 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700646 return Error::NONE;
647}
648
649Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
650 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800651 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
652 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700653 return Error::NONE;
654}
655
656Error AidlComposer::setLayerColor(Display display, Layer layer,
657 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800658 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
659 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700660 return Error::NONE;
661}
662
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500663Error AidlComposer::setLayerCompositionType(
664 Display display, Layer layer,
665 aidl::android::hardware::graphics::composer3::Composition type) {
666 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700667 return Error::NONE;
668}
669
670Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800671 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
672 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700673 return Error::NONE;
674}
675
676Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
677 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800678 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
679 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700680 return Error::NONE;
681}
682
683Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800684 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700685 return Error::NONE;
686}
687
688Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
689 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800690 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700691 return Error::NONE;
692}
693
694Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
695 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800696 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
697 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700698 return Error::NONE;
699}
700
701Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800702 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
703 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700704 return Error::NONE;
705}
706
707Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
708 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800709 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
710 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700711 return Error::NONE;
712}
713
714Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800715 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700716 return Error::NONE;
717}
718
719Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800720 const auto& commands = mWriter.getPendingCommands();
721 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700722 mWriter.reset();
723 return Error::NONE;
724 }
725
Ady Abrahama6388c02021-11-11 21:11:51 -0800726 std::vector<CommandResultPayload> results;
727 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700728 if (!status.isOk()) {
729 ALOGE("executeCommands failed %s", status.getDescription().c_str());
730 return static_cast<Error>(status.getServiceSpecificError());
731 }
732
Ady Abrahama6388c02021-11-11 21:11:51 -0800733 mReader.parse(results);
734 const auto commandErrors = mReader.takeErrors();
735 Error error = Error::NONE;
736 for (const auto& cmdErr : commandErrors) {
737 const auto index = static_cast<size_t>(cmdErr.commandIndex);
738 if (index < 0 || index >= commands.size()) {
739 ALOGE("invalid command index %zu", index);
740 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700741 }
742
Ady Abrahama6388c02021-11-11 21:11:51 -0800743 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800744 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
745 error = translate<Error>(cmdErr.errorCode);
746 } else {
747 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
748 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700749 }
750 }
751
752 mWriter.reset();
753
754 return error;
755}
756
757Error AidlComposer::setLayerPerFrameMetadata(
758 Display display, Layer layer,
759 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800760 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
761 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700762 return Error::NONE;
763}
764
765std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
766 Display display) {
767 std::vector<AidlPerFrameMetadataKey> keys;
768 const auto status =
769 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
770 if (!status.isOk()) {
771 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
772 return {};
773 }
774 return translate<IComposerClient::PerFrameMetadataKey>(keys);
775}
776
777Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
778 std::vector<RenderIntent>* outRenderIntents) {
779 std::vector<AidlRenderIntent> renderIntents;
780 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
781 translate<AidlColorMode>(colorMode),
782 &renderIntents);
783 if (!status.isOk()) {
784 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
785 return static_cast<Error>(status.getServiceSpecificError());
786 }
787 *outRenderIntents = translate<RenderIntent>(renderIntents);
788 return Error::NONE;
789}
790
791Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
792 std::vector<float> matrix;
793 const auto status =
794 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
795 &matrix);
796 if (!status.isOk()) {
797 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
798 return static_cast<Error>(status.getServiceSpecificError());
799 }
800 *outMatrix = makeMat4(matrix);
801 return Error::NONE;
802}
803
804Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
805 std::vector<uint8_t>* outData) {
806 AidlDisplayIdentification displayIdentification;
807 const auto status =
808 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
809 &displayIdentification);
810 if (!status.isOk()) {
811 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
812 return static_cast<Error>(status.getServiceSpecificError());
813 }
814
815 *outPort = static_cast<uint8_t>(displayIdentification.port);
816 *outData = displayIdentification.data;
817
818 return Error::NONE;
819}
820
821Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800822 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700823 return Error::NONE;
824}
825
826Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
827 Dataspace* outDataspace,
828 uint8_t* outComponentMask) {
829 if (!outFormat || !outDataspace || !outComponentMask) {
830 return Error::BAD_PARAMETER;
831 }
832
833 AidlDisplayContentSamplingAttributes attributes;
834 const auto status =
835 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
836 &attributes);
837 if (!status.isOk()) {
838 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
839 return static_cast<Error>(status.getServiceSpecificError());
840 }
841
842 *outFormat = translate<PixelFormat>(attributes.format);
843 *outDataspace = translate<Dataspace>(attributes.dataspace);
844 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
845 return Error::NONE;
846}
847
848Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
849 uint8_t componentMask, uint64_t maxFrames) {
850 const auto status =
851 mAidlComposerClient
852 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
853 static_cast<AidlFormatColorComponent>(
854 componentMask),
855 static_cast<int64_t>(maxFrames));
856 if (!status.isOk()) {
857 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
858 return static_cast<Error>(status.getServiceSpecificError());
859 }
860 return Error::NONE;
861}
862
863Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
864 uint64_t timestamp, DisplayedFrameStats* outStats) {
865 if (!outStats) {
866 return Error::BAD_PARAMETER;
867 }
868
869 AidlDisplayContentSample sample;
870 const auto status =
871 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
872 static_cast<int64_t>(maxFrames),
873 static_cast<int64_t>(timestamp),
874 &sample);
875 if (!status.isOk()) {
876 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
877 return static_cast<Error>(status.getServiceSpecificError());
878 }
879 *outStats = translate<DisplayedFrameStats>(sample);
880 return Error::NONE;
881}
882
883Error AidlComposer::setLayerPerFrameMetadataBlobs(
884 Display display, Layer layer,
885 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800886 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
887 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700888 return Error::NONE;
889}
890
891Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
892 const auto status =
893 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
894 if (!status.isOk()) {
895 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
896 return static_cast<Error>(status.getServiceSpecificError());
897 }
898 return Error::NONE;
899}
900
901Error AidlComposer::getDisplayCapabilities(Display display,
902 std::vector<DisplayCapability>* outCapabilities) {
903 std::vector<AidlDisplayCapability> capabilities;
904 const auto status =
905 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
906 if (!status.isOk()) {
907 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
908 return static_cast<Error>(status.getServiceSpecificError());
909 }
910 *outCapabilities = translate<DisplayCapability>(capabilities);
911 return Error::NONE;
912}
913
914V2_4::Error AidlComposer::getDisplayConnectionType(
915 Display display, IComposerClient::DisplayConnectionType* outType) {
916 AidlDisplayConnectionType type;
917 const auto status =
918 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
919 if (!status.isOk()) {
920 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
921 return static_cast<V2_4::Error>(status.getServiceSpecificError());
922 }
923 *outType = translate<IComposerClient::DisplayConnectionType>(type);
924 return V2_4::Error::NONE;
925}
926
927V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
928 int32_t vsyncPeriod;
929 const auto status =
930 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
931 if (!status.isOk()) {
932 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
933 return static_cast<V2_4::Error>(status.getServiceSpecificError());
934 }
935 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
936 return V2_4::Error::NONE;
937}
938
939V2_4::Error AidlComposer::setActiveConfigWithConstraints(
940 Display display, Config config,
941 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
942 VsyncPeriodChangeTimeline* outTimeline) {
943 AidlVsyncPeriodChangeTimeline timeline;
944 const auto status =
945 mAidlComposerClient
946 ->setActiveConfigWithConstraints(translate<int64_t>(display),
947 translate<int32_t>(config),
948 translate<AidlVsyncPeriodChangeConstraints>(
949 vsyncPeriodChangeConstraints),
950 &timeline);
951 if (!status.isOk()) {
952 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
953 return static_cast<V2_4::Error>(status.getServiceSpecificError());
954 }
955 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
956 return V2_4::Error::NONE;
957}
958
959V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
960 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
961 if (!status.isOk()) {
962 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
963 return static_cast<V2_4::Error>(status.getServiceSpecificError());
964 }
965 return V2_4::Error::NONE;
966}
967
968V2_4::Error AidlComposer::getSupportedContentTypes(
969 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
970 std::vector<AidlContentType> types;
971 const auto status =
972 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
973 if (!status.isOk()) {
974 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
975 return static_cast<V2_4::Error>(status.getServiceSpecificError());
976 }
977 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
978 return V2_4::Error::NONE;
979}
980
981V2_4::Error AidlComposer::setContentType(Display display,
982 IComposerClient::ContentType contentType) {
983 const auto status =
984 mAidlComposerClient->setContentType(translate<int64_t>(display),
985 translate<AidlContentType>(contentType));
986 if (!status.isOk()) {
987 ALOGE("setContentType failed %s", status.getDescription().c_str());
988 return static_cast<V2_4::Error>(status.getServiceSpecificError());
989 }
990 return V2_4::Error::NONE;
991}
992
993V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
994 const std::string& key, bool mandatory,
995 const std::vector<uint8_t>& value) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800996 mWriter.setLayerGenericMetadata(translate<int64_t>(display), translate<int64_t>(layer), key,
997 mandatory, value);
Ady Abrahame7385f72021-09-05 00:54:25 -0700998 return V2_4::Error::NONE;
999}
1000
1001V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
1002 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1003 std::vector<AidlLayerGenericMetadataKey> keys;
1004 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
1005 if (!status.isOk()) {
1006 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
1007 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1008 }
1009 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
1010 return V2_4::Error::NONE;
1011}
1012
1013Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001014 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1015 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -08001016 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001017 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -08001018 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -07001019 return Error::NONE;
1020}
1021
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001022Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1023 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1024 whitePointNits);
1025 return Error::NONE;
1026}
1027
Ady Abrahame7385f72021-09-05 00:54:25 -07001028} // namespace Hwc2
1029} // namespace android