blob: 3bed796a772e131d10eb2bd3e7dd254af55d55eb [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:
259 return true;
260 }
261}
262
Ady Abrahame7385f72021-09-05 00:54:25 -0700263std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
264 std::vector<Capability> capabilities;
265 const auto status = mAidlComposer->getCapabilities(&capabilities);
266 if (!status.isOk()) {
267 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
268 return {};
269 }
270 return translate<IComposer::Capability>(capabilities);
271}
272
273std::string AidlComposer::dumpDebugInfo() {
274 std::string info;
275 const auto status = mAidlComposer->dumpDebugInfo(&info);
276 if (!status.isOk()) {
277 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
278 return {};
279 }
280 return info;
281}
282
283void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
284 if (mAidlComposerCallback) {
285 ALOGE("Callback already registered");
286 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700287 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700288 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
296void AidlComposer::resetCommands() {
297 mWriter.reset();
298}
299
300Error AidlComposer::executeCommands() {
301 return execute();
302}
303
304uint32_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
314Error 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
335Error 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
344Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800345 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700346 return Error::NONE;
347}
348
349Error 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
362Error 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
372Error 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
383Error AidlComposer::getChangedCompositionTypes(
384 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500385 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800386 std::vector<int64_t> layers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500387 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
Ady Abrahama6388c02021-11-11 21:11:51 -0800388
389 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700390 return Error::NONE;
391}
392
393Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
394 std::vector<AidlColorMode> modes;
395 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
396 if (!status.isOk()) {
397 ALOGE("getColorModes failed %s", status.getDescription().c_str());
398 return static_cast<Error>(status.getServiceSpecificError());
399 }
400 *outModes = translate<ColorMode>(modes);
401 return Error::NONE;
402}
403
404Error AidlComposer::getDisplayAttribute(Display display, Config config,
405 IComposerClient::Attribute attribute, int32_t* outValue) {
406 const auto status =
407 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
408 translate<int32_t>(config),
409 static_cast<AidlDisplayAttribute>(attribute),
410 outValue);
411 if (!status.isOk()) {
412 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
413 return static_cast<Error>(status.getServiceSpecificError());
414 }
415 return Error::NONE;
416}
417
418Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
419 std::vector<int32_t> configs;
420 const auto status =
421 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
422 if (!status.isOk()) {
423 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
424 return static_cast<Error>(status.getServiceSpecificError());
425 }
426 *outConfigs = translate<Config>(configs);
427 return Error::NONE;
428}
429
430Error AidlComposer::getDisplayName(Display display, std::string* outName) {
431 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
432 if (!status.isOk()) {
433 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
434 return static_cast<Error>(status.getServiceSpecificError());
435 }
436 return Error::NONE;
437}
438
439Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
440 std::vector<Layer>* outLayers,
441 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800442 std::vector<int64_t> layers;
443 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
444 outLayerRequestMasks);
445 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700446 return Error::NONE;
447}
448
449Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800450 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700451 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800452 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700453 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800454 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700455 return static_cast<Error>(status.getServiceSpecificError());
456 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800457 *outSupport = std::find(capabilities.begin(), capabilities.end(),
458 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700459 return Error::NONE;
460}
461
462Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
463 float* outMaxLuminance, float* outMaxAverageLuminance,
464 float* outMinLuminance) {
465 AidlHdrCapabilities capabilities;
466 const auto status =
467 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
468 if (!status.isOk()) {
469 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
470 return static_cast<Error>(status.getServiceSpecificError());
471 }
472
473 *outTypes = translate<Hdr>(capabilities.types);
474 *outMaxLuminance = capabilities.maxLuminance;
475 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
476 *outMinLuminance = capabilities.minLuminance;
477 return Error::NONE;
478}
479
480Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
481 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800482 std::vector<int64_t> layers;
483 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
484 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700485 return Error::NONE;
486}
487
488Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
489 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800490 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700491
492 Error error = execute();
493 if (error != Error::NONE) {
494 return error;
495 }
496
Ady Abrahama6388c02021-11-11 21:11:51 -0800497 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700498
499 return Error::NONE;
500}
501
502Error AidlComposer::setActiveConfig(Display display, Config config) {
503 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
504 translate<int32_t>(config));
505 if (!status.isOk()) {
506 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
507 return static_cast<Error>(status.getServiceSpecificError());
508 }
509 return Error::NONE;
510}
511
512Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
513 int acquireFence, Dataspace dataspace,
514 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700515 const native_handle_t* handle = nullptr;
516 if (target.get()) {
517 handle = target->getNativeBuffer()->handle;
518 }
519
Ady Abrahama6388c02021-11-11 21:11:51 -0800520 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700521 translate<aidl::android::hardware::graphics::common::Dataspace>(
522 dataspace),
523 translate<AidlRect>(damage));
524 return Error::NONE;
525}
526
527Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
528 const auto status =
529 mAidlComposerClient->setColorMode(translate<int64_t>(display),
530 translate<AidlColorMode>(mode),
531 translate<AidlRenderIntent>(renderIntent));
532 if (!status.isOk()) {
533 ALOGE("setColorMode failed %s", status.getDescription().c_str());
534 return static_cast<Error>(status.getServiceSpecificError());
535 }
536 return Error::NONE;
537}
538
539Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800540 mWriter.setColorTransform(translate<int64_t>(display), matrix,
541 translate<AidlColorTransform>(hint));
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
583Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
584 uint32_t* outNumRequests) {
585 ATRACE_NAME("HwcValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800586 mWriter.validateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700587
588 Error error = execute();
589 if (error != Error::NONE) {
590 return error;
591 }
592
Ady Abrahama6388c02021-11-11 21:11:51 -0800593 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700594
595 return Error::NONE;
596}
597
598Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
599 uint32_t* outNumRequests, int* outPresentFence,
600 uint32_t* state) {
601 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800602 mWriter.presentOrvalidateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700603
604 Error error = execute();
605 if (error != Error::NONE) {
606 return error;
607 }
608
Ady Abrahama6388c02021-11-11 21:11:51 -0800609 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700610
611 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800612 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700613 }
614
615 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800616 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700617 }
618
619 return Error::NONE;
620}
621
622Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800623 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700624 return Error::NONE;
625}
626
627Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
628 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700629 const native_handle_t* handle = nullptr;
630 if (buffer.get()) {
631 handle = buffer->getNativeBuffer()->handle;
632 }
633
Ady Abrahama6388c02021-11-11 21:11:51 -0800634 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
635 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700636 return Error::NONE;
637}
638
639Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
640 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800641 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
642 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700643 return Error::NONE;
644}
645
646Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
647 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800648 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
649 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700650 return Error::NONE;
651}
652
653Error AidlComposer::setLayerColor(Display display, Layer layer,
654 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800655 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
656 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700657 return Error::NONE;
658}
659
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500660Error AidlComposer::setLayerCompositionType(
661 Display display, Layer layer,
662 aidl::android::hardware::graphics::composer3::Composition type) {
663 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700664 return Error::NONE;
665}
666
667Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800668 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
669 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700670 return Error::NONE;
671}
672
673Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
674 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800675 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
676 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700677 return Error::NONE;
678}
679
680Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800681 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700682 return Error::NONE;
683}
684
685Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
686 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800687 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700688 return Error::NONE;
689}
690
691Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
692 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800693 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
694 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700695 return Error::NONE;
696}
697
698Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800699 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
700 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return Error::NONE;
702}
703
704Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
705 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800706 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
707 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700708 return Error::NONE;
709}
710
711Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800712 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700713 return Error::NONE;
714}
715
716Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800717 const auto& commands = mWriter.getPendingCommands();
718 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700719 mWriter.reset();
720 return Error::NONE;
721 }
722
Ady Abrahama6388c02021-11-11 21:11:51 -0800723 std::vector<CommandResultPayload> results;
724 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700725 if (!status.isOk()) {
726 ALOGE("executeCommands failed %s", status.getDescription().c_str());
727 return static_cast<Error>(status.getServiceSpecificError());
728 }
729
Ady Abrahama6388c02021-11-11 21:11:51 -0800730 mReader.parse(results);
731 const auto commandErrors = mReader.takeErrors();
732 Error error = Error::NONE;
733 for (const auto& cmdErr : commandErrors) {
734 const auto index = static_cast<size_t>(cmdErr.commandIndex);
735 if (index < 0 || index >= commands.size()) {
736 ALOGE("invalid command index %zu", index);
737 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700738 }
739
Ady Abrahama6388c02021-11-11 21:11:51 -0800740 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800741 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
742 error = translate<Error>(cmdErr.errorCode);
743 } else {
744 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
745 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700746 }
747 }
748
749 mWriter.reset();
750
751 return error;
752}
753
754Error AidlComposer::setLayerPerFrameMetadata(
755 Display display, Layer layer,
756 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800757 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
758 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700759 return Error::NONE;
760}
761
762std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
763 Display display) {
764 std::vector<AidlPerFrameMetadataKey> keys;
765 const auto status =
766 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
767 if (!status.isOk()) {
768 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
769 return {};
770 }
771 return translate<IComposerClient::PerFrameMetadataKey>(keys);
772}
773
774Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
775 std::vector<RenderIntent>* outRenderIntents) {
776 std::vector<AidlRenderIntent> renderIntents;
777 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
778 translate<AidlColorMode>(colorMode),
779 &renderIntents);
780 if (!status.isOk()) {
781 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
782 return static_cast<Error>(status.getServiceSpecificError());
783 }
784 *outRenderIntents = translate<RenderIntent>(renderIntents);
785 return Error::NONE;
786}
787
788Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
789 std::vector<float> matrix;
790 const auto status =
791 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
792 &matrix);
793 if (!status.isOk()) {
794 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
795 return static_cast<Error>(status.getServiceSpecificError());
796 }
797 *outMatrix = makeMat4(matrix);
798 return Error::NONE;
799}
800
801Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
802 std::vector<uint8_t>* outData) {
803 AidlDisplayIdentification displayIdentification;
804 const auto status =
805 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
806 &displayIdentification);
807 if (!status.isOk()) {
808 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
809 return static_cast<Error>(status.getServiceSpecificError());
810 }
811
812 *outPort = static_cast<uint8_t>(displayIdentification.port);
813 *outData = displayIdentification.data;
814
815 return Error::NONE;
816}
817
818Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800819 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700820 return Error::NONE;
821}
822
823Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
824 Dataspace* outDataspace,
825 uint8_t* outComponentMask) {
826 if (!outFormat || !outDataspace || !outComponentMask) {
827 return Error::BAD_PARAMETER;
828 }
829
830 AidlDisplayContentSamplingAttributes attributes;
831 const auto status =
832 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
833 &attributes);
834 if (!status.isOk()) {
835 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
836 return static_cast<Error>(status.getServiceSpecificError());
837 }
838
839 *outFormat = translate<PixelFormat>(attributes.format);
840 *outDataspace = translate<Dataspace>(attributes.dataspace);
841 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
842 return Error::NONE;
843}
844
845Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
846 uint8_t componentMask, uint64_t maxFrames) {
847 const auto status =
848 mAidlComposerClient
849 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
850 static_cast<AidlFormatColorComponent>(
851 componentMask),
852 static_cast<int64_t>(maxFrames));
853 if (!status.isOk()) {
854 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
855 return static_cast<Error>(status.getServiceSpecificError());
856 }
857 return Error::NONE;
858}
859
860Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
861 uint64_t timestamp, DisplayedFrameStats* outStats) {
862 if (!outStats) {
863 return Error::BAD_PARAMETER;
864 }
865
866 AidlDisplayContentSample sample;
867 const auto status =
868 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
869 static_cast<int64_t>(maxFrames),
870 static_cast<int64_t>(timestamp),
871 &sample);
872 if (!status.isOk()) {
873 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
874 return static_cast<Error>(status.getServiceSpecificError());
875 }
876 *outStats = translate<DisplayedFrameStats>(sample);
877 return Error::NONE;
878}
879
880Error AidlComposer::setLayerPerFrameMetadataBlobs(
881 Display display, Layer layer,
882 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800883 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
884 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700885 return Error::NONE;
886}
887
888Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
889 const auto status =
890 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
891 if (!status.isOk()) {
892 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
893 return static_cast<Error>(status.getServiceSpecificError());
894 }
895 return Error::NONE;
896}
897
898Error AidlComposer::getDisplayCapabilities(Display display,
899 std::vector<DisplayCapability>* outCapabilities) {
900 std::vector<AidlDisplayCapability> capabilities;
901 const auto status =
902 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
903 if (!status.isOk()) {
904 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
905 return static_cast<Error>(status.getServiceSpecificError());
906 }
907 *outCapabilities = translate<DisplayCapability>(capabilities);
908 return Error::NONE;
909}
910
911V2_4::Error AidlComposer::getDisplayConnectionType(
912 Display display, IComposerClient::DisplayConnectionType* outType) {
913 AidlDisplayConnectionType type;
914 const auto status =
915 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
916 if (!status.isOk()) {
917 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
918 return static_cast<V2_4::Error>(status.getServiceSpecificError());
919 }
920 *outType = translate<IComposerClient::DisplayConnectionType>(type);
921 return V2_4::Error::NONE;
922}
923
924V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
925 int32_t vsyncPeriod;
926 const auto status =
927 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
928 if (!status.isOk()) {
929 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
930 return static_cast<V2_4::Error>(status.getServiceSpecificError());
931 }
932 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
933 return V2_4::Error::NONE;
934}
935
936V2_4::Error AidlComposer::setActiveConfigWithConstraints(
937 Display display, Config config,
938 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
939 VsyncPeriodChangeTimeline* outTimeline) {
940 AidlVsyncPeriodChangeTimeline timeline;
941 const auto status =
942 mAidlComposerClient
943 ->setActiveConfigWithConstraints(translate<int64_t>(display),
944 translate<int32_t>(config),
945 translate<AidlVsyncPeriodChangeConstraints>(
946 vsyncPeriodChangeConstraints),
947 &timeline);
948 if (!status.isOk()) {
949 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
950 return static_cast<V2_4::Error>(status.getServiceSpecificError());
951 }
952 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
953 return V2_4::Error::NONE;
954}
955
956V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
957 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
958 if (!status.isOk()) {
959 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
960 return static_cast<V2_4::Error>(status.getServiceSpecificError());
961 }
962 return V2_4::Error::NONE;
963}
964
965V2_4::Error AidlComposer::getSupportedContentTypes(
966 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
967 std::vector<AidlContentType> types;
968 const auto status =
969 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
970 if (!status.isOk()) {
971 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
972 return static_cast<V2_4::Error>(status.getServiceSpecificError());
973 }
974 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
975 return V2_4::Error::NONE;
976}
977
978V2_4::Error AidlComposer::setContentType(Display display,
979 IComposerClient::ContentType contentType) {
980 const auto status =
981 mAidlComposerClient->setContentType(translate<int64_t>(display),
982 translate<AidlContentType>(contentType));
983 if (!status.isOk()) {
984 ALOGE("setContentType failed %s", status.getDescription().c_str());
985 return static_cast<V2_4::Error>(status.getServiceSpecificError());
986 }
987 return V2_4::Error::NONE;
988}
989
990V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
991 const std::string& key, bool mandatory,
992 const std::vector<uint8_t>& value) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800993 mWriter.setLayerGenericMetadata(translate<int64_t>(display), translate<int64_t>(layer), key,
994 mandatory, value);
Ady Abrahame7385f72021-09-05 00:54:25 -0700995 return V2_4::Error::NONE;
996}
997
998V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
999 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1000 std::vector<AidlLayerGenericMetadataKey> keys;
1001 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
1002 if (!status.isOk()) {
1003 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
1004 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1005 }
1006 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
1007 return V2_4::Error::NONE;
1008}
1009
1010Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001011 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1012 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -08001013 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001014 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -08001015 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -07001016 return Error::NONE;
1017}
1018
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001019Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1020 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1021 whitePointNits);
1022 return Error::NONE;
1023}
1024
Ady Abrahame7385f72021-09-05 00:54:25 -07001025} // namespace Hwc2
1026} // namespace android