blob: 34f5a39bc0ba71d283b31ec8da76deeeb6077687 [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:
Alec Mouricdf16792021-12-10 13:16:06 -0800249 case OptionalFeature::DisplayBrightnessCommand:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800250 return true;
251 }
252}
253
Ady Abrahame7385f72021-09-05 00:54:25 -0700254std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
255 std::vector<Capability> capabilities;
256 const auto status = mAidlComposer->getCapabilities(&capabilities);
257 if (!status.isOk()) {
258 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
259 return {};
260 }
261 return translate<IComposer::Capability>(capabilities);
262}
263
264std::string AidlComposer::dumpDebugInfo() {
265 std::string info;
266 const auto status = mAidlComposer->dumpDebugInfo(&info);
267 if (!status.isOk()) {
268 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
269 return {};
270 }
271 return info;
272}
273
274void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
275 if (mAidlComposerCallback) {
276 ALOGE("Callback already registered");
277 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700278 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700279 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
280
281 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
282 if (!status.isOk()) {
283 ALOGE("registerCallback failed %s", status.getDescription().c_str());
284 }
285}
286
287void AidlComposer::resetCommands() {
288 mWriter.reset();
289}
290
291Error AidlComposer::executeCommands() {
292 return execute();
293}
294
295uint32_t AidlComposer::getMaxVirtualDisplayCount() {
296 int32_t count = 0;
297 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
298 if (!status.isOk()) {
299 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
300 return 0;
301 }
302 return static_cast<uint32_t>(count);
303}
304
305Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
306 Display* outDisplay) {
307 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
308 const int32_t bufferSlotCount = 1;
309 VirtualDisplay virtualDisplay;
310 const auto status =
311 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
312 static_cast<int32_t>(height),
313 static_cast<AidlPixelFormat>(*format),
314 bufferSlotCount, &virtualDisplay);
315
316 if (!status.isOk()) {
317 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
318 return static_cast<Error>(status.getServiceSpecificError());
319 }
320
321 *outDisplay = translate<Display>(virtualDisplay.display);
322 *format = static_cast<PixelFormat>(virtualDisplay.format);
323 return Error::NONE;
324}
325
326Error AidlComposer::destroyVirtualDisplay(Display display) {
327 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
328 if (!status.isOk()) {
329 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
330 return static_cast<Error>(status.getServiceSpecificError());
331 }
332 return Error::NONE;
333}
334
335Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800336 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700337 return Error::NONE;
338}
339
340Error AidlComposer::createLayer(Display display, Layer* outLayer) {
341 int64_t layer;
342 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
343 kMaxLayerBufferCount, &layer);
344 if (!status.isOk()) {
345 ALOGE("createLayer failed %s", status.getDescription().c_str());
346 return static_cast<Error>(status.getServiceSpecificError());
347 }
348
349 *outLayer = translate<Layer>(layer);
350 return Error::NONE;
351}
352
353Error AidlComposer::destroyLayer(Display display, Layer layer) {
354 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
355 translate<int64_t>(layer));
356 if (!status.isOk()) {
357 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
358 return static_cast<Error>(status.getServiceSpecificError());
359 }
360 return Error::NONE;
361}
362
363Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
364 int32_t config;
365 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
366 if (!status.isOk()) {
367 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
368 return static_cast<Error>(status.getServiceSpecificError());
369 }
370 *outConfig = translate<Config>(config);
371 return Error::NONE;
372}
373
374Error AidlComposer::getChangedCompositionTypes(
375 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500376 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahamde792782021-12-20 10:00:49 -0800377 const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
378 outLayers->reserve(changedLayers.size());
379 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800380
Ady Abrahamde792782021-12-20 10:00:49 -0800381 for (const auto& layer : changedLayers) {
382 outLayers->emplace_back(translate<Layer>(layer.layer));
383 outTypes->emplace_back(layer.composition);
384 }
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 Abrahamde792782021-12-20 10:00:49 -0800437 const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
438 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
439 outLayers->reserve(displayRequests.layerRequests.size());
440 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
441
442 for (const auto& layer : displayRequests.layerRequests) {
443 outLayers->emplace_back(translate<Layer>(layer.layer));
444 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
445 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700446 return Error::NONE;
447}
448
449Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800450 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700451 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800452 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700453 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800454 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700455 return static_cast<Error>(status.getServiceSpecificError());
456 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800457 *outSupport = std::find(capabilities.begin(), capabilities.end(),
458 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700459 return Error::NONE;
460}
461
462Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
463 float* outMaxLuminance, float* outMaxAverageLuminance,
464 float* outMinLuminance) {
465 AidlHdrCapabilities capabilities;
466 const auto status =
467 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
468 if (!status.isOk()) {
469 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
470 return static_cast<Error>(status.getServiceSpecificError());
471 }
472
473 *outTypes = translate<Hdr>(capabilities.types);
474 *outMaxLuminance = capabilities.maxLuminance;
475 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
476 *outMinLuminance = capabilities.minLuminance;
477 return Error::NONE;
478}
479
480Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
481 std::vector<int>* outReleaseFences) {
Ady Abrahamde792782021-12-20 10:00:49 -0800482 auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
483 outLayers->reserve(fences.size());
484 outReleaseFences->reserve(fences.size());
485
486 for (auto& fence : fences) {
487 outLayers->emplace_back(translate<Layer>(fence.layer));
488 // take ownership
489 const int fenceOwner = fence.fence.get();
490 *fence.fence.getR() = -1;
491 outReleaseFences->emplace_back(fenceOwner);
492 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700493 return Error::NONE;
494}
495
496Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
497 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800498 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700499
500 Error error = execute();
501 if (error != Error::NONE) {
502 return error;
503 }
504
Ady Abrahamde792782021-12-20 10:00:49 -0800505 auto fence = mReader.takePresentFence(translate<int64_t>(display));
506 // take ownership
507 *outPresentFence = fence.get();
508 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700509 return Error::NONE;
510}
511
512Error AidlComposer::setActiveConfig(Display display, Config config) {
513 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
514 translate<int32_t>(config));
515 if (!status.isOk()) {
516 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
517 return static_cast<Error>(status.getServiceSpecificError());
518 }
519 return Error::NONE;
520}
521
522Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
523 int acquireFence, Dataspace dataspace,
524 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700525 const native_handle_t* handle = nullptr;
526 if (target.get()) {
527 handle = target->getNativeBuffer()->handle;
528 }
529
Ady Abrahama6388c02021-11-11 21:11:51 -0800530 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700531 translate<aidl::android::hardware::graphics::common::Dataspace>(
532 dataspace),
533 translate<AidlRect>(damage));
534 return Error::NONE;
535}
536
537Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
538 const auto status =
539 mAidlComposerClient->setColorMode(translate<int64_t>(display),
540 translate<AidlColorMode>(mode),
541 translate<AidlRenderIntent>(renderIntent));
542 if (!status.isOk()) {
543 ALOGE("setColorMode failed %s", status.getDescription().c_str());
544 return static_cast<Error>(status.getServiceSpecificError());
545 }
546 return Error::NONE;
547}
548
Ady Abrahamdc011a92021-12-21 14:06:44 -0800549Error AidlComposer::setColorTransform(Display display, const float* matrix) {
550 mWriter.setColorTransform(translate<int64_t>(display), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700551 return Error::NONE;
552}
553
554Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
555 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800556 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700557 return Error::NONE;
558}
559
560Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
561 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
562 translate<PowerMode>(mode));
563 if (!status.isOk()) {
564 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
565 return static_cast<Error>(status.getServiceSpecificError());
566 }
567 return Error::NONE;
568}
569
570Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
571 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
572 const auto status =
573 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
574 if (!status.isOk()) {
575 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
576 return static_cast<Error>(status.getServiceSpecificError());
577 }
578 return Error::NONE;
579}
580
581Error AidlComposer::setClientTargetSlotCount(Display display) {
582 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
583 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
584 bufferSlotCount);
585 if (!status.isOk()) {
586 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
587 return static_cast<Error>(status.getServiceSpecificError());
588 }
589 return Error::NONE;
590}
591
Ady Abraham43065bd2021-12-10 17:22:15 -0800592Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
593 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700594 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800595 mWriter.validateDisplay(translate<int64_t>(display),
596 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700597
598 Error error = execute();
599 if (error != Error::NONE) {
600 return error;
601 }
602
Ady Abrahama6388c02021-11-11 21:11:51 -0800603 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700604
605 return Error::NONE;
606}
607
Ady Abraham43065bd2021-12-10 17:22:15 -0800608Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
609 uint32_t* outNumTypes, uint32_t* outNumRequests,
610 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700611 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800612 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
613 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700614
615 Error error = execute();
616 if (error != Error::NONE) {
617 return error;
618 }
619
Ady Abrahamde792782021-12-20 10:00:49 -0800620 const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
621 if (!result.has_value()) {
622 *state = translate<uint32_t>(-1);
623 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700624 }
625
Ady Abrahamde792782021-12-20 10:00:49 -0800626 *state = translate<uint32_t>(*result);
627
628 if (*result == PresentOrValidate::Result::Presented) {
629 auto fence = mReader.takePresentFence(translate<int64_t>(display));
630 // take ownership
631 *outPresentFence = fence.get();
632 *fence.getR() = -1;
633 }
634
635 if (*result == PresentOrValidate::Result::Validated) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800636 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700637 }
638
639 return Error::NONE;
640}
641
642Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800643 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700644 return Error::NONE;
645}
646
647Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
648 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700649 const native_handle_t* handle = nullptr;
650 if (buffer.get()) {
651 handle = buffer->getNativeBuffer()->handle;
652 }
653
Ady Abrahama6388c02021-11-11 21:11:51 -0800654 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
655 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700656 return Error::NONE;
657}
658
659Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
660 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800661 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
662 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700663 return Error::NONE;
664}
665
666Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
667 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800668 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
669 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700670 return Error::NONE;
671}
672
673Error AidlComposer::setLayerColor(Display display, Layer layer,
674 const IComposerClient::Color& color) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800675 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer),
676 translate<Color>(color));
Ady Abrahame7385f72021-09-05 00:54:25 -0700677 return Error::NONE;
678}
679
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500680Error AidlComposer::setLayerCompositionType(
681 Display display, Layer layer,
682 aidl::android::hardware::graphics::composer3::Composition type) {
683 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700684 return Error::NONE;
685}
686
687Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800688 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
689 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700690 return Error::NONE;
691}
692
693Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
694 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800695 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
696 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700697 return Error::NONE;
698}
699
700Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800701 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700702 return Error::NONE;
703}
704
705Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
706 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800707 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700708 return Error::NONE;
709}
710
711Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
712 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800713 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
714 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700715 return Error::NONE;
716}
717
718Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800719 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
720 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700721 return Error::NONE;
722}
723
724Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
725 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800726 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
727 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700728 return Error::NONE;
729}
730
731Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800732 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700733 return Error::NONE;
734}
735
736Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800737 const auto& commands = mWriter.getPendingCommands();
738 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700739 mWriter.reset();
740 return Error::NONE;
741 }
742
Ady Abrahamde792782021-12-20 10:00:49 -0800743 { // scope for results
744 std::vector<CommandResultPayload> results;
745 auto status = mAidlComposerClient->executeCommands(commands, &results);
746 if (!status.isOk()) {
747 ALOGE("executeCommands failed %s", status.getDescription().c_str());
748 return static_cast<Error>(status.getServiceSpecificError());
749 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700750
Ady Abrahamde792782021-12-20 10:00:49 -0800751 mReader.parse(std::move(results));
752 }
Ady Abrahama6388c02021-11-11 21:11:51 -0800753 const auto commandErrors = mReader.takeErrors();
754 Error error = Error::NONE;
755 for (const auto& cmdErr : commandErrors) {
756 const auto index = static_cast<size_t>(cmdErr.commandIndex);
757 if (index < 0 || index >= commands.size()) {
758 ALOGE("invalid command index %zu", index);
759 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700760 }
761
Ady Abrahama6388c02021-11-11 21:11:51 -0800762 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800763 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
764 error = translate<Error>(cmdErr.errorCode);
765 } else {
766 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
767 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700768 }
769 }
770
771 mWriter.reset();
772
773 return error;
774}
775
776Error AidlComposer::setLayerPerFrameMetadata(
777 Display display, Layer layer,
778 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800779 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
780 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700781 return Error::NONE;
782}
783
784std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
785 Display display) {
786 std::vector<AidlPerFrameMetadataKey> keys;
787 const auto status =
788 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
789 if (!status.isOk()) {
790 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
791 return {};
792 }
793 return translate<IComposerClient::PerFrameMetadataKey>(keys);
794}
795
796Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
797 std::vector<RenderIntent>* outRenderIntents) {
798 std::vector<AidlRenderIntent> renderIntents;
799 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
800 translate<AidlColorMode>(colorMode),
801 &renderIntents);
802 if (!status.isOk()) {
803 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
804 return static_cast<Error>(status.getServiceSpecificError());
805 }
806 *outRenderIntents = translate<RenderIntent>(renderIntents);
807 return Error::NONE;
808}
809
810Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
811 std::vector<float> matrix;
812 const auto status =
813 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
814 &matrix);
815 if (!status.isOk()) {
816 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
817 return static_cast<Error>(status.getServiceSpecificError());
818 }
819 *outMatrix = makeMat4(matrix);
820 return Error::NONE;
821}
822
823Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
824 std::vector<uint8_t>* outData) {
825 AidlDisplayIdentification displayIdentification;
826 const auto status =
827 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
828 &displayIdentification);
829 if (!status.isOk()) {
830 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
831 return static_cast<Error>(status.getServiceSpecificError());
832 }
833
834 *outPort = static_cast<uint8_t>(displayIdentification.port);
835 *outData = displayIdentification.data;
836
837 return Error::NONE;
838}
839
840Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800841 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700842 return Error::NONE;
843}
844
845Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
846 Dataspace* outDataspace,
847 uint8_t* outComponentMask) {
848 if (!outFormat || !outDataspace || !outComponentMask) {
849 return Error::BAD_PARAMETER;
850 }
851
852 AidlDisplayContentSamplingAttributes attributes;
853 const auto status =
854 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
855 &attributes);
856 if (!status.isOk()) {
857 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
858 return static_cast<Error>(status.getServiceSpecificError());
859 }
860
861 *outFormat = translate<PixelFormat>(attributes.format);
862 *outDataspace = translate<Dataspace>(attributes.dataspace);
863 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
864 return Error::NONE;
865}
866
867Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
868 uint8_t componentMask, uint64_t maxFrames) {
869 const auto status =
870 mAidlComposerClient
871 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
872 static_cast<AidlFormatColorComponent>(
873 componentMask),
874 static_cast<int64_t>(maxFrames));
875 if (!status.isOk()) {
876 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
877 return static_cast<Error>(status.getServiceSpecificError());
878 }
879 return Error::NONE;
880}
881
882Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
883 uint64_t timestamp, DisplayedFrameStats* outStats) {
884 if (!outStats) {
885 return Error::BAD_PARAMETER;
886 }
887
888 AidlDisplayContentSample sample;
889 const auto status =
890 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
891 static_cast<int64_t>(maxFrames),
892 static_cast<int64_t>(timestamp),
893 &sample);
894 if (!status.isOk()) {
895 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
896 return static_cast<Error>(status.getServiceSpecificError());
897 }
898 *outStats = translate<DisplayedFrameStats>(sample);
899 return Error::NONE;
900}
901
902Error AidlComposer::setLayerPerFrameMetadataBlobs(
903 Display display, Layer layer,
904 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800905 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
906 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700907 return Error::NONE;
908}
909
Alec Mouricdf16792021-12-10 13:16:06 -0800910Error AidlComposer::setDisplayBrightness(Display display, float brightness,
911 const DisplayBrightnessOptions& options) {
912 if (!options.sdrDimmingEnabled) {
913 const auto status =
914 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
915 if (!status.isOk()) {
916 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
917 return static_cast<Error>(status.getServiceSpecificError());
918 }
919 return Error::NONE;
Ady Abrahame7385f72021-09-05 00:54:25 -0700920 }
Alec Mouricdf16792021-12-10 13:16:06 -0800921
922 mWriter.setDisplayBrightness(translate<int64_t>(display), brightness);
923
924 if (options.applyImmediately) {
925 return execute();
926 }
927
Ady Abrahame7385f72021-09-05 00:54:25 -0700928 return Error::NONE;
929}
930
931Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500932 std::vector<AidlDisplayCapability>* outCapabilities) {
933 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
934 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700935 if (!status.isOk()) {
936 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500937 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -0700938 return static_cast<Error>(status.getServiceSpecificError());
939 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700940 return Error::NONE;
941}
942
943V2_4::Error AidlComposer::getDisplayConnectionType(
944 Display display, IComposerClient::DisplayConnectionType* outType) {
945 AidlDisplayConnectionType type;
946 const auto status =
947 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
948 if (!status.isOk()) {
949 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
950 return static_cast<V2_4::Error>(status.getServiceSpecificError());
951 }
952 *outType = translate<IComposerClient::DisplayConnectionType>(type);
953 return V2_4::Error::NONE;
954}
955
956V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
957 int32_t vsyncPeriod;
958 const auto status =
959 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
960 if (!status.isOk()) {
961 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
962 return static_cast<V2_4::Error>(status.getServiceSpecificError());
963 }
964 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
965 return V2_4::Error::NONE;
966}
967
968V2_4::Error AidlComposer::setActiveConfigWithConstraints(
969 Display display, Config config,
970 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
971 VsyncPeriodChangeTimeline* outTimeline) {
972 AidlVsyncPeriodChangeTimeline timeline;
973 const auto status =
974 mAidlComposerClient
975 ->setActiveConfigWithConstraints(translate<int64_t>(display),
976 translate<int32_t>(config),
977 translate<AidlVsyncPeriodChangeConstraints>(
978 vsyncPeriodChangeConstraints),
979 &timeline);
980 if (!status.isOk()) {
981 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
982 return static_cast<V2_4::Error>(status.getServiceSpecificError());
983 }
984 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
985 return V2_4::Error::NONE;
986}
987
988V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
989 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
990 if (!status.isOk()) {
991 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
992 return static_cast<V2_4::Error>(status.getServiceSpecificError());
993 }
994 return V2_4::Error::NONE;
995}
996
997V2_4::Error AidlComposer::getSupportedContentTypes(
998 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
999 std::vector<AidlContentType> types;
1000 const auto status =
1001 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1002 if (!status.isOk()) {
1003 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1004 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1005 }
1006 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1007 return V2_4::Error::NONE;
1008}
1009
1010V2_4::Error AidlComposer::setContentType(Display display,
1011 IComposerClient::ContentType contentType) {
1012 const auto status =
1013 mAidlComposerClient->setContentType(translate<int64_t>(display),
1014 translate<AidlContentType>(contentType));
1015 if (!status.isOk()) {
1016 ALOGE("setContentType failed %s", status.getDescription().c_str());
1017 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1018 }
1019 return V2_4::Error::NONE;
1020}
1021
Ady Abraham3f976752021-12-20 16:17:50 -08001022V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1023 const std::vector<uint8_t>&) {
1024 // There are no users for this API. See b/209691612.
1025 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001026}
1027
1028V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001029 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1030 // There are no users for this API. See b/209691612.
1031 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001032}
1033
1034Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001035 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1036 float* whitePointNits) {
Ady Abrahamde792782021-12-20 10:00:49 -08001037 const auto property = mReader.takeClientTargetProperty(translate<int64_t>(display));
1038 *outClientTargetProperty =
1039 translate<IComposerClient::ClientTargetProperty>(property.clientTargetProperty);
1040 *whitePointNits = property.whitePointNits;
Ady Abrahame7385f72021-09-05 00:54:25 -07001041 return Error::NONE;
1042}
1043
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001044Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1045 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1046 whitePointNits);
1047 return Error::NONE;
1048}
1049
Ady Abrahame7385f72021-09-05 00:54:25 -07001050} // namespace Hwc2
1051} // namespace android