blob: c25f9ddd12a36894362dd07c06a4e261b9e73c98 [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>
Alec Mouri9b133ca2023-11-14 19:00:01 +000027#include <common/FlagManager.h>
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -050028#include <gui/TraceUtils.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070029#include <log/log.h>
30#include <utils/Trace.h>
31
32#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
33
34#include <algorithm>
35#include <cinttypes>
36
Yichi Chen3401b562022-01-17 15:42:35 +080037#include "HWC2.h"
38
Ady Abrahame7385f72021-09-05 00:54:25 -070039namespace android {
40
41using hardware::hidl_handle;
42using hardware::hidl_vec;
43using hardware::Return;
44
45using aidl::android::hardware::graphics::composer3::BnComposerCallback;
46using aidl::android::hardware::graphics::composer3::Capability;
Alec Mouri85065692022-03-18 00:58:26 +000047using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
Ady Abrahame7385f72021-09-05 00:54:25 -070048using aidl::android::hardware::graphics::composer3::PowerMode;
49using aidl::android::hardware::graphics::composer3::VirtualDisplay;
50
Ady Abraham42977362021-12-07 21:04:49 -080051using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080052
Ady Abrahame7385f72021-09-05 00:54:25 -070053using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
54using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
55using AidlDisplayIdentification =
56 aidl::android::hardware::graphics::composer3::DisplayIdentification;
57using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
58using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
59using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070060using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
Kriti Dang674b9372022-11-18 10:58:44 +010061using AidlHdrConversionCapability =
62 aidl::android::hardware::graphics::common::HdrConversionCapability;
63using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
Sally Qi0cbd08b2022-08-17 12:12:28 -070064using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
Ady Abrahame7385f72021-09-05 00:54:25 -070065using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
66using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
67using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
68using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
69using AidlVsyncPeriodChangeConstraints =
70 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
71using AidlVsyncPeriodChangeTimeline =
72 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070073using AidlDisplayContentSamplingAttributes =
74 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
75using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
76using AidlDisplayConnectionType =
77 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070078
79using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
80using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
Huihong Luo791bef92023-09-19 21:18:45 -070081using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Ady Abrahame7385f72021-09-05 00:54:25 -070082using AidlFRect = aidl::android::hardware::graphics::common::FRect;
83using AidlRect = aidl::android::hardware::graphics::common::Rect;
84using AidlTransform = aidl::android::hardware::graphics::common::Transform;
85
86namespace Hwc2 {
87
88namespace {
89
90template <typename To, typename From>
91To translate(From x) {
92 return static_cast<To>(x);
93}
94
95template <typename To, typename From>
96std::vector<To> translate(const std::vector<From>& in) {
97 std::vector<To> out;
98 out.reserve(in.size());
99 std::transform(in.begin(), in.end(), std::back_inserter(out),
100 [](From x) { return translate<To>(x); });
101 return out;
102}
103
104template <>
105AidlRect translate(IComposerClient::Rect x) {
106 return AidlRect{
107 .left = x.left,
108 .top = x.top,
109 .right = x.right,
110 .bottom = x.bottom,
111 };
112}
113
114template <>
115AidlFRect translate(IComposerClient::FRect x) {
116 return AidlFRect{
117 .left = x.left,
118 .top = x.top,
119 .right = x.right,
120 .bottom = x.bottom,
121 };
122}
123
124template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700125AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
126 AidlPerFrameMetadataBlob blob;
127 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800128 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700129 return blob;
130}
131
132template <>
133AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
134 return AidlPerFrameMetadata{
135 .key = translate<AidlPerFrameMetadataKey>(x.key),
136 .value = x.value,
137 };
138}
139
140template <>
141DisplayedFrameStats translate(AidlDisplayContentSample x) {
142 return DisplayedFrameStats{
143 .numFrames = static_cast<uint64_t>(x.frameCount),
144 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
145 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
146 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
147 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
148 };
149}
150
151template <>
152AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
153 return AidlVsyncPeriodChangeConstraints{
154 .desiredTimeNanos = x.desiredTimeNanos,
155 .seamlessRequired = x.seamlessRequired,
156 };
157}
158
159template <>
160VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
161 return VsyncPeriodChangeTimeline{
162 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
163 .refreshRequired = x.refreshRequired,
164 .refreshTimeNanos = x.refreshTimeNanos,
165 };
166}
Ady Abrahame7385f72021-09-05 00:54:25 -0700167mat4 makeMat4(std::vector<float> in) {
168 return mat4(static_cast<const float*>(in.data()));
169}
170
171} // namespace
172
173class AidlIComposerCallbackWrapper : public BnComposerCallback {
174public:
Yichi Chen3401b562022-01-17 15:42:35 +0800175 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700176
177 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
Huihong Luo791bef92023-09-19 21:18:45 -0700178 const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
179 : AidlDisplayHotplugEvent::DISCONNECTED;
180 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
Ady Abrahame7385f72021-09-05 00:54:25 -0700181 return ::ndk::ScopedAStatus::ok();
182 }
183
184 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800185 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700186 return ::ndk::ScopedAStatus::ok();
187 }
Yichi Chen3401b562022-01-17 15:42:35 +0800188
Ady Abrahame7385f72021-09-05 00:54:25 -0700189 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800190 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700191 return ::ndk::ScopedAStatus::ok();
192 }
Yichi Chen3401b562022-01-17 15:42:35 +0800193
Ady Abrahame7385f72021-09-05 00:54:25 -0700194 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
195 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800196 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
197 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700198 return ::ndk::ScopedAStatus::ok();
199 }
Yichi Chen3401b562022-01-17 15:42:35 +0800200
Ady Abrahame7385f72021-09-05 00:54:25 -0700201 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
202 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800203 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
204 translate<V2_4::VsyncPeriodChangeTimeline>(
205 in_updatedTimeline));
206 return ::ndk::ScopedAStatus::ok();
207 }
208
209 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
210 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700211 return ::ndk::ScopedAStatus::ok();
212 }
213
ramindani12bfe6b2023-02-03 13:29:19 -0800214 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
215 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
216 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
217 return ::ndk::ScopedAStatus::ok();
218 }
219
Huihong Luo791bef92023-09-19 21:18:45 -0700220 ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
221 AidlDisplayHotplugEvent event) override {
222 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
223 return ::ndk::ScopedAStatus::ok();
224 }
225
Ady Abrahame7385f72021-09-05 00:54:25 -0700226private:
Yichi Chen3401b562022-01-17 15:42:35 +0800227 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700228};
229
Ady Abraham9fc28052021-10-14 17:21:38 -0700230std::string AidlComposer::instance(const std::string& serviceName) {
231 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
232}
233
234bool AidlComposer::isDeclared(const std::string& serviceName) {
235 return AServiceManager_isDeclared(instance(serviceName).c_str());
236}
Ady Abrahame7385f72021-09-05 00:54:25 -0700237
Ady Abrahama6388c02021-11-11 21:11:51 -0800238AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700239 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700240 mAidlComposer = AidlIComposer::fromBinder(
241 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700242 if (!mAidlComposer) {
243 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
244 return;
245 }
246
247 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
248 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
249 return;
250 }
251
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400252 addReader(translate<Display>(kSingleReaderKey));
253
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700254 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700255 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700256 if (!status.isOk()) {
257 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
258 status.getDescription().c_str());
259 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700260
261 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600262 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
263 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
264 GraphicBuffer::USAGE_HW_COMPOSER |
265 GraphicBuffer::USAGE_SW_READ_OFTEN |
266 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
267 "AidlComposer");
268 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
269 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
270 return;
271 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700272 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700273 }
274
Ady Abrahame7385f72021-09-05 00:54:25 -0700275 ALOGI("Loaded AIDL composer3 HAL service");
276}
277
278AidlComposer::~AidlComposer() = default;
279
Ady Abraham4d211cf2021-12-14 16:19:03 -0800280bool AidlComposer::isSupported(OptionalFeature feature) const {
281 switch (feature) {
282 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800283 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800284 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000285 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000286 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800287 return true;
288 }
289}
290
ramindani0cd1d8d2023-06-13 13:43:23 -0700291bool AidlComposer::getDisplayConfigurationsSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800292 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700293}
294
Ady Abrahamde549d42022-01-26 19:19:17 -0800295std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700296 std::vector<Capability> capabilities;
297 const auto status = mAidlComposer->getCapabilities(&capabilities);
298 if (!status.isOk()) {
299 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
300 return {};
301 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800302 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700303}
304
305std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800306 int pipefds[2];
307 int result = pipe(pipefds);
308 if (result < 0) {
309 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700310 return {};
311 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800312
313 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800314 // Use other thread to read pipe to prevent
315 // pipe is full, making HWC be blocked in writing.
316 std::thread t([&]() {
317 base::ReadFdToString(pipefds[0], &str);
318 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800319 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
320 // Close the write-end of the pipe to make sure that when reading from the
321 // read-end we will get eof instead of blocking forever
322 close(pipefds[1]);
323
yihsing.shen58847c52022-09-23 15:39:30 +0800324 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800325 ALOGE("dumpDebugInfo: dump failed: %d", status);
326 }
327
yihsing.shen58847c52022-09-23 15:39:30 +0800328 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800329 close(pipefds[0]);
330 return str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700331}
332
Yichi Chen3401b562022-01-17 15:42:35 +0800333void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700334 if (mAidlComposerCallback) {
335 ALOGE("Callback already registered");
336 }
Yichi Chen3401b562022-01-17 15:42:35 +0800337
Ady Abraham9fc28052021-10-14 17:21:38 -0700338 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700339 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
340
341 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
342 if (!status.isOk()) {
343 ALOGE("registerCallback failed %s", status.getDescription().c_str());
344 }
345}
346
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400347Error AidlComposer::executeCommands(Display display) {
348 mMutex.lock_shared();
349 auto error = execute(display);
350 mMutex.unlock_shared();
351 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700352}
353
354uint32_t AidlComposer::getMaxVirtualDisplayCount() {
355 int32_t count = 0;
356 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
357 if (!status.isOk()) {
358 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
359 return 0;
360 }
361 return static_cast<uint32_t>(count);
362}
363
364Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
365 Display* outDisplay) {
366 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
367 const int32_t bufferSlotCount = 1;
368 VirtualDisplay virtualDisplay;
369 const auto status =
370 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
371 static_cast<int32_t>(height),
372 static_cast<AidlPixelFormat>(*format),
373 bufferSlotCount, &virtualDisplay);
374
375 if (!status.isOk()) {
376 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
377 return static_cast<Error>(status.getServiceSpecificError());
378 }
379
380 *outDisplay = translate<Display>(virtualDisplay.display);
381 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400382 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700383 return Error::NONE;
384}
385
386Error AidlComposer::destroyVirtualDisplay(Display display) {
387 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
388 if (!status.isOk()) {
389 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
390 return static_cast<Error>(status.getServiceSpecificError());
391 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400392 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700393 return Error::NONE;
394}
395
396Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400397 Error error = Error::NONE;
398 mMutex.lock_shared();
399 if (auto writer = getWriter(display)) {
400 writer->get().acceptDisplayChanges(translate<int64_t>(display));
401 } else {
402 error = Error::BAD_DISPLAY;
403 }
404 mMutex.unlock_shared();
405 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700406}
407
408Error AidlComposer::createLayer(Display display, Layer* outLayer) {
409 int64_t layer;
410 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
411 kMaxLayerBufferCount, &layer);
412 if (!status.isOk()) {
413 ALOGE("createLayer failed %s", status.getDescription().c_str());
414 return static_cast<Error>(status.getServiceSpecificError());
415 }
416
417 *outLayer = translate<Layer>(layer);
418 return Error::NONE;
419}
420
421Error AidlComposer::destroyLayer(Display display, Layer layer) {
422 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
423 translate<int64_t>(layer));
424 if (!status.isOk()) {
425 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
426 return static_cast<Error>(status.getServiceSpecificError());
427 }
428 return Error::NONE;
429}
430
431Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
432 int32_t config;
433 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
434 if (!status.isOk()) {
435 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
436 return static_cast<Error>(status.getServiceSpecificError());
437 }
438 *outConfig = translate<Config>(config);
439 return Error::NONE;
440}
441
442Error AidlComposer::getChangedCompositionTypes(
443 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500444 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400445 std::vector<ChangedCompositionLayer> changedLayers;
446 Error error = Error::NONE;
447 {
448 mMutex.lock_shared();
449 if (auto reader = getReader(display)) {
450 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
451 } else {
452 error = Error::BAD_DISPLAY;
453 }
454 mMutex.unlock_shared();
455 }
Ady Abrahamde792782021-12-20 10:00:49 -0800456 outLayers->reserve(changedLayers.size());
457 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800458
Ady Abrahamde792782021-12-20 10:00:49 -0800459 for (const auto& layer : changedLayers) {
460 outLayers->emplace_back(translate<Layer>(layer.layer));
461 outTypes->emplace_back(layer.composition);
462 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400463 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700464}
465
466Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
467 std::vector<AidlColorMode> modes;
468 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
469 if (!status.isOk()) {
470 ALOGE("getColorModes failed %s", status.getDescription().c_str());
471 return static_cast<Error>(status.getServiceSpecificError());
472 }
473 *outModes = translate<ColorMode>(modes);
474 return Error::NONE;
475}
476
477Error AidlComposer::getDisplayAttribute(Display display, Config config,
478 IComposerClient::Attribute attribute, int32_t* outValue) {
479 const auto status =
480 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
481 translate<int32_t>(config),
482 static_cast<AidlDisplayAttribute>(attribute),
483 outValue);
484 if (!status.isOk()) {
485 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
486 return static_cast<Error>(status.getServiceSpecificError());
487 }
488 return Error::NONE;
489}
490
491Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
492 std::vector<int32_t> configs;
493 const auto status =
494 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
495 if (!status.isOk()) {
496 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
497 return static_cast<Error>(status.getServiceSpecificError());
498 }
499 *outConfigs = translate<Config>(configs);
500 return Error::NONE;
501}
502
ramindani263a3f12023-07-18 20:44:49 -0700503Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700504 std::vector<DisplayConfiguration>* outConfigs) {
505 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700506 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
507 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700508 if (!status.isOk()) {
509 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
510 return static_cast<Error>(status.getServiceSpecificError());
511 }
512
513 return Error::NONE;
514}
515
Ady Abrahame7385f72021-09-05 00:54:25 -0700516Error AidlComposer::getDisplayName(Display display, std::string* outName) {
517 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
518 if (!status.isOk()) {
519 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
520 return static_cast<Error>(status.getServiceSpecificError());
521 }
522 return Error::NONE;
523}
524
525Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
526 std::vector<Layer>* outLayers,
527 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400528 Error error = Error::NONE;
529 DisplayRequest displayRequests;
530 {
531 mMutex.lock_shared();
532 if (auto reader = getReader(display)) {
533 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
534 } else {
535 error = Error::BAD_DISPLAY;
536 }
537 mMutex.unlock_shared();
538 }
Ady Abrahamde792782021-12-20 10:00:49 -0800539 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
540 outLayers->reserve(displayRequests.layerRequests.size());
541 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
542
543 for (const auto& layer : displayRequests.layerRequests) {
544 outLayers->emplace_back(translate<Layer>(layer.layer));
545 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
546 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400547 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700548}
549
550Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800551 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700552 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800553 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700554 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800555 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700556 return static_cast<Error>(status.getServiceSpecificError());
557 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800558 *outSupport = std::find(capabilities.begin(), capabilities.end(),
559 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700560 return Error::NONE;
561}
562
ramindani32cf0602022-03-02 02:30:29 +0000563Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
564 std::vector<AidlDisplayCapability> capabilities;
565 const auto status =
566 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
567 if (!status.isOk()) {
568 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
569 return static_cast<Error>(status.getServiceSpecificError());
570 }
571 *outSupport = std::find(capabilities.begin(), capabilities.end(),
572 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
573 return Error::NONE;
574}
575
Ady Abrahame7385f72021-09-05 00:54:25 -0700576Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
577 float* outMaxLuminance, float* outMaxAverageLuminance,
578 float* outMinLuminance) {
579 AidlHdrCapabilities capabilities;
580 const auto status =
581 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
582 if (!status.isOk()) {
583 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
584 return static_cast<Error>(status.getServiceSpecificError());
585 }
586
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100587 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700588 *outMaxLuminance = capabilities.maxLuminance;
589 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
590 *outMinLuminance = capabilities.minLuminance;
591 return Error::NONE;
592}
593
Sally Qibb866c12022-10-17 11:31:20 -0700594Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
595 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
596 if (!status.isOk()) {
597 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
598 return static_cast<Error>(status.getServiceSpecificError());
599 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700600 return Error::NONE;
601}
602
Ady Abrahame7385f72021-09-05 00:54:25 -0700603Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
604 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400605 Error error = Error::NONE;
606 std::vector<ReleaseFences::Layer> fences;
607 {
608 mMutex.lock_shared();
609 if (auto reader = getReader(display)) {
610 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
611 } else {
612 error = Error::BAD_DISPLAY;
613 }
614 mMutex.unlock_shared();
615 }
Ady Abrahamde792782021-12-20 10:00:49 -0800616 outLayers->reserve(fences.size());
617 outReleaseFences->reserve(fences.size());
618
619 for (auto& fence : fences) {
620 outLayers->emplace_back(translate<Layer>(fence.layer));
621 // take ownership
622 const int fenceOwner = fence.fence.get();
623 *fence.fence.getR() = -1;
624 outReleaseFences->emplace_back(fenceOwner);
625 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400626 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700627}
628
629Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500630 const auto displayId = translate<int64_t>(display);
631 ATRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
632
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400633 Error error = Error::NONE;
634 mMutex.lock_shared();
635 auto writer = getWriter(display);
636 auto reader = getReader(display);
637 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500638 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400639 error = execute(display);
640 } else {
641 error = Error::BAD_DISPLAY;
642 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700643
Ady Abrahame7385f72021-09-05 00:54:25 -0700644 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400645 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700646 return error;
647 }
648
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500649 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400650 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800651 // take ownership
652 *outPresentFence = fence.get();
653 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700654 return Error::NONE;
655}
656
657Error AidlComposer::setActiveConfig(Display display, Config config) {
658 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
659 translate<int32_t>(config));
660 if (!status.isOk()) {
661 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
662 return static_cast<Error>(status.getServiceSpecificError());
663 }
664 return Error::NONE;
665}
666
667Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
668 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000669 const std::vector<IComposerClient::Rect>& damage,
670 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700671 const native_handle_t* handle = nullptr;
672 if (target.get()) {
673 handle = target->getNativeBuffer()->handle;
674 }
675
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400676 Error error = Error::NONE;
677 mMutex.lock_shared();
678 if (auto writer = getWriter(display)) {
679 writer->get()
680 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
681 translate<aidl::android::hardware::graphics::common::Dataspace>(
682 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000683 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400684 } else {
685 error = Error::BAD_DISPLAY;
686 }
687 mMutex.unlock_shared();
688 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700689}
690
691Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
692 const auto status =
693 mAidlComposerClient->setColorMode(translate<int64_t>(display),
694 translate<AidlColorMode>(mode),
695 translate<AidlRenderIntent>(renderIntent));
696 if (!status.isOk()) {
697 ALOGE("setColorMode failed %s", status.getDescription().c_str());
698 return static_cast<Error>(status.getServiceSpecificError());
699 }
700 return Error::NONE;
701}
702
Ady Abrahamdc011a92021-12-21 14:06:44 -0800703Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400704 auto error = Error::NONE;
705 mMutex.lock_shared();
706 if (auto writer = getWriter(display)) {
707 writer->get().setColorTransform(translate<int64_t>(display), matrix);
708 } else {
709 error = Error::BAD_DISPLAY;
710 }
711 mMutex.unlock_shared();
712 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700713}
714
715Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
716 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400717 auto error = Error::NONE;
718 mMutex.lock_shared();
719 if (auto writer = getWriter(display)) {
720 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
721 } else {
722 error = Error::BAD_DISPLAY;
723 }
724 mMutex.unlock_shared();
725 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700726}
727
728Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
729 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
730 translate<PowerMode>(mode));
731 if (!status.isOk()) {
732 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
733 return static_cast<Error>(status.getServiceSpecificError());
734 }
735 return Error::NONE;
736}
737
738Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
739 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
740 const auto status =
741 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
742 if (!status.isOk()) {
743 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
744 return static_cast<Error>(status.getServiceSpecificError());
745 }
746 return Error::NONE;
747}
748
749Error AidlComposer::setClientTargetSlotCount(Display display) {
750 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
751 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
752 bufferSlotCount);
753 if (!status.isOk()) {
754 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
755 return static_cast<Error>(status.getServiceSpecificError());
756 }
757 return Error::NONE;
758}
759
Ady Abraham43065bd2021-12-10 17:22:15 -0800760Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700761 int32_t frameIntervalNs, uint32_t* outNumTypes,
762 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400763 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500764 ATRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
765
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400766 Error error = Error::NONE;
767 mMutex.lock_shared();
768 auto writer = getWriter(display);
769 auto reader = getReader(display);
770 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700771 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
772 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400773 error = execute(display);
774 } else {
775 error = Error::BAD_DISPLAY;
776 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700777
Ady Abrahame7385f72021-09-05 00:54:25 -0700778 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400779 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700780 return error;
781 }
782
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400783 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700784
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400785 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700786 return Error::NONE;
787}
788
Ady Abraham43065bd2021-12-10 17:22:15 -0800789Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700790 int32_t frameIntervalNs, uint32_t* outNumTypes,
791 uint32_t* outNumRequests, int* outPresentFence,
792 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400793 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500794 ATRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
795
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400796 Error error = Error::NONE;
797 mMutex.lock_shared();
798 auto writer = getWriter(display);
799 auto reader = getReader(display);
800 if (writer && reader) {
801 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700802 ClockMonotonicTimestamp{expectedPresentTime},
803 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400804 error = execute(display);
805 } else {
806 error = Error::BAD_DISPLAY;
807 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700808
Ady Abrahame7385f72021-09-05 00:54:25 -0700809 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400810 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700811 return error;
812 }
813
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400814 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800815 if (!result.has_value()) {
816 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400817 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800818 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700819 }
820
Ady Abrahamde792782021-12-20 10:00:49 -0800821 *state = translate<uint32_t>(*result);
822
823 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400824 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800825 // take ownership
826 *outPresentFence = fence.get();
827 *fence.getR() = -1;
828 }
829
830 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400831 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700832 }
833
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400834 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700835 return Error::NONE;
836}
837
838Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400839 Error error = Error::NONE;
840 mMutex.lock_shared();
841 if (auto writer = getWriter(display)) {
842 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
843 x, y);
844 } else {
845 error = Error::BAD_DISPLAY;
846 }
847 mMutex.unlock_shared();
848 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700849}
850
851Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
852 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700853 const native_handle_t* handle = nullptr;
854 if (buffer.get()) {
855 handle = buffer->getNativeBuffer()->handle;
856 }
857
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400858 Error error = Error::NONE;
859 mMutex.lock_shared();
860 if (auto writer = getWriter(display)) {
861 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
862 handle, acquireFence);
863 } else {
864 error = Error::BAD_DISPLAY;
865 }
866 mMutex.unlock_shared();
867 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700868}
869
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700870Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
871 const std::vector<uint32_t>& slotsToClear,
872 uint32_t activeBufferSlot) {
873 if (slotsToClear.empty()) {
874 return Error::NONE;
875 }
876
Brian Lindahl90553da2022-12-06 13:36:30 -0700877 Error error = Error::NONE;
878 mMutex.lock_shared();
879 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700880 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700881 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
882 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600883 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
884 // placeholder buffer, using the slot that needs to cleared... tricky.
885 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700886 for (uint32_t slot : slotsToClear) {
887 // Don't clear the active buffer slot because we need to restore the active buffer
888 // after clearing the requested buffer slots with a placeholder buffer.
889 if (slot != activeBufferSlot) {
890 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
891 translate<int64_t>(layer), slot,
892 mClearSlotBuffer->handle,
893 /*fence*/ -1);
894 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700895 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700896 // Since we clear buffers by setting them to a placeholder buffer, we want to make
897 // sure that the last setLayerBuffer command is sent with the currently active
898 // buffer, not the placeholder buffer, so that there is no perceptual change when
899 // buffers are discarded.
900 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
901 translate<int64_t>(layer), activeBufferSlot,
902 // The active buffer is still cached in
903 // its slot and doesn't need a fence.
904 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700905 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700906 } else {
907 error = Error::BAD_DISPLAY;
908 }
909 mMutex.unlock_shared();
910 return error;
911}
912
Ady Abrahame7385f72021-09-05 00:54:25 -0700913Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
914 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400915 Error error = Error::NONE;
916 mMutex.lock_shared();
917 if (auto writer = getWriter(display)) {
918 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
919 translate<AidlRect>(damage));
920 } else {
921 error = Error::BAD_DISPLAY;
922 }
923 mMutex.unlock_shared();
924 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700925}
926
927Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
928 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400929 Error error = Error::NONE;
930 mMutex.lock_shared();
931 if (auto writer = getWriter(display)) {
932 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
933 translate<BlendMode>(mode));
934 } else {
935 error = Error::BAD_DISPLAY;
936 }
937 mMutex.unlock_shared();
938 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700939}
940
Ady Abraham6e60b142022-01-06 18:10:35 -0800941Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400942 Error error = Error::NONE;
943 mMutex.lock_shared();
944 if (auto writer = getWriter(display)) {
945 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
946 } else {
947 error = Error::BAD_DISPLAY;
948 }
949 mMutex.unlock_shared();
950 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700951}
952
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500953Error AidlComposer::setLayerCompositionType(
954 Display display, Layer layer,
955 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400956 Error error = Error::NONE;
957 mMutex.lock_shared();
958 if (auto writer = getWriter(display)) {
959 writer->get().setLayerCompositionType(translate<int64_t>(display),
960 translate<int64_t>(layer), type);
961 } else {
962 error = Error::BAD_DISPLAY;
963 }
964 mMutex.unlock_shared();
965 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700966}
967
968Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400969 Error error = Error::NONE;
970 mMutex.lock_shared();
971 if (auto writer = getWriter(display)) {
972 writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
973 translate<AidlDataspace>(dataspace));
974 } else {
975 error = Error::BAD_DISPLAY;
976 }
977 mMutex.unlock_shared();
978 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700979}
980
981Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
982 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400983 Error error = Error::NONE;
984 mMutex.lock_shared();
985 if (auto writer = getWriter(display)) {
986 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
987 translate<AidlRect>(frame));
988 } else {
989 error = Error::BAD_DISPLAY;
990 }
991 mMutex.unlock_shared();
992 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700993}
994
995Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400996 Error error = Error::NONE;
997 mMutex.lock_shared();
998 if (auto writer = getWriter(display)) {
999 writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1000 alpha);
1001 } else {
1002 error = Error::BAD_DISPLAY;
1003 }
1004 mMutex.unlock_shared();
1005 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001006}
1007
1008Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
1009 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001010 Error error = Error::NONE;
1011 mMutex.lock_shared();
1012 if (auto writer = getWriter(display)) {
1013 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1014 stream);
1015 } else {
1016 error = Error::BAD_DISPLAY;
1017 }
1018 mMutex.unlock_shared();
1019 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001020}
1021
1022Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1023 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001024 Error error = Error::NONE;
1025 mMutex.lock_shared();
1026 if (auto writer = getWriter(display)) {
1027 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1028 translate<AidlFRect>(crop));
1029 } else {
1030 error = Error::BAD_DISPLAY;
1031 }
1032 mMutex.unlock_shared();
1033 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001034}
1035
1036Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001037 Error error = Error::NONE;
1038 mMutex.lock_shared();
1039 if (auto writer = getWriter(display)) {
1040 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1041 translate<AidlTransform>(transform));
1042 } else {
1043 error = Error::BAD_DISPLAY;
1044 }
1045 mMutex.unlock_shared();
1046 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001047}
1048
1049Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1050 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001051 Error error = Error::NONE;
1052 mMutex.lock_shared();
1053 if (auto writer = getWriter(display)) {
1054 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1055 translate<AidlRect>(visible));
1056 } else {
1057 error = Error::BAD_DISPLAY;
1058 }
1059 mMutex.unlock_shared();
1060 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001061}
1062
1063Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001064 Error error = Error::NONE;
1065 mMutex.lock_shared();
1066 if (auto writer = getWriter(display)) {
1067 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1068 } else {
1069 error = Error::BAD_DISPLAY;
1070 }
1071 mMutex.unlock_shared();
1072 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001073}
1074
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001075Error AidlComposer::execute(Display display) {
1076 auto writer = getWriter(display);
1077 auto reader = getReader(display);
1078 if (!writer || !reader) {
1079 return Error::BAD_DISPLAY;
1080 }
1081
Huihong Luoe7382c12023-04-21 20:24:32 +00001082 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001083 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001084 return Error::NONE;
1085 }
1086
Ady Abrahamde792782021-12-20 10:00:49 -08001087 { // scope for results
1088 std::vector<CommandResultPayload> results;
1089 auto status = mAidlComposerClient->executeCommands(commands, &results);
1090 if (!status.isOk()) {
1091 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1092 return static_cast<Error>(status.getServiceSpecificError());
1093 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001094
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001095 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001096 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001097 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001098 Error error = Error::NONE;
1099 for (const auto& cmdErr : commandErrors) {
1100 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1101 if (index < 0 || index >= commands.size()) {
1102 ALOGE("invalid command index %zu", index);
1103 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001104 }
1105
Ady Abrahama6388c02021-11-11 21:11:51 -08001106 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001107 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1108 error = translate<Error>(cmdErr.errorCode);
1109 } else {
1110 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1111 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001112 }
1113 }
1114
Ady Abrahame7385f72021-09-05 00:54:25 -07001115 return error;
1116}
1117
1118Error AidlComposer::setLayerPerFrameMetadata(
1119 Display display, Layer layer,
1120 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001121 Error error = Error::NONE;
1122 mMutex.lock_shared();
1123 if (auto writer = getWriter(display)) {
1124 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1125 translate<int64_t>(layer),
1126 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1127 } else {
1128 error = Error::BAD_DISPLAY;
1129 }
1130 mMutex.unlock_shared();
1131 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001132}
1133
1134std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1135 Display display) {
1136 std::vector<AidlPerFrameMetadataKey> keys;
1137 const auto status =
1138 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1139 if (!status.isOk()) {
1140 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1141 return {};
1142 }
1143 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1144}
1145
1146Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1147 std::vector<RenderIntent>* outRenderIntents) {
1148 std::vector<AidlRenderIntent> renderIntents;
1149 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1150 translate<AidlColorMode>(colorMode),
1151 &renderIntents);
1152 if (!status.isOk()) {
1153 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1154 return static_cast<Error>(status.getServiceSpecificError());
1155 }
1156 *outRenderIntents = translate<RenderIntent>(renderIntents);
1157 return Error::NONE;
1158}
1159
1160Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1161 std::vector<float> matrix;
1162 const auto status =
1163 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1164 &matrix);
1165 if (!status.isOk()) {
1166 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1167 return static_cast<Error>(status.getServiceSpecificError());
1168 }
1169 *outMatrix = makeMat4(matrix);
1170 return Error::NONE;
1171}
1172
1173Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1174 std::vector<uint8_t>* outData) {
1175 AidlDisplayIdentification displayIdentification;
1176 const auto status =
1177 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1178 &displayIdentification);
1179 if (!status.isOk()) {
1180 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1181 return static_cast<Error>(status.getServiceSpecificError());
1182 }
1183
1184 *outPort = static_cast<uint8_t>(displayIdentification.port);
1185 *outData = displayIdentification.data;
1186
1187 return Error::NONE;
1188}
1189
1190Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001191 Error error = Error::NONE;
1192 mMutex.lock_shared();
1193 if (auto writer = getWriter(display)) {
1194 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1195 matrix);
1196 } else {
1197 error = Error::BAD_DISPLAY;
1198 }
1199 mMutex.unlock_shared();
1200 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001201}
1202
1203Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1204 Dataspace* outDataspace,
1205 uint8_t* outComponentMask) {
1206 if (!outFormat || !outDataspace || !outComponentMask) {
1207 return Error::BAD_PARAMETER;
1208 }
1209
1210 AidlDisplayContentSamplingAttributes attributes;
1211 const auto status =
1212 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1213 &attributes);
1214 if (!status.isOk()) {
1215 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1216 return static_cast<Error>(status.getServiceSpecificError());
1217 }
1218
1219 *outFormat = translate<PixelFormat>(attributes.format);
1220 *outDataspace = translate<Dataspace>(attributes.dataspace);
1221 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1222 return Error::NONE;
1223}
1224
1225Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1226 uint8_t componentMask, uint64_t maxFrames) {
1227 const auto status =
1228 mAidlComposerClient
1229 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1230 static_cast<AidlFormatColorComponent>(
1231 componentMask),
1232 static_cast<int64_t>(maxFrames));
1233 if (!status.isOk()) {
1234 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1235 return static_cast<Error>(status.getServiceSpecificError());
1236 }
1237 return Error::NONE;
1238}
1239
1240Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1241 uint64_t timestamp, DisplayedFrameStats* outStats) {
1242 if (!outStats) {
1243 return Error::BAD_PARAMETER;
1244 }
1245
1246 AidlDisplayContentSample sample;
1247 const auto status =
1248 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1249 static_cast<int64_t>(maxFrames),
1250 static_cast<int64_t>(timestamp),
1251 &sample);
1252 if (!status.isOk()) {
1253 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1254 return static_cast<Error>(status.getServiceSpecificError());
1255 }
1256 *outStats = translate<DisplayedFrameStats>(sample);
1257 return Error::NONE;
1258}
1259
1260Error AidlComposer::setLayerPerFrameMetadataBlobs(
1261 Display display, Layer layer,
1262 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001263 Error error = Error::NONE;
1264 mMutex.lock_shared();
1265 if (auto writer = getWriter(display)) {
1266 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1267 translate<int64_t>(layer),
1268 translate<AidlPerFrameMetadataBlob>(metadata));
1269 } else {
1270 error = Error::BAD_DISPLAY;
1271 }
1272 mMutex.unlock_shared();
1273 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001274}
1275
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001276Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001277 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001278 Error error = Error::NONE;
1279 mMutex.lock_shared();
1280 if (auto writer = getWriter(display)) {
1281 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001282
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001283 if (options.applyImmediately) {
1284 error = execute(display);
1285 mMutex.unlock_shared();
1286 return error;
1287 }
1288 } else {
1289 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001290 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001291 mMutex.unlock_shared();
1292 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001293}
1294
1295Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001296 std::vector<AidlDisplayCapability>* outCapabilities) {
1297 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1298 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001299 if (!status.isOk()) {
1300 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001301 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001302 return static_cast<Error>(status.getServiceSpecificError());
1303 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001304 return Error::NONE;
1305}
1306
1307V2_4::Error AidlComposer::getDisplayConnectionType(
1308 Display display, IComposerClient::DisplayConnectionType* outType) {
1309 AidlDisplayConnectionType type;
1310 const auto status =
1311 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1312 if (!status.isOk()) {
1313 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1314 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1315 }
1316 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1317 return V2_4::Error::NONE;
1318}
1319
1320V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1321 int32_t vsyncPeriod;
1322 const auto status =
1323 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1324 if (!status.isOk()) {
1325 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1326 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1327 }
1328 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1329 return V2_4::Error::NONE;
1330}
1331
1332V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1333 Display display, Config config,
1334 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1335 VsyncPeriodChangeTimeline* outTimeline) {
1336 AidlVsyncPeriodChangeTimeline timeline;
1337 const auto status =
1338 mAidlComposerClient
1339 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1340 translate<int32_t>(config),
1341 translate<AidlVsyncPeriodChangeConstraints>(
1342 vsyncPeriodChangeConstraints),
1343 &timeline);
1344 if (!status.isOk()) {
1345 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1346 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1347 }
1348 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1349 return V2_4::Error::NONE;
1350}
1351
1352V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1353 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1354 if (!status.isOk()) {
1355 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1356 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1357 }
1358 return V2_4::Error::NONE;
1359}
1360
1361V2_4::Error AidlComposer::getSupportedContentTypes(
1362 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1363 std::vector<AidlContentType> types;
1364 const auto status =
1365 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1366 if (!status.isOk()) {
1367 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1368 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1369 }
1370 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1371 return V2_4::Error::NONE;
1372}
1373
1374V2_4::Error AidlComposer::setContentType(Display display,
1375 IComposerClient::ContentType contentType) {
1376 const auto status =
1377 mAidlComposerClient->setContentType(translate<int64_t>(display),
1378 translate<AidlContentType>(contentType));
1379 if (!status.isOk()) {
1380 ALOGE("setContentType failed %s", status.getDescription().c_str());
1381 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1382 }
1383 return V2_4::Error::NONE;
1384}
1385
Ady Abraham3f976752021-12-20 16:17:50 -08001386V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1387 const std::vector<uint8_t>&) {
1388 // There are no users for this API. See b/209691612.
1389 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001390}
1391
1392V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001393 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1394 // There are no users for this API. See b/209691612.
1395 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001396}
1397
Kriti Dang7defaf32021-11-15 11:55:43 +01001398Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1399 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1400 translate<int32_t>(config));
1401 if (!status.isOk()) {
1402 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1403 return static_cast<Error>(status.getServiceSpecificError());
1404 }
1405 return Error::NONE;
1406}
1407
1408Error AidlComposer::clearBootDisplayConfig(Display display) {
1409 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1410 if (!status.isOk()) {
1411 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1412 return static_cast<Error>(status.getServiceSpecificError());
1413 }
1414 return Error::NONE;
1415}
1416
1417Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1418 int32_t displayConfig;
1419 const auto status =
1420 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1421 &displayConfig);
1422 if (!status.isOk()) {
1423 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1424 return static_cast<Error>(status.getServiceSpecificError());
1425 }
1426 *config = translate<uint32_t>(displayConfig);
1427 return Error::NONE;
1428}
1429
Kriti Dang674b9372022-11-18 10:58:44 +01001430Error AidlComposer::getHdrConversionCapabilities(
1431 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1432 const auto status =
1433 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1434 if (!status.isOk()) {
1435 hdrConversionCapabilities = {};
1436 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1437 return static_cast<Error>(status.getServiceSpecificError());
1438 }
1439 return Error::NONE;
1440}
1441
Kriti Dangd432bb52023-02-09 18:21:04 +01001442Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1443 Hdr* outPreferredHdrOutputType) {
1444 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1445 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001446 if (!status.isOk()) {
1447 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1448 return static_cast<Error>(status.getServiceSpecificError());
1449 }
1450 return Error::NONE;
1451}
1452
ramindanib2158ee2023-02-13 20:29:59 -08001453Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1454 const auto status =
1455 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1456 displayId),
1457 enabled);
1458 if (!status.isOk()) {
1459 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1460 status.getDescription().c_str());
1461 return static_cast<Error>(status.getServiceSpecificError());
1462 }
1463 return Error::NONE;
1464}
1465
ramindani3acaaf52023-09-25 10:31:27 -07001466Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1467 int32_t frameIntervalNs) {
1468 const auto status =
1469 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1470 ClockMonotonicTimestamp{expectedPresentTime},
1471 frameIntervalNs);
1472
1473 if (!status.isOk()) {
1474 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1475 return static_cast<Error>(status.getServiceSpecificError());
1476 }
1477 return Error::NONE;
1478}
1479
Ady Abrahame7385f72021-09-05 00:54:25 -07001480Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001481 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001482 Error error = Error::NONE;
1483 mMutex.lock_shared();
1484 if (auto reader = getReader(display)) {
1485 *outClientTargetProperty =
1486 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1487 } else {
1488 error = Error::BAD_DISPLAY;
1489 }
1490 mMutex.unlock_shared();
1491 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001492}
1493
Alec Mouri6da0e272022-02-07 12:45:57 -08001494Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001495 Error error = Error::NONE;
1496 mMutex.lock_shared();
1497 if (auto writer = getWriter(display)) {
1498 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1499 brightness);
1500 } else {
1501 error = Error::BAD_DISPLAY;
1502 }
1503 mMutex.unlock_shared();
1504 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001505}
1506
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001507Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1508 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001509 Error error = Error::NONE;
1510 mMutex.lock_shared();
1511 if (auto writer = getWriter(display)) {
1512 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1513 translate<AidlRect>(blocking));
1514 } else {
1515 error = Error::BAD_DISPLAY;
1516 }
1517 mMutex.unlock_shared();
1518 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001519}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001520
1521Error AidlComposer::getDisplayDecorationSupport(Display display,
1522 std::optional<DisplayDecorationSupport>* support) {
1523 const auto status =
1524 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1525 if (!status.isOk()) {
1526 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1527 support->reset();
1528 return static_cast<Error>(status.getServiceSpecificError());
1529 }
1530 return Error::NONE;
1531}
ramindani32cf0602022-03-02 02:30:29 +00001532
1533Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1534 const auto status =
1535 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1536 translate<int32_t>(timeout.count()));
1537 if (!status.isOk()) {
1538 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1539 return static_cast<Error>(status.getServiceSpecificError());
1540 }
1541 return Error::NONE;
1542}
1543
ramindani06e518e2022-03-14 18:47:53 +00001544Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1545 AidlTransform* outDisplayOrientation) {
1546 const auto status =
1547 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1548 outDisplayOrientation);
1549 if (!status.isOk()) {
1550 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1551 return static_cast<Error>(status.getServiceSpecificError());
1552 }
1553 return Error::NONE;
1554}
1555
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001556ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1557 REQUIRES_SHARED(mMutex) {
1558 return mWriters.get(display);
1559}
1560
1561ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1562 REQUIRES_SHARED(mMutex) {
1563 if (mSingleReader) {
1564 display = translate<Display>(kSingleReaderKey);
1565 }
1566 return mReaders.get(display);
1567}
1568
1569void AidlComposer::removeDisplay(Display display) {
1570 mMutex.lock();
1571 bool wasErased = mWriters.erase(display);
1572 ALOGW_IF(!wasErased,
1573 "Attempting to remove writer for display %" PRId64 " which is not connected",
1574 translate<int64_t>(display));
1575 if (!mSingleReader) {
1576 removeReader(display);
1577 }
1578 mMutex.unlock();
1579}
1580
1581void AidlComposer::onHotplugDisconnect(Display display) {
1582 removeDisplay(display);
1583}
1584
1585bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001586 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001587 const auto displayId = translate<int64_t>(display);
1588 std::vector<AidlDisplayCapability> capabilities;
1589 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1590 if (!status.isOk()) {
1591 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1592 return false;
1593 }
1594 return std::find(capabilities.begin(), capabilities.end(),
1595 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1596}
1597
1598void AidlComposer::addReader(Display display) {
1599 const auto displayId = translate<int64_t>(display);
1600 std::optional<int64_t> displayOpt;
1601 if (displayId != kSingleReaderKey) {
1602 displayOpt.emplace(displayId);
1603 }
1604 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1605 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1606 displayId);
1607}
1608
1609void AidlComposer::removeReader(Display display) {
1610 bool wasErased = mReaders.erase(display);
1611 ALOGW_IF(!wasErased,
1612 "Attempting to remove reader for display %" PRId64 " which is not connected",
1613 translate<int64_t>(display));
1614}
1615
1616void AidlComposer::addDisplay(Display display) {
1617 const auto displayId = translate<int64_t>(display);
1618 mMutex.lock();
1619 auto [it, added] = mWriters.try_emplace(display, displayId);
1620 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1621 displayId);
1622 if (mSingleReader) {
1623 if (hasMultiThreadedPresentSupport(display)) {
1624 mSingleReader = false;
1625 removeReader(translate<Display>(kSingleReaderKey));
1626 // Note that this includes the new display.
1627 for (const auto& [existingDisplay, _] : mWriters) {
1628 addReader(existingDisplay);
1629 }
1630 }
1631 } else {
1632 addReader(display);
1633 }
1634 mMutex.unlock();
1635}
1636
1637void AidlComposer::onHotplugConnect(Display display) {
1638 addDisplay(display);
1639}
Ady Abrahame7385f72021-09-05 00:54:25 -07001640} // namespace Hwc2
1641} // namespace android