blob: c0eb36dc02cba1fd31dd38bdeb661a192e9ec00d [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
Brian Lindahl5b0ffe02023-06-15 14:19:43 -060023#include <SurfaceFlingerProperties.h>
Ady Abrahamc4acf512022-02-18 17:11:59 -080024#include <android-base/file.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070025#include <android/binder_ibinder_platform.h>
26#include <android/binder_manager.h>
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -050027#include <gui/TraceUtils.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070028#include <log/log.h>
29#include <utils/Trace.h>
30
31#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
32
33#include <algorithm>
34#include <cinttypes>
35
Yichi Chen3401b562022-01-17 15:42:35 +080036#include "HWC2.h"
37
Ady Abrahame7385f72021-09-05 00:54:25 -070038namespace android {
39
40using hardware::hidl_handle;
41using hardware::hidl_vec;
42using hardware::Return;
43
44using aidl::android::hardware::graphics::composer3::BnComposerCallback;
45using aidl::android::hardware::graphics::composer3::Capability;
Alec Mouri85065692022-03-18 00:58:26 +000046using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
Ady Abrahame7385f72021-09-05 00:54:25 -070047using aidl::android::hardware::graphics::composer3::PowerMode;
48using aidl::android::hardware::graphics::composer3::VirtualDisplay;
49
Ady Abraham42977362021-12-07 21:04:49 -080050using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080051
Ady Abrahame7385f72021-09-05 00:54:25 -070052using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
53using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
54using AidlDisplayIdentification =
55 aidl::android::hardware::graphics::composer3::DisplayIdentification;
56using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
57using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
58using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070059using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
Kriti Dang674b9372022-11-18 10:58:44 +010060using AidlHdrConversionCapability =
61 aidl::android::hardware::graphics::common::HdrConversionCapability;
62using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
Sally Qi0cbd08b2022-08-17 12:12:28 -070063using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
Ady Abrahame7385f72021-09-05 00:54:25 -070064using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
65using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
66using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
67using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
68using AidlVsyncPeriodChangeConstraints =
69 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
70using AidlVsyncPeriodChangeTimeline =
71 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070072using AidlDisplayContentSamplingAttributes =
73 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
74using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
75using AidlDisplayConnectionType =
76 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070077
78using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
79using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
80using AidlFRect = aidl::android::hardware::graphics::common::FRect;
81using AidlRect = aidl::android::hardware::graphics::common::Rect;
82using AidlTransform = aidl::android::hardware::graphics::common::Transform;
83
84namespace Hwc2 {
85
86namespace {
87
88template <typename To, typename From>
89To translate(From x) {
90 return static_cast<To>(x);
91}
92
93template <typename To, typename From>
94std::vector<To> translate(const std::vector<From>& in) {
95 std::vector<To> out;
96 out.reserve(in.size());
97 std::transform(in.begin(), in.end(), std::back_inserter(out),
98 [](From x) { return translate<To>(x); });
99 return out;
100}
101
102template <>
103AidlRect translate(IComposerClient::Rect x) {
104 return AidlRect{
105 .left = x.left,
106 .top = x.top,
107 .right = x.right,
108 .bottom = x.bottom,
109 };
110}
111
112template <>
113AidlFRect translate(IComposerClient::FRect x) {
114 return AidlFRect{
115 .left = x.left,
116 .top = x.top,
117 .right = x.right,
118 .bottom = x.bottom,
119 };
120}
121
122template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700123AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
124 AidlPerFrameMetadataBlob blob;
125 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800126 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700127 return blob;
128}
129
130template <>
131AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
132 return AidlPerFrameMetadata{
133 .key = translate<AidlPerFrameMetadataKey>(x.key),
134 .value = x.value,
135 };
136}
137
138template <>
139DisplayedFrameStats translate(AidlDisplayContentSample x) {
140 return DisplayedFrameStats{
141 .numFrames = static_cast<uint64_t>(x.frameCount),
142 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
143 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
144 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
145 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
146 };
147}
148
149template <>
150AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
151 return AidlVsyncPeriodChangeConstraints{
152 .desiredTimeNanos = x.desiredTimeNanos,
153 .seamlessRequired = x.seamlessRequired,
154 };
155}
156
157template <>
158VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
159 return VsyncPeriodChangeTimeline{
160 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
161 .refreshRequired = x.refreshRequired,
162 .refreshTimeNanos = x.refreshTimeNanos,
163 };
164}
Ady Abrahame7385f72021-09-05 00:54:25 -0700165mat4 makeMat4(std::vector<float> in) {
166 return mat4(static_cast<const float*>(in.data()));
167}
168
169} // namespace
170
171class AidlIComposerCallbackWrapper : public BnComposerCallback {
172public:
Yichi Chen3401b562022-01-17 15:42:35 +0800173 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700174
175 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
176 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
177 : V2_4::IComposerCallback::Connection::DISCONNECTED;
Yichi Chen3401b562022-01-17 15:42:35 +0800178 mCallback.onComposerHalHotplug(translate<Display>(in_display), connection);
Ady Abrahame7385f72021-09-05 00:54:25 -0700179 return ::ndk::ScopedAStatus::ok();
180 }
181
182 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800183 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700184 return ::ndk::ScopedAStatus::ok();
185 }
Yichi Chen3401b562022-01-17 15:42:35 +0800186
Ady Abrahame7385f72021-09-05 00:54:25 -0700187 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800188 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700189 return ::ndk::ScopedAStatus::ok();
190 }
Yichi Chen3401b562022-01-17 15:42:35 +0800191
Ady Abrahame7385f72021-09-05 00:54:25 -0700192 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
193 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800194 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
195 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700196 return ::ndk::ScopedAStatus::ok();
197 }
Yichi Chen3401b562022-01-17 15:42:35 +0800198
Ady Abrahame7385f72021-09-05 00:54:25 -0700199 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
200 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800201 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
202 translate<V2_4::VsyncPeriodChangeTimeline>(
203 in_updatedTimeline));
204 return ::ndk::ScopedAStatus::ok();
205 }
206
207 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
208 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700209 return ::ndk::ScopedAStatus::ok();
210 }
211
ramindani12bfe6b2023-02-03 13:29:19 -0800212 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
213 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
214 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
215 return ::ndk::ScopedAStatus::ok();
216 }
217
Ady Abrahame7385f72021-09-05 00:54:25 -0700218private:
Yichi Chen3401b562022-01-17 15:42:35 +0800219 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700220};
221
Ady Abraham9fc28052021-10-14 17:21:38 -0700222std::string AidlComposer::instance(const std::string& serviceName) {
223 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
224}
225
226bool AidlComposer::isDeclared(const std::string& serviceName) {
227 return AServiceManager_isDeclared(instance(serviceName).c_str());
228}
Ady Abrahame7385f72021-09-05 00:54:25 -0700229
Ady Abrahama6388c02021-11-11 21:11:51 -0800230AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700231 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700232 mAidlComposer = AidlIComposer::fromBinder(
233 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700234 if (!mAidlComposer) {
235 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
236 return;
237 }
238
239 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
240 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
241 return;
242 }
243
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400244 addReader(translate<Display>(kSingleReaderKey));
245
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700246 // If unable to read interface version, then become backwards compatible.
247 int32_t version = 1;
248 const auto status = mAidlComposerClient->getInterfaceVersion(&version);
249 if (!status.isOk()) {
250 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
251 status.getDescription().c_str());
252 }
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600253 mSupportsBufferSlotsToClear = version > 1;
254 if (!mSupportsBufferSlotsToClear) {
255 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
256 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
257 GraphicBuffer::USAGE_HW_COMPOSER |
258 GraphicBuffer::USAGE_SW_READ_OFTEN |
259 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
260 "AidlComposer");
261 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
262 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
263 return;
264 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700265 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700266 }
267
Ady Abrahame7385f72021-09-05 00:54:25 -0700268 ALOGI("Loaded AIDL composer3 HAL service");
269}
270
271AidlComposer::~AidlComposer() = default;
272
Ady Abraham4d211cf2021-12-14 16:19:03 -0800273bool AidlComposer::isSupported(OptionalFeature feature) const {
274 switch (feature) {
275 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800276 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800277 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000278 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000279 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800280 return true;
281 }
282}
283
Ady Abrahamde549d42022-01-26 19:19:17 -0800284std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700285 std::vector<Capability> capabilities;
286 const auto status = mAidlComposer->getCapabilities(&capabilities);
287 if (!status.isOk()) {
288 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
289 return {};
290 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800291 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700292}
293
294std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800295 int pipefds[2];
296 int result = pipe(pipefds);
297 if (result < 0) {
298 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700299 return {};
300 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800301
302 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800303 // Use other thread to read pipe to prevent
304 // pipe is full, making HWC be blocked in writing.
305 std::thread t([&]() {
306 base::ReadFdToString(pipefds[0], &str);
307 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800308 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
309 // Close the write-end of the pipe to make sure that when reading from the
310 // read-end we will get eof instead of blocking forever
311 close(pipefds[1]);
312
yihsing.shen58847c52022-09-23 15:39:30 +0800313 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800314 ALOGE("dumpDebugInfo: dump failed: %d", status);
315 }
316
yihsing.shen58847c52022-09-23 15:39:30 +0800317 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800318 close(pipefds[0]);
319 return str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700320}
321
Yichi Chen3401b562022-01-17 15:42:35 +0800322void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700323 if (mAidlComposerCallback) {
324 ALOGE("Callback already registered");
325 }
Yichi Chen3401b562022-01-17 15:42:35 +0800326
Ady Abraham9fc28052021-10-14 17:21:38 -0700327 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700328 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
329
330 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
331 if (!status.isOk()) {
332 ALOGE("registerCallback failed %s", status.getDescription().c_str());
333 }
334}
335
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400336Error AidlComposer::executeCommands(Display display) {
337 mMutex.lock_shared();
338 auto error = execute(display);
339 mMutex.unlock_shared();
340 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700341}
342
343uint32_t AidlComposer::getMaxVirtualDisplayCount() {
344 int32_t count = 0;
345 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
346 if (!status.isOk()) {
347 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
348 return 0;
349 }
350 return static_cast<uint32_t>(count);
351}
352
353Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
354 Display* outDisplay) {
355 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
356 const int32_t bufferSlotCount = 1;
357 VirtualDisplay virtualDisplay;
358 const auto status =
359 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
360 static_cast<int32_t>(height),
361 static_cast<AidlPixelFormat>(*format),
362 bufferSlotCount, &virtualDisplay);
363
364 if (!status.isOk()) {
365 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
366 return static_cast<Error>(status.getServiceSpecificError());
367 }
368
369 *outDisplay = translate<Display>(virtualDisplay.display);
370 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400371 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700372 return Error::NONE;
373}
374
375Error AidlComposer::destroyVirtualDisplay(Display display) {
376 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
377 if (!status.isOk()) {
378 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
379 return static_cast<Error>(status.getServiceSpecificError());
380 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400381 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700382 return Error::NONE;
383}
384
385Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400386 Error error = Error::NONE;
387 mMutex.lock_shared();
388 if (auto writer = getWriter(display)) {
389 writer->get().acceptDisplayChanges(translate<int64_t>(display));
390 } else {
391 error = Error::BAD_DISPLAY;
392 }
393 mMutex.unlock_shared();
394 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700395}
396
397Error AidlComposer::createLayer(Display display, Layer* outLayer) {
398 int64_t layer;
399 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
400 kMaxLayerBufferCount, &layer);
401 if (!status.isOk()) {
402 ALOGE("createLayer failed %s", status.getDescription().c_str());
403 return static_cast<Error>(status.getServiceSpecificError());
404 }
405
406 *outLayer = translate<Layer>(layer);
407 return Error::NONE;
408}
409
410Error AidlComposer::destroyLayer(Display display, Layer layer) {
411 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
412 translate<int64_t>(layer));
413 if (!status.isOk()) {
414 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
415 return static_cast<Error>(status.getServiceSpecificError());
416 }
417 return Error::NONE;
418}
419
420Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
421 int32_t config;
422 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
423 if (!status.isOk()) {
424 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
425 return static_cast<Error>(status.getServiceSpecificError());
426 }
427 *outConfig = translate<Config>(config);
428 return Error::NONE;
429}
430
431Error AidlComposer::getChangedCompositionTypes(
432 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500433 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400434 std::vector<ChangedCompositionLayer> changedLayers;
435 Error error = Error::NONE;
436 {
437 mMutex.lock_shared();
438 if (auto reader = getReader(display)) {
439 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
440 } else {
441 error = Error::BAD_DISPLAY;
442 }
443 mMutex.unlock_shared();
444 }
Ady Abrahamde792782021-12-20 10:00:49 -0800445 outLayers->reserve(changedLayers.size());
446 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800447
Ady Abrahamde792782021-12-20 10:00:49 -0800448 for (const auto& layer : changedLayers) {
449 outLayers->emplace_back(translate<Layer>(layer.layer));
450 outTypes->emplace_back(layer.composition);
451 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400452 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700453}
454
455Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
456 std::vector<AidlColorMode> modes;
457 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
458 if (!status.isOk()) {
459 ALOGE("getColorModes failed %s", status.getDescription().c_str());
460 return static_cast<Error>(status.getServiceSpecificError());
461 }
462 *outModes = translate<ColorMode>(modes);
463 return Error::NONE;
464}
465
466Error AidlComposer::getDisplayAttribute(Display display, Config config,
467 IComposerClient::Attribute attribute, int32_t* outValue) {
468 const auto status =
469 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
470 translate<int32_t>(config),
471 static_cast<AidlDisplayAttribute>(attribute),
472 outValue);
473 if (!status.isOk()) {
474 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
475 return static_cast<Error>(status.getServiceSpecificError());
476 }
477 return Error::NONE;
478}
479
480Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
481 std::vector<int32_t> configs;
482 const auto status =
483 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
484 if (!status.isOk()) {
485 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
486 return static_cast<Error>(status.getServiceSpecificError());
487 }
488 *outConfigs = translate<Config>(configs);
489 return Error::NONE;
490}
491
492Error AidlComposer::getDisplayName(Display display, std::string* outName) {
493 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
494 if (!status.isOk()) {
495 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
496 return static_cast<Error>(status.getServiceSpecificError());
497 }
498 return Error::NONE;
499}
500
501Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
502 std::vector<Layer>* outLayers,
503 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400504 Error error = Error::NONE;
505 DisplayRequest displayRequests;
506 {
507 mMutex.lock_shared();
508 if (auto reader = getReader(display)) {
509 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
510 } else {
511 error = Error::BAD_DISPLAY;
512 }
513 mMutex.unlock_shared();
514 }
Ady Abrahamde792782021-12-20 10:00:49 -0800515 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
516 outLayers->reserve(displayRequests.layerRequests.size());
517 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
518
519 for (const auto& layer : displayRequests.layerRequests) {
520 outLayers->emplace_back(translate<Layer>(layer.layer));
521 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
522 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400523 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700524}
525
526Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800527 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700528 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800529 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700530 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800531 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700532 return static_cast<Error>(status.getServiceSpecificError());
533 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800534 *outSupport = std::find(capabilities.begin(), capabilities.end(),
535 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700536 return Error::NONE;
537}
538
ramindani32cf0602022-03-02 02:30:29 +0000539Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
540 std::vector<AidlDisplayCapability> capabilities;
541 const auto status =
542 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
543 if (!status.isOk()) {
544 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
545 return static_cast<Error>(status.getServiceSpecificError());
546 }
547 *outSupport = std::find(capabilities.begin(), capabilities.end(),
548 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
549 return Error::NONE;
550}
551
Ady Abrahame7385f72021-09-05 00:54:25 -0700552Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
553 float* outMaxLuminance, float* outMaxAverageLuminance,
554 float* outMinLuminance) {
555 AidlHdrCapabilities capabilities;
556 const auto status =
557 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
558 if (!status.isOk()) {
559 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
560 return static_cast<Error>(status.getServiceSpecificError());
561 }
562
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100563 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700564 *outMaxLuminance = capabilities.maxLuminance;
565 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
566 *outMinLuminance = capabilities.minLuminance;
567 return Error::NONE;
568}
569
Sally Qibb866c12022-10-17 11:31:20 -0700570Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
571 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
572 if (!status.isOk()) {
573 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
574 return static_cast<Error>(status.getServiceSpecificError());
575 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700576 return Error::NONE;
577}
578
Ady Abrahame7385f72021-09-05 00:54:25 -0700579Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
580 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400581 Error error = Error::NONE;
582 std::vector<ReleaseFences::Layer> fences;
583 {
584 mMutex.lock_shared();
585 if (auto reader = getReader(display)) {
586 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
587 } else {
588 error = Error::BAD_DISPLAY;
589 }
590 mMutex.unlock_shared();
591 }
Ady Abrahamde792782021-12-20 10:00:49 -0800592 outLayers->reserve(fences.size());
593 outReleaseFences->reserve(fences.size());
594
595 for (auto& fence : fences) {
596 outLayers->emplace_back(translate<Layer>(fence.layer));
597 // take ownership
598 const int fenceOwner = fence.fence.get();
599 *fence.fence.getR() = -1;
600 outReleaseFences->emplace_back(fenceOwner);
601 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400602 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700603}
604
605Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500606 const auto displayId = translate<int64_t>(display);
607 ATRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
608
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400609 Error error = Error::NONE;
610 mMutex.lock_shared();
611 auto writer = getWriter(display);
612 auto reader = getReader(display);
613 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500614 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400615 error = execute(display);
616 } else {
617 error = Error::BAD_DISPLAY;
618 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700619
Ady Abrahame7385f72021-09-05 00:54:25 -0700620 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400621 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700622 return error;
623 }
624
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500625 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400626 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800627 // take ownership
628 *outPresentFence = fence.get();
629 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700630 return Error::NONE;
631}
632
633Error AidlComposer::setActiveConfig(Display display, Config config) {
634 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
635 translate<int32_t>(config));
636 if (!status.isOk()) {
637 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
638 return static_cast<Error>(status.getServiceSpecificError());
639 }
640 return Error::NONE;
641}
642
643Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
644 int acquireFence, Dataspace dataspace,
645 const std::vector<IComposerClient::Rect>& damage) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700646 const native_handle_t* handle = nullptr;
647 if (target.get()) {
648 handle = target->getNativeBuffer()->handle;
649 }
650
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400651 Error error = Error::NONE;
652 mMutex.lock_shared();
653 if (auto writer = getWriter(display)) {
654 writer->get()
655 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
656 translate<aidl::android::hardware::graphics::common::Dataspace>(
657 dataspace),
658 translate<AidlRect>(damage));
659 } else {
660 error = Error::BAD_DISPLAY;
661 }
662 mMutex.unlock_shared();
663 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700664}
665
666Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
667 const auto status =
668 mAidlComposerClient->setColorMode(translate<int64_t>(display),
669 translate<AidlColorMode>(mode),
670 translate<AidlRenderIntent>(renderIntent));
671 if (!status.isOk()) {
672 ALOGE("setColorMode failed %s", status.getDescription().c_str());
673 return static_cast<Error>(status.getServiceSpecificError());
674 }
675 return Error::NONE;
676}
677
Ady Abrahamdc011a92021-12-21 14:06:44 -0800678Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400679 auto error = Error::NONE;
680 mMutex.lock_shared();
681 if (auto writer = getWriter(display)) {
682 writer->get().setColorTransform(translate<int64_t>(display), matrix);
683 } else {
684 error = Error::BAD_DISPLAY;
685 }
686 mMutex.unlock_shared();
687 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700688}
689
690Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
691 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400692 auto error = Error::NONE;
693 mMutex.lock_shared();
694 if (auto writer = getWriter(display)) {
695 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
696 } else {
697 error = Error::BAD_DISPLAY;
698 }
699 mMutex.unlock_shared();
700 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700701}
702
703Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
704 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
705 translate<PowerMode>(mode));
706 if (!status.isOk()) {
707 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
708 return static_cast<Error>(status.getServiceSpecificError());
709 }
710 return Error::NONE;
711}
712
713Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
714 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
715 const auto status =
716 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
717 if (!status.isOk()) {
718 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
719 return static_cast<Error>(status.getServiceSpecificError());
720 }
721 return Error::NONE;
722}
723
724Error AidlComposer::setClientTargetSlotCount(Display display) {
725 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
726 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
727 bufferSlotCount);
728 if (!status.isOk()) {
729 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
730 return static_cast<Error>(status.getServiceSpecificError());
731 }
732 return Error::NONE;
733}
734
Ady Abraham43065bd2021-12-10 17:22:15 -0800735Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
736 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400737 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500738 ATRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
739
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400740 Error error = Error::NONE;
741 mMutex.lock_shared();
742 auto writer = getWriter(display);
743 auto reader = getReader(display);
744 if (writer && reader) {
745 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime});
746 error = execute(display);
747 } else {
748 error = Error::BAD_DISPLAY;
749 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700750
Ady Abrahame7385f72021-09-05 00:54:25 -0700751 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400752 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700753 return error;
754 }
755
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400756 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700757
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400758 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700759 return Error::NONE;
760}
761
Ady Abraham43065bd2021-12-10 17:22:15 -0800762Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
763 uint32_t* outNumTypes, uint32_t* outNumRequests,
764 int* outPresentFence, uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400765 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500766 ATRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
767
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400768 Error error = Error::NONE;
769 mMutex.lock_shared();
770 auto writer = getWriter(display);
771 auto reader = getReader(display);
772 if (writer && reader) {
773 writer->get().presentOrvalidateDisplay(displayId,
774 ClockMonotonicTimestamp{expectedPresentTime});
775 error = execute(display);
776 } else {
777 error = Error::BAD_DISPLAY;
778 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700779
Ady Abrahame7385f72021-09-05 00:54:25 -0700780 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400781 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700782 return error;
783 }
784
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400785 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800786 if (!result.has_value()) {
787 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400788 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800789 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700790 }
791
Ady Abrahamde792782021-12-20 10:00:49 -0800792 *state = translate<uint32_t>(*result);
793
794 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400795 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800796 // take ownership
797 *outPresentFence = fence.get();
798 *fence.getR() = -1;
799 }
800
801 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400802 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700803 }
804
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400805 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700806 return Error::NONE;
807}
808
809Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400810 Error error = Error::NONE;
811 mMutex.lock_shared();
812 if (auto writer = getWriter(display)) {
813 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
814 x, y);
815 } else {
816 error = Error::BAD_DISPLAY;
817 }
818 mMutex.unlock_shared();
819 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700820}
821
822Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
823 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700824 const native_handle_t* handle = nullptr;
825 if (buffer.get()) {
826 handle = buffer->getNativeBuffer()->handle;
827 }
828
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400829 Error error = Error::NONE;
830 mMutex.lock_shared();
831 if (auto writer = getWriter(display)) {
832 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
833 handle, acquireFence);
834 } else {
835 error = Error::BAD_DISPLAY;
836 }
837 mMutex.unlock_shared();
838 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700839}
840
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700841Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
842 const std::vector<uint32_t>& slotsToClear,
843 uint32_t activeBufferSlot) {
844 if (slotsToClear.empty()) {
845 return Error::NONE;
846 }
847
Brian Lindahl90553da2022-12-06 13:36:30 -0700848 Error error = Error::NONE;
849 mMutex.lock_shared();
850 if (auto writer = getWriter(display)) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600851 if (mSupportsBufferSlotsToClear) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700852 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
853 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600854 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
855 // placeholder buffer, using the slot that needs to cleared... tricky.
856 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700857 for (uint32_t slot : slotsToClear) {
858 // Don't clear the active buffer slot because we need to restore the active buffer
859 // after clearing the requested buffer slots with a placeholder buffer.
860 if (slot != activeBufferSlot) {
861 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
862 translate<int64_t>(layer), slot,
863 mClearSlotBuffer->handle,
864 /*fence*/ -1);
865 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700866 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700867 // Since we clear buffers by setting them to a placeholder buffer, we want to make
868 // sure that the last setLayerBuffer command is sent with the currently active
869 // buffer, not the placeholder buffer, so that there is no perceptual change when
870 // buffers are discarded.
871 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
872 translate<int64_t>(layer), activeBufferSlot,
873 // The active buffer is still cached in
874 // its slot and doesn't need a fence.
875 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700876 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700877 } else {
878 error = Error::BAD_DISPLAY;
879 }
880 mMutex.unlock_shared();
881 return error;
882}
883
Ady Abrahame7385f72021-09-05 00:54:25 -0700884Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
885 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400886 Error error = Error::NONE;
887 mMutex.lock_shared();
888 if (auto writer = getWriter(display)) {
889 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
890 translate<AidlRect>(damage));
891 } else {
892 error = Error::BAD_DISPLAY;
893 }
894 mMutex.unlock_shared();
895 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700896}
897
898Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
899 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400900 Error error = Error::NONE;
901 mMutex.lock_shared();
902 if (auto writer = getWriter(display)) {
903 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
904 translate<BlendMode>(mode));
905 } else {
906 error = Error::BAD_DISPLAY;
907 }
908 mMutex.unlock_shared();
909 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700910}
911
Ady Abraham6e60b142022-01-06 18:10:35 -0800912Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400913 Error error = Error::NONE;
914 mMutex.lock_shared();
915 if (auto writer = getWriter(display)) {
916 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
917 } else {
918 error = Error::BAD_DISPLAY;
919 }
920 mMutex.unlock_shared();
921 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700922}
923
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500924Error AidlComposer::setLayerCompositionType(
925 Display display, Layer layer,
926 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400927 Error error = Error::NONE;
928 mMutex.lock_shared();
929 if (auto writer = getWriter(display)) {
930 writer->get().setLayerCompositionType(translate<int64_t>(display),
931 translate<int64_t>(layer), type);
932 } else {
933 error = Error::BAD_DISPLAY;
934 }
935 mMutex.unlock_shared();
936 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700937}
938
939Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400940 Error error = Error::NONE;
941 mMutex.lock_shared();
942 if (auto writer = getWriter(display)) {
943 writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
944 translate<AidlDataspace>(dataspace));
945 } else {
946 error = Error::BAD_DISPLAY;
947 }
948 mMutex.unlock_shared();
949 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700950}
951
952Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
953 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400954 Error error = Error::NONE;
955 mMutex.lock_shared();
956 if (auto writer = getWriter(display)) {
957 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
958 translate<AidlRect>(frame));
959 } else {
960 error = Error::BAD_DISPLAY;
961 }
962 mMutex.unlock_shared();
963 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700964}
965
966Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400967 Error error = Error::NONE;
968 mMutex.lock_shared();
969 if (auto writer = getWriter(display)) {
970 writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
971 alpha);
972 } else {
973 error = Error::BAD_DISPLAY;
974 }
975 mMutex.unlock_shared();
976 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700977}
978
979Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
980 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400981 Error error = Error::NONE;
982 mMutex.lock_shared();
983 if (auto writer = getWriter(display)) {
984 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
985 stream);
986 } else {
987 error = Error::BAD_DISPLAY;
988 }
989 mMutex.unlock_shared();
990 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700991}
992
993Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
994 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400995 Error error = Error::NONE;
996 mMutex.lock_shared();
997 if (auto writer = getWriter(display)) {
998 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
999 translate<AidlFRect>(crop));
1000 } else {
1001 error = Error::BAD_DISPLAY;
1002 }
1003 mMutex.unlock_shared();
1004 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001005}
1006
1007Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001008 Error error = Error::NONE;
1009 mMutex.lock_shared();
1010 if (auto writer = getWriter(display)) {
1011 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1012 translate<AidlTransform>(transform));
1013 } else {
1014 error = Error::BAD_DISPLAY;
1015 }
1016 mMutex.unlock_shared();
1017 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001018}
1019
1020Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1021 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001022 Error error = Error::NONE;
1023 mMutex.lock_shared();
1024 if (auto writer = getWriter(display)) {
1025 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1026 translate<AidlRect>(visible));
1027 } else {
1028 error = Error::BAD_DISPLAY;
1029 }
1030 mMutex.unlock_shared();
1031 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001032}
1033
1034Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001035 Error error = Error::NONE;
1036 mMutex.lock_shared();
1037 if (auto writer = getWriter(display)) {
1038 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1039 } else {
1040 error = Error::BAD_DISPLAY;
1041 }
1042 mMutex.unlock_shared();
1043 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001044}
1045
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001046Error AidlComposer::execute(Display display) {
1047 auto writer = getWriter(display);
1048 auto reader = getReader(display);
1049 if (!writer || !reader) {
1050 return Error::BAD_DISPLAY;
1051 }
1052
Huihong Luoe7382c12023-04-21 20:24:32 +00001053 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001054 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001055 return Error::NONE;
1056 }
1057
Ady Abrahamde792782021-12-20 10:00:49 -08001058 { // scope for results
1059 std::vector<CommandResultPayload> results;
1060 auto status = mAidlComposerClient->executeCommands(commands, &results);
1061 if (!status.isOk()) {
1062 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1063 return static_cast<Error>(status.getServiceSpecificError());
1064 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001065
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001066 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001067 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001068 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001069 Error error = Error::NONE;
1070 for (const auto& cmdErr : commandErrors) {
1071 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1072 if (index < 0 || index >= commands.size()) {
1073 ALOGE("invalid command index %zu", index);
1074 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001075 }
1076
Ady Abrahama6388c02021-11-11 21:11:51 -08001077 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001078 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1079 error = translate<Error>(cmdErr.errorCode);
1080 } else {
1081 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1082 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001083 }
1084 }
1085
Ady Abrahame7385f72021-09-05 00:54:25 -07001086 return error;
1087}
1088
1089Error AidlComposer::setLayerPerFrameMetadata(
1090 Display display, Layer layer,
1091 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001092 Error error = Error::NONE;
1093 mMutex.lock_shared();
1094 if (auto writer = getWriter(display)) {
1095 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1096 translate<int64_t>(layer),
1097 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1098 } else {
1099 error = Error::BAD_DISPLAY;
1100 }
1101 mMutex.unlock_shared();
1102 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001103}
1104
1105std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1106 Display display) {
1107 std::vector<AidlPerFrameMetadataKey> keys;
1108 const auto status =
1109 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1110 if (!status.isOk()) {
1111 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1112 return {};
1113 }
1114 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1115}
1116
1117Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1118 std::vector<RenderIntent>* outRenderIntents) {
1119 std::vector<AidlRenderIntent> renderIntents;
1120 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1121 translate<AidlColorMode>(colorMode),
1122 &renderIntents);
1123 if (!status.isOk()) {
1124 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1125 return static_cast<Error>(status.getServiceSpecificError());
1126 }
1127 *outRenderIntents = translate<RenderIntent>(renderIntents);
1128 return Error::NONE;
1129}
1130
1131Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1132 std::vector<float> matrix;
1133 const auto status =
1134 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1135 &matrix);
1136 if (!status.isOk()) {
1137 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1138 return static_cast<Error>(status.getServiceSpecificError());
1139 }
1140 *outMatrix = makeMat4(matrix);
1141 return Error::NONE;
1142}
1143
1144Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1145 std::vector<uint8_t>* outData) {
1146 AidlDisplayIdentification displayIdentification;
1147 const auto status =
1148 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1149 &displayIdentification);
1150 if (!status.isOk()) {
1151 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1152 return static_cast<Error>(status.getServiceSpecificError());
1153 }
1154
1155 *outPort = static_cast<uint8_t>(displayIdentification.port);
1156 *outData = displayIdentification.data;
1157
1158 return Error::NONE;
1159}
1160
1161Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001162 Error error = Error::NONE;
1163 mMutex.lock_shared();
1164 if (auto writer = getWriter(display)) {
1165 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1166 matrix);
1167 } else {
1168 error = Error::BAD_DISPLAY;
1169 }
1170 mMutex.unlock_shared();
1171 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001172}
1173
1174Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1175 Dataspace* outDataspace,
1176 uint8_t* outComponentMask) {
1177 if (!outFormat || !outDataspace || !outComponentMask) {
1178 return Error::BAD_PARAMETER;
1179 }
1180
1181 AidlDisplayContentSamplingAttributes attributes;
1182 const auto status =
1183 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1184 &attributes);
1185 if (!status.isOk()) {
1186 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1187 return static_cast<Error>(status.getServiceSpecificError());
1188 }
1189
1190 *outFormat = translate<PixelFormat>(attributes.format);
1191 *outDataspace = translate<Dataspace>(attributes.dataspace);
1192 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1193 return Error::NONE;
1194}
1195
1196Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1197 uint8_t componentMask, uint64_t maxFrames) {
1198 const auto status =
1199 mAidlComposerClient
1200 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1201 static_cast<AidlFormatColorComponent>(
1202 componentMask),
1203 static_cast<int64_t>(maxFrames));
1204 if (!status.isOk()) {
1205 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1206 return static_cast<Error>(status.getServiceSpecificError());
1207 }
1208 return Error::NONE;
1209}
1210
1211Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1212 uint64_t timestamp, DisplayedFrameStats* outStats) {
1213 if (!outStats) {
1214 return Error::BAD_PARAMETER;
1215 }
1216
1217 AidlDisplayContentSample sample;
1218 const auto status =
1219 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1220 static_cast<int64_t>(maxFrames),
1221 static_cast<int64_t>(timestamp),
1222 &sample);
1223 if (!status.isOk()) {
1224 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1225 return static_cast<Error>(status.getServiceSpecificError());
1226 }
1227 *outStats = translate<DisplayedFrameStats>(sample);
1228 return Error::NONE;
1229}
1230
1231Error AidlComposer::setLayerPerFrameMetadataBlobs(
1232 Display display, Layer layer,
1233 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001234 Error error = Error::NONE;
1235 mMutex.lock_shared();
1236 if (auto writer = getWriter(display)) {
1237 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1238 translate<int64_t>(layer),
1239 translate<AidlPerFrameMetadataBlob>(metadata));
1240 } else {
1241 error = Error::BAD_DISPLAY;
1242 }
1243 mMutex.unlock_shared();
1244 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001245}
1246
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001247Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001248 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001249 Error error = Error::NONE;
1250 mMutex.lock_shared();
1251 if (auto writer = getWriter(display)) {
1252 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001253
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001254 if (options.applyImmediately) {
1255 error = execute(display);
1256 mMutex.unlock_shared();
1257 return error;
1258 }
1259 } else {
1260 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001261 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001262 mMutex.unlock_shared();
1263 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001264}
1265
1266Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001267 std::vector<AidlDisplayCapability>* outCapabilities) {
1268 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1269 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001270 if (!status.isOk()) {
1271 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001272 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001273 return static_cast<Error>(status.getServiceSpecificError());
1274 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001275 return Error::NONE;
1276}
1277
1278V2_4::Error AidlComposer::getDisplayConnectionType(
1279 Display display, IComposerClient::DisplayConnectionType* outType) {
1280 AidlDisplayConnectionType type;
1281 const auto status =
1282 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1283 if (!status.isOk()) {
1284 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1285 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1286 }
1287 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1288 return V2_4::Error::NONE;
1289}
1290
1291V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1292 int32_t vsyncPeriod;
1293 const auto status =
1294 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1295 if (!status.isOk()) {
1296 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1297 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1298 }
1299 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1300 return V2_4::Error::NONE;
1301}
1302
1303V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1304 Display display, Config config,
1305 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1306 VsyncPeriodChangeTimeline* outTimeline) {
1307 AidlVsyncPeriodChangeTimeline timeline;
1308 const auto status =
1309 mAidlComposerClient
1310 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1311 translate<int32_t>(config),
1312 translate<AidlVsyncPeriodChangeConstraints>(
1313 vsyncPeriodChangeConstraints),
1314 &timeline);
1315 if (!status.isOk()) {
1316 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1317 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1318 }
1319 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1320 return V2_4::Error::NONE;
1321}
1322
1323V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1324 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1325 if (!status.isOk()) {
1326 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1327 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1328 }
1329 return V2_4::Error::NONE;
1330}
1331
1332V2_4::Error AidlComposer::getSupportedContentTypes(
1333 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1334 std::vector<AidlContentType> types;
1335 const auto status =
1336 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1337 if (!status.isOk()) {
1338 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1339 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1340 }
1341 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1342 return V2_4::Error::NONE;
1343}
1344
1345V2_4::Error AidlComposer::setContentType(Display display,
1346 IComposerClient::ContentType contentType) {
1347 const auto status =
1348 mAidlComposerClient->setContentType(translate<int64_t>(display),
1349 translate<AidlContentType>(contentType));
1350 if (!status.isOk()) {
1351 ALOGE("setContentType failed %s", status.getDescription().c_str());
1352 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1353 }
1354 return V2_4::Error::NONE;
1355}
1356
Ady Abraham3f976752021-12-20 16:17:50 -08001357V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1358 const std::vector<uint8_t>&) {
1359 // There are no users for this API. See b/209691612.
1360 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001361}
1362
1363V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001364 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1365 // There are no users for this API. See b/209691612.
1366 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001367}
1368
Kriti Dang7defaf32021-11-15 11:55:43 +01001369Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1370 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1371 translate<int32_t>(config));
1372 if (!status.isOk()) {
1373 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1374 return static_cast<Error>(status.getServiceSpecificError());
1375 }
1376 return Error::NONE;
1377}
1378
1379Error AidlComposer::clearBootDisplayConfig(Display display) {
1380 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1381 if (!status.isOk()) {
1382 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1383 return static_cast<Error>(status.getServiceSpecificError());
1384 }
1385 return Error::NONE;
1386}
1387
1388Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1389 int32_t displayConfig;
1390 const auto status =
1391 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1392 &displayConfig);
1393 if (!status.isOk()) {
1394 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1395 return static_cast<Error>(status.getServiceSpecificError());
1396 }
1397 *config = translate<uint32_t>(displayConfig);
1398 return Error::NONE;
1399}
1400
Kriti Dang674b9372022-11-18 10:58:44 +01001401Error AidlComposer::getHdrConversionCapabilities(
1402 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1403 const auto status =
1404 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1405 if (!status.isOk()) {
1406 hdrConversionCapabilities = {};
1407 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1408 return static_cast<Error>(status.getServiceSpecificError());
1409 }
1410 return Error::NONE;
1411}
1412
Kriti Dangd432bb52023-02-09 18:21:04 +01001413Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1414 Hdr* outPreferredHdrOutputType) {
1415 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1416 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001417 if (!status.isOk()) {
1418 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1419 return static_cast<Error>(status.getServiceSpecificError());
1420 }
1421 return Error::NONE;
1422}
1423
ramindanib2158ee2023-02-13 20:29:59 -08001424Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1425 const auto status =
1426 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1427 displayId),
1428 enabled);
1429 if (!status.isOk()) {
1430 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1431 status.getDescription().c_str());
1432 return static_cast<Error>(status.getServiceSpecificError());
1433 }
1434 return Error::NONE;
1435}
1436
Ady Abrahame7385f72021-09-05 00:54:25 -07001437Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001438 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001439 Error error = Error::NONE;
1440 mMutex.lock_shared();
1441 if (auto reader = getReader(display)) {
1442 *outClientTargetProperty =
1443 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1444 } else {
1445 error = Error::BAD_DISPLAY;
1446 }
1447 mMutex.unlock_shared();
1448 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001449}
1450
Alec Mouri6da0e272022-02-07 12:45:57 -08001451Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001452 Error error = Error::NONE;
1453 mMutex.lock_shared();
1454 if (auto writer = getWriter(display)) {
1455 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1456 brightness);
1457 } else {
1458 error = Error::BAD_DISPLAY;
1459 }
1460 mMutex.unlock_shared();
1461 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001462}
1463
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001464Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1465 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001466 Error error = Error::NONE;
1467 mMutex.lock_shared();
1468 if (auto writer = getWriter(display)) {
1469 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1470 translate<AidlRect>(blocking));
1471 } else {
1472 error = Error::BAD_DISPLAY;
1473 }
1474 mMutex.unlock_shared();
1475 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001476}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001477
1478Error AidlComposer::getDisplayDecorationSupport(Display display,
1479 std::optional<DisplayDecorationSupport>* support) {
1480 const auto status =
1481 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1482 if (!status.isOk()) {
1483 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1484 support->reset();
1485 return static_cast<Error>(status.getServiceSpecificError());
1486 }
1487 return Error::NONE;
1488}
ramindani32cf0602022-03-02 02:30:29 +00001489
1490Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1491 const auto status =
1492 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1493 translate<int32_t>(timeout.count()));
1494 if (!status.isOk()) {
1495 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1496 return static_cast<Error>(status.getServiceSpecificError());
1497 }
1498 return Error::NONE;
1499}
1500
ramindani06e518e2022-03-14 18:47:53 +00001501Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1502 AidlTransform* outDisplayOrientation) {
1503 const auto status =
1504 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1505 outDisplayOrientation);
1506 if (!status.isOk()) {
1507 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1508 return static_cast<Error>(status.getServiceSpecificError());
1509 }
1510 return Error::NONE;
1511}
1512
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001513ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1514 REQUIRES_SHARED(mMutex) {
1515 return mWriters.get(display);
1516}
1517
1518ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1519 REQUIRES_SHARED(mMutex) {
1520 if (mSingleReader) {
1521 display = translate<Display>(kSingleReaderKey);
1522 }
1523 return mReaders.get(display);
1524}
1525
1526void AidlComposer::removeDisplay(Display display) {
1527 mMutex.lock();
1528 bool wasErased = mWriters.erase(display);
1529 ALOGW_IF(!wasErased,
1530 "Attempting to remove writer for display %" PRId64 " which is not connected",
1531 translate<int64_t>(display));
1532 if (!mSingleReader) {
1533 removeReader(display);
1534 }
1535 mMutex.unlock();
1536}
1537
1538void AidlComposer::onHotplugDisconnect(Display display) {
1539 removeDisplay(display);
1540}
1541
1542bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIc1cf4582023-03-23 18:37:44 -04001543#if 0
1544 // TODO (b/259132483): Reenable
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001545 const auto displayId = translate<int64_t>(display);
1546 std::vector<AidlDisplayCapability> capabilities;
1547 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1548 if (!status.isOk()) {
1549 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1550 return false;
1551 }
1552 return std::find(capabilities.begin(), capabilities.end(),
1553 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
Leon Scroggins IIIc1cf4582023-03-23 18:37:44 -04001554#else
1555 (void) display;
1556 return false;
1557#endif
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001558}
1559
1560void AidlComposer::addReader(Display display) {
1561 const auto displayId = translate<int64_t>(display);
1562 std::optional<int64_t> displayOpt;
1563 if (displayId != kSingleReaderKey) {
1564 displayOpt.emplace(displayId);
1565 }
1566 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1567 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1568 displayId);
1569}
1570
1571void AidlComposer::removeReader(Display display) {
1572 bool wasErased = mReaders.erase(display);
1573 ALOGW_IF(!wasErased,
1574 "Attempting to remove reader for display %" PRId64 " which is not connected",
1575 translate<int64_t>(display));
1576}
1577
1578void AidlComposer::addDisplay(Display display) {
1579 const auto displayId = translate<int64_t>(display);
1580 mMutex.lock();
1581 auto [it, added] = mWriters.try_emplace(display, displayId);
1582 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1583 displayId);
1584 if (mSingleReader) {
1585 if (hasMultiThreadedPresentSupport(display)) {
1586 mSingleReader = false;
1587 removeReader(translate<Display>(kSingleReaderKey));
1588 // Note that this includes the new display.
1589 for (const auto& [existingDisplay, _] : mWriters) {
1590 addReader(existingDisplay);
1591 }
1592 }
1593 } else {
1594 addReader(display);
1595 }
1596 mMutex.unlock();
1597}
1598
1599void AidlComposer::onHotplugConnect(Display display) {
1600 addDisplay(display);
1601}
Ady Abrahame7385f72021-09-05 00:54:25 -07001602} // namespace Hwc2
1603} // namespace android