blob: 92592f7e09fc2c7c30fa401119fd00cc4fa06a50 [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
Ady Abrahamc4acf512022-02-18 17:11:59 -080023#include <android-base/file.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070024#include <android/binder_ibinder_platform.h>
25#include <android/binder_manager.h>
26#include <log/log.h>
27#include <utils/Trace.h>
28
29#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
30
31#include <algorithm>
32#include <cinttypes>
33
Yichi Chen3401b562022-01-17 15:42:35 +080034#include "HWC2.h"
35
Ady Abrahame7385f72021-09-05 00:54:25 -070036namespace android {
37
38using hardware::hidl_handle;
39using hardware::hidl_vec;
40using hardware::Return;
41
42using aidl::android::hardware::graphics::composer3::BnComposerCallback;
43using aidl::android::hardware::graphics::composer3::Capability;
44using aidl::android::hardware::graphics::composer3::PowerMode;
45using aidl::android::hardware::graphics::composer3::VirtualDisplay;
46
Ady Abraham42977362021-12-07 21:04:49 -080047using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080048
Ady Abrahame7385f72021-09-05 00:54:25 -070049using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
50using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
51using AidlDisplayIdentification =
52 aidl::android::hardware::graphics::composer3::DisplayIdentification;
53using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
54using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
55using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070056using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
57using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
58using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
59using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
60using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
61using AidlVsyncPeriodChangeConstraints =
62 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
63using AidlVsyncPeriodChangeTimeline =
64 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070065using AidlDisplayContentSamplingAttributes =
66 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
67using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
68using AidlDisplayConnectionType =
69 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070070
71using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
72using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
73using AidlFRect = aidl::android::hardware::graphics::common::FRect;
74using AidlRect = aidl::android::hardware::graphics::common::Rect;
75using AidlTransform = aidl::android::hardware::graphics::common::Transform;
76
77namespace Hwc2 {
78
79namespace {
80
81template <typename To, typename From>
82To translate(From x) {
83 return static_cast<To>(x);
84}
85
86template <typename To, typename From>
87std::vector<To> translate(const std::vector<From>& in) {
88 std::vector<To> out;
89 out.reserve(in.size());
90 std::transform(in.begin(), in.end(), std::back_inserter(out),
91 [](From x) { return translate<To>(x); });
92 return out;
93}
94
95template <>
96AidlRect translate(IComposerClient::Rect x) {
97 return AidlRect{
98 .left = x.left,
99 .top = x.top,
100 .right = x.right,
101 .bottom = x.bottom,
102 };
103}
104
105template <>
106AidlFRect translate(IComposerClient::FRect x) {
107 return AidlFRect{
108 .left = x.left,
109 .top = x.top,
110 .right = x.right,
111 .bottom = x.bottom,
112 };
113}
114
115template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700116AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
117 AidlPerFrameMetadataBlob blob;
118 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800119 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700120 return blob;
121}
122
123template <>
124AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
125 return AidlPerFrameMetadata{
126 .key = translate<AidlPerFrameMetadataKey>(x.key),
127 .value = x.value,
128 };
129}
130
131template <>
132DisplayedFrameStats translate(AidlDisplayContentSample x) {
133 return DisplayedFrameStats{
134 .numFrames = static_cast<uint64_t>(x.frameCount),
135 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
136 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
137 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
138 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
139 };
140}
141
142template <>
143AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
144 return AidlVsyncPeriodChangeConstraints{
145 .desiredTimeNanos = x.desiredTimeNanos,
146 .seamlessRequired = x.seamlessRequired,
147 };
148}
149
150template <>
151VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
152 return VsyncPeriodChangeTimeline{
153 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
154 .refreshRequired = x.refreshRequired,
155 .refreshTimeNanos = x.refreshTimeNanos,
156 };
157}
158
159template <>
Ady Abrahama6388c02021-11-11 21:11:51 -0800160IComposerClient::ClientTargetProperty translate(ClientTargetProperty x) {
161 return IComposerClient::ClientTargetProperty{
162 .pixelFormat = translate<PixelFormat>(x.pixelFormat),
163 .dataspace = translate<Dataspace>(x.dataspace),
164 };
165}
166
Ady Abrahame7385f72021-09-05 00:54:25 -0700167mat4 makeMat4(std::vector<float> in) {
168 return mat4(static_cast<const float*>(in.data()));
169}
170
171} // namespace
172
173class AidlIComposerCallbackWrapper : public BnComposerCallback {
174public:
Yichi Chen3401b562022-01-17 15:42:35 +0800175 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700176
177 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
178 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
179 : V2_4::IComposerCallback::Connection::DISCONNECTED;
Yichi Chen3401b562022-01-17 15:42:35 +0800180 mCallback.onComposerHalHotplug(translate<Display>(in_display), connection);
Ady Abrahame7385f72021-09-05 00:54:25 -0700181 return ::ndk::ScopedAStatus::ok();
182 }
183
184 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800185 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700186 return ::ndk::ScopedAStatus::ok();
187 }
Yichi Chen3401b562022-01-17 15:42:35 +0800188
Ady Abrahame7385f72021-09-05 00:54:25 -0700189 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800190 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700191 return ::ndk::ScopedAStatus::ok();
192 }
Yichi Chen3401b562022-01-17 15:42:35 +0800193
Ady Abrahame7385f72021-09-05 00:54:25 -0700194 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
195 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800196 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
197 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700198 return ::ndk::ScopedAStatus::ok();
199 }
Yichi Chen3401b562022-01-17 15:42:35 +0800200
Ady Abrahame7385f72021-09-05 00:54:25 -0700201 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
202 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800203 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
204 translate<V2_4::VsyncPeriodChangeTimeline>(
205 in_updatedTimeline));
206 return ::ndk::ScopedAStatus::ok();
207 }
208
209 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
210 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700211 return ::ndk::ScopedAStatus::ok();
212 }
213
214private:
Yichi Chen3401b562022-01-17 15:42:35 +0800215 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700216};
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:
Kriti Dang7defaf32021-11-15 11:55:43 +0100250 case OptionalFeature::BootDisplayConfig:
ramindani32cf0602022-03-02 02:30:29 +0000251 case OptionalFeature::KernelIdleTimer:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800252 return true;
253 }
254}
255
Ady Abrahamde549d42022-01-26 19:19:17 -0800256std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700257 std::vector<Capability> capabilities;
258 const auto status = mAidlComposer->getCapabilities(&capabilities);
259 if (!status.isOk()) {
260 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
261 return {};
262 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800263 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700264}
265
266std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800267 int pipefds[2];
268 int result = pipe(pipefds);
269 if (result < 0) {
270 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700271 return {};
272 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800273
274 std::string str;
275 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
276 // Close the write-end of the pipe to make sure that when reading from the
277 // read-end we will get eof instead of blocking forever
278 close(pipefds[1]);
279
280 if (status == STATUS_OK) {
281 base::ReadFdToString(pipefds[0], &str);
282 } else {
283 ALOGE("dumpDebugInfo: dump failed: %d", status);
284 }
285
286 close(pipefds[0]);
287 return str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700288}
289
Yichi Chen3401b562022-01-17 15:42:35 +0800290void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700291 if (mAidlComposerCallback) {
292 ALOGE("Callback already registered");
293 }
Yichi Chen3401b562022-01-17 15:42:35 +0800294
Ady Abraham9fc28052021-10-14 17:21:38 -0700295 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700296 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
297
298 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
299 if (!status.isOk()) {
300 ALOGE("registerCallback failed %s", status.getDescription().c_str());
301 }
302}
303
304void AidlComposer::resetCommands() {
305 mWriter.reset();
306}
307
308Error AidlComposer::executeCommands() {
309 return execute();
310}
311
312uint32_t AidlComposer::getMaxVirtualDisplayCount() {
313 int32_t count = 0;
314 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
315 if (!status.isOk()) {
316 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
317 return 0;
318 }
319 return static_cast<uint32_t>(count);
320}
321
322Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
323 Display* outDisplay) {
324 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
325 const int32_t bufferSlotCount = 1;
326 VirtualDisplay virtualDisplay;
327 const auto status =
328 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
329 static_cast<int32_t>(height),
330 static_cast<AidlPixelFormat>(*format),
331 bufferSlotCount, &virtualDisplay);
332
333 if (!status.isOk()) {
334 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
335 return static_cast<Error>(status.getServiceSpecificError());
336 }
337
338 *outDisplay = translate<Display>(virtualDisplay.display);
339 *format = static_cast<PixelFormat>(virtualDisplay.format);
340 return Error::NONE;
341}
342
343Error AidlComposer::destroyVirtualDisplay(Display display) {
344 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
345 if (!status.isOk()) {
346 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
347 return static_cast<Error>(status.getServiceSpecificError());
348 }
349 return Error::NONE;
350}
351
352Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800353 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700354 return Error::NONE;
355}
356
357Error AidlComposer::createLayer(Display display, Layer* outLayer) {
358 int64_t layer;
359 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
360 kMaxLayerBufferCount, &layer);
361 if (!status.isOk()) {
362 ALOGE("createLayer failed %s", status.getDescription().c_str());
363 return static_cast<Error>(status.getServiceSpecificError());
364 }
365
366 *outLayer = translate<Layer>(layer);
367 return Error::NONE;
368}
369
370Error AidlComposer::destroyLayer(Display display, Layer layer) {
371 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
372 translate<int64_t>(layer));
373 if (!status.isOk()) {
374 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
375 return static_cast<Error>(status.getServiceSpecificError());
376 }
377 return Error::NONE;
378}
379
380Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
381 int32_t config;
382 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
383 if (!status.isOk()) {
384 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
385 return static_cast<Error>(status.getServiceSpecificError());
386 }
387 *outConfig = translate<Config>(config);
388 return Error::NONE;
389}
390
391Error AidlComposer::getChangedCompositionTypes(
392 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500393 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahamde792782021-12-20 10:00:49 -0800394 const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
395 outLayers->reserve(changedLayers.size());
396 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800397
Ady Abrahamde792782021-12-20 10:00:49 -0800398 for (const auto& layer : changedLayers) {
399 outLayers->emplace_back(translate<Layer>(layer.layer));
400 outTypes->emplace_back(layer.composition);
401 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700402 return Error::NONE;
403}
404
405Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
406 std::vector<AidlColorMode> modes;
407 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
408 if (!status.isOk()) {
409 ALOGE("getColorModes failed %s", status.getDescription().c_str());
410 return static_cast<Error>(status.getServiceSpecificError());
411 }
412 *outModes = translate<ColorMode>(modes);
413 return Error::NONE;
414}
415
416Error AidlComposer::getDisplayAttribute(Display display, Config config,
417 IComposerClient::Attribute attribute, int32_t* outValue) {
418 const auto status =
419 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
420 translate<int32_t>(config),
421 static_cast<AidlDisplayAttribute>(attribute),
422 outValue);
423 if (!status.isOk()) {
424 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
425 return static_cast<Error>(status.getServiceSpecificError());
426 }
427 return Error::NONE;
428}
429
430Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
431 std::vector<int32_t> configs;
432 const auto status =
433 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
434 if (!status.isOk()) {
435 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
436 return static_cast<Error>(status.getServiceSpecificError());
437 }
438 *outConfigs = translate<Config>(configs);
439 return Error::NONE;
440}
441
442Error AidlComposer::getDisplayName(Display display, std::string* outName) {
443 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
444 if (!status.isOk()) {
445 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
446 return static_cast<Error>(status.getServiceSpecificError());
447 }
448 return Error::NONE;
449}
450
451Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
452 std::vector<Layer>* outLayers,
453 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahamde792782021-12-20 10:00:49 -0800454 const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
455 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
456 outLayers->reserve(displayRequests.layerRequests.size());
457 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
458
459 for (const auto& layer : displayRequests.layerRequests) {
460 outLayers->emplace_back(translate<Layer>(layer.layer));
461 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
462 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700463 return Error::NONE;
464}
465
466Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800467 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700468 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800469 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700470 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800471 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700472 return static_cast<Error>(status.getServiceSpecificError());
473 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800474 *outSupport = std::find(capabilities.begin(), capabilities.end(),
475 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700476 return Error::NONE;
477}
478
ramindani32cf0602022-03-02 02:30:29 +0000479Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
480 std::vector<AidlDisplayCapability> capabilities;
481 const auto status =
482 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
483 if (!status.isOk()) {
484 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
485 return static_cast<Error>(status.getServiceSpecificError());
486 }
487 *outSupport = std::find(capabilities.begin(), capabilities.end(),
488 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
489 return Error::NONE;
490}
491
Ady Abrahame7385f72021-09-05 00:54:25 -0700492Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
493 float* outMaxLuminance, float* outMaxAverageLuminance,
494 float* outMinLuminance) {
495 AidlHdrCapabilities capabilities;
496 const auto status =
497 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
498 if (!status.isOk()) {
499 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
500 return static_cast<Error>(status.getServiceSpecificError());
501 }
502
503 *outTypes = translate<Hdr>(capabilities.types);
504 *outMaxLuminance = capabilities.maxLuminance;
505 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
506 *outMinLuminance = capabilities.minLuminance;
507 return Error::NONE;
508}
509
510Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
511 std::vector<int>* outReleaseFences) {
Ady Abrahamde792782021-12-20 10:00:49 -0800512 auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
513 outLayers->reserve(fences.size());
514 outReleaseFences->reserve(fences.size());
515
516 for (auto& fence : fences) {
517 outLayers->emplace_back(translate<Layer>(fence.layer));
518 // take ownership
519 const int fenceOwner = fence.fence.get();
520 *fence.fence.getR() = -1;
521 outReleaseFences->emplace_back(fenceOwner);
522 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700523 return Error::NONE;
524}
525
526Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
527 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800528 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700529
530 Error error = execute();
531 if (error != Error::NONE) {
532 return error;
533 }
534
Ady Abrahamde792782021-12-20 10:00:49 -0800535 auto fence = mReader.takePresentFence(translate<int64_t>(display));
536 // take ownership
537 *outPresentFence = fence.get();
538 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700539 return Error::NONE;
540}
541
542Error AidlComposer::setActiveConfig(Display display, Config config) {
543 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
544 translate<int32_t>(config));
545 if (!status.isOk()) {
546 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
547 return static_cast<Error>(status.getServiceSpecificError());
548 }
549 return Error::NONE;
550}
551
552Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
553 int acquireFence, Dataspace dataspace,
554 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700555 const native_handle_t* handle = nullptr;
556 if (target.get()) {
557 handle = target->getNativeBuffer()->handle;
558 }
559
Ady Abrahama6388c02021-11-11 21:11:51 -0800560 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700561 translate<aidl::android::hardware::graphics::common::Dataspace>(
562 dataspace),
563 translate<AidlRect>(damage));
564 return Error::NONE;
565}
566
567Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
568 const auto status =
569 mAidlComposerClient->setColorMode(translate<int64_t>(display),
570 translate<AidlColorMode>(mode),
571 translate<AidlRenderIntent>(renderIntent));
572 if (!status.isOk()) {
573 ALOGE("setColorMode failed %s", status.getDescription().c_str());
574 return static_cast<Error>(status.getServiceSpecificError());
575 }
576 return Error::NONE;
577}
578
Ady Abrahamdc011a92021-12-21 14:06:44 -0800579Error AidlComposer::setColorTransform(Display display, const float* matrix) {
580 mWriter.setColorTransform(translate<int64_t>(display), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700581 return Error::NONE;
582}
583
584Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
585 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800586 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700587 return Error::NONE;
588}
589
590Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
591 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
592 translate<PowerMode>(mode));
593 if (!status.isOk()) {
594 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
595 return static_cast<Error>(status.getServiceSpecificError());
596 }
597 return Error::NONE;
598}
599
600Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
601 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
602 const auto status =
603 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
604 if (!status.isOk()) {
605 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
606 return static_cast<Error>(status.getServiceSpecificError());
607 }
608 return Error::NONE;
609}
610
611Error AidlComposer::setClientTargetSlotCount(Display display) {
612 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
613 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
614 bufferSlotCount);
615 if (!status.isOk()) {
616 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
617 return static_cast<Error>(status.getServiceSpecificError());
618 }
619 return Error::NONE;
620}
621
Ady Abraham43065bd2021-12-10 17:22:15 -0800622Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
623 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700624 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800625 mWriter.validateDisplay(translate<int64_t>(display),
626 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700627
628 Error error = execute();
629 if (error != Error::NONE) {
630 return error;
631 }
632
Ady Abrahama6388c02021-11-11 21:11:51 -0800633 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700634
635 return Error::NONE;
636}
637
Ady Abraham43065bd2021-12-10 17:22:15 -0800638Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
639 uint32_t* outNumTypes, uint32_t* outNumRequests,
640 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700641 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800642 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
643 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700644
645 Error error = execute();
646 if (error != Error::NONE) {
647 return error;
648 }
649
Ady Abrahamde792782021-12-20 10:00:49 -0800650 const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
651 if (!result.has_value()) {
652 *state = translate<uint32_t>(-1);
653 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700654 }
655
Ady Abrahamde792782021-12-20 10:00:49 -0800656 *state = translate<uint32_t>(*result);
657
658 if (*result == PresentOrValidate::Result::Presented) {
659 auto fence = mReader.takePresentFence(translate<int64_t>(display));
660 // take ownership
661 *outPresentFence = fence.get();
662 *fence.getR() = -1;
663 }
664
665 if (*result == PresentOrValidate::Result::Validated) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800666 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700667 }
668
669 return Error::NONE;
670}
671
672Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800673 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700674 return Error::NONE;
675}
676
677Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
678 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700679 const native_handle_t* handle = nullptr;
680 if (buffer.get()) {
681 handle = buffer->getNativeBuffer()->handle;
682 }
683
Ady Abrahama6388c02021-11-11 21:11:51 -0800684 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
685 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700686 return Error::NONE;
687}
688
689Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
690 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800691 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
692 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700693 return Error::NONE;
694}
695
696Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
697 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800698 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
699 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700700 return Error::NONE;
701}
702
Ady Abraham6e60b142022-01-06 18:10:35 -0800703Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
704 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
Ady Abrahame7385f72021-09-05 00:54:25 -0700705 return Error::NONE;
706}
707
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500708Error AidlComposer::setLayerCompositionType(
709 Display display, Layer layer,
710 aidl::android::hardware::graphics::composer3::Composition type) {
711 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700712 return Error::NONE;
713}
714
715Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800716 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
717 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700718 return Error::NONE;
719}
720
721Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
722 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800723 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
724 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700725 return Error::NONE;
726}
727
728Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800729 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700730 return Error::NONE;
731}
732
733Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
734 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800735 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700736 return Error::NONE;
737}
738
739Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
740 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800741 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
742 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700743 return Error::NONE;
744}
745
746Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800747 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
748 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700749 return Error::NONE;
750}
751
752Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
753 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800754 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
755 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700756 return Error::NONE;
757}
758
759Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800760 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700761 return Error::NONE;
762}
763
764Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800765 const auto& commands = mWriter.getPendingCommands();
766 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700767 mWriter.reset();
768 return Error::NONE;
769 }
770
Ady Abrahamde792782021-12-20 10:00:49 -0800771 { // scope for results
772 std::vector<CommandResultPayload> results;
773 auto status = mAidlComposerClient->executeCommands(commands, &results);
774 if (!status.isOk()) {
775 ALOGE("executeCommands failed %s", status.getDescription().c_str());
776 return static_cast<Error>(status.getServiceSpecificError());
777 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700778
Ady Abrahamde792782021-12-20 10:00:49 -0800779 mReader.parse(std::move(results));
780 }
Ady Abrahama6388c02021-11-11 21:11:51 -0800781 const auto commandErrors = mReader.takeErrors();
782 Error error = Error::NONE;
783 for (const auto& cmdErr : commandErrors) {
784 const auto index = static_cast<size_t>(cmdErr.commandIndex);
785 if (index < 0 || index >= commands.size()) {
786 ALOGE("invalid command index %zu", index);
787 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700788 }
789
Ady Abrahama6388c02021-11-11 21:11:51 -0800790 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800791 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
792 error = translate<Error>(cmdErr.errorCode);
793 } else {
794 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
795 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700796 }
797 }
798
799 mWriter.reset();
800
801 return error;
802}
803
804Error AidlComposer::setLayerPerFrameMetadata(
805 Display display, Layer layer,
806 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800807 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
808 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700809 return Error::NONE;
810}
811
812std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
813 Display display) {
814 std::vector<AidlPerFrameMetadataKey> keys;
815 const auto status =
816 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
817 if (!status.isOk()) {
818 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
819 return {};
820 }
821 return translate<IComposerClient::PerFrameMetadataKey>(keys);
822}
823
824Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
825 std::vector<RenderIntent>* outRenderIntents) {
826 std::vector<AidlRenderIntent> renderIntents;
827 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
828 translate<AidlColorMode>(colorMode),
829 &renderIntents);
830 if (!status.isOk()) {
831 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
832 return static_cast<Error>(status.getServiceSpecificError());
833 }
834 *outRenderIntents = translate<RenderIntent>(renderIntents);
835 return Error::NONE;
836}
837
838Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
839 std::vector<float> matrix;
840 const auto status =
841 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
842 &matrix);
843 if (!status.isOk()) {
844 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
845 return static_cast<Error>(status.getServiceSpecificError());
846 }
847 *outMatrix = makeMat4(matrix);
848 return Error::NONE;
849}
850
851Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
852 std::vector<uint8_t>* outData) {
853 AidlDisplayIdentification displayIdentification;
854 const auto status =
855 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
856 &displayIdentification);
857 if (!status.isOk()) {
858 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
859 return static_cast<Error>(status.getServiceSpecificError());
860 }
861
862 *outPort = static_cast<uint8_t>(displayIdentification.port);
863 *outData = displayIdentification.data;
864
865 return Error::NONE;
866}
867
868Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800869 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700870 return Error::NONE;
871}
872
873Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
874 Dataspace* outDataspace,
875 uint8_t* outComponentMask) {
876 if (!outFormat || !outDataspace || !outComponentMask) {
877 return Error::BAD_PARAMETER;
878 }
879
880 AidlDisplayContentSamplingAttributes attributes;
881 const auto status =
882 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
883 &attributes);
884 if (!status.isOk()) {
885 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
886 return static_cast<Error>(status.getServiceSpecificError());
887 }
888
889 *outFormat = translate<PixelFormat>(attributes.format);
890 *outDataspace = translate<Dataspace>(attributes.dataspace);
891 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
892 return Error::NONE;
893}
894
895Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
896 uint8_t componentMask, uint64_t maxFrames) {
897 const auto status =
898 mAidlComposerClient
899 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
900 static_cast<AidlFormatColorComponent>(
901 componentMask),
902 static_cast<int64_t>(maxFrames));
903 if (!status.isOk()) {
904 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
905 return static_cast<Error>(status.getServiceSpecificError());
906 }
907 return Error::NONE;
908}
909
910Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
911 uint64_t timestamp, DisplayedFrameStats* outStats) {
912 if (!outStats) {
913 return Error::BAD_PARAMETER;
914 }
915
916 AidlDisplayContentSample sample;
917 const auto status =
918 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
919 static_cast<int64_t>(maxFrames),
920 static_cast<int64_t>(timestamp),
921 &sample);
922 if (!status.isOk()) {
923 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
924 return static_cast<Error>(status.getServiceSpecificError());
925 }
926 *outStats = translate<DisplayedFrameStats>(sample);
927 return Error::NONE;
928}
929
930Error AidlComposer::setLayerPerFrameMetadataBlobs(
931 Display display, Layer layer,
932 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800933 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
934 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700935 return Error::NONE;
936}
937
Alec Mouricdf16792021-12-10 13:16:06 -0800938Error AidlComposer::setDisplayBrightness(Display display, float brightness,
939 const DisplayBrightnessOptions& options) {
Alec Mouricdf16792021-12-10 13:16:06 -0800940 mWriter.setDisplayBrightness(translate<int64_t>(display), brightness);
941
942 if (options.applyImmediately) {
943 return execute();
944 }
945
Ady Abrahame7385f72021-09-05 00:54:25 -0700946 return Error::NONE;
947}
948
949Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500950 std::vector<AidlDisplayCapability>* outCapabilities) {
951 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
952 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700953 if (!status.isOk()) {
954 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500955 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -0700956 return static_cast<Error>(status.getServiceSpecificError());
957 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700958 return Error::NONE;
959}
960
961V2_4::Error AidlComposer::getDisplayConnectionType(
962 Display display, IComposerClient::DisplayConnectionType* outType) {
963 AidlDisplayConnectionType type;
964 const auto status =
965 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
966 if (!status.isOk()) {
967 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
968 return static_cast<V2_4::Error>(status.getServiceSpecificError());
969 }
970 *outType = translate<IComposerClient::DisplayConnectionType>(type);
971 return V2_4::Error::NONE;
972}
973
974V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
975 int32_t vsyncPeriod;
976 const auto status =
977 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
978 if (!status.isOk()) {
979 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
980 return static_cast<V2_4::Error>(status.getServiceSpecificError());
981 }
982 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
983 return V2_4::Error::NONE;
984}
985
986V2_4::Error AidlComposer::setActiveConfigWithConstraints(
987 Display display, Config config,
988 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
989 VsyncPeriodChangeTimeline* outTimeline) {
990 AidlVsyncPeriodChangeTimeline timeline;
991 const auto status =
992 mAidlComposerClient
993 ->setActiveConfigWithConstraints(translate<int64_t>(display),
994 translate<int32_t>(config),
995 translate<AidlVsyncPeriodChangeConstraints>(
996 vsyncPeriodChangeConstraints),
997 &timeline);
998 if (!status.isOk()) {
999 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1000 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1001 }
1002 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1003 return V2_4::Error::NONE;
1004}
1005
1006V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1007 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1008 if (!status.isOk()) {
1009 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1010 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1011 }
1012 return V2_4::Error::NONE;
1013}
1014
1015V2_4::Error AidlComposer::getSupportedContentTypes(
1016 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1017 std::vector<AidlContentType> types;
1018 const auto status =
1019 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1020 if (!status.isOk()) {
1021 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1022 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1023 }
1024 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1025 return V2_4::Error::NONE;
1026}
1027
1028V2_4::Error AidlComposer::setContentType(Display display,
1029 IComposerClient::ContentType contentType) {
1030 const auto status =
1031 mAidlComposerClient->setContentType(translate<int64_t>(display),
1032 translate<AidlContentType>(contentType));
1033 if (!status.isOk()) {
1034 ALOGE("setContentType failed %s", status.getDescription().c_str());
1035 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1036 }
1037 return V2_4::Error::NONE;
1038}
1039
Ady Abraham3f976752021-12-20 16:17:50 -08001040V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1041 const std::vector<uint8_t>&) {
1042 // There are no users for this API. See b/209691612.
1043 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001044}
1045
1046V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001047 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1048 // There are no users for this API. See b/209691612.
1049 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001050}
1051
Kriti Dang7defaf32021-11-15 11:55:43 +01001052Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1053 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1054 translate<int32_t>(config));
1055 if (!status.isOk()) {
1056 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1057 return static_cast<Error>(status.getServiceSpecificError());
1058 }
1059 return Error::NONE;
1060}
1061
1062Error AidlComposer::clearBootDisplayConfig(Display display) {
1063 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1064 if (!status.isOk()) {
1065 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1066 return static_cast<Error>(status.getServiceSpecificError());
1067 }
1068 return Error::NONE;
1069}
1070
1071Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1072 int32_t displayConfig;
1073 const auto status =
1074 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1075 &displayConfig);
1076 if (!status.isOk()) {
1077 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1078 return static_cast<Error>(status.getServiceSpecificError());
1079 }
1080 *config = translate<uint32_t>(displayConfig);
1081 return Error::NONE;
1082}
1083
Ady Abrahame7385f72021-09-05 00:54:25 -07001084Error AidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001085 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
Alec Mourif8d093d2022-02-10 15:16:59 -08001086 float* outBrightness) {
Ady Abrahamde792782021-12-20 10:00:49 -08001087 const auto property = mReader.takeClientTargetProperty(translate<int64_t>(display));
1088 *outClientTargetProperty =
1089 translate<IComposerClient::ClientTargetProperty>(property.clientTargetProperty);
Alec Mourif8d093d2022-02-10 15:16:59 -08001090 *outBrightness = property.brightness;
Ady Abrahame7385f72021-09-05 00:54:25 -07001091 return Error::NONE;
1092}
1093
Alec Mouri6da0e272022-02-07 12:45:57 -08001094Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
1095 mWriter.setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer), brightness);
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001096 return Error::NONE;
1097}
1098
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001099Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1100 const std::vector<IComposerClient::Rect>& blocking) {
1101 mWriter.setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1102 translate<AidlRect>(blocking));
1103 return Error::NONE;
1104}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001105
1106Error AidlComposer::getDisplayDecorationSupport(Display display,
1107 std::optional<DisplayDecorationSupport>* support) {
1108 const auto status =
1109 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1110 if (!status.isOk()) {
1111 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1112 support->reset();
1113 return static_cast<Error>(status.getServiceSpecificError());
1114 }
1115 return Error::NONE;
1116}
ramindani32cf0602022-03-02 02:30:29 +00001117
1118Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1119 const auto status =
1120 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1121 translate<int32_t>(timeout.count()));
1122 if (!status.isOk()) {
1123 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1124 return static_cast<Error>(status.getServiceSpecificError());
1125 }
1126 return Error::NONE;
1127}
1128
Ady Abrahame7385f72021-09-05 00:54:25 -07001129} // namespace Hwc2
1130} // namespace android