blob: 46d49c59ba9838d84345c22eccfc2b506ce93d99 [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,
378 std::vector<IComposerClient::Composition>* outTypes) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800379 std::vector<int64_t> layers;
380 std::vector<Composition> types;
381 mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, &types);
382
383 *outLayers = translate<Layer>(layers);
384 *outTypes = translate<IComposerClient::Composition>(types);
Ady Abrahame7385f72021-09-05 00:54:25 -0700385 return Error::NONE;
386}
387
388Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
389 std::vector<AidlColorMode> modes;
390 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
391 if (!status.isOk()) {
392 ALOGE("getColorModes failed %s", status.getDescription().c_str());
393 return static_cast<Error>(status.getServiceSpecificError());
394 }
395 *outModes = translate<ColorMode>(modes);
396 return Error::NONE;
397}
398
399Error AidlComposer::getDisplayAttribute(Display display, Config config,
400 IComposerClient::Attribute attribute, int32_t* outValue) {
401 const auto status =
402 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
403 translate<int32_t>(config),
404 static_cast<AidlDisplayAttribute>(attribute),
405 outValue);
406 if (!status.isOk()) {
407 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
408 return static_cast<Error>(status.getServiceSpecificError());
409 }
410 return Error::NONE;
411}
412
413Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
414 std::vector<int32_t> configs;
415 const auto status =
416 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
417 if (!status.isOk()) {
418 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
419 return static_cast<Error>(status.getServiceSpecificError());
420 }
421 *outConfigs = translate<Config>(configs);
422 return Error::NONE;
423}
424
425Error AidlComposer::getDisplayName(Display display, std::string* outName) {
426 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
427 if (!status.isOk()) {
428 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
429 return static_cast<Error>(status.getServiceSpecificError());
430 }
431 return Error::NONE;
432}
433
434Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
435 std::vector<Layer>* outLayers,
436 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800437 std::vector<int64_t> layers;
438 mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
439 outLayerRequestMasks);
440 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700441 return Error::NONE;
442}
443
444Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
445 const auto status =
446 mAidlComposerClient->getDozeSupport(translate<int64_t>(display), outSupport);
447 if (!status.isOk()) {
448 ALOGE("getDozeSupport failed %s", status.getDescription().c_str());
449 return static_cast<Error>(status.getServiceSpecificError());
450 }
451 return Error::NONE;
452}
453
454Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
455 float* outMaxLuminance, float* outMaxAverageLuminance,
456 float* outMinLuminance) {
457 AidlHdrCapabilities capabilities;
458 const auto status =
459 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
460 if (!status.isOk()) {
461 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
462 return static_cast<Error>(status.getServiceSpecificError());
463 }
464
465 *outTypes = translate<Hdr>(capabilities.types);
466 *outMaxLuminance = capabilities.maxLuminance;
467 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
468 *outMinLuminance = capabilities.minLuminance;
469 return Error::NONE;
470}
471
472Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
473 std::vector<int>* outReleaseFences) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800474 std::vector<int64_t> layers;
475 mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
476 *outLayers = translate<Layer>(layers);
Ady Abrahame7385f72021-09-05 00:54:25 -0700477 return Error::NONE;
478}
479
480Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
481 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800482 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700483
484 Error error = execute();
485 if (error != Error::NONE) {
486 return error;
487 }
488
Ady Abrahama6388c02021-11-11 21:11:51 -0800489 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700490
491 return Error::NONE;
492}
493
494Error AidlComposer::setActiveConfig(Display display, Config config) {
495 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
496 translate<int32_t>(config));
497 if (!status.isOk()) {
498 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
499 return static_cast<Error>(status.getServiceSpecificError());
500 }
501 return Error::NONE;
502}
503
504Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
505 int acquireFence, Dataspace dataspace,
506 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700507 const native_handle_t* handle = nullptr;
508 if (target.get()) {
509 handle = target->getNativeBuffer()->handle;
510 }
511
Ady Abrahama6388c02021-11-11 21:11:51 -0800512 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700513 translate<aidl::android::hardware::graphics::common::Dataspace>(
514 dataspace),
515 translate<AidlRect>(damage));
516 return Error::NONE;
517}
518
519Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
520 const auto status =
521 mAidlComposerClient->setColorMode(translate<int64_t>(display),
522 translate<AidlColorMode>(mode),
523 translate<AidlRenderIntent>(renderIntent));
524 if (!status.isOk()) {
525 ALOGE("setColorMode failed %s", status.getDescription().c_str());
526 return static_cast<Error>(status.getServiceSpecificError());
527 }
528 return Error::NONE;
529}
530
531Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800532 mWriter.setColorTransform(translate<int64_t>(display), matrix,
533 translate<AidlColorTransform>(hint));
Ady Abrahame7385f72021-09-05 00:54:25 -0700534 return Error::NONE;
535}
536
537Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
538 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800539 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700540 return Error::NONE;
541}
542
543Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
544 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
545 translate<PowerMode>(mode));
546 if (!status.isOk()) {
547 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
548 return static_cast<Error>(status.getServiceSpecificError());
549 }
550 return Error::NONE;
551}
552
553Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
554 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
555 const auto status =
556 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
557 if (!status.isOk()) {
558 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
559 return static_cast<Error>(status.getServiceSpecificError());
560 }
561 return Error::NONE;
562}
563
564Error AidlComposer::setClientTargetSlotCount(Display display) {
565 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
566 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
567 bufferSlotCount);
568 if (!status.isOk()) {
569 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
570 return static_cast<Error>(status.getServiceSpecificError());
571 }
572 return Error::NONE;
573}
574
575Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
576 uint32_t* outNumRequests) {
577 ATRACE_NAME("HwcValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800578 mWriter.validateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700579
580 Error error = execute();
581 if (error != Error::NONE) {
582 return error;
583 }
584
Ady Abrahama6388c02021-11-11 21:11:51 -0800585 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700586
587 return Error::NONE;
588}
589
590Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
591 uint32_t* outNumRequests, int* outPresentFence,
592 uint32_t* state) {
593 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800594 mWriter.presentOrvalidateDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700595
596 Error error = execute();
597 if (error != Error::NONE) {
598 return error;
599 }
600
Ady Abrahama6388c02021-11-11 21:11:51 -0800601 mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
Ady Abrahame7385f72021-09-05 00:54:25 -0700602
603 if (*state == 1) { // Present succeeded
Ady Abrahama6388c02021-11-11 21:11:51 -0800604 mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700605 }
606
607 if (*state == 0) { // Validate succeeded.
Ady Abrahama6388c02021-11-11 21:11:51 -0800608 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700609 }
610
611 return Error::NONE;
612}
613
614Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800615 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700616 return Error::NONE;
617}
618
619Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
620 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700621 const native_handle_t* handle = nullptr;
622 if (buffer.get()) {
623 handle = buffer->getNativeBuffer()->handle;
624 }
625
Ady Abrahama6388c02021-11-11 21:11:51 -0800626 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
627 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700628 return Error::NONE;
629}
630
631Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
632 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800633 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
634 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700635 return Error::NONE;
636}
637
638Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
639 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800640 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
641 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700642 return Error::NONE;
643}
644
645Error AidlComposer::setLayerColor(Display display, Layer layer,
646 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800647 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
648 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700649 return Error::NONE;
650}
651
652Error AidlComposer::setLayerCompositionType(Display display, Layer layer,
653 IComposerClient::Composition type) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800654 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer),
655 translate<Composition>(type));
Ady Abrahame7385f72021-09-05 00:54:25 -0700656 return Error::NONE;
657}
658
659Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800660 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
661 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700662 return Error::NONE;
663}
664
665Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
666 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800667 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
668 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700669 return Error::NONE;
670}
671
672Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800673 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700674 return Error::NONE;
675}
676
677Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
678 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800679 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700680 return Error::NONE;
681}
682
683Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
684 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800685 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
686 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700687 return Error::NONE;
688}
689
690Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800691 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
692 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700693 return Error::NONE;
694}
695
696Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
697 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800698 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
699 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700700 return Error::NONE;
701}
702
703Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800704 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700705 return Error::NONE;
706}
707
708Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800709 const auto& commands = mWriter.getPendingCommands();
710 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700711 mWriter.reset();
712 return Error::NONE;
713 }
714
Ady Abrahama6388c02021-11-11 21:11:51 -0800715 std::vector<CommandResultPayload> results;
716 auto status = mAidlComposerClient->executeCommands(commands, &results);
Ady Abrahame7385f72021-09-05 00:54:25 -0700717 if (!status.isOk()) {
718 ALOGE("executeCommands failed %s", status.getDescription().c_str());
719 return static_cast<Error>(status.getServiceSpecificError());
720 }
721
Ady Abrahama6388c02021-11-11 21:11:51 -0800722 mReader.parse(results);
723 const auto commandErrors = mReader.takeErrors();
724 Error error = Error::NONE;
725 for (const auto& cmdErr : commandErrors) {
726 const auto index = static_cast<size_t>(cmdErr.commandIndex);
727 if (index < 0 || index >= commands.size()) {
728 ALOGE("invalid command index %zu", index);
729 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700730 }
731
Ady Abrahama6388c02021-11-11 21:11:51 -0800732 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800733 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
734 error = translate<Error>(cmdErr.errorCode);
735 } else {
736 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
737 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700738 }
739 }
740
741 mWriter.reset();
742
743 return error;
744}
745
746Error AidlComposer::setLayerPerFrameMetadata(
747 Display display, Layer layer,
748 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800749 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
750 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700751 return Error::NONE;
752}
753
754std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
755 Display display) {
756 std::vector<AidlPerFrameMetadataKey> keys;
757 const auto status =
758 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
759 if (!status.isOk()) {
760 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
761 return {};
762 }
763 return translate<IComposerClient::PerFrameMetadataKey>(keys);
764}
765
766Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
767 std::vector<RenderIntent>* outRenderIntents) {
768 std::vector<AidlRenderIntent> renderIntents;
769 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
770 translate<AidlColorMode>(colorMode),
771 &renderIntents);
772 if (!status.isOk()) {
773 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
774 return static_cast<Error>(status.getServiceSpecificError());
775 }
776 *outRenderIntents = translate<RenderIntent>(renderIntents);
777 return Error::NONE;
778}
779
780Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
781 std::vector<float> matrix;
782 const auto status =
783 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
784 &matrix);
785 if (!status.isOk()) {
786 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
787 return static_cast<Error>(status.getServiceSpecificError());
788 }
789 *outMatrix = makeMat4(matrix);
790 return Error::NONE;
791}
792
793Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
794 std::vector<uint8_t>* outData) {
795 AidlDisplayIdentification displayIdentification;
796 const auto status =
797 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
798 &displayIdentification);
799 if (!status.isOk()) {
800 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
801 return static_cast<Error>(status.getServiceSpecificError());
802 }
803
804 *outPort = static_cast<uint8_t>(displayIdentification.port);
805 *outData = displayIdentification.data;
806
807 return Error::NONE;
808}
809
810Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800811 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700812 return Error::NONE;
813}
814
815Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
816 Dataspace* outDataspace,
817 uint8_t* outComponentMask) {
818 if (!outFormat || !outDataspace || !outComponentMask) {
819 return Error::BAD_PARAMETER;
820 }
821
822 AidlDisplayContentSamplingAttributes attributes;
823 const auto status =
824 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
825 &attributes);
826 if (!status.isOk()) {
827 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
828 return static_cast<Error>(status.getServiceSpecificError());
829 }
830
831 *outFormat = translate<PixelFormat>(attributes.format);
832 *outDataspace = translate<Dataspace>(attributes.dataspace);
833 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
834 return Error::NONE;
835}
836
837Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
838 uint8_t componentMask, uint64_t maxFrames) {
839 const auto status =
840 mAidlComposerClient
841 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
842 static_cast<AidlFormatColorComponent>(
843 componentMask),
844 static_cast<int64_t>(maxFrames));
845 if (!status.isOk()) {
846 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
847 return static_cast<Error>(status.getServiceSpecificError());
848 }
849 return Error::NONE;
850}
851
852Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
853 uint64_t timestamp, DisplayedFrameStats* outStats) {
854 if (!outStats) {
855 return Error::BAD_PARAMETER;
856 }
857
858 AidlDisplayContentSample sample;
859 const auto status =
860 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
861 static_cast<int64_t>(maxFrames),
862 static_cast<int64_t>(timestamp),
863 &sample);
864 if (!status.isOk()) {
865 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
866 return static_cast<Error>(status.getServiceSpecificError());
867 }
868 *outStats = translate<DisplayedFrameStats>(sample);
869 return Error::NONE;
870}
871
872Error AidlComposer::setLayerPerFrameMetadataBlobs(
873 Display display, Layer layer,
874 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800875 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
876 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700877 return Error::NONE;
878}
879
880Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
881 const auto status =
882 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
883 if (!status.isOk()) {
884 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
885 return static_cast<Error>(status.getServiceSpecificError());
886 }
887 return Error::NONE;
888}
889
890Error AidlComposer::getDisplayCapabilities(Display display,
891 std::vector<DisplayCapability>* outCapabilities) {
892 std::vector<AidlDisplayCapability> capabilities;
893 const auto status =
894 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
895 if (!status.isOk()) {
896 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
897 return static_cast<Error>(status.getServiceSpecificError());
898 }
899 *outCapabilities = translate<DisplayCapability>(capabilities);
900 return Error::NONE;
901}
902
903V2_4::Error AidlComposer::getDisplayConnectionType(
904 Display display, IComposerClient::DisplayConnectionType* outType) {
905 AidlDisplayConnectionType type;
906 const auto status =
907 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
908 if (!status.isOk()) {
909 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
910 return static_cast<V2_4::Error>(status.getServiceSpecificError());
911 }
912 *outType = translate<IComposerClient::DisplayConnectionType>(type);
913 return V2_4::Error::NONE;
914}
915
916V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
917 int32_t vsyncPeriod;
918 const auto status =
919 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
920 if (!status.isOk()) {
921 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
922 return static_cast<V2_4::Error>(status.getServiceSpecificError());
923 }
924 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
925 return V2_4::Error::NONE;
926}
927
928V2_4::Error AidlComposer::setActiveConfigWithConstraints(
929 Display display, Config config,
930 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
931 VsyncPeriodChangeTimeline* outTimeline) {
932 AidlVsyncPeriodChangeTimeline timeline;
933 const auto status =
934 mAidlComposerClient
935 ->setActiveConfigWithConstraints(translate<int64_t>(display),
936 translate<int32_t>(config),
937 translate<AidlVsyncPeriodChangeConstraints>(
938 vsyncPeriodChangeConstraints),
939 &timeline);
940 if (!status.isOk()) {
941 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
942 return static_cast<V2_4::Error>(status.getServiceSpecificError());
943 }
944 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
945 return V2_4::Error::NONE;
946}
947
948V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
949 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
950 if (!status.isOk()) {
951 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
952 return static_cast<V2_4::Error>(status.getServiceSpecificError());
953 }
954 return V2_4::Error::NONE;
955}
956
957V2_4::Error AidlComposer::getSupportedContentTypes(
958 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
959 std::vector<AidlContentType> types;
960 const auto status =
961 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
962 if (!status.isOk()) {
963 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
964 return static_cast<V2_4::Error>(status.getServiceSpecificError());
965 }
966 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
967 return V2_4::Error::NONE;
968}
969
970V2_4::Error AidlComposer::setContentType(Display display,
971 IComposerClient::ContentType contentType) {
972 const auto status =
973 mAidlComposerClient->setContentType(translate<int64_t>(display),
974 translate<AidlContentType>(contentType));
975 if (!status.isOk()) {
976 ALOGE("setContentType failed %s", status.getDescription().c_str());
977 return static_cast<V2_4::Error>(status.getServiceSpecificError());
978 }
979 return V2_4::Error::NONE;
980}
981
982V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
983 const std::string& key, bool mandatory,
984 const std::vector<uint8_t>& value) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800985 mWriter.setLayerGenericMetadata(translate<int64_t>(display), translate<int64_t>(layer), key,
986 mandatory, value);
Ady Abrahame7385f72021-09-05 00:54:25 -0700987 return V2_4::Error::NONE;
988}
989
990V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
991 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
992 std::vector<AidlLayerGenericMetadataKey> keys;
993 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
994 if (!status.isOk()) {
995 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
996 return static_cast<V2_4::Error>(status.getServiceSpecificError());
997 }
998 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
999 return V2_4::Error::NONE;
1000}
1001
1002Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001003 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1004 float* whitePointNits) {
Ady Abrahama6388c02021-11-11 21:11:51 -08001005 ClientTargetProperty property;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001006 mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
Ady Abrahama6388c02021-11-11 21:11:51 -08001007 *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
Ady Abrahame7385f72021-09-05 00:54:25 -07001008 return Error::NONE;
1009}
1010
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001011Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1012 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1013 whitePointNits);
1014 return Error::NONE;
1015}
1016
Ady Abrahame7385f72021-09-05 00:54:25 -07001017} // namespace Hwc2
1018} // namespace android