blob: 081f5263565690dd8e78458654879389a57db9c5 [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:
Ady Abraham43065bd2021-12-10 17:22:15 -0800248 case OptionalFeature::ExpectedPresentTime:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800249 return true;
250 }
251}
252
Ady Abrahame7385f72021-09-05 00:54:25 -0700253std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
254 std::vector<Capability> capabilities;
255 const auto status = mAidlComposer->getCapabilities(&capabilities);
256 if (!status.isOk()) {
257 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
258 return {};
259 }
260 return translate<IComposer::Capability>(capabilities);
261}
262
263std::string AidlComposer::dumpDebugInfo() {
264 std::string info;
265 const auto status = mAidlComposer->dumpDebugInfo(&info);
266 if (!status.isOk()) {
267 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
268 return {};
269 }
270 return info;
271}
272
273void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
274 if (mAidlComposerCallback) {
275 ALOGE("Callback already registered");
276 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700277 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700278 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
279
280 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
281 if (!status.isOk()) {
282 ALOGE("registerCallback failed %s", status.getDescription().c_str());
283 }
284}
285
286void AidlComposer::resetCommands() {
287 mWriter.reset();
288}
289
290Error AidlComposer::executeCommands() {
291 return execute();
292}
293
294uint32_t AidlComposer::getMaxVirtualDisplayCount() {
295 int32_t count = 0;
296 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
297 if (!status.isOk()) {
298 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
299 return 0;
300 }
301 return static_cast<uint32_t>(count);
302}
303
304Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
305 Display* outDisplay) {
306 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
307 const int32_t bufferSlotCount = 1;
308 VirtualDisplay virtualDisplay;
309 const auto status =
310 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
311 static_cast<int32_t>(height),
312 static_cast<AidlPixelFormat>(*format),
313 bufferSlotCount, &virtualDisplay);
314
315 if (!status.isOk()) {
316 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
317 return static_cast<Error>(status.getServiceSpecificError());
318 }
319
320 *outDisplay = translate<Display>(virtualDisplay.display);
321 *format = static_cast<PixelFormat>(virtualDisplay.format);
322 return Error::NONE;
323}
324
325Error AidlComposer::destroyVirtualDisplay(Display display) {
326 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
327 if (!status.isOk()) {
328 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
329 return static_cast<Error>(status.getServiceSpecificError());
330 }
331 return Error::NONE;
332}
333
334Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800335 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700336 return Error::NONE;
337}
338
339Error AidlComposer::createLayer(Display display, Layer* outLayer) {
340 int64_t layer;
341 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
342 kMaxLayerBufferCount, &layer);
343 if (!status.isOk()) {
344 ALOGE("createLayer failed %s", status.getDescription().c_str());
345 return static_cast<Error>(status.getServiceSpecificError());
346 }
347
348 *outLayer = translate<Layer>(layer);
349 return Error::NONE;
350}
351
352Error AidlComposer::destroyLayer(Display display, Layer layer) {
353 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
354 translate<int64_t>(layer));
355 if (!status.isOk()) {
356 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
357 return static_cast<Error>(status.getServiceSpecificError());
358 }
359 return Error::NONE;
360}
361
362Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
363 int32_t config;
364 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
365 if (!status.isOk()) {
366 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
367 return static_cast<Error>(status.getServiceSpecificError());
368 }
369 *outConfig = translate<Config>(config);
370 return Error::NONE;
371}
372
373Error AidlComposer::getChangedCompositionTypes(
374 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500375 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800376 std::vector<int64_t> layers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500377 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
Ady Abrahama6388c02021-11-11 21:11:51 -0800378
379 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700380 return Error::NONE;
381}
382
383Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
384 std::vector<AidlColorMode> modes;
385 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
386 if (!status.isOk()) {
387 ALOGE("getColorModes failed %s", status.getDescription().c_str());
388 return static_cast<Error>(status.getServiceSpecificError());
389 }
390 *outModes = translate<ColorMode>(modes);
391 return Error::NONE;
392}
393
394Error AidlComposer::getDisplayAttribute(Display display, Config config,
395 IComposerClient::Attribute attribute, int32_t* outValue) {
396 const auto status =
397 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
398 translate<int32_t>(config),
399 static_cast<AidlDisplayAttribute>(attribute),
400 outValue);
401 if (!status.isOk()) {
402 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
403 return static_cast<Error>(status.getServiceSpecificError());
404 }
405 return Error::NONE;
406}
407
408Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
409 std::vector<int32_t> configs;
410 const auto status =
411 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
412 if (!status.isOk()) {
413 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
414 return static_cast<Error>(status.getServiceSpecificError());
415 }
416 *outConfigs = translate<Config>(configs);
417 return Error::NONE;
418}
419
420Error AidlComposer::getDisplayName(Display display, std::string* outName) {
421 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
422 if (!status.isOk()) {
423 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
424 return static_cast<Error>(status.getServiceSpecificError());
425 }
426 return Error::NONE;
427}
428
429Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
430 std::vector<Layer>* outLayers,
431 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800432 std::vector<int64_t> layers;
433 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
434 outLayerRequestMasks);
435 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700436 return Error::NONE;
437}
438
439Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800440 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700441 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800442 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700443 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800444 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700445 return static_cast<Error>(status.getServiceSpecificError());
446 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800447 *outSupport = std::find(capabilities.begin(), capabilities.end(),
448 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700449 return Error::NONE;
450}
451
452Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
453 float* outMaxLuminance, float* outMaxAverageLuminance,
454 float* outMinLuminance) {
455 AidlHdrCapabilities capabilities;
456 const auto status =
457 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
458 if (!status.isOk()) {
459 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
460 return static_cast<Error>(status.getServiceSpecificError());
461 }
462
463 *outTypes = translate<Hdr>(capabilities.types);
464 *outMaxLuminance = capabilities.maxLuminance;
465 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
466 *outMinLuminance = capabilities.minLuminance;
467 return Error::NONE;
468}
469
470Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
471 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800472 std::vector<int64_t> layers;
473 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
474 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700475 return Error::NONE;
476}
477
478Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
479 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800480 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700481
482 Error error = execute();
483 if (error != Error::NONE) {
484 return error;
485 }
486
Ady Abrahama6388c02021-11-11 21:11:51 -0800487 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700488
489 return Error::NONE;
490}
491
492Error AidlComposer::setActiveConfig(Display display, Config config) {
493 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
494 translate<int32_t>(config));
495 if (!status.isOk()) {
496 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
497 return static_cast<Error>(status.getServiceSpecificError());
498 }
499 return Error::NONE;
500}
501
502Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
503 int acquireFence, Dataspace dataspace,
504 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700505 const native_handle_t* handle = nullptr;
506 if (target.get()) {
507 handle = target->getNativeBuffer()->handle;
508 }
509
Ady Abrahama6388c02021-11-11 21:11:51 -0800510 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700511 translate<aidl::android::hardware::graphics::common::Dataspace>(
512 dataspace),
513 translate<AidlRect>(damage));
514 return Error::NONE;
515}
516
517Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
518 const auto status =
519 mAidlComposerClient->setColorMode(translate<int64_t>(display),
520 translate<AidlColorMode>(mode),
521 translate<AidlRenderIntent>(renderIntent));
522 if (!status.isOk()) {
523 ALOGE("setColorMode failed %s", status.getDescription().c_str());
524 return static_cast<Error>(status.getServiceSpecificError());
525 }
526 return Error::NONE;
527}
528
Ady Abrahamdc011a92021-12-21 14:06:44 -0800529Error AidlComposer::setColorTransform(Display display, const float* matrix) {
530 mWriter.setColorTransform(translate<int64_t>(display), matrix);
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
Ady Abraham43065bd2021-12-10 17:22:15 -0800572Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
573 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700574 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800575 mWriter.validateDisplay(translate<int64_t>(display),
576 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700577
578 Error error = execute();
579 if (error != Error::NONE) {
580 return error;
581 }
582
Ady Abrahama6388c02021-11-11 21:11:51 -0800583 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700584
585 return Error::NONE;
586}
587
Ady Abraham43065bd2021-12-10 17:22:15 -0800588Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
589 uint32_t* outNumTypes, uint32_t* outNumRequests,
590 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700591 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800592 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
593 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700594
595 Error error = execute();
596 if (error != Error::NONE) {
597 return error;
598 }
599
Ady Abrahama6388c02021-11-11 21:11:51 -0800600 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700601
602 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800603 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700604 }
605
606 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800607 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700608 }
609
610 return Error::NONE;
611}
612
613Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800614 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700615 return Error::NONE;
616}
617
618Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
619 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700620 const native_handle_t* handle = nullptr;
621 if (buffer.get()) {
622 handle = buffer->getNativeBuffer()->handle;
623 }
624
Ady Abrahama6388c02021-11-11 21:11:51 -0800625 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
626 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700627 return Error::NONE;
628}
629
630Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
631 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800632 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
633 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700634 return Error::NONE;
635}
636
637Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
638 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800639 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
640 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700641 return Error::NONE;
642}
643
644Error AidlComposer::setLayerColor(Display display, Layer layer,
645 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800646 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
647 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700648 return Error::NONE;
649}
650
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500651Error AidlComposer::setLayerCompositionType(
652 Display display, Layer layer,
653 aidl::android::hardware::graphics::composer3::Composition type) {
654 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700655 return Error::NONE;
656}
657
658Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800659 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
660 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700661 return Error::NONE;
662}
663
664Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
665 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800666 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
667 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700668 return Error::NONE;
669}
670
671Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800672 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700673 return Error::NONE;
674}
675
676Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
677 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800678 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700679 return Error::NONE;
680}
681
682Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
683 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800684 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
685 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700686 return Error::NONE;
687}
688
689Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800690 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
691 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700692 return Error::NONE;
693}
694
695Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
696 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800697 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
698 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700699 return Error::NONE;
700}
701
702Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800703 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700704 return Error::NONE;
705}
706
707Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800708 const auto& commands = mWriter.getPendingCommands();
709 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700710 mWriter.reset();
711 return Error::NONE;
712 }
713
Ady Abrahama6388c02021-11-11 21:11:51 -0800714 std::vector<CommandResultPayload> results;
715 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700716 if (!status.isOk()) {
717 ALOGE("executeCommands failed %s", status.getDescription().c_str());
718 return static_cast<Error>(status.getServiceSpecificError());
719 }
720
Ady Abrahama6388c02021-11-11 21:11:51 -0800721 mReader.parse(results);
722 const auto commandErrors = mReader.takeErrors();
723 Error error = Error::NONE;
724 for (const auto& cmdErr : commandErrors) {
725 const auto index = static_cast<size_t>(cmdErr.commandIndex);
726 if (index < 0 || index >= commands.size()) {
727 ALOGE("invalid command index %zu", index);
728 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700729 }
730
Ady Abrahama6388c02021-11-11 21:11:51 -0800731 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800732 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
733 error = translate<Error>(cmdErr.errorCode);
734 } else {
735 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
736 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700737 }
738 }
739
740 mWriter.reset();
741
742 return error;
743}
744
745Error AidlComposer::setLayerPerFrameMetadata(
746 Display display, Layer layer,
747 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800748 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
749 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700750 return Error::NONE;
751}
752
753std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
754 Display display) {
755 std::vector<AidlPerFrameMetadataKey> keys;
756 const auto status =
757 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
758 if (!status.isOk()) {
759 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
760 return {};
761 }
762 return translate<IComposerClient::PerFrameMetadataKey>(keys);
763}
764
765Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
766 std::vector<RenderIntent>* outRenderIntents) {
767 std::vector<AidlRenderIntent> renderIntents;
768 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
769 translate<AidlColorMode>(colorMode),
770 &renderIntents);
771 if (!status.isOk()) {
772 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
773 return static_cast<Error>(status.getServiceSpecificError());
774 }
775 *outRenderIntents = translate<RenderIntent>(renderIntents);
776 return Error::NONE;
777}
778
779Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
780 std::vector<float> matrix;
781 const auto status =
782 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
783 &matrix);
784 if (!status.isOk()) {
785 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
786 return static_cast<Error>(status.getServiceSpecificError());
787 }
788 *outMatrix = makeMat4(matrix);
789 return Error::NONE;
790}
791
792Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
793 std::vector<uint8_t>* outData) {
794 AidlDisplayIdentification displayIdentification;
795 const auto status =
796 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
797 &displayIdentification);
798 if (!status.isOk()) {
799 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
800 return static_cast<Error>(status.getServiceSpecificError());
801 }
802
803 *outPort = static_cast<uint8_t>(displayIdentification.port);
804 *outData = displayIdentification.data;
805
806 return Error::NONE;
807}
808
809Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800810 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700811 return Error::NONE;
812}
813
814Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
815 Dataspace* outDataspace,
816 uint8_t* outComponentMask) {
817 if (!outFormat || !outDataspace || !outComponentMask) {
818 return Error::BAD_PARAMETER;
819 }
820
821 AidlDisplayContentSamplingAttributes attributes;
822 const auto status =
823 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
824 &attributes);
825 if (!status.isOk()) {
826 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
827 return static_cast<Error>(status.getServiceSpecificError());
828 }
829
830 *outFormat = translate<PixelFormat>(attributes.format);
831 *outDataspace = translate<Dataspace>(attributes.dataspace);
832 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
833 return Error::NONE;
834}
835
836Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
837 uint8_t componentMask, uint64_t maxFrames) {
838 const auto status =
839 mAidlComposerClient
840 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
841 static_cast<AidlFormatColorComponent>(
842 componentMask),
843 static_cast<int64_t>(maxFrames));
844 if (!status.isOk()) {
845 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
846 return static_cast<Error>(status.getServiceSpecificError());
847 }
848 return Error::NONE;
849}
850
851Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
852 uint64_t timestamp, DisplayedFrameStats* outStats) {
853 if (!outStats) {
854 return Error::BAD_PARAMETER;
855 }
856
857 AidlDisplayContentSample sample;
858 const auto status =
859 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
860 static_cast<int64_t>(maxFrames),
861 static_cast<int64_t>(timestamp),
862 &sample);
863 if (!status.isOk()) {
864 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
865 return static_cast<Error>(status.getServiceSpecificError());
866 }
867 *outStats = translate<DisplayedFrameStats>(sample);
868 return Error::NONE;
869}
870
871Error AidlComposer::setLayerPerFrameMetadataBlobs(
872 Display display, Layer layer,
873 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800874 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
875 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700876 return Error::NONE;
877}
878
879Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
880 const auto status =
881 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
882 if (!status.isOk()) {
883 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
884 return static_cast<Error>(status.getServiceSpecificError());
885 }
886 return Error::NONE;
887}
888
889Error AidlComposer::getDisplayCapabilities(Display display,
890 std::vector<DisplayCapability>* outCapabilities) {
891 std::vector<AidlDisplayCapability> capabilities;
892 const auto status =
893 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
894 if (!status.isOk()) {
895 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
896 return static_cast<Error>(status.getServiceSpecificError());
897 }
898 *outCapabilities = translate<DisplayCapability>(capabilities);
899 return Error::NONE;
900}
901
902V2_4::Error AidlComposer::getDisplayConnectionType(
903 Display display, IComposerClient::DisplayConnectionType* outType) {
904 AidlDisplayConnectionType type;
905 const auto status =
906 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
907 if (!status.isOk()) {
908 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
909 return static_cast<V2_4::Error>(status.getServiceSpecificError());
910 }
911 *outType = translate<IComposerClient::DisplayConnectionType>(type);
912 return V2_4::Error::NONE;
913}
914
915V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
916 int32_t vsyncPeriod;
917 const auto status =
918 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
919 if (!status.isOk()) {
920 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
921 return static_cast<V2_4::Error>(status.getServiceSpecificError());
922 }
923 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
924 return V2_4::Error::NONE;
925}
926
927V2_4::Error AidlComposer::setActiveConfigWithConstraints(
928 Display display, Config config,
929 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
930 VsyncPeriodChangeTimeline* outTimeline) {
931 AidlVsyncPeriodChangeTimeline timeline;
932 const auto status =
933 mAidlComposerClient
934 ->setActiveConfigWithConstraints(translate<int64_t>(display),
935 translate<int32_t>(config),
936 translate<AidlVsyncPeriodChangeConstraints>(
937 vsyncPeriodChangeConstraints),
938 &timeline);
939 if (!status.isOk()) {
940 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
941 return static_cast<V2_4::Error>(status.getServiceSpecificError());
942 }
943 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
944 return V2_4::Error::NONE;
945}
946
947V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
948 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
949 if (!status.isOk()) {
950 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
951 return static_cast<V2_4::Error>(status.getServiceSpecificError());
952 }
953 return V2_4::Error::NONE;
954}
955
956V2_4::Error AidlComposer::getSupportedContentTypes(
957 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
958 std::vector<AidlContentType> types;
959 const auto status =
960 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
961 if (!status.isOk()) {
962 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
963 return static_cast<V2_4::Error>(status.getServiceSpecificError());
964 }
965 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
966 return V2_4::Error::NONE;
967}
968
969V2_4::Error AidlComposer::setContentType(Display display,
970 IComposerClient::ContentType contentType) {
971 const auto status =
972 mAidlComposerClient->setContentType(translate<int64_t>(display),
973 translate<AidlContentType>(contentType));
974 if (!status.isOk()) {
975 ALOGE("setContentType failed %s", status.getDescription().c_str());
976 return static_cast<V2_4::Error>(status.getServiceSpecificError());
977 }
978 return V2_4::Error::NONE;
979}
980
Ady Abraham3f976752021-12-20 16:17:50 -0800981V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
982 const std::vector<uint8_t>&) {
983 // There are no users for this API. See b/209691612.
984 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -0700985}
986
987V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -0800988 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
989 // There are no users for this API. See b/209691612.
990 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -0700991}
992
993Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700994 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
995 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800996 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700997 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -0800998 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -0700999 return Error::NONE;
1000}
1001
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001002Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1003 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1004 whitePointNits);
1005 return Error::NONE;
1006}
1007
Ady Abrahame7385f72021-09-05 00:54:25 -07001008} // namespace Hwc2
1009} // namespace android