blob: e80fc34cce07bb0e3df7a64e959932e939336d66 [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;
Ady Abrahame7385f72021-09-05 00:54:25 -070062using AidlDisplayContentSamplingAttributes =
63 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
64using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
65using AidlDisplayConnectionType =
66 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070067
68using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
69using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
70using AidlFRect = aidl::android::hardware::graphics::common::FRect;
71using AidlRect = aidl::android::hardware::graphics::common::Rect;
72using AidlTransform = aidl::android::hardware::graphics::common::Transform;
73
74namespace Hwc2 {
75
76namespace {
77
78template <typename To, typename From>
79To translate(From x) {
80 return static_cast<To>(x);
81}
82
83template <typename To, typename From>
84std::vector<To> translate(const std::vector<From>& in) {
85 std::vector<To> out;
86 out.reserve(in.size());
87 std::transform(in.begin(), in.end(), std::back_inserter(out),
88 [](From x) { return translate<To>(x); });
89 return out;
90}
91
92template <>
93AidlRect translate(IComposerClient::Rect x) {
94 return AidlRect{
95 .left = x.left,
96 .top = x.top,
97 .right = x.right,
98 .bottom = x.bottom,
99 };
100}
101
102template <>
103AidlFRect translate(IComposerClient::FRect x) {
104 return AidlFRect{
105 .left = x.left,
106 .top = x.top,
107 .right = x.right,
108 .bottom = x.bottom,
109 };
110}
111
112template <>
113Color translate(IComposerClient::Color x) {
114 return Color{
115 .r = static_cast<int8_t>(x.r),
116 .g = static_cast<int8_t>(x.g),
117 .b = static_cast<int8_t>(x.b),
118 .a = static_cast<int8_t>(x.a),
119 };
120}
121
122template <>
123AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
124 AidlPerFrameMetadataBlob blob;
125 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
126 std::copy(blob.blob.begin(), blob.blob.end(), x.blob.begin());
127 return blob;
128}
129
130template <>
131AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
132 return AidlPerFrameMetadata{
133 .key = translate<AidlPerFrameMetadataKey>(x.key),
134 .value = x.value,
135 };
136}
137
138template <>
139DisplayedFrameStats translate(AidlDisplayContentSample x) {
140 return DisplayedFrameStats{
141 .numFrames = static_cast<uint64_t>(x.frameCount),
142 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
143 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
144 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
145 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
146 };
147}
148
149template <>
150AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
151 return AidlVsyncPeriodChangeConstraints{
152 .desiredTimeNanos = x.desiredTimeNanos,
153 .seamlessRequired = x.seamlessRequired,
154 };
155}
156
157template <>
158VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
159 return VsyncPeriodChangeTimeline{
160 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
161 .refreshRequired = x.refreshRequired,
162 .refreshTimeNanos = x.refreshTimeNanos,
163 };
164}
165
166template <>
Ady Abrahama6388c02021-11-11 21:11:51 -0800167IComposerClient::ClientTargetProperty translate(ClientTargetProperty x) {
168 return IComposerClient::ClientTargetProperty{
169 .pixelFormat = translate<PixelFormat>(x.pixelFormat),
170 .dataspace = translate<Dataspace>(x.dataspace),
171 };
172}
173
Ady Abrahame7385f72021-09-05 00:54:25 -0700174mat4 makeMat4(std::vector<float> in) {
175 return mat4(static_cast<const float*>(in.data()));
176}
177
178} // namespace
179
180class AidlIComposerCallbackWrapper : public BnComposerCallback {
181public:
182 AidlIComposerCallbackWrapper(sp<V2_4::IComposerCallback> callback)
183 : mCallback(std::move(callback)) {}
184
185 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
186 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
187 : V2_4::IComposerCallback::Connection::DISCONNECTED;
188 mCallback->onHotplug(translate<Display>(in_display), connection);
189 return ::ndk::ScopedAStatus::ok();
190 }
191
192 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
193 mCallback->onRefresh(translate<Display>(in_display));
194 return ::ndk::ScopedAStatus::ok();
195 }
196 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
197 mCallback->onSeamlessPossible(translate<Display>(in_display));
198 return ::ndk::ScopedAStatus::ok();
199 }
200 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
201 int32_t in_vsyncPeriodNanos) override {
202 mCallback->onVsync_2_4(translate<Display>(in_display), in_timestamp,
203 static_cast<uint32_t>(in_vsyncPeriodNanos));
204 return ::ndk::ScopedAStatus::ok();
205 }
206 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
207 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
208 mCallback->onVsyncPeriodTimingChanged(translate<Display>(in_display),
209 translate<V2_4::VsyncPeriodChangeTimeline>(
210 in_updatedTimeline));
211 return ::ndk::ScopedAStatus::ok();
212 }
213
214private:
215 sp<V2_4::IComposerCallback> mCallback;
216};
217
Ady Abraham9fc28052021-10-14 17:21:38 -0700218std::string AidlComposer::instance(const std::string& serviceName) {
219 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
220}
221
222bool AidlComposer::isDeclared(const std::string& serviceName) {
223 return AServiceManager_isDeclared(instance(serviceName).c_str());
224}
Ady Abrahame7385f72021-09-05 00:54:25 -0700225
Ady Abrahama6388c02021-11-11 21:11:51 -0800226AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700227 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700228 mAidlComposer = AidlIComposer::fromBinder(
229 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700230 if (!mAidlComposer) {
231 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
232 return;
233 }
234
235 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
236 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
237 return;
238 }
239
240 ALOGI("Loaded AIDL composer3 HAL service");
241}
242
243AidlComposer::~AidlComposer() = default;
244
Ady Abraham4d211cf2021-12-14 16:19:03 -0800245bool AidlComposer::isSupported(OptionalFeature feature) const {
246 switch (feature) {
247 case OptionalFeature::RefreshRateSwitching:
248 return true;
249 }
250}
251
Ady Abrahame7385f72021-09-05 00:54:25 -0700252std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
253 std::vector<Capability> capabilities;
254 const auto status = mAidlComposer->getCapabilities(&capabilities);
255 if (!status.isOk()) {
256 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
257 return {};
258 }
259 return translate<IComposer::Capability>(capabilities);
260}
261
262std::string AidlComposer::dumpDebugInfo() {
263 std::string info;
264 const auto status = mAidlComposer->dumpDebugInfo(&info);
265 if (!status.isOk()) {
266 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
267 return {};
268 }
269 return info;
270}
271
272void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
273 if (mAidlComposerCallback) {
274 ALOGE("Callback already registered");
275 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700276 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700277 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
278
279 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
280 if (!status.isOk()) {
281 ALOGE("registerCallback failed %s", status.getDescription().c_str());
282 }
283}
284
285void AidlComposer::resetCommands() {
286 mWriter.reset();
287}
288
289Error AidlComposer::executeCommands() {
290 return execute();
291}
292
293uint32_t AidlComposer::getMaxVirtualDisplayCount() {
294 int32_t count = 0;
295 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
296 if (!status.isOk()) {
297 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
298 return 0;
299 }
300 return static_cast<uint32_t>(count);
301}
302
303Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
304 Display* outDisplay) {
305 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
306 const int32_t bufferSlotCount = 1;
307 VirtualDisplay virtualDisplay;
308 const auto status =
309 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
310 static_cast<int32_t>(height),
311 static_cast<AidlPixelFormat>(*format),
312 bufferSlotCount, &virtualDisplay);
313
314 if (!status.isOk()) {
315 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
316 return static_cast<Error>(status.getServiceSpecificError());
317 }
318
319 *outDisplay = translate<Display>(virtualDisplay.display);
320 *format = static_cast<PixelFormat>(virtualDisplay.format);
321 return Error::NONE;
322}
323
324Error AidlComposer::destroyVirtualDisplay(Display display) {
325 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
326 if (!status.isOk()) {
327 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
328 return static_cast<Error>(status.getServiceSpecificError());
329 }
330 return Error::NONE;
331}
332
333Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800334 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700335 return Error::NONE;
336}
337
338Error AidlComposer::createLayer(Display display, Layer* outLayer) {
339 int64_t layer;
340 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
341 kMaxLayerBufferCount, &layer);
342 if (!status.isOk()) {
343 ALOGE("createLayer failed %s", status.getDescription().c_str());
344 return static_cast<Error>(status.getServiceSpecificError());
345 }
346
347 *outLayer = translate<Layer>(layer);
348 return Error::NONE;
349}
350
351Error AidlComposer::destroyLayer(Display display, Layer layer) {
352 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
353 translate<int64_t>(layer));
354 if (!status.isOk()) {
355 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
356 return static_cast<Error>(status.getServiceSpecificError());
357 }
358 return Error::NONE;
359}
360
361Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
362 int32_t config;
363 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
364 if (!status.isOk()) {
365 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
366 return static_cast<Error>(status.getServiceSpecificError());
367 }
368 *outConfig = translate<Config>(config);
369 return Error::NONE;
370}
371
372Error AidlComposer::getChangedCompositionTypes(
373 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500374 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800375 std::vector<int64_t> layers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500376 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
Ady Abrahama6388c02021-11-11 21:11:51 -0800377
378 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700379 return Error::NONE;
380}
381
382Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
383 std::vector<AidlColorMode> modes;
384 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
385 if (!status.isOk()) {
386 ALOGE("getColorModes failed %s", status.getDescription().c_str());
387 return static_cast<Error>(status.getServiceSpecificError());
388 }
389 *outModes = translate<ColorMode>(modes);
390 return Error::NONE;
391}
392
393Error AidlComposer::getDisplayAttribute(Display display, Config config,
394 IComposerClient::Attribute attribute, int32_t* outValue) {
395 const auto status =
396 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
397 translate<int32_t>(config),
398 static_cast<AidlDisplayAttribute>(attribute),
399 outValue);
400 if (!status.isOk()) {
401 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
402 return static_cast<Error>(status.getServiceSpecificError());
403 }
404 return Error::NONE;
405}
406
407Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
408 std::vector<int32_t> configs;
409 const auto status =
410 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
411 if (!status.isOk()) {
412 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
413 return static_cast<Error>(status.getServiceSpecificError());
414 }
415 *outConfigs = translate<Config>(configs);
416 return Error::NONE;
417}
418
419Error AidlComposer::getDisplayName(Display display, std::string* outName) {
420 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
421 if (!status.isOk()) {
422 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
423 return static_cast<Error>(status.getServiceSpecificError());
424 }
425 return Error::NONE;
426}
427
428Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
429 std::vector<Layer>* outLayers,
430 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800431 std::vector<int64_t> layers;
432 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
433 outLayerRequestMasks);
434 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700435 return Error::NONE;
436}
437
438Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800439 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700440 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800441 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700442 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800443 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700444 return static_cast<Error>(status.getServiceSpecificError());
445 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800446 *outSupport = std::find(capabilities.begin(), capabilities.end(),
447 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700448 return Error::NONE;
449}
450
451Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
452 float* outMaxLuminance, float* outMaxAverageLuminance,
453 float* outMinLuminance) {
454 AidlHdrCapabilities capabilities;
455 const auto status =
456 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
457 if (!status.isOk()) {
458 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
459 return static_cast<Error>(status.getServiceSpecificError());
460 }
461
462 *outTypes = translate<Hdr>(capabilities.types);
463 *outMaxLuminance = capabilities.maxLuminance;
464 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
465 *outMinLuminance = capabilities.minLuminance;
466 return Error::NONE;
467}
468
469Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
470 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800471 std::vector<int64_t> layers;
472 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
473 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700474 return Error::NONE;
475}
476
477Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
478 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800479 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700480
481 Error error = execute();
482 if (error != Error::NONE) {
483 return error;
484 }
485
Ady Abrahama6388c02021-11-11 21:11:51 -0800486 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700487
488 return Error::NONE;
489}
490
491Error AidlComposer::setActiveConfig(Display display, Config config) {
492 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
493 translate<int32_t>(config));
494 if (!status.isOk()) {
495 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
496 return static_cast<Error>(status.getServiceSpecificError());
497 }
498 return Error::NONE;
499}
500
501Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
502 int acquireFence, Dataspace dataspace,
503 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700504 const native_handle_t* handle = nullptr;
505 if (target.get()) {
506 handle = target->getNativeBuffer()->handle;
507 }
508
Ady Abrahama6388c02021-11-11 21:11:51 -0800509 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700510 translate<aidl::android::hardware::graphics::common::Dataspace>(
511 dataspace),
512 translate<AidlRect>(damage));
513 return Error::NONE;
514}
515
516Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
517 const auto status =
518 mAidlComposerClient->setColorMode(translate<int64_t>(display),
519 translate<AidlColorMode>(mode),
520 translate<AidlRenderIntent>(renderIntent));
521 if (!status.isOk()) {
522 ALOGE("setColorMode failed %s", status.getDescription().c_str());
523 return static_cast<Error>(status.getServiceSpecificError());
524 }
525 return Error::NONE;
526}
527
528Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800529 mWriter.setColorTransform(translate<int64_t>(display), matrix,
530 translate<AidlColorTransform>(hint));
Ady Abrahame7385f72021-09-05 00:54:25 -0700531 return Error::NONE;
532}
533
534Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
535 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800536 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700537 return Error::NONE;
538}
539
540Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
541 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
542 translate<PowerMode>(mode));
543 if (!status.isOk()) {
544 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
545 return static_cast<Error>(status.getServiceSpecificError());
546 }
547 return Error::NONE;
548}
549
550Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
551 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
552 const auto status =
553 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
554 if (!status.isOk()) {
555 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
556 return static_cast<Error>(status.getServiceSpecificError());
557 }
558 return Error::NONE;
559}
560
561Error AidlComposer::setClientTargetSlotCount(Display display) {
562 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
563 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
564 bufferSlotCount);
565 if (!status.isOk()) {
566 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
567 return static_cast<Error>(status.getServiceSpecificError());
568 }
569 return Error::NONE;
570}
571
572Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
573 uint32_t* outNumRequests) {
574 ATRACE_NAME("HwcValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800575 mWriter.validateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700576
577 Error error = execute();
578 if (error != Error::NONE) {
579 return error;
580 }
581
Ady Abrahama6388c02021-11-11 21:11:51 -0800582 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700583
584 return Error::NONE;
585}
586
587Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
588 uint32_t* outNumRequests, int* outPresentFence,
589 uint32_t* state) {
590 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800591 mWriter.presentOrvalidateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700592
593 Error error = execute();
594 if (error != Error::NONE) {
595 return error;
596 }
597
Ady Abrahama6388c02021-11-11 21:11:51 -0800598 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700599
600 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800601 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700602 }
603
604 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800605 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700606 }
607
608 return Error::NONE;
609}
610
611Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800612 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700613 return Error::NONE;
614}
615
616Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
617 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700618 const native_handle_t* handle = nullptr;
619 if (buffer.get()) {
620 handle = buffer->getNativeBuffer()->handle;
621 }
622
Ady Abrahama6388c02021-11-11 21:11:51 -0800623 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
624 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700625 return Error::NONE;
626}
627
628Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
629 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800630 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
631 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700632 return Error::NONE;
633}
634
635Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
636 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800637 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
638 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700639 return Error::NONE;
640}
641
642Error AidlComposer::setLayerColor(Display display, Layer layer,
643 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800644 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
645 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700646 return Error::NONE;
647}
648
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500649Error AidlComposer::setLayerCompositionType(
650 Display display, Layer layer,
651 aidl::android::hardware::graphics::composer3::Composition type) {
652 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700653 return Error::NONE;
654}
655
656Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800657 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
658 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700659 return Error::NONE;
660}
661
662Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
663 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800664 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
665 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700666 return Error::NONE;
667}
668
669Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800670 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700671 return Error::NONE;
672}
673
674Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
675 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800676 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700677 return Error::NONE;
678}
679
680Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
681 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800682 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
683 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700684 return Error::NONE;
685}
686
687Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800688 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
689 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700690 return Error::NONE;
691}
692
693Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
694 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800695 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
696 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700697 return Error::NONE;
698}
699
700Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800701 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700702 return Error::NONE;
703}
704
705Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800706 const auto& commands = mWriter.getPendingCommands();
707 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700708 mWriter.reset();
709 return Error::NONE;
710 }
711
Ady Abrahama6388c02021-11-11 21:11:51 -0800712 std::vector<CommandResultPayload> results;
713 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700714 if (!status.isOk()) {
715 ALOGE("executeCommands failed %s", status.getDescription().c_str());
716 return static_cast<Error>(status.getServiceSpecificError());
717 }
718
Ady Abrahama6388c02021-11-11 21:11:51 -0800719 mReader.parse(results);
720 const auto commandErrors = mReader.takeErrors();
721 Error error = Error::NONE;
722 for (const auto& cmdErr : commandErrors) {
723 const auto index = static_cast<size_t>(cmdErr.commandIndex);
724 if (index < 0 || index >= commands.size()) {
725 ALOGE("invalid command index %zu", index);
726 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700727 }
728
Ady Abrahama6388c02021-11-11 21:11:51 -0800729 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800730 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
731 error = translate<Error>(cmdErr.errorCode);
732 } else {
733 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
734 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700735 }
736 }
737
738 mWriter.reset();
739
740 return error;
741}
742
743Error AidlComposer::setLayerPerFrameMetadata(
744 Display display, Layer layer,
745 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800746 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
747 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700748 return Error::NONE;
749}
750
751std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
752 Display display) {
753 std::vector<AidlPerFrameMetadataKey> keys;
754 const auto status =
755 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
756 if (!status.isOk()) {
757 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
758 return {};
759 }
760 return translate<IComposerClient::PerFrameMetadataKey>(keys);
761}
762
763Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
764 std::vector<RenderIntent>* outRenderIntents) {
765 std::vector<AidlRenderIntent> renderIntents;
766 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
767 translate<AidlColorMode>(colorMode),
768 &renderIntents);
769 if (!status.isOk()) {
770 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
771 return static_cast<Error>(status.getServiceSpecificError());
772 }
773 *outRenderIntents = translate<RenderIntent>(renderIntents);
774 return Error::NONE;
775}
776
777Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
778 std::vector<float> matrix;
779 const auto status =
780 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
781 &matrix);
782 if (!status.isOk()) {
783 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
784 return static_cast<Error>(status.getServiceSpecificError());
785 }
786 *outMatrix = makeMat4(matrix);
787 return Error::NONE;
788}
789
790Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
791 std::vector<uint8_t>* outData) {
792 AidlDisplayIdentification displayIdentification;
793 const auto status =
794 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
795 &displayIdentification);
796 if (!status.isOk()) {
797 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
798 return static_cast<Error>(status.getServiceSpecificError());
799 }
800
801 *outPort = static_cast<uint8_t>(displayIdentification.port);
802 *outData = displayIdentification.data;
803
804 return Error::NONE;
805}
806
807Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800808 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700809 return Error::NONE;
810}
811
812Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
813 Dataspace* outDataspace,
814 uint8_t* outComponentMask) {
815 if (!outFormat || !outDataspace || !outComponentMask) {
816 return Error::BAD_PARAMETER;
817 }
818
819 AidlDisplayContentSamplingAttributes attributes;
820 const auto status =
821 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
822 &attributes);
823 if (!status.isOk()) {
824 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
825 return static_cast<Error>(status.getServiceSpecificError());
826 }
827
828 *outFormat = translate<PixelFormat>(attributes.format);
829 *outDataspace = translate<Dataspace>(attributes.dataspace);
830 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
831 return Error::NONE;
832}
833
834Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
835 uint8_t componentMask, uint64_t maxFrames) {
836 const auto status =
837 mAidlComposerClient
838 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
839 static_cast<AidlFormatColorComponent>(
840 componentMask),
841 static_cast<int64_t>(maxFrames));
842 if (!status.isOk()) {
843 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
844 return static_cast<Error>(status.getServiceSpecificError());
845 }
846 return Error::NONE;
847}
848
849Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
850 uint64_t timestamp, DisplayedFrameStats* outStats) {
851 if (!outStats) {
852 return Error::BAD_PARAMETER;
853 }
854
855 AidlDisplayContentSample sample;
856 const auto status =
857 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
858 static_cast<int64_t>(maxFrames),
859 static_cast<int64_t>(timestamp),
860 &sample);
861 if (!status.isOk()) {
862 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
863 return static_cast<Error>(status.getServiceSpecificError());
864 }
865 *outStats = translate<DisplayedFrameStats>(sample);
866 return Error::NONE;
867}
868
869Error AidlComposer::setLayerPerFrameMetadataBlobs(
870 Display display, Layer layer,
871 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800872 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
873 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700874 return Error::NONE;
875}
876
877Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
878 const auto status =
879 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
880 if (!status.isOk()) {
881 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
882 return static_cast<Error>(status.getServiceSpecificError());
883 }
884 return Error::NONE;
885}
886
887Error AidlComposer::getDisplayCapabilities(Display display,
888 std::vector<DisplayCapability>* outCapabilities) {
889 std::vector<AidlDisplayCapability> capabilities;
890 const auto status =
891 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
892 if (!status.isOk()) {
893 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
894 return static_cast<Error>(status.getServiceSpecificError());
895 }
896 *outCapabilities = translate<DisplayCapability>(capabilities);
897 return Error::NONE;
898}
899
900V2_4::Error AidlComposer::getDisplayConnectionType(
901 Display display, IComposerClient::DisplayConnectionType* outType) {
902 AidlDisplayConnectionType type;
903 const auto status =
904 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
905 if (!status.isOk()) {
906 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
907 return static_cast<V2_4::Error>(status.getServiceSpecificError());
908 }
909 *outType = translate<IComposerClient::DisplayConnectionType>(type);
910 return V2_4::Error::NONE;
911}
912
913V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
914 int32_t vsyncPeriod;
915 const auto status =
916 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
917 if (!status.isOk()) {
918 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
919 return static_cast<V2_4::Error>(status.getServiceSpecificError());
920 }
921 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
922 return V2_4::Error::NONE;
923}
924
925V2_4::Error AidlComposer::setActiveConfigWithConstraints(
926 Display display, Config config,
927 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
928 VsyncPeriodChangeTimeline* outTimeline) {
929 AidlVsyncPeriodChangeTimeline timeline;
930 const auto status =
931 mAidlComposerClient
932 ->setActiveConfigWithConstraints(translate<int64_t>(display),
933 translate<int32_t>(config),
934 translate<AidlVsyncPeriodChangeConstraints>(
935 vsyncPeriodChangeConstraints),
936 &timeline);
937 if (!status.isOk()) {
938 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
939 return static_cast<V2_4::Error>(status.getServiceSpecificError());
940 }
941 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
942 return V2_4::Error::NONE;
943}
944
945V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
946 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
947 if (!status.isOk()) {
948 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
949 return static_cast<V2_4::Error>(status.getServiceSpecificError());
950 }
951 return V2_4::Error::NONE;
952}
953
954V2_4::Error AidlComposer::getSupportedContentTypes(
955 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
956 std::vector<AidlContentType> types;
957 const auto status =
958 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
959 if (!status.isOk()) {
960 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
961 return static_cast<V2_4::Error>(status.getServiceSpecificError());
962 }
963 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
964 return V2_4::Error::NONE;
965}
966
967V2_4::Error AidlComposer::setContentType(Display display,
968 IComposerClient::ContentType contentType) {
969 const auto status =
970 mAidlComposerClient->setContentType(translate<int64_t>(display),
971 translate<AidlContentType>(contentType));
972 if (!status.isOk()) {
973 ALOGE("setContentType failed %s", status.getDescription().c_str());
974 return static_cast<V2_4::Error>(status.getServiceSpecificError());
975 }
976 return V2_4::Error::NONE;
977}
978
Ady Abraham3f976752021-12-20 16:17:50 -0800979V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
980 const std::vector<uint8_t>&) {
981 // There are no users for this API. See b/209691612.
982 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -0700983}
984
985V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -0800986 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
987 // There are no users for this API. See b/209691612.
988 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -0700989}
990
991Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700992 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
993 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800994 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700995 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -0800996 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -0700997 return Error::NONE;
998}
999
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001000Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1001 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1002 whitePointNits);
1003 return Error::NONE;
1004}
1005
Ady Abrahame7385f72021-09-05 00:54:25 -07001006} // namespace Hwc2
1007} // namespace android