blob: 36512311d15928158507fba3786646bce373eca8 [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;
Alec Mouri85065692022-03-18 00:58:26 +000044using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
Ady Abrahame7385f72021-09-05 00:54:25 -070045using aidl::android::hardware::graphics::composer3::PowerMode;
46using aidl::android::hardware::graphics::composer3::VirtualDisplay;
47
Ady Abraham42977362021-12-07 21:04:49 -080048using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080049
Ady Abrahame7385f72021-09-05 00:54:25 -070050using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
51using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
52using AidlDisplayIdentification =
53 aidl::android::hardware::graphics::composer3::DisplayIdentification;
54using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
55using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
56using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070057using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
58using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
59using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
60using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
61using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
62using AidlVsyncPeriodChangeConstraints =
63 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
64using AidlVsyncPeriodChangeTimeline =
65 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070066using AidlDisplayContentSamplingAttributes =
67 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
68using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
69using AidlDisplayConnectionType =
70 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070071
72using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
73using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
74using AidlFRect = aidl::android::hardware::graphics::common::FRect;
75using AidlRect = aidl::android::hardware::graphics::common::Rect;
76using AidlTransform = aidl::android::hardware::graphics::common::Transform;
77
78namespace Hwc2 {
79
80namespace {
81
82template <typename To, typename From>
83To translate(From x) {
84 return static_cast<To>(x);
85}
86
87template <typename To, typename From>
88std::vector<To> translate(const std::vector<From>& in) {
89 std::vector<To> out;
90 out.reserve(in.size());
91 std::transform(in.begin(), in.end(), std::back_inserter(out),
92 [](From x) { return translate<To>(x); });
93 return out;
94}
95
96template <>
97AidlRect translate(IComposerClient::Rect x) {
98 return AidlRect{
99 .left = x.left,
100 .top = x.top,
101 .right = x.right,
102 .bottom = x.bottom,
103 };
104}
105
106template <>
107AidlFRect translate(IComposerClient::FRect x) {
108 return AidlFRect{
109 .left = x.left,
110 .top = x.top,
111 .right = x.right,
112 .bottom = x.bottom,
113 };
114}
115
116template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700117AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
118 AidlPerFrameMetadataBlob blob;
119 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800120 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700121 return blob;
122}
123
124template <>
125AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
126 return AidlPerFrameMetadata{
127 .key = translate<AidlPerFrameMetadataKey>(x.key),
128 .value = x.value,
129 };
130}
131
132template <>
133DisplayedFrameStats translate(AidlDisplayContentSample x) {
134 return DisplayedFrameStats{
135 .numFrames = static_cast<uint64_t>(x.frameCount),
136 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
137 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
138 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
139 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
140 };
141}
142
143template <>
144AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
145 return AidlVsyncPeriodChangeConstraints{
146 .desiredTimeNanos = x.desiredTimeNanos,
147 .seamlessRequired = x.seamlessRequired,
148 };
149}
150
151template <>
152VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
153 return VsyncPeriodChangeTimeline{
154 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
155 .refreshRequired = x.refreshRequired,
156 .refreshTimeNanos = x.refreshTimeNanos,
157 };
158}
Ady Abrahame7385f72021-09-05 00:54:25 -0700159mat4 makeMat4(std::vector<float> in) {
160 return mat4(static_cast<const float*>(in.data()));
161}
162
163} // namespace
164
165class AidlIComposerCallbackWrapper : public BnComposerCallback {
166public:
Yichi Chen3401b562022-01-17 15:42:35 +0800167 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700168
169 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
170 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
171 : V2_4::IComposerCallback::Connection::DISCONNECTED;
Yichi Chen3401b562022-01-17 15:42:35 +0800172 mCallback.onComposerHalHotplug(translate<Display>(in_display), connection);
Ady Abrahame7385f72021-09-05 00:54:25 -0700173 return ::ndk::ScopedAStatus::ok();
174 }
175
176 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800177 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700178 return ::ndk::ScopedAStatus::ok();
179 }
Yichi Chen3401b562022-01-17 15:42:35 +0800180
Ady Abrahame7385f72021-09-05 00:54:25 -0700181 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800182 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700183 return ::ndk::ScopedAStatus::ok();
184 }
Yichi Chen3401b562022-01-17 15:42:35 +0800185
Ady Abrahame7385f72021-09-05 00:54:25 -0700186 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
187 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800188 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
189 static_cast<uint32_t>(in_vsyncPeriodNanos));
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 onVsyncPeriodTimingChanged(
194 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800195 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
196 translate<V2_4::VsyncPeriodChangeTimeline>(
197 in_updatedTimeline));
198 return ::ndk::ScopedAStatus::ok();
199 }
200
201 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
202 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700203 return ::ndk::ScopedAStatus::ok();
204 }
205
206private:
Yichi Chen3401b562022-01-17 15:42:35 +0800207 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700208};
209
Ady Abraham9fc28052021-10-14 17:21:38 -0700210std::string AidlComposer::instance(const std::string& serviceName) {
211 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
212}
213
214bool AidlComposer::isDeclared(const std::string& serviceName) {
215 return AServiceManager_isDeclared(instance(serviceName).c_str());
216}
Ady Abrahame7385f72021-09-05 00:54:25 -0700217
Ady Abrahama6388c02021-11-11 21:11:51 -0800218AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700219 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700220 mAidlComposer = AidlIComposer::fromBinder(
221 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700222 if (!mAidlComposer) {
223 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
224 return;
225 }
226
227 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
228 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
229 return;
230 }
231
232 ALOGI("Loaded AIDL composer3 HAL service");
233}
234
235AidlComposer::~AidlComposer() = default;
236
Ady Abraham4d211cf2021-12-14 16:19:03 -0800237bool AidlComposer::isSupported(OptionalFeature feature) const {
238 switch (feature) {
239 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800240 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800241 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000242 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000243 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800244 return true;
245 }
246}
247
Ady Abrahamde549d42022-01-26 19:19:17 -0800248std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700249 std::vector<Capability> capabilities;
250 const auto status = mAidlComposer->getCapabilities(&capabilities);
251 if (!status.isOk()) {
252 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
253 return {};
254 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800255 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700256}
257
258std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800259 int pipefds[2];
260 int result = pipe(pipefds);
261 if (result < 0) {
262 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700263 return {};
264 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800265
266 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800267 // Use other thread to read pipe to prevent
268 // pipe is full, making HWC be blocked in writing.
269 std::thread t([&]() {
270 base::ReadFdToString(pipefds[0], &str);
271 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800272 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
273 // Close the write-end of the pipe to make sure that when reading from the
274 // read-end we will get eof instead of blocking forever
275 close(pipefds[1]);
276
yihsing.shen58847c52022-09-23 15:39:30 +0800277 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800278 ALOGE("dumpDebugInfo: dump failed: %d", status);
279 }
280
yihsing.shen58847c52022-09-23 15:39:30 +0800281 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800282 close(pipefds[0]);
283 return str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700284}
285
Yichi Chen3401b562022-01-17 15:42:35 +0800286void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700287 if (mAidlComposerCallback) {
288 ALOGE("Callback already registered");
289 }
Yichi Chen3401b562022-01-17 15:42:35 +0800290
Ady Abraham9fc28052021-10-14 17:21:38 -0700291 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700292 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
293
294 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
295 if (!status.isOk()) {
296 ALOGE("registerCallback failed %s", status.getDescription().c_str());
297 }
298}
299
300void AidlComposer::resetCommands() {
301 mWriter.reset();
302}
303
304Error AidlComposer::executeCommands() {
305 return execute();
306}
307
308uint32_t AidlComposer::getMaxVirtualDisplayCount() {
309 int32_t count = 0;
310 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
311 if (!status.isOk()) {
312 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
313 return 0;
314 }
315 return static_cast<uint32_t>(count);
316}
317
318Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
319 Display* outDisplay) {
320 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
321 const int32_t bufferSlotCount = 1;
322 VirtualDisplay virtualDisplay;
323 const auto status =
324 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
325 static_cast<int32_t>(height),
326 static_cast<AidlPixelFormat>(*format),
327 bufferSlotCount, &virtualDisplay);
328
329 if (!status.isOk()) {
330 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
331 return static_cast<Error>(status.getServiceSpecificError());
332 }
333
334 *outDisplay = translate<Display>(virtualDisplay.display);
335 *format = static_cast<PixelFormat>(virtualDisplay.format);
336 return Error::NONE;
337}
338
339Error AidlComposer::destroyVirtualDisplay(Display display) {
340 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
341 if (!status.isOk()) {
342 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
343 return static_cast<Error>(status.getServiceSpecificError());
344 }
345 return Error::NONE;
346}
347
348Error AidlComposer::acceptDisplayChanges(Display display) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800349 mWriter.acceptDisplayChanges(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700350 return Error::NONE;
351}
352
353Error AidlComposer::createLayer(Display display, Layer* outLayer) {
354 int64_t layer;
355 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
356 kMaxLayerBufferCount, &layer);
357 if (!status.isOk()) {
358 ALOGE("createLayer failed %s", status.getDescription().c_str());
359 return static_cast<Error>(status.getServiceSpecificError());
360 }
361
362 *outLayer = translate<Layer>(layer);
363 return Error::NONE;
364}
365
366Error AidlComposer::destroyLayer(Display display, Layer layer) {
367 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
368 translate<int64_t>(layer));
369 if (!status.isOk()) {
370 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
371 return static_cast<Error>(status.getServiceSpecificError());
372 }
373 return Error::NONE;
374}
375
376Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
377 int32_t config;
378 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
379 if (!status.isOk()) {
380 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
381 return static_cast<Error>(status.getServiceSpecificError());
382 }
383 *outConfig = translate<Config>(config);
384 return Error::NONE;
385}
386
387Error AidlComposer::getChangedCompositionTypes(
388 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500389 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abrahamde792782021-12-20 10:00:49 -0800390 const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
391 outLayers->reserve(changedLayers.size());
392 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800393
Ady Abrahamde792782021-12-20 10:00:49 -0800394 for (const auto& layer : changedLayers) {
395 outLayers->emplace_back(translate<Layer>(layer.layer));
396 outTypes->emplace_back(layer.composition);
397 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700398 return Error::NONE;
399}
400
401Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
402 std::vector<AidlColorMode> modes;
403 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
404 if (!status.isOk()) {
405 ALOGE("getColorModes failed %s", status.getDescription().c_str());
406 return static_cast<Error>(status.getServiceSpecificError());
407 }
408 *outModes = translate<ColorMode>(modes);
409 return Error::NONE;
410}
411
412Error AidlComposer::getDisplayAttribute(Display display, Config config,
413 IComposerClient::Attribute attribute, int32_t* outValue) {
414 const auto status =
415 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
416 translate<int32_t>(config),
417 static_cast<AidlDisplayAttribute>(attribute),
418 outValue);
419 if (!status.isOk()) {
420 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
421 return static_cast<Error>(status.getServiceSpecificError());
422 }
423 return Error::NONE;
424}
425
426Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
427 std::vector<int32_t> configs;
428 const auto status =
429 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
430 if (!status.isOk()) {
431 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
432 return static_cast<Error>(status.getServiceSpecificError());
433 }
434 *outConfigs = translate<Config>(configs);
435 return Error::NONE;
436}
437
438Error AidlComposer::getDisplayName(Display display, std::string* outName) {
439 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
440 if (!status.isOk()) {
441 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
442 return static_cast<Error>(status.getServiceSpecificError());
443 }
444 return Error::NONE;
445}
446
447Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
448 std::vector<Layer>* outLayers,
449 std::vector<uint32_t>* outLayerRequestMasks) {
Ady Abrahamde792782021-12-20 10:00:49 -0800450 const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
451 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
452 outLayers->reserve(displayRequests.layerRequests.size());
453 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
454
455 for (const auto& layer : displayRequests.layerRequests) {
456 outLayers->emplace_back(translate<Layer>(layer.layer));
457 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
458 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700459 return Error::NONE;
460}
461
462Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800463 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700464 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800465 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700466 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800467 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700468 return static_cast<Error>(status.getServiceSpecificError());
469 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800470 *outSupport = std::find(capabilities.begin(), capabilities.end(),
471 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700472 return Error::NONE;
473}
474
ramindani32cf0602022-03-02 02:30:29 +0000475Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
476 std::vector<AidlDisplayCapability> capabilities;
477 const auto status =
478 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
479 if (!status.isOk()) {
480 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
481 return static_cast<Error>(status.getServiceSpecificError());
482 }
483 *outSupport = std::find(capabilities.begin(), capabilities.end(),
484 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
485 return Error::NONE;
486}
487
Ady Abrahame7385f72021-09-05 00:54:25 -0700488Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
489 float* outMaxLuminance, float* outMaxAverageLuminance,
490 float* outMinLuminance) {
491 AidlHdrCapabilities capabilities;
492 const auto status =
493 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
494 if (!status.isOk()) {
495 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
496 return static_cast<Error>(status.getServiceSpecificError());
497 }
498
499 *outTypes = translate<Hdr>(capabilities.types);
500 *outMaxLuminance = capabilities.maxLuminance;
501 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
502 *outMinLuminance = capabilities.minLuminance;
503 return Error::NONE;
504}
505
506Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
507 std::vector<int>* outReleaseFences) {
Ady Abrahamde792782021-12-20 10:00:49 -0800508 auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
509 outLayers->reserve(fences.size());
510 outReleaseFences->reserve(fences.size());
511
512 for (auto& fence : fences) {
513 outLayers->emplace_back(translate<Layer>(fence.layer));
514 // take ownership
515 const int fenceOwner = fence.fence.get();
516 *fence.fence.getR() = -1;
517 outReleaseFences->emplace_back(fenceOwner);
518 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700519 return Error::NONE;
520}
521
522Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
523 ATRACE_NAME("HwcPresentDisplay");
Ady Abrahama6388c02021-11-11 21:11:51 -0800524 mWriter.presentDisplay(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700525
526 Error error = execute();
527 if (error != Error::NONE) {
528 return error;
529 }
530
Ady Abrahamde792782021-12-20 10:00:49 -0800531 auto fence = mReader.takePresentFence(translate<int64_t>(display));
532 // take ownership
533 *outPresentFence = fence.get();
534 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700535 return Error::NONE;
536}
537
538Error AidlComposer::setActiveConfig(Display display, Config config) {
539 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
540 translate<int32_t>(config));
541 if (!status.isOk()) {
542 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
543 return static_cast<Error>(status.getServiceSpecificError());
544 }
545 return Error::NONE;
546}
547
548Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
549 int acquireFence, Dataspace dataspace,
550 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700551 const native_handle_t* handle = nullptr;
552 if (target.get()) {
553 handle = target->getNativeBuffer()->handle;
554 }
555
Ady Abrahama6388c02021-11-11 21:11:51 -0800556 mWriter.setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
Ady Abrahame7385f72021-09-05 00:54:25 -0700557 translate<aidl::android::hardware::graphics::common::Dataspace>(
558 dataspace),
559 translate<AidlRect>(damage));
560 return Error::NONE;
561}
562
563Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
564 const auto status =
565 mAidlComposerClient->setColorMode(translate<int64_t>(display),
566 translate<AidlColorMode>(mode),
567 translate<AidlRenderIntent>(renderIntent));
568 if (!status.isOk()) {
569 ALOGE("setColorMode failed %s", status.getDescription().c_str());
570 return static_cast<Error>(status.getServiceSpecificError());
571 }
572 return Error::NONE;
573}
574
Ady Abrahamdc011a92021-12-21 14:06:44 -0800575Error AidlComposer::setColorTransform(Display display, const float* matrix) {
576 mWriter.setColorTransform(translate<int64_t>(display), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700577 return Error::NONE;
578}
579
580Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
581 int releaseFence) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800582 mWriter.setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
Ady Abrahame7385f72021-09-05 00:54:25 -0700583 return Error::NONE;
584}
585
586Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
587 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
588 translate<PowerMode>(mode));
589 if (!status.isOk()) {
590 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
591 return static_cast<Error>(status.getServiceSpecificError());
592 }
593 return Error::NONE;
594}
595
596Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
597 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
598 const auto status =
599 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
600 if (!status.isOk()) {
601 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
602 return static_cast<Error>(status.getServiceSpecificError());
603 }
604 return Error::NONE;
605}
606
607Error AidlComposer::setClientTargetSlotCount(Display display) {
608 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
609 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
610 bufferSlotCount);
611 if (!status.isOk()) {
612 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
613 return static_cast<Error>(status.getServiceSpecificError());
614 }
615 return Error::NONE;
616}
617
Ady Abraham43065bd2021-12-10 17:22:15 -0800618Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
619 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700620 ATRACE_NAME("HwcValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800621 mWriter.validateDisplay(translate<int64_t>(display),
622 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700623
624 Error error = execute();
625 if (error != Error::NONE) {
626 return error;
627 }
628
Ady Abrahama6388c02021-11-11 21:11:51 -0800629 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700630
631 return Error::NONE;
632}
633
Ady Abraham43065bd2021-12-10 17:22:15 -0800634Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
635 uint32_t* outNumTypes, uint32_t* outNumRequests,
636 int* outPresentFence, uint32_t* state) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700637 ATRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham43065bd2021-12-10 17:22:15 -0800638 mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
639 ClockMonotonicTimestamp{expectedPresentTime});
Ady Abrahame7385f72021-09-05 00:54:25 -0700640
641 Error error = execute();
642 if (error != Error::NONE) {
643 return error;
644 }
645
Ady Abrahamde792782021-12-20 10:00:49 -0800646 const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
647 if (!result.has_value()) {
648 *state = translate<uint32_t>(-1);
649 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700650 }
651
Ady Abrahamde792782021-12-20 10:00:49 -0800652 *state = translate<uint32_t>(*result);
653
654 if (*result == PresentOrValidate::Result::Presented) {
655 auto fence = mReader.takePresentFence(translate<int64_t>(display));
656 // take ownership
657 *outPresentFence = fence.get();
658 *fence.getR() = -1;
659 }
660
661 if (*result == PresentOrValidate::Result::Validated) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800662 mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700663 }
664
665 return Error::NONE;
666}
667
668Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800669 mWriter.setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer), x, y);
Ady Abrahame7385f72021-09-05 00:54:25 -0700670 return Error::NONE;
671}
672
673Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
674 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700675 const native_handle_t* handle = nullptr;
676 if (buffer.get()) {
677 handle = buffer->getNativeBuffer()->handle;
678 }
679
Ady Abrahama6388c02021-11-11 21:11:51 -0800680 mWriter.setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot, handle,
681 acquireFence);
Ady Abrahame7385f72021-09-05 00:54:25 -0700682 return Error::NONE;
683}
684
685Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
686 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800687 mWriter.setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
688 translate<AidlRect>(damage));
Ady Abrahame7385f72021-09-05 00:54:25 -0700689 return Error::NONE;
690}
691
692Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
693 IComposerClient::BlendMode mode) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800694 mWriter.setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
695 translate<BlendMode>(mode));
Ady Abrahame7385f72021-09-05 00:54:25 -0700696 return Error::NONE;
697}
698
Ady Abraham6e60b142022-01-06 18:10:35 -0800699Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
700 mWriter.setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return Error::NONE;
702}
703
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500704Error AidlComposer::setLayerCompositionType(
705 Display display, Layer layer,
706 aidl::android::hardware::graphics::composer3::Composition type) {
707 mWriter.setLayerCompositionType(translate<int64_t>(display), translate<int64_t>(layer), type);
Ady Abrahame7385f72021-09-05 00:54:25 -0700708 return Error::NONE;
709}
710
711Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800712 mWriter.setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
713 translate<AidlDataspace>(dataspace));
Ady Abrahame7385f72021-09-05 00:54:25 -0700714 return Error::NONE;
715}
716
717Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
718 const IComposerClient::Rect& frame) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800719 mWriter.setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
720 translate<AidlRect>(frame));
Ady Abrahame7385f72021-09-05 00:54:25 -0700721 return Error::NONE;
722}
723
724Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800725 mWriter.setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer), alpha);
Ady Abrahame7385f72021-09-05 00:54:25 -0700726 return Error::NONE;
727}
728
729Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
730 const native_handle_t* stream) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800731 mWriter.setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer), stream);
Ady Abrahame7385f72021-09-05 00:54:25 -0700732 return Error::NONE;
733}
734
735Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
736 const IComposerClient::FRect& crop) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800737 mWriter.setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
738 translate<AidlFRect>(crop));
Ady Abrahame7385f72021-09-05 00:54:25 -0700739 return Error::NONE;
740}
741
742Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800743 mWriter.setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
744 translate<AidlTransform>(transform));
Ady Abrahame7385f72021-09-05 00:54:25 -0700745 return Error::NONE;
746}
747
748Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
749 const std::vector<IComposerClient::Rect>& visible) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800750 mWriter.setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
751 translate<AidlRect>(visible));
Ady Abrahame7385f72021-09-05 00:54:25 -0700752 return Error::NONE;
753}
754
755Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800756 mWriter.setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
Ady Abrahame7385f72021-09-05 00:54:25 -0700757 return Error::NONE;
758}
759
760Error AidlComposer::execute() {
Ady Abrahama6388c02021-11-11 21:11:51 -0800761 const auto& commands = mWriter.getPendingCommands();
762 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700763 mWriter.reset();
764 return Error::NONE;
765 }
766
Ady Abrahamde792782021-12-20 10:00:49 -0800767 { // scope for results
768 std::vector<CommandResultPayload> results;
769 auto status = mAidlComposerClient->executeCommands(commands, &results);
770 if (!status.isOk()) {
771 ALOGE("executeCommands failed %s", status.getDescription().c_str());
772 return static_cast<Error>(status.getServiceSpecificError());
773 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700774
Ady Abrahamde792782021-12-20 10:00:49 -0800775 mReader.parse(std::move(results));
776 }
Ady Abrahama6388c02021-11-11 21:11:51 -0800777 const auto commandErrors = mReader.takeErrors();
778 Error error = Error::NONE;
779 for (const auto& cmdErr : commandErrors) {
780 const auto index = static_cast<size_t>(cmdErr.commandIndex);
781 if (index < 0 || index >= commands.size()) {
782 ALOGE("invalid command index %zu", index);
783 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -0700784 }
785
Ady Abrahama6388c02021-11-11 21:11:51 -0800786 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -0800787 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
788 error = translate<Error>(cmdErr.errorCode);
789 } else {
790 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
791 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -0700792 }
793 }
794
795 mWriter.reset();
796
797 return error;
798}
799
800Error AidlComposer::setLayerPerFrameMetadata(
801 Display display, Layer layer,
802 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800803 mWriter.setLayerPerFrameMetadata(translate<int64_t>(display), translate<int64_t>(layer),
804 translate<AidlPerFrameMetadata>(perFrameMetadatas));
Ady Abrahame7385f72021-09-05 00:54:25 -0700805 return Error::NONE;
806}
807
808std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
809 Display display) {
810 std::vector<AidlPerFrameMetadataKey> keys;
811 const auto status =
812 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
813 if (!status.isOk()) {
814 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
815 return {};
816 }
817 return translate<IComposerClient::PerFrameMetadataKey>(keys);
818}
819
820Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
821 std::vector<RenderIntent>* outRenderIntents) {
822 std::vector<AidlRenderIntent> renderIntents;
823 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
824 translate<AidlColorMode>(colorMode),
825 &renderIntents);
826 if (!status.isOk()) {
827 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
828 return static_cast<Error>(status.getServiceSpecificError());
829 }
830 *outRenderIntents = translate<RenderIntent>(renderIntents);
831 return Error::NONE;
832}
833
834Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
835 std::vector<float> matrix;
836 const auto status =
837 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
838 &matrix);
839 if (!status.isOk()) {
840 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
841 return static_cast<Error>(status.getServiceSpecificError());
842 }
843 *outMatrix = makeMat4(matrix);
844 return Error::NONE;
845}
846
847Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
848 std::vector<uint8_t>* outData) {
849 AidlDisplayIdentification displayIdentification;
850 const auto status =
851 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
852 &displayIdentification);
853 if (!status.isOk()) {
854 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
855 return static_cast<Error>(status.getServiceSpecificError());
856 }
857
858 *outPort = static_cast<uint8_t>(displayIdentification.port);
859 *outData = displayIdentification.data;
860
861 return Error::NONE;
862}
863
864Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800865 mWriter.setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer), matrix);
Ady Abrahame7385f72021-09-05 00:54:25 -0700866 return Error::NONE;
867}
868
869Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
870 Dataspace* outDataspace,
871 uint8_t* outComponentMask) {
872 if (!outFormat || !outDataspace || !outComponentMask) {
873 return Error::BAD_PARAMETER;
874 }
875
876 AidlDisplayContentSamplingAttributes attributes;
877 const auto status =
878 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
879 &attributes);
880 if (!status.isOk()) {
881 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
882 return static_cast<Error>(status.getServiceSpecificError());
883 }
884
885 *outFormat = translate<PixelFormat>(attributes.format);
886 *outDataspace = translate<Dataspace>(attributes.dataspace);
887 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
888 return Error::NONE;
889}
890
891Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
892 uint8_t componentMask, uint64_t maxFrames) {
893 const auto status =
894 mAidlComposerClient
895 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
896 static_cast<AidlFormatColorComponent>(
897 componentMask),
898 static_cast<int64_t>(maxFrames));
899 if (!status.isOk()) {
900 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
901 return static_cast<Error>(status.getServiceSpecificError());
902 }
903 return Error::NONE;
904}
905
906Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
907 uint64_t timestamp, DisplayedFrameStats* outStats) {
908 if (!outStats) {
909 return Error::BAD_PARAMETER;
910 }
911
912 AidlDisplayContentSample sample;
913 const auto status =
914 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
915 static_cast<int64_t>(maxFrames),
916 static_cast<int64_t>(timestamp),
917 &sample);
918 if (!status.isOk()) {
919 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
920 return static_cast<Error>(status.getServiceSpecificError());
921 }
922 *outStats = translate<DisplayedFrameStats>(sample);
923 return Error::NONE;
924}
925
926Error AidlComposer::setLayerPerFrameMetadataBlobs(
927 Display display, Layer layer,
928 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Ady Abrahama6388c02021-11-11 21:11:51 -0800929 mWriter.setLayerPerFrameMetadataBlobs(translate<int64_t>(display), translate<int64_t>(layer),
930 translate<AidlPerFrameMetadataBlob>(metadata));
Ady Abrahame7385f72021-09-05 00:54:25 -0700931 return Error::NONE;
932}
933
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000934Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -0800935 const DisplayBrightnessOptions& options) {
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000936 mWriter.setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -0800937
938 if (options.applyImmediately) {
939 return execute();
940 }
941
Ady Abrahame7385f72021-09-05 00:54:25 -0700942 return Error::NONE;
943}
944
945Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500946 std::vector<AidlDisplayCapability>* outCapabilities) {
947 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
948 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700949 if (!status.isOk()) {
950 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500951 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -0700952 return static_cast<Error>(status.getServiceSpecificError());
953 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700954 return Error::NONE;
955}
956
957V2_4::Error AidlComposer::getDisplayConnectionType(
958 Display display, IComposerClient::DisplayConnectionType* outType) {
959 AidlDisplayConnectionType type;
960 const auto status =
961 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
962 if (!status.isOk()) {
963 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
964 return static_cast<V2_4::Error>(status.getServiceSpecificError());
965 }
966 *outType = translate<IComposerClient::DisplayConnectionType>(type);
967 return V2_4::Error::NONE;
968}
969
970V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
971 int32_t vsyncPeriod;
972 const auto status =
973 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
974 if (!status.isOk()) {
975 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
976 return static_cast<V2_4::Error>(status.getServiceSpecificError());
977 }
978 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
979 return V2_4::Error::NONE;
980}
981
982V2_4::Error AidlComposer::setActiveConfigWithConstraints(
983 Display display, Config config,
984 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
985 VsyncPeriodChangeTimeline* outTimeline) {
986 AidlVsyncPeriodChangeTimeline timeline;
987 const auto status =
988 mAidlComposerClient
989 ->setActiveConfigWithConstraints(translate<int64_t>(display),
990 translate<int32_t>(config),
991 translate<AidlVsyncPeriodChangeConstraints>(
992 vsyncPeriodChangeConstraints),
993 &timeline);
994 if (!status.isOk()) {
995 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
996 return static_cast<V2_4::Error>(status.getServiceSpecificError());
997 }
998 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
999 return V2_4::Error::NONE;
1000}
1001
1002V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1003 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1004 if (!status.isOk()) {
1005 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1006 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1007 }
1008 return V2_4::Error::NONE;
1009}
1010
1011V2_4::Error AidlComposer::getSupportedContentTypes(
1012 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1013 std::vector<AidlContentType> types;
1014 const auto status =
1015 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1016 if (!status.isOk()) {
1017 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1018 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1019 }
1020 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1021 return V2_4::Error::NONE;
1022}
1023
1024V2_4::Error AidlComposer::setContentType(Display display,
1025 IComposerClient::ContentType contentType) {
1026 const auto status =
1027 mAidlComposerClient->setContentType(translate<int64_t>(display),
1028 translate<AidlContentType>(contentType));
1029 if (!status.isOk()) {
1030 ALOGE("setContentType failed %s", status.getDescription().c_str());
1031 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1032 }
1033 return V2_4::Error::NONE;
1034}
1035
Ady Abraham3f976752021-12-20 16:17:50 -08001036V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1037 const std::vector<uint8_t>&) {
1038 // There are no users for this API. See b/209691612.
1039 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001040}
1041
1042V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001043 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1044 // There are no users for this API. See b/209691612.
1045 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001046}
1047
Kriti Dang7defaf32021-11-15 11:55:43 +01001048Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1049 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1050 translate<int32_t>(config));
1051 if (!status.isOk()) {
1052 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1053 return static_cast<Error>(status.getServiceSpecificError());
1054 }
1055 return Error::NONE;
1056}
1057
1058Error AidlComposer::clearBootDisplayConfig(Display display) {
1059 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1060 if (!status.isOk()) {
1061 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1062 return static_cast<Error>(status.getServiceSpecificError());
1063 }
1064 return Error::NONE;
1065}
1066
1067Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1068 int32_t displayConfig;
1069 const auto status =
1070 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1071 &displayConfig);
1072 if (!status.isOk()) {
1073 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1074 return static_cast<Error>(status.getServiceSpecificError());
1075 }
1076 *config = translate<uint32_t>(displayConfig);
1077 return Error::NONE;
1078}
1079
Ady Abrahame7385f72021-09-05 00:54:25 -07001080Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001081 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1082 *outClientTargetProperty = mReader.takeClientTargetProperty(translate<int64_t>(display));
Ady Abrahame7385f72021-09-05 00:54:25 -07001083 return Error::NONE;
1084}
1085
Alec Mouri6da0e272022-02-07 12:45:57 -08001086Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
1087 mWriter.setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer), brightness);
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001088 return Error::NONE;
1089}
1090
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001091Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1092 const std::vector<IComposerClient::Rect>& blocking) {
1093 mWriter.setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1094 translate<AidlRect>(blocking));
1095 return Error::NONE;
1096}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001097
1098Error AidlComposer::getDisplayDecorationSupport(Display display,
1099 std::optional<DisplayDecorationSupport>* support) {
1100 const auto status =
1101 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1102 if (!status.isOk()) {
1103 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1104 support->reset();
1105 return static_cast<Error>(status.getServiceSpecificError());
1106 }
1107 return Error::NONE;
1108}
ramindani32cf0602022-03-02 02:30:29 +00001109
1110Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1111 const auto status =
1112 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1113 translate<int32_t>(timeout.count()));
1114 if (!status.isOk()) {
1115 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1116 return static_cast<Error>(status.getServiceSpecificError());
1117 }
1118 return Error::NONE;
1119}
1120
ramindani06e518e2022-03-14 18:47:53 +00001121Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1122 AidlTransform* outDisplayOrientation) {
1123 const auto status =
1124 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1125 outDisplayOrientation);
1126 if (!status.isOk()) {
1127 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1128 return static_cast<Error>(status.getServiceSpecificError());
1129 }
1130 return Error::NONE;
1131}
1132
Ady Abrahame7385f72021-09-05 00:54:25 -07001133} // namespace Hwc2
1134} // namespace android