blob: c9b61446551475db3f738f063878f9ecaafa6b16 [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
256std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
257 std::vector<Capability> capabilities;
258 const auto status = mAidlComposer->getCapabilities(&capabilities);
259 if (!status.isOk()) {
260 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
261 return {};
262 }
263 return translate<IComposer::Capability>(capabilities);
264}
265
266std::string AidlComposer::dumpDebugInfo() {
267 std::string info;
268 const auto status = mAidlComposer->dumpDebugInfo(&info);
269 if (!status.isOk()) {
270 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
271 return {};
272 }
273 return info;
274}
275
276void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
277 if (mAidlComposerCallback) {
278 ALOGE("Callback already registered");
279 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700280 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700281 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
282
283 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
284 if (!status.isOk()) {
285 ALOGE("registerCallback failed %s", status.getDescription().c_str());
286 }
287}
288
289void AidlComposer::resetCommands() {
290 mWriter.reset();
291}
292
293Error AidlComposer::executeCommands() {
294 return execute();
295}
296
297uint32_t AidlComposer::getMaxVirtualDisplayCount() {
298 int32_t count = 0;
299 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
300 if (!status.isOk()) {
301 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
302 return 0;
303 }
304 return static_cast<uint32_t>(count);
305}
306
307Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
308 Display* outDisplay) {
309 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
310 const int32_t bufferSlotCount = 1;
311 VirtualDisplay virtualDisplay;
312 const auto status =
313 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
314 static_cast<int32_t>(height),
315 static_cast<AidlPixelFormat>(*format),
316 bufferSlotCount, &virtualDisplay);
317
318 if (!status.isOk()) {
319 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
320 return static_cast<Error>(status.getServiceSpecificError());
321 }
322
323 *outDisplay = translate<Display>(virtualDisplay.display);
324 *format = static_cast<PixelFormat>(virtualDisplay.format);
325 return Error::NONE;
326}
327
328Error AidlComposer::destroyVirtualDisplay(Display display) {
329 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
330 if (!status.isOk()) {
331 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
332 return static_cast<Error>(status.getServiceSpecificError());
333 }
334 return Error::NONE;
335}
336
337Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800338 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700339 return Error::NONE;
340}
341
342Error AidlComposer::createLayer(Display display, Layer* outLayer) {
343 int64_t layer;
344 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
345 kMaxLayerBufferCount, &layer);
346 if (!status.isOk()) {
347 ALOGE("createLayer failed %s", status.getDescription().c_str());
348 return static_cast<Error>(status.getServiceSpecificError());
349 }
350
351 *outLayer = translate<Layer>(layer);
352 return Error::NONE;
353}
354
355Error AidlComposer::destroyLayer(Display display, Layer layer) {
356 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
357 translate<int64_t>(layer));
358 if (!status.isOk()) {
359 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
360 return static_cast<Error>(status.getServiceSpecificError());
361 }
362 return Error::NONE;
363}
364
365Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
366 int32_t config;
367 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
368 if (!status.isOk()) {
369 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
370 return static_cast<Error>(status.getServiceSpecificError());
371 }
372 *outConfig = translate<Config>(config);
373 return Error::NONE;
374}
375
376Error AidlComposer::getChangedCompositionTypes(
377 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500378 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800379 std::vector<int64_t> layers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500380 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
Ady Abrahama6388c02021-11-11 21:11:51 -0800381
382 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700383 return Error::NONE;
384}
385
386Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
387 std::vector<AidlColorMode> modes;
388 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
389 if (!status.isOk()) {
390 ALOGE("getColorModes failed %s", status.getDescription().c_str());
391 return static_cast<Error>(status.getServiceSpecificError());
392 }
393 *outModes = translate<ColorMode>(modes);
394 return Error::NONE;
395}
396
397Error AidlComposer::getDisplayAttribute(Display display, Config config,
398 IComposerClient::Attribute attribute, int32_t* outValue) {
399 const auto status =
400 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
401 translate<int32_t>(config),
402 static_cast<AidlDisplayAttribute>(attribute),
403 outValue);
404 if (!status.isOk()) {
405 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
406 return static_cast<Error>(status.getServiceSpecificError());
407 }
408 return Error::NONE;
409}
410
411Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
412 std::vector<int32_t> configs;
413 const auto status =
414 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
415 if (!status.isOk()) {
416 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
417 return static_cast<Error>(status.getServiceSpecificError());
418 }
419 *outConfigs = translate<Config>(configs);
420 return Error::NONE;
421}
422
423Error AidlComposer::getDisplayName(Display display, std::string* outName) {
424 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
425 if (!status.isOk()) {
426 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
427 return static_cast<Error>(status.getServiceSpecificError());
428 }
429 return Error::NONE;
430}
431
432Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
433 std::vector<Layer>* outLayers,
434 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800435 std::vector<int64_t> layers;
436 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
437 outLayerRequestMasks);
438 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700439 return Error::NONE;
440}
441
442Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800443 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700444 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800445 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700446 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800447 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700448 return static_cast<Error>(status.getServiceSpecificError());
449 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800450 *outSupport = std::find(capabilities.begin(), capabilities.end(),
451 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700452 return Error::NONE;
453}
454
455Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
456 float* outMaxLuminance, float* outMaxAverageLuminance,
457 float* outMinLuminance) {
458 AidlHdrCapabilities capabilities;
459 const auto status =
460 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
461 if (!status.isOk()) {
462 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
463 return static_cast<Error>(status.getServiceSpecificError());
464 }
465
466 *outTypes = translate<Hdr>(capabilities.types);
467 *outMaxLuminance = capabilities.maxLuminance;
468 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
469 *outMinLuminance = capabilities.minLuminance;
470 return Error::NONE;
471}
472
473Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
474 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800475 std::vector<int64_t> layers;
476 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
477 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700478 return Error::NONE;
479}
480
481Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
482 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800483 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700484
485 Error error = execute();
486 if (error != Error::NONE) {
487 return error;
488 }
489
Ady Abrahama6388c02021-11-11 21:11:51 -0800490 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700491
492 return Error::NONE;
493}
494
495Error AidlComposer::setActiveConfig(Display display, Config config) {
496 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
497 translate<int32_t>(config));
498 if (!status.isOk()) {
499 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
500 return static_cast<Error>(status.getServiceSpecificError());
501 }
502 return Error::NONE;
503}
504
505Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
506 int acquireFence, Dataspace dataspace,
507 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700508 const native_handle_t* handle = nullptr;
509 if (target.get()) {
510 handle = target->getNativeBuffer()->handle;
511 }
512
Ady Abrahama6388c02021-11-11 21:11:51 -0800513 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700514 translate<aidl::android::hardware::graphics::common::Dataspace>(
515 dataspace),
516 translate<AidlRect>(damage));
517 return Error::NONE;
518}
519
520Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
521 const auto status =
522 mAidlComposerClient->setColorMode(translate<int64_t>(display),
523 translate<AidlColorMode>(mode),
524 translate<AidlRenderIntent>(renderIntent));
525 if (!status.isOk()) {
526 ALOGE("setColorMode failed %s", status.getDescription().c_str());
527 return static_cast<Error>(status.getServiceSpecificError());
528 }
529 return Error::NONE;
530}
531
532Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800533 mWriter.setColorTransform(translate<int64_t>(display), matrix,
534 translate<AidlColorTransform>(hint));
Ady Abrahame7385f72021-09-05 00:54:25 -0700535 return Error::NONE;
536}
537
538Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
539 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800540 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700541 return Error::NONE;
542}
543
544Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
545 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
546 translate<PowerMode>(mode));
547 if (!status.isOk()) {
548 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
549 return static_cast<Error>(status.getServiceSpecificError());
550 }
551 return Error::NONE;
552}
553
554Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
555 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
556 const auto status =
557 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
558 if (!status.isOk()) {
559 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
560 return static_cast<Error>(status.getServiceSpecificError());
561 }
562 return Error::NONE;
563}
564
565Error AidlComposer::setClientTargetSlotCount(Display display) {
566 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
567 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
568 bufferSlotCount);
569 if (!status.isOk()) {
570 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
571 return static_cast<Error>(status.getServiceSpecificError());
572 }
573 return Error::NONE;
574}
575
576Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
577 uint32_t* outNumRequests) {
578 ATRACE_NAME("HwcValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800579 mWriter.validateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700580
581 Error error = execute();
582 if (error != Error::NONE) {
583 return error;
584 }
585
Ady Abrahama6388c02021-11-11 21:11:51 -0800586 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700587
588 return Error::NONE;
589}
590
591Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
592 uint32_t* outNumRequests, int* outPresentFence,
593 uint32_t* state) {
594 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800595 mWriter.presentOrvalidateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700596
597 Error error = execute();
598 if (error != Error::NONE) {
599 return error;
600 }
601
Ady Abrahama6388c02021-11-11 21:11:51 -0800602 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700603
604 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800605 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700606 }
607
608 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800609 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700610 }
611
612 return Error::NONE;
613}
614
615Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800616 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700617 return Error::NONE;
618}
619
620Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
621 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700622 const native_handle_t* handle = nullptr;
623 if (buffer.get()) {
624 handle = buffer->getNativeBuffer()->handle;
625 }
626
Ady Abrahama6388c02021-11-11 21:11:51 -0800627 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
628 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700629 return Error::NONE;
630}
631
632Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
633 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800634 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
635 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700636 return Error::NONE;
637}
638
639Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
640 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800641 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
642 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700643 return Error::NONE;
644}
645
646Error AidlComposer::setLayerColor(Display display, Layer layer,
647 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800648 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
649 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700650 return Error::NONE;
651}
652
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500653Error AidlComposer::setLayerCompositionType(
654 Display display, Layer layer,
655 aidl::android::hardware::graphics::composer3::Composition type) {
656 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700657 return Error::NONE;
658}
659
660Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800661 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
662 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700663 return Error::NONE;
664}
665
666Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
667 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800668 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
669 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700670 return Error::NONE;
671}
672
673Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800674 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700675 return Error::NONE;
676}
677
678Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
679 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800680 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700681 return Error::NONE;
682}
683
684Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
685 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800686 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
687 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700688 return Error::NONE;
689}
690
691Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800692 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
693 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700694 return Error::NONE;
695}
696
697Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
698 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800699 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
700 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return Error::NONE;
702}
703
704Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800705 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700706 return Error::NONE;
707}
708
709Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800710 const auto& commands = mWriter.getPendingCommands();
711 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700712 mWriter.reset();
713 return Error::NONE;
714 }
715
Ady Abrahama6388c02021-11-11 21:11:51 -0800716 std::vector<CommandResultPayload> results;
717 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700718 if (!status.isOk()) {
719 ALOGE("executeCommands failed %s", status.getDescription().c_str());
720 return static_cast<Error>(status.getServiceSpecificError());
721 }
722
Ady Abrahama6388c02021-11-11 21:11:51 -0800723 mReader.parse(results);
724 const auto commandErrors = mReader.takeErrors();
725 Error error = Error::NONE;
726 for (const auto& cmdErr : commandErrors) {
727 const auto index = static_cast<size_t>(cmdErr.commandIndex);
728 if (index < 0 || index >= commands.size()) {
729 ALOGE("invalid command index %zu", index);
730 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700731 }
732
Ady Abrahama6388c02021-11-11 21:11:51 -0800733 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800734 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
735 error = translate<Error>(cmdErr.errorCode);
736 } else {
737 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
738 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700739 }
740 }
741
742 mWriter.reset();
743
744 return error;
745}
746
747Error AidlComposer::setLayerPerFrameMetadata(
748 Display display, Layer layer,
749 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800750 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
751 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700752 return Error::NONE;
753}
754
755std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
756 Display display) {
757 std::vector<AidlPerFrameMetadataKey> keys;
758 const auto status =
759 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
760 if (!status.isOk()) {
761 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
762 return {};
763 }
764 return translate<IComposerClient::PerFrameMetadataKey>(keys);
765}
766
767Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
768 std::vector<RenderIntent>* outRenderIntents) {
769 std::vector<AidlRenderIntent> renderIntents;
770 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
771 translate<AidlColorMode>(colorMode),
772 &renderIntents);
773 if (!status.isOk()) {
774 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
775 return static_cast<Error>(status.getServiceSpecificError());
776 }
777 *outRenderIntents = translate<RenderIntent>(renderIntents);
778 return Error::NONE;
779}
780
781Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
782 std::vector<float> matrix;
783 const auto status =
784 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
785 &matrix);
786 if (!status.isOk()) {
787 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
788 return static_cast<Error>(status.getServiceSpecificError());
789 }
790 *outMatrix = makeMat4(matrix);
791 return Error::NONE;
792}
793
794Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
795 std::vector<uint8_t>* outData) {
796 AidlDisplayIdentification displayIdentification;
797 const auto status =
798 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
799 &displayIdentification);
800 if (!status.isOk()) {
801 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
802 return static_cast<Error>(status.getServiceSpecificError());
803 }
804
805 *outPort = static_cast<uint8_t>(displayIdentification.port);
806 *outData = displayIdentification.data;
807
808 return Error::NONE;
809}
810
811Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800812 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700813 return Error::NONE;
814}
815
816Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
817 Dataspace* outDataspace,
818 uint8_t* outComponentMask) {
819 if (!outFormat || !outDataspace || !outComponentMask) {
820 return Error::BAD_PARAMETER;
821 }
822
823 AidlDisplayContentSamplingAttributes attributes;
824 const auto status =
825 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
826 &attributes);
827 if (!status.isOk()) {
828 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
829 return static_cast<Error>(status.getServiceSpecificError());
830 }
831
832 *outFormat = translate<PixelFormat>(attributes.format);
833 *outDataspace = translate<Dataspace>(attributes.dataspace);
834 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
835 return Error::NONE;
836}
837
838Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
839 uint8_t componentMask, uint64_t maxFrames) {
840 const auto status =
841 mAidlComposerClient
842 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
843 static_cast<AidlFormatColorComponent>(
844 componentMask),
845 static_cast<int64_t>(maxFrames));
846 if (!status.isOk()) {
847 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
848 return static_cast<Error>(status.getServiceSpecificError());
849 }
850 return Error::NONE;
851}
852
853Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
854 uint64_t timestamp, DisplayedFrameStats* outStats) {
855 if (!outStats) {
856 return Error::BAD_PARAMETER;
857 }
858
859 AidlDisplayContentSample sample;
860 const auto status =
861 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
862 static_cast<int64_t>(maxFrames),
863 static_cast<int64_t>(timestamp),
864 &sample);
865 if (!status.isOk()) {
866 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
867 return static_cast<Error>(status.getServiceSpecificError());
868 }
869 *outStats = translate<DisplayedFrameStats>(sample);
870 return Error::NONE;
871}
872
873Error AidlComposer::setLayerPerFrameMetadataBlobs(
874 Display display, Layer layer,
875 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800876 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
877 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700878 return Error::NONE;
879}
880
881Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
882 const auto status =
883 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
884 if (!status.isOk()) {
885 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
886 return static_cast<Error>(status.getServiceSpecificError());
887 }
888 return Error::NONE;
889}
890
891Error AidlComposer::getDisplayCapabilities(Display display,
892 std::vector<DisplayCapability>* outCapabilities) {
893 std::vector<AidlDisplayCapability> capabilities;
894 const auto status =
895 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
896 if (!status.isOk()) {
897 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
898 return static_cast<Error>(status.getServiceSpecificError());
899 }
900 *outCapabilities = translate<DisplayCapability>(capabilities);
901 return Error::NONE;
902}
903
904V2_4::Error AidlComposer::getDisplayConnectionType(
905 Display display, IComposerClient::DisplayConnectionType* outType) {
906 AidlDisplayConnectionType type;
907 const auto status =
908 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
909 if (!status.isOk()) {
910 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
911 return static_cast<V2_4::Error>(status.getServiceSpecificError());
912 }
913 *outType = translate<IComposerClient::DisplayConnectionType>(type);
914 return V2_4::Error::NONE;
915}
916
917V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
918 int32_t vsyncPeriod;
919 const auto status =
920 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
921 if (!status.isOk()) {
922 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
923 return static_cast<V2_4::Error>(status.getServiceSpecificError());
924 }
925 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
926 return V2_4::Error::NONE;
927}
928
929V2_4::Error AidlComposer::setActiveConfigWithConstraints(
930 Display display, Config config,
931 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
932 VsyncPeriodChangeTimeline* outTimeline) {
933 AidlVsyncPeriodChangeTimeline timeline;
934 const auto status =
935 mAidlComposerClient
936 ->setActiveConfigWithConstraints(translate<int64_t>(display),
937 translate<int32_t>(config),
938 translate<AidlVsyncPeriodChangeConstraints>(
939 vsyncPeriodChangeConstraints),
940 &timeline);
941 if (!status.isOk()) {
942 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
943 return static_cast<V2_4::Error>(status.getServiceSpecificError());
944 }
945 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
946 return V2_4::Error::NONE;
947}
948
949V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
950 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
951 if (!status.isOk()) {
952 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
953 return static_cast<V2_4::Error>(status.getServiceSpecificError());
954 }
955 return V2_4::Error::NONE;
956}
957
958V2_4::Error AidlComposer::getSupportedContentTypes(
959 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
960 std::vector<AidlContentType> types;
961 const auto status =
962 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
963 if (!status.isOk()) {
964 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
965 return static_cast<V2_4::Error>(status.getServiceSpecificError());
966 }
967 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
968 return V2_4::Error::NONE;
969}
970
971V2_4::Error AidlComposer::setContentType(Display display,
972 IComposerClient::ContentType contentType) {
973 const auto status =
974 mAidlComposerClient->setContentType(translate<int64_t>(display),
975 translate<AidlContentType>(contentType));
976 if (!status.isOk()) {
977 ALOGE("setContentType failed %s", status.getDescription().c_str());
978 return static_cast<V2_4::Error>(status.getServiceSpecificError());
979 }
980 return V2_4::Error::NONE;
981}
982
983V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
984 const std::string& key, bool mandatory,
985 const std::vector<uint8_t>& value) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800986 mWriter.setLayerGenericMetadata(translate<int64_t>(display), translate<int64_t>(layer), key,
987 mandatory, value);
Ady Abrahame7385f72021-09-05 00:54:25 -0700988 return V2_4::Error::NONE;
989}
990
991V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
992 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
993 std::vector<AidlLayerGenericMetadataKey> keys;
994 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
995 if (!status.isOk()) {
996 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
997 return static_cast<V2_4::Error>(status.getServiceSpecificError());
998 }
999 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
1000 return V2_4::Error::NONE;
1001}
1002
1003Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001004 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1005 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -08001006 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001007 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -08001008 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -07001009 return Error::NONE;
1010}
1011
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001012Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1013 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1014 whitePointNits);
1015 return Error::NONE;
1016}
1017
Ady Abrahame7385f72021-09-05 00:54:25 -07001018} // namespace Hwc2
1019} // namespace android