blob: d50a0bcec10ddfd1e8da8c4386bb404971aa11a4 [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>
Vishnu Nairbe0ad902024-06-27 23:38:43 +000028#include <common/trace.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070029#include <log/log.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070030
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;
Huihong Luo791bef92023-09-19 21:18:45 -070080using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Ady Abrahame7385f72021-09-05 00:54:25 -070081using AidlFRect = aidl::android::hardware::graphics::common::FRect;
82using AidlRect = aidl::android::hardware::graphics::common::Rect;
83using AidlTransform = aidl::android::hardware::graphics::common::Transform;
84
85namespace Hwc2 {
86
87namespace {
88
89template <typename To, typename From>
90To translate(From x) {
91 return static_cast<To>(x);
92}
93
94template <typename To, typename From>
95std::vector<To> translate(const std::vector<From>& in) {
96 std::vector<To> out;
97 out.reserve(in.size());
98 std::transform(in.begin(), in.end(), std::back_inserter(out),
99 [](From x) { return translate<To>(x); });
100 return out;
101}
102
103template <>
104AidlRect translate(IComposerClient::Rect x) {
105 return AidlRect{
106 .left = x.left,
107 .top = x.top,
108 .right = x.right,
109 .bottom = x.bottom,
110 };
111}
112
113template <>
114AidlFRect translate(IComposerClient::FRect x) {
115 return AidlFRect{
116 .left = x.left,
117 .top = x.top,
118 .right = x.right,
119 .bottom = x.bottom,
120 };
121}
122
123template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700124AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
125 AidlPerFrameMetadataBlob blob;
126 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800127 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700128 return blob;
129}
130
131template <>
132AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
133 return AidlPerFrameMetadata{
134 .key = translate<AidlPerFrameMetadataKey>(x.key),
135 .value = x.value,
136 };
137}
138
139template <>
140DisplayedFrameStats translate(AidlDisplayContentSample x) {
141 return DisplayedFrameStats{
142 .numFrames = static_cast<uint64_t>(x.frameCount),
143 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
144 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
145 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
146 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
147 };
148}
149
150template <>
151AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
152 return AidlVsyncPeriodChangeConstraints{
153 .desiredTimeNanos = x.desiredTimeNanos,
154 .seamlessRequired = x.seamlessRequired,
155 };
156}
157
158template <>
159VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
160 return VsyncPeriodChangeTimeline{
161 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
162 .refreshRequired = x.refreshRequired,
163 .refreshTimeNanos = x.refreshTimeNanos,
164 };
165}
Ady Abrahame7385f72021-09-05 00:54:25 -0700166mat4 makeMat4(std::vector<float> in) {
167 return mat4(static_cast<const float*>(in.data()));
168}
169
170} // namespace
171
172class AidlIComposerCallbackWrapper : public BnComposerCallback {
173public:
Yichi Chen3401b562022-01-17 15:42:35 +0800174 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700175
176 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
Huihong Luo791bef92023-09-19 21:18:45 -0700177 const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
178 : AidlDisplayHotplugEvent::DISCONNECTED;
179 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
Ady Abrahame7385f72021-09-05 00:54:25 -0700180 return ::ndk::ScopedAStatus::ok();
181 }
182
183 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800184 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700185 return ::ndk::ScopedAStatus::ok();
186 }
Yichi Chen3401b562022-01-17 15:42:35 +0800187
Ady Abrahame7385f72021-09-05 00:54:25 -0700188 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800189 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700190 return ::ndk::ScopedAStatus::ok();
191 }
Yichi Chen3401b562022-01-17 15:42:35 +0800192
Ady Abrahame7385f72021-09-05 00:54:25 -0700193 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
194 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800195 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
196 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700197 return ::ndk::ScopedAStatus::ok();
198 }
Yichi Chen3401b562022-01-17 15:42:35 +0800199
Ady Abrahame7385f72021-09-05 00:54:25 -0700200 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
201 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800202 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
203 translate<V2_4::VsyncPeriodChangeTimeline>(
204 in_updatedTimeline));
205 return ::ndk::ScopedAStatus::ok();
206 }
207
208 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
209 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700210 return ::ndk::ScopedAStatus::ok();
211 }
212
ramindani12bfe6b2023-02-03 13:29:19 -0800213 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
214 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
215 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
216 return ::ndk::ScopedAStatus::ok();
217 }
218
Huihong Luo791bef92023-09-19 21:18:45 -0700219 ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
220 AidlDisplayHotplugEvent event) override {
221 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
222 return ::ndk::ScopedAStatus::ok();
223 }
224
Ady Abrahame7385f72021-09-05 00:54:25 -0700225private:
Yichi Chen3401b562022-01-17 15:42:35 +0800226 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700227};
228
Ady Abraham9fc28052021-10-14 17:21:38 -0700229std::string AidlComposer::instance(const std::string& serviceName) {
230 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
231}
232
233bool AidlComposer::isDeclared(const std::string& serviceName) {
234 return AServiceManager_isDeclared(instance(serviceName).c_str());
235}
Ady Abrahame7385f72021-09-05 00:54:25 -0700236
Ady Abrahama6388c02021-11-11 21:11:51 -0800237AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700238 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700239 mAidlComposer = AidlIComposer::fromBinder(
240 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700241 if (!mAidlComposer) {
242 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
243 return;
244 }
245
246 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
247 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
248 return;
249 }
250
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400251 addReader(translate<Display>(kSingleReaderKey));
252
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700253 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700254 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700255 if (!status.isOk()) {
256 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
257 status.getDescription().c_str());
258 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700259
260 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600261 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
262 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
263 GraphicBuffer::USAGE_HW_COMPOSER |
264 GraphicBuffer::USAGE_SW_READ_OFTEN |
265 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
266 "AidlComposer");
267 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
268 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
269 return;
270 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700271 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700272 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000273 if (getLayerLifecycleBatchCommand()) {
274 mEnableLayerCommandBatchingFlag =
275 FlagManager::getInstance().enable_layer_command_batching();
276 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700277 ALOGI("Loaded AIDL composer3 HAL service");
278}
279
280AidlComposer::~AidlComposer() = default;
281
Ady Abraham4d211cf2021-12-14 16:19:03 -0800282bool AidlComposer::isSupported(OptionalFeature feature) const {
283 switch (feature) {
284 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800285 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800286 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000287 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000288 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800289 return true;
290 }
291}
292
ramindani19919ff2023-12-07 11:27:06 -0800293bool AidlComposer::isVrrSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800294 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700295}
296
Ady Abrahamde549d42022-01-26 19:19:17 -0800297std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700298 std::vector<Capability> capabilities;
299 const auto status = mAidlComposer->getCapabilities(&capabilities);
300 if (!status.isOk()) {
301 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
302 return {};
303 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800304 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700305}
306
307std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800308 int pipefds[2];
309 int result = pipe(pipefds);
310 if (result < 0) {
311 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700312 return {};
313 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800314
315 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800316 // Use other thread to read pipe to prevent
317 // pipe is full, making HWC be blocked in writing.
318 std::thread t([&]() {
319 base::ReadFdToString(pipefds[0], &str);
320 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800321 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
322 // Close the write-end of the pipe to make sure that when reading from the
323 // read-end we will get eof instead of blocking forever
324 close(pipefds[1]);
325
yihsing.shen58847c52022-09-23 15:39:30 +0800326 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800327 ALOGE("dumpDebugInfo: dump failed: %d", status);
328 }
329
yihsing.shen58847c52022-09-23 15:39:30 +0800330 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800331 close(pipefds[0]);
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800332
333 std::string hash;
334 mAidlComposer->getInterfaceHash(&hash);
335 return std::string(mAidlComposer->descriptor) +
336 " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700337}
338
Yichi Chen3401b562022-01-17 15:42:35 +0800339void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700340 if (mAidlComposerCallback) {
341 ALOGE("Callback already registered");
342 }
Yichi Chen3401b562022-01-17 15:42:35 +0800343
Ady Abraham9fc28052021-10-14 17:21:38 -0700344 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
shuide chenf1111e12024-01-03 18:41:38 +0800345
346 ndk::SpAIBinder binder = mAidlComposerCallback->asBinder();
347 AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_FIFO, 2);
Ady Abrahame7385f72021-09-05 00:54:25 -0700348
349 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
350 if (!status.isOk()) {
351 ALOGE("registerCallback failed %s", status.getDescription().c_str());
352 }
353}
354
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400355Error AidlComposer::executeCommands(Display display) {
356 mMutex.lock_shared();
357 auto error = execute(display);
358 mMutex.unlock_shared();
359 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700360}
361
362uint32_t AidlComposer::getMaxVirtualDisplayCount() {
363 int32_t count = 0;
364 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
365 if (!status.isOk()) {
366 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
367 return 0;
368 }
369 return static_cast<uint32_t>(count);
370}
371
372Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
373 Display* outDisplay) {
374 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
375 const int32_t bufferSlotCount = 1;
376 VirtualDisplay virtualDisplay;
377 const auto status =
378 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
379 static_cast<int32_t>(height),
380 static_cast<AidlPixelFormat>(*format),
381 bufferSlotCount, &virtualDisplay);
382
383 if (!status.isOk()) {
384 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
385 return static_cast<Error>(status.getServiceSpecificError());
386 }
387
388 *outDisplay = translate<Display>(virtualDisplay.display);
389 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400390 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700391 return Error::NONE;
392}
393
394Error AidlComposer::destroyVirtualDisplay(Display display) {
395 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
396 if (!status.isOk()) {
397 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
398 return static_cast<Error>(status.getServiceSpecificError());
399 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400400 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700401 return Error::NONE;
402}
403
404Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400405 Error error = Error::NONE;
406 mMutex.lock_shared();
407 if (auto writer = getWriter(display)) {
408 writer->get().acceptDisplayChanges(translate<int64_t>(display));
409 } else {
410 error = Error::BAD_DISPLAY;
411 }
412 mMutex.unlock_shared();
413 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700414}
415
416Error AidlComposer::createLayer(Display display, Layer* outLayer) {
417 int64_t layer;
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000418 Error error = Error::NONE;
419 if (!mEnableLayerCommandBatchingFlag) {
420 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
421 kMaxLayerBufferCount, &layer);
422 if (!status.isOk()) {
423 ALOGE("createLayer failed %s", status.getDescription().c_str());
424 return static_cast<Error>(status.getServiceSpecificError());
425 }
426 } else {
427 // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
428 // Add this as a new displayCommand in execute command.
429 // return the SF generated layerID instead of calling HWC
430 layer = mLayerID++;
431 mMutex.lock_shared();
432 if (auto writer = getWriter(display)) {
433 writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
434 translate<int64_t>(layer),
435 LayerLifecycleBatchCommandType::CREATE);
436 writer->get().setNewBufferSlotCount(translate<int64_t>(display),
437 translate<int64_t>(layer), kMaxLayerBufferCount);
438 } else {
439 error = Error::BAD_DISPLAY;
440 }
441 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700442 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700443 *outLayer = translate<Layer>(layer);
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000444 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700445}
446
447Error AidlComposer::destroyLayer(Display display, Layer layer) {
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000448 Error error = Error::NONE;
449 if (!mEnableLayerCommandBatchingFlag) {
450 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
451 translate<int64_t>(layer));
452 if (!status.isOk()) {
453 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
454 return static_cast<Error>(status.getServiceSpecificError());
455 }
456 } else {
457 mMutex.lock_shared();
458 if (auto writer = getWriter(display)) {
459 writer->get()
460 .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
461 translate<int64_t>(layer),
462 LayerLifecycleBatchCommandType::DESTROY);
463 } else {
464 error = Error::BAD_DISPLAY;
465 }
466 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700467 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000468
469 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700470}
471
472Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
473 int32_t config;
474 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
475 if (!status.isOk()) {
476 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
477 return static_cast<Error>(status.getServiceSpecificError());
478 }
479 *outConfig = translate<Config>(config);
480 return Error::NONE;
481}
482
483Error AidlComposer::getChangedCompositionTypes(
484 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500485 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400486 std::vector<ChangedCompositionLayer> changedLayers;
487 Error error = Error::NONE;
488 {
489 mMutex.lock_shared();
490 if (auto reader = getReader(display)) {
491 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
492 } else {
493 error = Error::BAD_DISPLAY;
494 }
495 mMutex.unlock_shared();
496 }
Ady Abrahamde792782021-12-20 10:00:49 -0800497 outLayers->reserve(changedLayers.size());
498 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800499
Ady Abrahamde792782021-12-20 10:00:49 -0800500 for (const auto& layer : changedLayers) {
501 outLayers->emplace_back(translate<Layer>(layer.layer));
502 outTypes->emplace_back(layer.composition);
503 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400504 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700505}
506
507Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
508 std::vector<AidlColorMode> modes;
509 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
510 if (!status.isOk()) {
511 ALOGE("getColorModes failed %s", status.getDescription().c_str());
512 return static_cast<Error>(status.getServiceSpecificError());
513 }
514 *outModes = translate<ColorMode>(modes);
515 return Error::NONE;
516}
517
518Error AidlComposer::getDisplayAttribute(Display display, Config config,
519 IComposerClient::Attribute attribute, int32_t* outValue) {
520 const auto status =
521 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
522 translate<int32_t>(config),
523 static_cast<AidlDisplayAttribute>(attribute),
524 outValue);
525 if (!status.isOk()) {
526 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
527 return static_cast<Error>(status.getServiceSpecificError());
528 }
529 return Error::NONE;
530}
531
532Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
533 std::vector<int32_t> configs;
534 const auto status =
535 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
536 if (!status.isOk()) {
537 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
538 return static_cast<Error>(status.getServiceSpecificError());
539 }
540 *outConfigs = translate<Config>(configs);
541 return Error::NONE;
542}
543
ramindani263a3f12023-07-18 20:44:49 -0700544Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700545 std::vector<DisplayConfiguration>* outConfigs) {
546 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700547 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
548 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700549 if (!status.isOk()) {
550 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
551 return static_cast<Error>(status.getServiceSpecificError());
552 }
553
554 return Error::NONE;
555}
556
Ady Abrahame7385f72021-09-05 00:54:25 -0700557Error AidlComposer::getDisplayName(Display display, std::string* outName) {
558 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
559 if (!status.isOk()) {
560 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
561 return static_cast<Error>(status.getServiceSpecificError());
562 }
563 return Error::NONE;
564}
565
566Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
567 std::vector<Layer>* outLayers,
568 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400569 Error error = Error::NONE;
570 DisplayRequest displayRequests;
571 {
572 mMutex.lock_shared();
573 if (auto reader = getReader(display)) {
574 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
575 } else {
576 error = Error::BAD_DISPLAY;
577 }
578 mMutex.unlock_shared();
579 }
Ady Abrahamde792782021-12-20 10:00:49 -0800580 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
581 outLayers->reserve(displayRequests.layerRequests.size());
582 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
583
584 for (const auto& layer : displayRequests.layerRequests) {
585 outLayers->emplace_back(translate<Layer>(layer.layer));
586 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
587 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400588 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700589}
590
591Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800592 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700593 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800594 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700595 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800596 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700597 return static_cast<Error>(status.getServiceSpecificError());
598 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800599 *outSupport = std::find(capabilities.begin(), capabilities.end(),
600 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700601 return Error::NONE;
602}
603
ramindani32cf0602022-03-02 02:30:29 +0000604Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
605 std::vector<AidlDisplayCapability> capabilities;
606 const auto status =
607 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
608 if (!status.isOk()) {
609 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
610 return static_cast<Error>(status.getServiceSpecificError());
611 }
612 *outSupport = std::find(capabilities.begin(), capabilities.end(),
613 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
614 return Error::NONE;
615}
616
Ady Abrahame7385f72021-09-05 00:54:25 -0700617Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
618 float* outMaxLuminance, float* outMaxAverageLuminance,
619 float* outMinLuminance) {
620 AidlHdrCapabilities capabilities;
621 const auto status =
622 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
623 if (!status.isOk()) {
624 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
625 return static_cast<Error>(status.getServiceSpecificError());
626 }
627
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100628 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700629 *outMaxLuminance = capabilities.maxLuminance;
630 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
631 *outMinLuminance = capabilities.minLuminance;
632 return Error::NONE;
633}
634
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000635bool AidlComposer::getLayerLifecycleBatchCommand() {
636 std::vector<Capability> capabilities = getCapabilities();
637 bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
638 Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
639 return hasCapability;
640}
641
Sally Qibb866c12022-10-17 11:31:20 -0700642Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
643 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
644 if (!status.isOk()) {
645 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
646 return static_cast<Error>(status.getServiceSpecificError());
647 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700648 return Error::NONE;
649}
650
Ady Abrahame7385f72021-09-05 00:54:25 -0700651Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
652 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400653 Error error = Error::NONE;
654 std::vector<ReleaseFences::Layer> fences;
655 {
656 mMutex.lock_shared();
657 if (auto reader = getReader(display)) {
658 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
659 } else {
660 error = Error::BAD_DISPLAY;
661 }
662 mMutex.unlock_shared();
663 }
Ady Abrahamde792782021-12-20 10:00:49 -0800664 outLayers->reserve(fences.size());
665 outReleaseFences->reserve(fences.size());
666
667 for (auto& fence : fences) {
668 outLayers->emplace_back(translate<Layer>(fence.layer));
669 // take ownership
670 const int fenceOwner = fence.fence.get();
671 *fence.fence.getR() = -1;
672 outReleaseFences->emplace_back(fenceOwner);
673 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400674 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700675}
676
677Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500678 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000679 SFTRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500680
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400681 Error error = Error::NONE;
682 mMutex.lock_shared();
683 auto writer = getWriter(display);
684 auto reader = getReader(display);
685 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500686 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400687 error = execute(display);
688 } else {
689 error = Error::BAD_DISPLAY;
690 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700691
Ady Abrahame7385f72021-09-05 00:54:25 -0700692 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400693 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700694 return error;
695 }
696
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500697 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400698 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800699 // take ownership
700 *outPresentFence = fence.get();
701 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700702 return Error::NONE;
703}
704
705Error AidlComposer::setActiveConfig(Display display, Config config) {
706 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
707 translate<int32_t>(config));
708 if (!status.isOk()) {
709 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
710 return static_cast<Error>(status.getServiceSpecificError());
711 }
712 return Error::NONE;
713}
714
715Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
716 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000717 const std::vector<IComposerClient::Rect>& damage,
718 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700719 const native_handle_t* handle = nullptr;
720 if (target.get()) {
721 handle = target->getNativeBuffer()->handle;
722 }
723
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400724 Error error = Error::NONE;
725 mMutex.lock_shared();
726 if (auto writer = getWriter(display)) {
727 writer->get()
728 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
729 translate<aidl::android::hardware::graphics::common::Dataspace>(
730 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000731 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400732 } else {
733 error = Error::BAD_DISPLAY;
734 }
735 mMutex.unlock_shared();
736 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700737}
738
739Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
740 const auto status =
741 mAidlComposerClient->setColorMode(translate<int64_t>(display),
742 translate<AidlColorMode>(mode),
743 translate<AidlRenderIntent>(renderIntent));
744 if (!status.isOk()) {
745 ALOGE("setColorMode failed %s", status.getDescription().c_str());
746 return static_cast<Error>(status.getServiceSpecificError());
747 }
748 return Error::NONE;
749}
750
Ady Abrahamdc011a92021-12-21 14:06:44 -0800751Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400752 auto error = Error::NONE;
753 mMutex.lock_shared();
754 if (auto writer = getWriter(display)) {
755 writer->get().setColorTransform(translate<int64_t>(display), matrix);
756 } else {
757 error = Error::BAD_DISPLAY;
758 }
759 mMutex.unlock_shared();
760 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700761}
762
763Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
764 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400765 auto error = Error::NONE;
766 mMutex.lock_shared();
767 if (auto writer = getWriter(display)) {
768 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
769 } else {
770 error = Error::BAD_DISPLAY;
771 }
772 mMutex.unlock_shared();
773 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700774}
775
776Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
777 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
778 translate<PowerMode>(mode));
779 if (!status.isOk()) {
780 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
781 return static_cast<Error>(status.getServiceSpecificError());
782 }
783 return Error::NONE;
784}
785
786Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
787 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
788 const auto status =
789 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
790 if (!status.isOk()) {
791 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
792 return static_cast<Error>(status.getServiceSpecificError());
793 }
794 return Error::NONE;
795}
796
797Error AidlComposer::setClientTargetSlotCount(Display display) {
798 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
799 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
800 bufferSlotCount);
801 if (!status.isOk()) {
802 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
803 return static_cast<Error>(status.getServiceSpecificError());
804 }
805 return Error::NONE;
806}
807
Ady Abraham43065bd2021-12-10 17:22:15 -0800808Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700809 int32_t frameIntervalNs, uint32_t* outNumTypes,
810 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400811 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000812 SFTRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500813
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400814 Error error = Error::NONE;
815 mMutex.lock_shared();
816 auto writer = getWriter(display);
817 auto reader = getReader(display);
818 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700819 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
820 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400821 error = execute(display);
822 } else {
823 error = Error::BAD_DISPLAY;
824 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700825
Ady Abrahame7385f72021-09-05 00:54:25 -0700826 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400827 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700828 return error;
829 }
830
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400831 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700832
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400833 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700834 return Error::NONE;
835}
836
Ady Abraham43065bd2021-12-10 17:22:15 -0800837Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700838 int32_t frameIntervalNs, uint32_t* outNumTypes,
839 uint32_t* outNumRequests, int* outPresentFence,
840 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400841 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000842 SFTRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500843
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400844 Error error = Error::NONE;
845 mMutex.lock_shared();
846 auto writer = getWriter(display);
847 auto reader = getReader(display);
848 if (writer && reader) {
849 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700850 ClockMonotonicTimestamp{expectedPresentTime},
851 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400852 error = execute(display);
853 } else {
854 error = Error::BAD_DISPLAY;
855 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700856
Ady Abrahame7385f72021-09-05 00:54:25 -0700857 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400858 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700859 return error;
860 }
861
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400862 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800863 if (!result.has_value()) {
864 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400865 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800866 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700867 }
868
Ady Abrahamde792782021-12-20 10:00:49 -0800869 *state = translate<uint32_t>(*result);
870
871 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400872 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800873 // take ownership
874 *outPresentFence = fence.get();
875 *fence.getR() = -1;
876 }
877
878 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400879 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700880 }
881
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400882 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700883 return Error::NONE;
884}
885
886Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400887 Error error = Error::NONE;
888 mMutex.lock_shared();
889 if (auto writer = getWriter(display)) {
890 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
891 x, y);
892 } else {
893 error = Error::BAD_DISPLAY;
894 }
895 mMutex.unlock_shared();
896 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700897}
898
899Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
900 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700901 const native_handle_t* handle = nullptr;
902 if (buffer.get()) {
903 handle = buffer->getNativeBuffer()->handle;
904 }
905
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400906 Error error = Error::NONE;
907 mMutex.lock_shared();
908 if (auto writer = getWriter(display)) {
909 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
910 handle, acquireFence);
911 } else {
912 error = Error::BAD_DISPLAY;
913 }
914 mMutex.unlock_shared();
915 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700916}
917
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700918Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
919 const std::vector<uint32_t>& slotsToClear,
920 uint32_t activeBufferSlot) {
921 if (slotsToClear.empty()) {
922 return Error::NONE;
923 }
924
Brian Lindahl90553da2022-12-06 13:36:30 -0700925 Error error = Error::NONE;
926 mMutex.lock_shared();
927 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700928 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700929 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
930 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600931 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
932 // placeholder buffer, using the slot that needs to cleared... tricky.
933 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700934 for (uint32_t slot : slotsToClear) {
935 // Don't clear the active buffer slot because we need to restore the active buffer
936 // after clearing the requested buffer slots with a placeholder buffer.
937 if (slot != activeBufferSlot) {
938 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
939 translate<int64_t>(layer), slot,
940 mClearSlotBuffer->handle,
941 /*fence*/ -1);
942 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700943 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700944 // Since we clear buffers by setting them to a placeholder buffer, we want to make
945 // sure that the last setLayerBuffer command is sent with the currently active
946 // buffer, not the placeholder buffer, so that there is no perceptual change when
947 // buffers are discarded.
948 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
949 translate<int64_t>(layer), activeBufferSlot,
950 // The active buffer is still cached in
951 // its slot and doesn't need a fence.
952 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700953 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700954 } else {
955 error = Error::BAD_DISPLAY;
956 }
957 mMutex.unlock_shared();
958 return error;
959}
960
Ady Abrahame7385f72021-09-05 00:54:25 -0700961Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
962 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400963 Error error = Error::NONE;
964 mMutex.lock_shared();
965 if (auto writer = getWriter(display)) {
966 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
967 translate<AidlRect>(damage));
968 } else {
969 error = Error::BAD_DISPLAY;
970 }
971 mMutex.unlock_shared();
972 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700973}
974
975Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
976 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400977 Error error = Error::NONE;
978 mMutex.lock_shared();
979 if (auto writer = getWriter(display)) {
980 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
981 translate<BlendMode>(mode));
982 } else {
983 error = Error::BAD_DISPLAY;
984 }
985 mMutex.unlock_shared();
986 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700987}
988
Ady Abraham6e60b142022-01-06 18:10:35 -0800989Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400990 Error error = Error::NONE;
991 mMutex.lock_shared();
992 if (auto writer = getWriter(display)) {
993 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
994 } else {
995 error = Error::BAD_DISPLAY;
996 }
997 mMutex.unlock_shared();
998 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700999}
1000
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001001Error AidlComposer::setLayerCompositionType(
1002 Display display, Layer layer,
1003 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001004 Error error = Error::NONE;
1005 mMutex.lock_shared();
1006 if (auto writer = getWriter(display)) {
1007 writer->get().setLayerCompositionType(translate<int64_t>(display),
1008 translate<int64_t>(layer), type);
1009 } else {
1010 error = Error::BAD_DISPLAY;
1011 }
1012 mMutex.unlock_shared();
1013 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001014}
1015
1016Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001017 Error error = Error::NONE;
1018 mMutex.lock_shared();
1019 if (auto writer = getWriter(display)) {
1020 writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1021 translate<AidlDataspace>(dataspace));
1022 } else {
1023 error = Error::BAD_DISPLAY;
1024 }
1025 mMutex.unlock_shared();
1026 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001027}
1028
1029Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
1030 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001031 Error error = Error::NONE;
1032 mMutex.lock_shared();
1033 if (auto writer = getWriter(display)) {
1034 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1035 translate<AidlRect>(frame));
1036 } else {
1037 error = Error::BAD_DISPLAY;
1038 }
1039 mMutex.unlock_shared();
1040 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001041}
1042
1043Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001044 Error error = Error::NONE;
1045 mMutex.lock_shared();
1046 if (auto writer = getWriter(display)) {
1047 writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1048 alpha);
1049 } else {
1050 error = Error::BAD_DISPLAY;
1051 }
1052 mMutex.unlock_shared();
1053 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001054}
1055
1056Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
1057 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001058 Error error = Error::NONE;
1059 mMutex.lock_shared();
1060 if (auto writer = getWriter(display)) {
1061 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1062 stream);
1063 } else {
1064 error = Error::BAD_DISPLAY;
1065 }
1066 mMutex.unlock_shared();
1067 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001068}
1069
1070Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1071 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001072 Error error = Error::NONE;
1073 mMutex.lock_shared();
1074 if (auto writer = getWriter(display)) {
1075 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1076 translate<AidlFRect>(crop));
1077 } else {
1078 error = Error::BAD_DISPLAY;
1079 }
1080 mMutex.unlock_shared();
1081 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001082}
1083
1084Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001085 Error error = Error::NONE;
1086 mMutex.lock_shared();
1087 if (auto writer = getWriter(display)) {
1088 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1089 translate<AidlTransform>(transform));
1090 } else {
1091 error = Error::BAD_DISPLAY;
1092 }
1093 mMutex.unlock_shared();
1094 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001095}
1096
1097Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1098 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001099 Error error = Error::NONE;
1100 mMutex.lock_shared();
1101 if (auto writer = getWriter(display)) {
1102 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1103 translate<AidlRect>(visible));
1104 } else {
1105 error = Error::BAD_DISPLAY;
1106 }
1107 mMutex.unlock_shared();
1108 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001109}
1110
1111Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001112 Error error = Error::NONE;
1113 mMutex.lock_shared();
1114 if (auto writer = getWriter(display)) {
1115 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1116 } else {
1117 error = Error::BAD_DISPLAY;
1118 }
1119 mMutex.unlock_shared();
1120 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001121}
1122
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001123Error AidlComposer::execute(Display display) {
1124 auto writer = getWriter(display);
1125 auto reader = getReader(display);
1126 if (!writer || !reader) {
1127 return Error::BAD_DISPLAY;
1128 }
1129
Huihong Luoe7382c12023-04-21 20:24:32 +00001130 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001131 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001132 return Error::NONE;
1133 }
1134
Ady Abrahamde792782021-12-20 10:00:49 -08001135 { // scope for results
1136 std::vector<CommandResultPayload> results;
1137 auto status = mAidlComposerClient->executeCommands(commands, &results);
1138 if (!status.isOk()) {
1139 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1140 return static_cast<Error>(status.getServiceSpecificError());
1141 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001142
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001143 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001144 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001145 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001146 Error error = Error::NONE;
1147 for (const auto& cmdErr : commandErrors) {
1148 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1149 if (index < 0 || index >= commands.size()) {
1150 ALOGE("invalid command index %zu", index);
1151 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001152 }
1153
Ady Abrahama6388c02021-11-11 21:11:51 -08001154 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001155 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1156 error = translate<Error>(cmdErr.errorCode);
1157 } else {
1158 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1159 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001160 }
1161 }
1162
Ady Abrahame7385f72021-09-05 00:54:25 -07001163 return error;
1164}
1165
1166Error AidlComposer::setLayerPerFrameMetadata(
1167 Display display, Layer layer,
1168 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001169 Error error = Error::NONE;
1170 mMutex.lock_shared();
1171 if (auto writer = getWriter(display)) {
1172 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1173 translate<int64_t>(layer),
1174 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1175 } else {
1176 error = Error::BAD_DISPLAY;
1177 }
1178 mMutex.unlock_shared();
1179 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001180}
1181
1182std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1183 Display display) {
1184 std::vector<AidlPerFrameMetadataKey> keys;
1185 const auto status =
1186 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1187 if (!status.isOk()) {
1188 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1189 return {};
1190 }
1191 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1192}
1193
1194Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1195 std::vector<RenderIntent>* outRenderIntents) {
1196 std::vector<AidlRenderIntent> renderIntents;
1197 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1198 translate<AidlColorMode>(colorMode),
1199 &renderIntents);
1200 if (!status.isOk()) {
1201 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1202 return static_cast<Error>(status.getServiceSpecificError());
1203 }
1204 *outRenderIntents = translate<RenderIntent>(renderIntents);
1205 return Error::NONE;
1206}
1207
1208Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1209 std::vector<float> matrix;
1210 const auto status =
1211 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1212 &matrix);
1213 if (!status.isOk()) {
1214 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1215 return static_cast<Error>(status.getServiceSpecificError());
1216 }
1217 *outMatrix = makeMat4(matrix);
1218 return Error::NONE;
1219}
1220
1221Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1222 std::vector<uint8_t>* outData) {
1223 AidlDisplayIdentification displayIdentification;
1224 const auto status =
1225 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1226 &displayIdentification);
1227 if (!status.isOk()) {
1228 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1229 return static_cast<Error>(status.getServiceSpecificError());
1230 }
1231
1232 *outPort = static_cast<uint8_t>(displayIdentification.port);
1233 *outData = displayIdentification.data;
1234
1235 return Error::NONE;
1236}
1237
1238Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001239 Error error = Error::NONE;
1240 mMutex.lock_shared();
1241 if (auto writer = getWriter(display)) {
1242 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1243 matrix);
1244 } else {
1245 error = Error::BAD_DISPLAY;
1246 }
1247 mMutex.unlock_shared();
1248 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001249}
1250
1251Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1252 Dataspace* outDataspace,
1253 uint8_t* outComponentMask) {
1254 if (!outFormat || !outDataspace || !outComponentMask) {
1255 return Error::BAD_PARAMETER;
1256 }
1257
1258 AidlDisplayContentSamplingAttributes attributes;
1259 const auto status =
1260 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1261 &attributes);
1262 if (!status.isOk()) {
1263 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1264 return static_cast<Error>(status.getServiceSpecificError());
1265 }
1266
1267 *outFormat = translate<PixelFormat>(attributes.format);
1268 *outDataspace = translate<Dataspace>(attributes.dataspace);
1269 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1270 return Error::NONE;
1271}
1272
1273Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1274 uint8_t componentMask, uint64_t maxFrames) {
1275 const auto status =
1276 mAidlComposerClient
1277 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1278 static_cast<AidlFormatColorComponent>(
1279 componentMask),
1280 static_cast<int64_t>(maxFrames));
1281 if (!status.isOk()) {
1282 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1283 return static_cast<Error>(status.getServiceSpecificError());
1284 }
1285 return Error::NONE;
1286}
1287
1288Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1289 uint64_t timestamp, DisplayedFrameStats* outStats) {
1290 if (!outStats) {
1291 return Error::BAD_PARAMETER;
1292 }
1293
1294 AidlDisplayContentSample sample;
1295 const auto status =
1296 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1297 static_cast<int64_t>(maxFrames),
1298 static_cast<int64_t>(timestamp),
1299 &sample);
1300 if (!status.isOk()) {
1301 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1302 return static_cast<Error>(status.getServiceSpecificError());
1303 }
1304 *outStats = translate<DisplayedFrameStats>(sample);
1305 return Error::NONE;
1306}
1307
1308Error AidlComposer::setLayerPerFrameMetadataBlobs(
1309 Display display, Layer layer,
1310 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001311 Error error = Error::NONE;
1312 mMutex.lock_shared();
1313 if (auto writer = getWriter(display)) {
1314 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1315 translate<int64_t>(layer),
1316 translate<AidlPerFrameMetadataBlob>(metadata));
1317 } else {
1318 error = Error::BAD_DISPLAY;
1319 }
1320 mMutex.unlock_shared();
1321 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001322}
1323
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001324Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001325 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001326 Error error = Error::NONE;
1327 mMutex.lock_shared();
1328 if (auto writer = getWriter(display)) {
1329 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001330
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001331 if (options.applyImmediately) {
1332 error = execute(display);
1333 mMutex.unlock_shared();
1334 return error;
1335 }
1336 } else {
1337 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001338 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001339 mMutex.unlock_shared();
1340 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001341}
1342
1343Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001344 std::vector<AidlDisplayCapability>* outCapabilities) {
1345 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1346 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001347 if (!status.isOk()) {
1348 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001349 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001350 return static_cast<Error>(status.getServiceSpecificError());
1351 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001352 return Error::NONE;
1353}
1354
1355V2_4::Error AidlComposer::getDisplayConnectionType(
1356 Display display, IComposerClient::DisplayConnectionType* outType) {
1357 AidlDisplayConnectionType type;
1358 const auto status =
1359 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1360 if (!status.isOk()) {
1361 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1362 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1363 }
1364 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1365 return V2_4::Error::NONE;
1366}
1367
1368V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1369 int32_t vsyncPeriod;
1370 const auto status =
1371 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1372 if (!status.isOk()) {
1373 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1374 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1375 }
1376 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1377 return V2_4::Error::NONE;
1378}
1379
1380V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1381 Display display, Config config,
1382 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1383 VsyncPeriodChangeTimeline* outTimeline) {
1384 AidlVsyncPeriodChangeTimeline timeline;
1385 const auto status =
1386 mAidlComposerClient
1387 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1388 translate<int32_t>(config),
1389 translate<AidlVsyncPeriodChangeConstraints>(
1390 vsyncPeriodChangeConstraints),
1391 &timeline);
1392 if (!status.isOk()) {
1393 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1394 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1395 }
1396 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1397 return V2_4::Error::NONE;
1398}
1399
1400V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1401 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1402 if (!status.isOk()) {
1403 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1404 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1405 }
1406 return V2_4::Error::NONE;
1407}
1408
1409V2_4::Error AidlComposer::getSupportedContentTypes(
1410 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1411 std::vector<AidlContentType> types;
1412 const auto status =
1413 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1414 if (!status.isOk()) {
1415 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1416 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1417 }
1418 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1419 return V2_4::Error::NONE;
1420}
1421
1422V2_4::Error AidlComposer::setContentType(Display display,
1423 IComposerClient::ContentType contentType) {
1424 const auto status =
1425 mAidlComposerClient->setContentType(translate<int64_t>(display),
1426 translate<AidlContentType>(contentType));
1427 if (!status.isOk()) {
1428 ALOGE("setContentType failed %s", status.getDescription().c_str());
1429 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1430 }
1431 return V2_4::Error::NONE;
1432}
1433
Ady Abraham3f976752021-12-20 16:17:50 -08001434V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1435 const std::vector<uint8_t>&) {
1436 // There are no users for this API. See b/209691612.
1437 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001438}
1439
1440V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001441 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1442 // There are no users for this API. See b/209691612.
1443 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001444}
1445
Kriti Dang7defaf32021-11-15 11:55:43 +01001446Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1447 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1448 translate<int32_t>(config));
1449 if (!status.isOk()) {
1450 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1451 return static_cast<Error>(status.getServiceSpecificError());
1452 }
1453 return Error::NONE;
1454}
1455
1456Error AidlComposer::clearBootDisplayConfig(Display display) {
1457 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1458 if (!status.isOk()) {
1459 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1460 return static_cast<Error>(status.getServiceSpecificError());
1461 }
1462 return Error::NONE;
1463}
1464
1465Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1466 int32_t displayConfig;
1467 const auto status =
1468 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1469 &displayConfig);
1470 if (!status.isOk()) {
1471 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1472 return static_cast<Error>(status.getServiceSpecificError());
1473 }
1474 *config = translate<uint32_t>(displayConfig);
1475 return Error::NONE;
1476}
1477
Kriti Dang674b9372022-11-18 10:58:44 +01001478Error AidlComposer::getHdrConversionCapabilities(
1479 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1480 const auto status =
1481 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1482 if (!status.isOk()) {
1483 hdrConversionCapabilities = {};
1484 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1485 return static_cast<Error>(status.getServiceSpecificError());
1486 }
1487 return Error::NONE;
1488}
1489
Kriti Dangd432bb52023-02-09 18:21:04 +01001490Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1491 Hdr* outPreferredHdrOutputType) {
1492 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1493 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001494 if (!status.isOk()) {
1495 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1496 return static_cast<Error>(status.getServiceSpecificError());
1497 }
1498 return Error::NONE;
1499}
1500
ramindanib2158ee2023-02-13 20:29:59 -08001501Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1502 const auto status =
1503 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1504 displayId),
1505 enabled);
1506 if (!status.isOk()) {
1507 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1508 status.getDescription().c_str());
1509 return static_cast<Error>(status.getServiceSpecificError());
1510 }
1511 return Error::NONE;
1512}
1513
ramindani3acaaf52023-09-25 10:31:27 -07001514Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1515 int32_t frameIntervalNs) {
1516 const auto status =
1517 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1518 ClockMonotonicTimestamp{expectedPresentTime},
1519 frameIntervalNs);
1520
1521 if (!status.isOk()) {
1522 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1523 return static_cast<Error>(status.getServiceSpecificError());
1524 }
1525 return Error::NONE;
1526}
1527
Ady Abrahame7385f72021-09-05 00:54:25 -07001528Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001529 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001530 Error error = Error::NONE;
1531 mMutex.lock_shared();
1532 if (auto reader = getReader(display)) {
1533 *outClientTargetProperty =
1534 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1535 } else {
1536 error = Error::BAD_DISPLAY;
1537 }
1538 mMutex.unlock_shared();
1539 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001540}
1541
Alec Mouri6da0e272022-02-07 12:45:57 -08001542Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001543 Error error = Error::NONE;
1544 mMutex.lock_shared();
1545 if (auto writer = getWriter(display)) {
1546 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1547 brightness);
1548 } else {
1549 error = Error::BAD_DISPLAY;
1550 }
1551 mMutex.unlock_shared();
1552 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001553}
1554
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001555Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1556 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001557 Error error = Error::NONE;
1558 mMutex.lock_shared();
1559 if (auto writer = getWriter(display)) {
1560 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1561 translate<AidlRect>(blocking));
1562 } else {
1563 error = Error::BAD_DISPLAY;
1564 }
1565 mMutex.unlock_shared();
1566 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001567}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001568
1569Error AidlComposer::getDisplayDecorationSupport(Display display,
1570 std::optional<DisplayDecorationSupport>* support) {
1571 const auto status =
1572 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1573 if (!status.isOk()) {
1574 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1575 support->reset();
1576 return static_cast<Error>(status.getServiceSpecificError());
1577 }
1578 return Error::NONE;
1579}
ramindani32cf0602022-03-02 02:30:29 +00001580
1581Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1582 const auto status =
1583 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1584 translate<int32_t>(timeout.count()));
1585 if (!status.isOk()) {
1586 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1587 return static_cast<Error>(status.getServiceSpecificError());
1588 }
1589 return Error::NONE;
1590}
1591
ramindani06e518e2022-03-14 18:47:53 +00001592Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1593 AidlTransform* outDisplayOrientation) {
1594 const auto status =
1595 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1596 outDisplayOrientation);
1597 if (!status.isOk()) {
1598 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1599 return static_cast<Error>(status.getServiceSpecificError());
1600 }
1601 return Error::NONE;
1602}
1603
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001604ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1605 REQUIRES_SHARED(mMutex) {
1606 return mWriters.get(display);
1607}
1608
1609ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1610 REQUIRES_SHARED(mMutex) {
1611 if (mSingleReader) {
1612 display = translate<Display>(kSingleReaderKey);
1613 }
1614 return mReaders.get(display);
1615}
1616
1617void AidlComposer::removeDisplay(Display display) {
1618 mMutex.lock();
1619 bool wasErased = mWriters.erase(display);
1620 ALOGW_IF(!wasErased,
1621 "Attempting to remove writer for display %" PRId64 " which is not connected",
1622 translate<int64_t>(display));
1623 if (!mSingleReader) {
1624 removeReader(display);
1625 }
1626 mMutex.unlock();
1627}
1628
1629void AidlComposer::onHotplugDisconnect(Display display) {
1630 removeDisplay(display);
1631}
1632
1633bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001634 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001635 const auto displayId = translate<int64_t>(display);
1636 std::vector<AidlDisplayCapability> capabilities;
1637 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1638 if (!status.isOk()) {
1639 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1640 return false;
1641 }
1642 return std::find(capabilities.begin(), capabilities.end(),
1643 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1644}
1645
1646void AidlComposer::addReader(Display display) {
1647 const auto displayId = translate<int64_t>(display);
1648 std::optional<int64_t> displayOpt;
1649 if (displayId != kSingleReaderKey) {
1650 displayOpt.emplace(displayId);
1651 }
1652 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1653 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1654 displayId);
1655}
1656
1657void AidlComposer::removeReader(Display display) {
1658 bool wasErased = mReaders.erase(display);
1659 ALOGW_IF(!wasErased,
1660 "Attempting to remove reader for display %" PRId64 " which is not connected",
1661 translate<int64_t>(display));
1662}
1663
1664void AidlComposer::addDisplay(Display display) {
1665 const auto displayId = translate<int64_t>(display);
1666 mMutex.lock();
1667 auto [it, added] = mWriters.try_emplace(display, displayId);
1668 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1669 displayId);
1670 if (mSingleReader) {
1671 if (hasMultiThreadedPresentSupport(display)) {
1672 mSingleReader = false;
1673 removeReader(translate<Display>(kSingleReaderKey));
1674 // Note that this includes the new display.
1675 for (const auto& [existingDisplay, _] : mWriters) {
1676 addReader(existingDisplay);
1677 }
1678 }
1679 } else {
1680 addReader(display);
1681 }
1682 mMutex.unlock();
1683}
1684
1685void AidlComposer::onHotplugConnect(Display display) {
1686 addDisplay(display);
1687}
Ady Abrahame7385f72021-09-05 00:54:25 -07001688} // namespace Hwc2
1689} // namespace android