blob: 04723a2cbba0c3e6898f84cd39744f39df6c5f47 [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
Yichi Chen3401b562022-01-17 15:42:35 +080033#include "HWC2.h"
34
Ady Abrahame7385f72021-09-05 00:54:25 -070035namespace android {
36
37using hardware::hidl_handle;
38using hardware::hidl_vec;
39using hardware::Return;
40
41using aidl::android::hardware::graphics::composer3::BnComposerCallback;
42using aidl::android::hardware::graphics::composer3::Capability;
43using aidl::android::hardware::graphics::composer3::PowerMode;
44using aidl::android::hardware::graphics::composer3::VirtualDisplay;
45
Ady Abraham42977362021-12-07 21:04:49 -080046using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080047
Ady Abrahame7385f72021-09-05 00:54:25 -070048using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
49using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
50using AidlDisplayIdentification =
51 aidl::android::hardware::graphics::composer3::DisplayIdentification;
52using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
53using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
54using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070055using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
56using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
57using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
58using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
59using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
60using AidlVsyncPeriodChangeConstraints =
61 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
62using AidlVsyncPeriodChangeTimeline =
63 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070064using 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;
Ady Abrahame7385f72021-09-05 00:54:25 -070069
70using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
71using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
72using AidlFRect = aidl::android::hardware::graphics::common::FRect;
73using AidlRect = aidl::android::hardware::graphics::common::Rect;
74using AidlTransform = aidl::android::hardware::graphics::common::Transform;
75
76namespace Hwc2 {
77
78namespace {
79
80template <typename To, typename From>
81To translate(From x) {
82 return static_cast<To>(x);
83}
84
85template <typename To, typename From>
86std::vector<To> translate(const std::vector<From>& in) {
87 std::vector<To> out;
88 out.reserve(in.size());
89 std::transform(in.begin(), in.end(), std::back_inserter(out),
90 [](From x) { return translate<To>(x); });
91 return out;
92}
93
94template <>
95AidlRect translate(IComposerClient::Rect x) {
96 return AidlRect{
97 .left = x.left,
98 .top = x.top,
99 .right = x.right,
100 .bottom = x.bottom,
101 };
102}
103
104template <>
105AidlFRect translate(IComposerClient::FRect x) {
106 return AidlFRect{
107 .left = x.left,
108 .top = x.top,
109 .right = x.right,
110 .bottom = x.bottom,
111 };
112}
113
114template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700115AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
116 AidlPerFrameMetadataBlob blob;
117 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
118 std::copy(blob.blob.begin(), blob.blob.end(), x.blob.begin());
119 return blob;
120}
121
122template <>
123AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
124 return AidlPerFrameMetadata{
125 .key = translate<AidlPerFrameMetadataKey>(x.key),
126 .value = x.value,
127 };
128}
129
130template <>
131DisplayedFrameStats translate(AidlDisplayContentSample x) {
132 return DisplayedFrameStats{
133 .numFrames = static_cast<uint64_t>(x.frameCount),
134 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
135 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
136 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
137 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
138 };
139}
140
141template <>
142AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
143 return AidlVsyncPeriodChangeConstraints{
144 .desiredTimeNanos = x.desiredTimeNanos,
145 .seamlessRequired = x.seamlessRequired,
146 };
147}
148
149template <>
150VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
151 return VsyncPeriodChangeTimeline{
152 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
153 .refreshRequired = x.refreshRequired,
154 .refreshTimeNanos = x.refreshTimeNanos,
155 };
156}
157
158template <>
Ady Abrahama6388c02021-11-11 21:11:51 -0800159IComposerClient::ClientTargetProperty translate(ClientTargetProperty x) {
160 return IComposerClient::ClientTargetProperty{
161 .pixelFormat = translate<PixelFormat>(x.pixelFormat),
162 .dataspace = translate<Dataspace>(x.dataspace),
163 };
164}
165
Ady Abrahame7385f72021-09-05 00:54:25 -0700166mat4 makeMat4(std::vector<float> in) {
167 return mat4(static_cast<const float*>(in.data()));
168}
169
170} // namespace
171
172class AidlIComposerCallbackWrapper : public BnComposerCallback {
173public:
Yichi Chen3401b562022-01-17 15:42:35 +0800174 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700175
176 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
177 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
178 : V2_4::IComposerCallback::Connection::DISCONNECTED;
Yichi Chen3401b562022-01-17 15:42:35 +0800179 mCallback.onComposerHalHotplug(translate<Display>(in_display), connection);
Ady Abrahame7385f72021-09-05 00:54:25 -0700180 return ::ndk::ScopedAStatus::ok();
181 }
182
183 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800184 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700185 return ::ndk::ScopedAStatus::ok();
186 }
Yichi Chen3401b562022-01-17 15:42:35 +0800187
Ady Abrahame7385f72021-09-05 00:54:25 -0700188 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800189 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700190 return ::ndk::ScopedAStatus::ok();
191 }
Yichi Chen3401b562022-01-17 15:42:35 +0800192
Ady Abrahame7385f72021-09-05 00:54:25 -0700193 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
194 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800195 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
196 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700197 return ::ndk::ScopedAStatus::ok();
198 }
Yichi Chen3401b562022-01-17 15:42:35 +0800199
Ady Abrahame7385f72021-09-05 00:54:25 -0700200 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
201 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800202 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
203 translate<V2_4::VsyncPeriodChangeTimeline>(
204 in_updatedTimeline));
205 return ::ndk::ScopedAStatus::ok();
206 }
207
208 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
209 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700210 return ::ndk::ScopedAStatus::ok();
211 }
212
213private:
Yichi Chen3401b562022-01-17 15:42:35 +0800214 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700215};
216
Ady Abraham9fc28052021-10-14 17:21:38 -0700217std::string AidlComposer::instance(const std::string& serviceName) {
218 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
219}
220
221bool AidlComposer::isDeclared(const std::string& serviceName) {
222 return AServiceManager_isDeclared(instance(serviceName).c_str());
223}
Ady Abrahame7385f72021-09-05 00:54:25 -0700224
Ady Abrahama6388c02021-11-11 21:11:51 -0800225AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700226 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700227 mAidlComposer = AidlIComposer::fromBinder(
228 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700229 if (!mAidlComposer) {
230 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
231 return;
232 }
233
234 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
235 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
236 return;
237 }
238
239 ALOGI("Loaded AIDL composer3 HAL service");
240}
241
242AidlComposer::~AidlComposer() = default;
243
Ady Abraham4d211cf2021-12-14 16:19:03 -0800244bool AidlComposer::isSupported(OptionalFeature feature) const {
245 switch (feature) {
246 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800247 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800248 case OptionalFeature::DisplayBrightnessCommand:
Kriti Dang7defaf32021-11-15 11:55:43 +0100249 case OptionalFeature::BootDisplayConfig:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800250 return true;
251 }
252}
253
Ady Abrahamde549d42022-01-26 19:19:17 -0800254std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700255 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 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800261 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700262}
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
Yichi Chen3401b562022-01-17 15:42:35 +0800274void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700275 if (mAidlComposerCallback) {
276 ALOGE("Callback already registered");
277 }
Yichi Chen3401b562022-01-17 15:42:35 +0800278
Ady Abraham9fc28052021-10-14 17:21:38 -0700279 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700280 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
281
282 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
283 if (!status.isOk()) {
284 ALOGE("registerCallback failed %s", status.getDescription().c_str());
285 }
286}
287
288void AidlComposer::resetCommands() {
289 mWriter.reset();
290}
291
292Error AidlComposer::executeCommands() {
293 return execute();
294}
295
296uint32_t AidlComposer::getMaxVirtualDisplayCount() {
297 int32_t count = 0;
298 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
299 if (!status.isOk()) {
300 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
301 return 0;
302 }
303 return static_cast<uint32_t>(count);
304}
305
306Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
307 Display* outDisplay) {
308 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
309 const int32_t bufferSlotCount = 1;
310 VirtualDisplay virtualDisplay;
311 const auto status =
312 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
313 static_cast<int32_t>(height),
314 static_cast<AidlPixelFormat>(*format),
315 bufferSlotCount, &virtualDisplay);
316
317 if (!status.isOk()) {
318 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
319 return static_cast<Error>(status.getServiceSpecificError());
320 }
321
322 *outDisplay = translate<Display>(virtualDisplay.display);
323 *format = static_cast<PixelFormat>(virtualDisplay.format);
324 return Error::NONE;
325}
326
327Error AidlComposer::destroyVirtualDisplay(Display display) {
328 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
329 if (!status.isOk()) {
330 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
331 return static_cast<Error>(status.getServiceSpecificError());
332 }
333 return Error::NONE;
334}
335
336Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800337 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700338 return Error::NONE;
339}
340
341Error AidlComposer::createLayer(Display display, Layer* outLayer) {
342 int64_t layer;
343 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
344 kMaxLayerBufferCount, &layer);
345 if (!status.isOk()) {
346 ALOGE("createLayer failed %s", status.getDescription().c_str());
347 return static_cast<Error>(status.getServiceSpecificError());
348 }
349
350 *outLayer = translate<Layer>(layer);
351 return Error::NONE;
352}
353
354Error AidlComposer::destroyLayer(Display display, Layer layer) {
355 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
356 translate<int64_t>(layer));
357 if (!status.isOk()) {
358 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
359 return static_cast<Error>(status.getServiceSpecificError());
360 }
361 return Error::NONE;
362}
363
364Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
365 int32_t config;
366 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
367 if (!status.isOk()) {
368 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
369 return static_cast<Error>(status.getServiceSpecificError());
370 }
371 *outConfig = translate<Config>(config);
372 return Error::NONE;
373}
374
375Error AidlComposer::getChangedCompositionTypes(
376 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500377 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahamde792782021-12-20 10:00:49 -0800378 const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
379 outLayers->reserve(changedLayers.size());
380 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800381
Ady Abrahamde792782021-12-20 10:00:49 -0800382 for (const auto& layer : changedLayers) {
383 outLayers->emplace_back(translate<Layer>(layer.layer));
384 outTypes->emplace_back(layer.composition);
385 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700386 return Error::NONE;
387}
388
389Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
390 std::vector<AidlColorMode> modes;
391 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
392 if (!status.isOk()) {
393 ALOGE("getColorModes failed %s", status.getDescription().c_str());
394 return static_cast<Error>(status.getServiceSpecificError());
395 }
396 *outModes = translate<ColorMode>(modes);
397 return Error::NONE;
398}
399
400Error AidlComposer::getDisplayAttribute(Display display, Config config,
401 IComposerClient::Attribute attribute, int32_t* outValue) {
402 const auto status =
403 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
404 translate<int32_t>(config),
405 static_cast<AidlDisplayAttribute>(attribute),
406 outValue);
407 if (!status.isOk()) {
408 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
409 return static_cast<Error>(status.getServiceSpecificError());
410 }
411 return Error::NONE;
412}
413
414Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
415 std::vector<int32_t> configs;
416 const auto status =
417 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
418 if (!status.isOk()) {
419 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
420 return static_cast<Error>(status.getServiceSpecificError());
421 }
422 *outConfigs = translate<Config>(configs);
423 return Error::NONE;
424}
425
426Error AidlComposer::getDisplayName(Display display, std::string* outName) {
427 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
428 if (!status.isOk()) {
429 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
430 return static_cast<Error>(status.getServiceSpecificError());
431 }
432 return Error::NONE;
433}
434
435Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
436 std::vector<Layer>* outLayers,
437 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahamde792782021-12-20 10:00:49 -0800438 const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
439 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
440 outLayers->reserve(displayRequests.layerRequests.size());
441 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
442
443 for (const auto& layer : displayRequests.layerRequests) {
444 outLayers->emplace_back(translate<Layer>(layer.layer));
445 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
446 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700447 return Error::NONE;
448}
449
450Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800451 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700452 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800453 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700454 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800455 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700456 return static_cast<Error>(status.getServiceSpecificError());
457 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800458 *outSupport = std::find(capabilities.begin(), capabilities.end(),
459 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700460 return Error::NONE;
461}
462
463Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
464 float* outMaxLuminance, float* outMaxAverageLuminance,
465 float* outMinLuminance) {
466 AidlHdrCapabilities capabilities;
467 const auto status =
468 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
469 if (!status.isOk()) {
470 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
471 return static_cast<Error>(status.getServiceSpecificError());
472 }
473
474 *outTypes = translate<Hdr>(capabilities.types);
475 *outMaxLuminance = capabilities.maxLuminance;
476 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
477 *outMinLuminance = capabilities.minLuminance;
478 return Error::NONE;
479}
480
481Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
482 std::vector<int>* outReleaseFences) {
Ady Abrahamde792782021-12-20 10:00:49 -0800483 auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
484 outLayers->reserve(fences.size());
485 outReleaseFences->reserve(fences.size());
486
487 for (auto& fence : fences) {
488 outLayers->emplace_back(translate<Layer>(fence.layer));
489 // take ownership
490 const int fenceOwner = fence.fence.get();
491 *fence.fence.getR() = -1;
492 outReleaseFences->emplace_back(fenceOwner);
493 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700494 return Error::NONE;
495}
496
497Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
498 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800499 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700500
501 Error error = execute();
502 if (error != Error::NONE) {
503 return error;
504 }
505
Ady Abrahamde792782021-12-20 10:00:49 -0800506 auto fence = mReader.takePresentFence(translate<int64_t>(display));
507 // take ownership
508 *outPresentFence = fence.get();
509 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700510 return Error::NONE;
511}
512
513Error AidlComposer::setActiveConfig(Display display, Config config) {
514 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
515 translate<int32_t>(config));
516 if (!status.isOk()) {
517 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
518 return static_cast<Error>(status.getServiceSpecificError());
519 }
520 return Error::NONE;
521}
522
523Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
524 int acquireFence, Dataspace dataspace,
525 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700526 const native_handle_t* handle = nullptr;
527 if (target.get()) {
528 handle = target->getNativeBuffer()->handle;
529 }
530
Ady Abrahama6388c02021-11-11 21:11:51 -0800531 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700532 translate<aidl::android::hardware::graphics::common::Dataspace>(
533 dataspace),
534 translate<AidlRect>(damage));
535 return Error::NONE;
536}
537
538Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
539 const auto status =
540 mAidlComposerClient->setColorMode(translate<int64_t>(display),
541 translate<AidlColorMode>(mode),
542 translate<AidlRenderIntent>(renderIntent));
543 if (!status.isOk()) {
544 ALOGE("setColorMode failed %s", status.getDescription().c_str());
545 return static_cast<Error>(status.getServiceSpecificError());
546 }
547 return Error::NONE;
548}
549
Ady Abrahamdc011a92021-12-21 14:06:44 -0800550Error AidlComposer::setColorTransform(Display display, const float* matrix) {
551 mWriter.setColorTransform(translate<int64_t>(display), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700552 return Error::NONE;
553}
554
555Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
556 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800557 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700558 return Error::NONE;
559}
560
561Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
562 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
563 translate<PowerMode>(mode));
564 if (!status.isOk()) {
565 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
566 return static_cast<Error>(status.getServiceSpecificError());
567 }
568 return Error::NONE;
569}
570
571Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
572 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
573 const auto status =
574 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
575 if (!status.isOk()) {
576 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
577 return static_cast<Error>(status.getServiceSpecificError());
578 }
579 return Error::NONE;
580}
581
582Error AidlComposer::setClientTargetSlotCount(Display display) {
583 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
584 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
585 bufferSlotCount);
586 if (!status.isOk()) {
587 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
588 return static_cast<Error>(status.getServiceSpecificError());
589 }
590 return Error::NONE;
591}
592
Ady Abraham43065bd2021-12-10 17:22:15 -0800593Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
594 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700595 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800596 mWriter.validateDisplay(translate<int64_t>(display),
597 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700598
599 Error error = execute();
600 if (error != Error::NONE) {
601 return error;
602 }
603
Ady Abrahama6388c02021-11-11 21:11:51 -0800604 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700605
606 return Error::NONE;
607}
608
Ady Abraham43065bd2021-12-10 17:22:15 -0800609Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
610 uint32_t* outNumTypes, uint32_t* outNumRequests,
611 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700612 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800613 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
614 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700615
616 Error error = execute();
617 if (error != Error::NONE) {
618 return error;
619 }
620
Ady Abrahamde792782021-12-20 10:00:49 -0800621 const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
622 if (!result.has_value()) {
623 *state = translate<uint32_t>(-1);
624 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700625 }
626
Ady Abrahamde792782021-12-20 10:00:49 -0800627 *state = translate<uint32_t>(*result);
628
629 if (*result == PresentOrValidate::Result::Presented) {
630 auto fence = mReader.takePresentFence(translate<int64_t>(display));
631 // take ownership
632 *outPresentFence = fence.get();
633 *fence.getR() = -1;
634 }
635
636 if (*result == PresentOrValidate::Result::Validated) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800637 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700638 }
639
640 return Error::NONE;
641}
642
643Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800644 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700645 return Error::NONE;
646}
647
648Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
649 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700650 const native_handle_t* handle = nullptr;
651 if (buffer.get()) {
652 handle = buffer->getNativeBuffer()->handle;
653 }
654
Ady Abrahama6388c02021-11-11 21:11:51 -0800655 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
656 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700657 return Error::NONE;
658}
659
660Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
661 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800662 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
663 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700664 return Error::NONE;
665}
666
667Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
668 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800669 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
670 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700671 return Error::NONE;
672}
673
Ady Abraham6e60b142022-01-06 18:10:35 -0800674Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
675 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
Ady Abrahame7385f72021-09-05 00:54:25 -0700676 return Error::NONE;
677}
678
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500679Error AidlComposer::setLayerCompositionType(
680 Display display, Layer layer,
681 aidl::android::hardware::graphics::composer3::Composition type) {
682 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700683 return Error::NONE;
684}
685
686Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800687 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
688 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700689 return Error::NONE;
690}
691
692Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
693 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800694 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
695 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700696 return Error::NONE;
697}
698
699Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800700 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return Error::NONE;
702}
703
704Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
705 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800706 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700707 return Error::NONE;
708}
709
710Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
711 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800712 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
713 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700714 return Error::NONE;
715}
716
717Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800718 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
719 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700720 return Error::NONE;
721}
722
723Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
724 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800725 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
726 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700727 return Error::NONE;
728}
729
730Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800731 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700732 return Error::NONE;
733}
734
735Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800736 const auto& commands = mWriter.getPendingCommands();
737 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700738 mWriter.reset();
739 return Error::NONE;
740 }
741
Ady Abrahamde792782021-12-20 10:00:49 -0800742 { // scope for results
743 std::vector<CommandResultPayload> results;
744 auto status = mAidlComposerClient->executeCommands(commands, &results);
745 if (!status.isOk()) {
746 ALOGE("executeCommands failed %s", status.getDescription().c_str());
747 return static_cast<Error>(status.getServiceSpecificError());
748 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700749
Ady Abrahamde792782021-12-20 10:00:49 -0800750 mReader.parse(std::move(results));
751 }
Ady Abrahama6388c02021-11-11 21:11:51 -0800752 const auto commandErrors = mReader.takeErrors();
753 Error error = Error::NONE;
754 for (const auto& cmdErr : commandErrors) {
755 const auto index = static_cast<size_t>(cmdErr.commandIndex);
756 if (index < 0 || index >= commands.size()) {
757 ALOGE("invalid command index %zu", index);
758 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700759 }
760
Ady Abrahama6388c02021-11-11 21:11:51 -0800761 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800762 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
763 error = translate<Error>(cmdErr.errorCode);
764 } else {
765 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
766 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700767 }
768 }
769
770 mWriter.reset();
771
772 return error;
773}
774
775Error AidlComposer::setLayerPerFrameMetadata(
776 Display display, Layer layer,
777 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800778 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
779 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700780 return Error::NONE;
781}
782
783std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
784 Display display) {
785 std::vector<AidlPerFrameMetadataKey> keys;
786 const auto status =
787 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
788 if (!status.isOk()) {
789 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
790 return {};
791 }
792 return translate<IComposerClient::PerFrameMetadataKey>(keys);
793}
794
795Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
796 std::vector<RenderIntent>* outRenderIntents) {
797 std::vector<AidlRenderIntent> renderIntents;
798 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
799 translate<AidlColorMode>(colorMode),
800 &renderIntents);
801 if (!status.isOk()) {
802 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
803 return static_cast<Error>(status.getServiceSpecificError());
804 }
805 *outRenderIntents = translate<RenderIntent>(renderIntents);
806 return Error::NONE;
807}
808
809Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
810 std::vector<float> matrix;
811 const auto status =
812 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
813 &matrix);
814 if (!status.isOk()) {
815 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
816 return static_cast<Error>(status.getServiceSpecificError());
817 }
818 *outMatrix = makeMat4(matrix);
819 return Error::NONE;
820}
821
822Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
823 std::vector<uint8_t>* outData) {
824 AidlDisplayIdentification displayIdentification;
825 const auto status =
826 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
827 &displayIdentification);
828 if (!status.isOk()) {
829 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
830 return static_cast<Error>(status.getServiceSpecificError());
831 }
832
833 *outPort = static_cast<uint8_t>(displayIdentification.port);
834 *outData = displayIdentification.data;
835
836 return Error::NONE;
837}
838
839Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800840 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700841 return Error::NONE;
842}
843
844Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
845 Dataspace* outDataspace,
846 uint8_t* outComponentMask) {
847 if (!outFormat || !outDataspace || !outComponentMask) {
848 return Error::BAD_PARAMETER;
849 }
850
851 AidlDisplayContentSamplingAttributes attributes;
852 const auto status =
853 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
854 &attributes);
855 if (!status.isOk()) {
856 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
857 return static_cast<Error>(status.getServiceSpecificError());
858 }
859
860 *outFormat = translate<PixelFormat>(attributes.format);
861 *outDataspace = translate<Dataspace>(attributes.dataspace);
862 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
863 return Error::NONE;
864}
865
866Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
867 uint8_t componentMask, uint64_t maxFrames) {
868 const auto status =
869 mAidlComposerClient
870 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
871 static_cast<AidlFormatColorComponent>(
872 componentMask),
873 static_cast<int64_t>(maxFrames));
874 if (!status.isOk()) {
875 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
876 return static_cast<Error>(status.getServiceSpecificError());
877 }
878 return Error::NONE;
879}
880
881Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
882 uint64_t timestamp, DisplayedFrameStats* outStats) {
883 if (!outStats) {
884 return Error::BAD_PARAMETER;
885 }
886
887 AidlDisplayContentSample sample;
888 const auto status =
889 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
890 static_cast<int64_t>(maxFrames),
891 static_cast<int64_t>(timestamp),
892 &sample);
893 if (!status.isOk()) {
894 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
895 return static_cast<Error>(status.getServiceSpecificError());
896 }
897 *outStats = translate<DisplayedFrameStats>(sample);
898 return Error::NONE;
899}
900
901Error AidlComposer::setLayerPerFrameMetadataBlobs(
902 Display display, Layer layer,
903 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800904 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
905 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700906 return Error::NONE;
907}
908
Alec Mouricdf16792021-12-10 13:16:06 -0800909Error AidlComposer::setDisplayBrightness(Display display, float brightness,
910 const DisplayBrightnessOptions& options) {
Alec Mouricdf16792021-12-10 13:16:06 -0800911 mWriter.setDisplayBrightness(translate<int64_t>(display), brightness);
912
913 if (options.applyImmediately) {
914 return execute();
915 }
916
Ady Abrahame7385f72021-09-05 00:54:25 -0700917 return Error::NONE;
918}
919
920Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500921 std::vector<AidlDisplayCapability>* outCapabilities) {
922 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
923 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700924 if (!status.isOk()) {
925 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500926 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -0700927 return static_cast<Error>(status.getServiceSpecificError());
928 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700929 return Error::NONE;
930}
931
932V2_4::Error AidlComposer::getDisplayConnectionType(
933 Display display, IComposerClient::DisplayConnectionType* outType) {
934 AidlDisplayConnectionType type;
935 const auto status =
936 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
937 if (!status.isOk()) {
938 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
939 return static_cast<V2_4::Error>(status.getServiceSpecificError());
940 }
941 *outType = translate<IComposerClient::DisplayConnectionType>(type);
942 return V2_4::Error::NONE;
943}
944
945V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
946 int32_t vsyncPeriod;
947 const auto status =
948 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
949 if (!status.isOk()) {
950 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
951 return static_cast<V2_4::Error>(status.getServiceSpecificError());
952 }
953 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
954 return V2_4::Error::NONE;
955}
956
957V2_4::Error AidlComposer::setActiveConfigWithConstraints(
958 Display display, Config config,
959 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
960 VsyncPeriodChangeTimeline* outTimeline) {
961 AidlVsyncPeriodChangeTimeline timeline;
962 const auto status =
963 mAidlComposerClient
964 ->setActiveConfigWithConstraints(translate<int64_t>(display),
965 translate<int32_t>(config),
966 translate<AidlVsyncPeriodChangeConstraints>(
967 vsyncPeriodChangeConstraints),
968 &timeline);
969 if (!status.isOk()) {
970 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
971 return static_cast<V2_4::Error>(status.getServiceSpecificError());
972 }
973 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
974 return V2_4::Error::NONE;
975}
976
977V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
978 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
979 if (!status.isOk()) {
980 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
981 return static_cast<V2_4::Error>(status.getServiceSpecificError());
982 }
983 return V2_4::Error::NONE;
984}
985
986V2_4::Error AidlComposer::getSupportedContentTypes(
987 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
988 std::vector<AidlContentType> types;
989 const auto status =
990 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
991 if (!status.isOk()) {
992 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
993 return static_cast<V2_4::Error>(status.getServiceSpecificError());
994 }
995 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
996 return V2_4::Error::NONE;
997}
998
999V2_4::Error AidlComposer::setContentType(Display display,
1000 IComposerClient::ContentType contentType) {
1001 const auto status =
1002 mAidlComposerClient->setContentType(translate<int64_t>(display),
1003 translate<AidlContentType>(contentType));
1004 if (!status.isOk()) {
1005 ALOGE("setContentType failed %s", status.getDescription().c_str());
1006 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1007 }
1008 return V2_4::Error::NONE;
1009}
1010
Ady Abraham3f976752021-12-20 16:17:50 -08001011V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1012 const std::vector<uint8_t>&) {
1013 // There are no users for this API. See b/209691612.
1014 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001015}
1016
1017V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001018 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1019 // There are no users for this API. See b/209691612.
1020 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001021}
1022
Kriti Dang7defaf32021-11-15 11:55:43 +01001023Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1024 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1025 translate<int32_t>(config));
1026 if (!status.isOk()) {
1027 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1028 return static_cast<Error>(status.getServiceSpecificError());
1029 }
1030 return Error::NONE;
1031}
1032
1033Error AidlComposer::clearBootDisplayConfig(Display display) {
1034 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1035 if (!status.isOk()) {
1036 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1037 return static_cast<Error>(status.getServiceSpecificError());
1038 }
1039 return Error::NONE;
1040}
1041
1042Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1043 int32_t displayConfig;
1044 const auto status =
1045 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1046 &displayConfig);
1047 if (!status.isOk()) {
1048 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1049 return static_cast<Error>(status.getServiceSpecificError());
1050 }
1051 *config = translate<uint32_t>(displayConfig);
1052 return Error::NONE;
1053}
1054
Ady Abrahame7385f72021-09-05 00:54:25 -07001055Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001056 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1057 float* whitePointNits) {
Ady Abrahamde792782021-12-20 10:00:49 -08001058 const auto property = mReader.takeClientTargetProperty(translate<int64_t>(display));
1059 *outClientTargetProperty =
1060 translate<IComposerClient::ClientTargetProperty>(property.clientTargetProperty);
1061 *whitePointNits = property.whitePointNits;
Ady Abrahame7385f72021-09-05 00:54:25 -07001062 return Error::NONE;
1063}
1064
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001065Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) {
1066 mWriter.setLayerWhitePointNits(translate<int64_t>(display), translate<int64_t>(layer),
1067 whitePointNits);
1068 return Error::NONE;
1069}
1070
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001071Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1072 const std::vector<IComposerClient::Rect>& blocking) {
1073 mWriter.setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1074 translate<AidlRect>(blocking));
1075 return Error::NONE;
1076}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001077
1078Error AidlComposer::getDisplayDecorationSupport(Display display,
1079 std::optional<DisplayDecorationSupport>* support) {
1080 const auto status =
1081 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1082 if (!status.isOk()) {
1083 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1084 support->reset();
1085 return static_cast<Error>(status.getServiceSpecificError());
1086 }
1087 return Error::NONE;
1088}
Ady Abrahame7385f72021-09-05 00:54:25 -07001089} // namespace Hwc2
1090} // namespace android