blob: 4c8ff58530a02f77b99e92f987b4de0cc958e706 [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;
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -060047using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Sally Qi0abc4a52024-09-26 16:13:06 -070048using aidl::android::hardware::graphics::composer3::Luts;
Ady Abrahame7385f72021-09-05 00:54:25 -070049using aidl::android::hardware::graphics::composer3::PowerMode;
50using aidl::android::hardware::graphics::composer3::VirtualDisplay;
51
52using 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;
Huihong Luo817ebb82023-12-13 12:54:24 -080062using AidlHdcpLevels = aidl::android::hardware::drm::HdcpLevels;
Kriti Dang674b9372022-11-18 10:58:44 +010063using 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
Huihong Luo817ebb82023-12-13 12:54:24 -0800226 ::ndk::ScopedAStatus onHdcpLevelsChanged(int64_t in_display,
227 const AidlHdcpLevels& levels) override {
228 mCallback.onComposerHalHdcpLevelsChanged(translate<Display>(in_display), levels);
229 return ::ndk::ScopedAStatus::ok();
230 }
231
Ady Abrahame7385f72021-09-05 00:54:25 -0700232private:
Yichi Chen3401b562022-01-17 15:42:35 +0800233 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700234};
235
Ady Abraham9fc28052021-10-14 17:21:38 -0700236std::string AidlComposer::instance(const std::string& serviceName) {
237 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
238}
239
240bool AidlComposer::isDeclared(const std::string& serviceName) {
241 return AServiceManager_isDeclared(instance(serviceName).c_str());
242}
Ady Abrahame7385f72021-09-05 00:54:25 -0700243
Ady Abrahama6388c02021-11-11 21:11:51 -0800244AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700245 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700246 mAidlComposer = AidlIComposer::fromBinder(
247 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700248 if (!mAidlComposer) {
249 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
250 return;
251 }
252
253 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
254 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
255 return;
256 }
257
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400258 addReader(translate<Display>(kSingleReaderKey));
259
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700260 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700261 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700262 if (!status.isOk()) {
263 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
264 status.getDescription().c_str());
265 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700266
267 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600268 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
269 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
270 GraphicBuffer::USAGE_HW_COMPOSER |
271 GraphicBuffer::USAGE_SW_READ_OFTEN |
272 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
273 "AidlComposer");
274 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
275 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
276 return;
277 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700278 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700279 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000280 if (getLayerLifecycleBatchCommand()) {
281 mEnableLayerCommandBatchingFlag =
282 FlagManager::getInstance().enable_layer_command_batching();
283 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700284 ALOGI("Loaded AIDL composer3 HAL service");
285}
286
287AidlComposer::~AidlComposer() = default;
288
Ady Abraham4d211cf2021-12-14 16:19:03 -0800289bool AidlComposer::isSupported(OptionalFeature feature) const {
290 switch (feature) {
291 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800292 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800293 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000294 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000295 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800296 return true;
297 }
298}
299
ramindani19919ff2023-12-07 11:27:06 -0800300bool AidlComposer::isVrrSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800301 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700302}
303
Ady Abrahamde549d42022-01-26 19:19:17 -0800304std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700305 std::vector<Capability> capabilities;
306 const auto status = mAidlComposer->getCapabilities(&capabilities);
307 if (!status.isOk()) {
308 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
309 return {};
310 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800311 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700312}
313
314std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800315 int pipefds[2];
316 int result = pipe(pipefds);
317 if (result < 0) {
318 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700319 return {};
320 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800321
322 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800323 // Use other thread to read pipe to prevent
324 // pipe is full, making HWC be blocked in writing.
325 std::thread t([&]() {
326 base::ReadFdToString(pipefds[0], &str);
327 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800328 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
329 // Close the write-end of the pipe to make sure that when reading from the
330 // read-end we will get eof instead of blocking forever
331 close(pipefds[1]);
332
yihsing.shen58847c52022-09-23 15:39:30 +0800333 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800334 ALOGE("dumpDebugInfo: dump failed: %d", status);
335 }
336
yihsing.shen58847c52022-09-23 15:39:30 +0800337 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800338 close(pipefds[0]);
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800339
340 std::string hash;
341 mAidlComposer->getInterfaceHash(&hash);
342 return std::string(mAidlComposer->descriptor) +
343 " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700344}
345
Yichi Chen3401b562022-01-17 15:42:35 +0800346void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700347 if (mAidlComposerCallback) {
348 ALOGE("Callback already registered");
349 }
Yichi Chen3401b562022-01-17 15:42:35 +0800350
Ady Abraham9fc28052021-10-14 17:21:38 -0700351 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
shuide chenf1111e12024-01-03 18:41:38 +0800352
353 ndk::SpAIBinder binder = mAidlComposerCallback->asBinder();
354 AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_FIFO, 2);
Ady Abrahame7385f72021-09-05 00:54:25 -0700355
356 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
357 if (!status.isOk()) {
358 ALOGE("registerCallback failed %s", status.getDescription().c_str());
359 }
360}
361
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400362Error AidlComposer::executeCommands(Display display) {
363 mMutex.lock_shared();
364 auto error = execute(display);
365 mMutex.unlock_shared();
366 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700367}
368
369uint32_t AidlComposer::getMaxVirtualDisplayCount() {
370 int32_t count = 0;
371 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
372 if (!status.isOk()) {
373 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
374 return 0;
375 }
376 return static_cast<uint32_t>(count);
377}
378
379Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
380 Display* outDisplay) {
381 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
382 const int32_t bufferSlotCount = 1;
383 VirtualDisplay virtualDisplay;
384 const auto status =
385 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
386 static_cast<int32_t>(height),
387 static_cast<AidlPixelFormat>(*format),
388 bufferSlotCount, &virtualDisplay);
389
390 if (!status.isOk()) {
391 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
392 return static_cast<Error>(status.getServiceSpecificError());
393 }
394
395 *outDisplay = translate<Display>(virtualDisplay.display);
396 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400397 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700398 return Error::NONE;
399}
400
401Error AidlComposer::destroyVirtualDisplay(Display display) {
402 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
403 if (!status.isOk()) {
404 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
405 return static_cast<Error>(status.getServiceSpecificError());
406 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400407 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700408 return Error::NONE;
409}
410
411Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400412 Error error = Error::NONE;
413 mMutex.lock_shared();
414 if (auto writer = getWriter(display)) {
415 writer->get().acceptDisplayChanges(translate<int64_t>(display));
416 } else {
417 error = Error::BAD_DISPLAY;
418 }
419 mMutex.unlock_shared();
420 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700421}
422
423Error AidlComposer::createLayer(Display display, Layer* outLayer) {
424 int64_t layer;
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000425 Error error = Error::NONE;
426 if (!mEnableLayerCommandBatchingFlag) {
427 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
428 kMaxLayerBufferCount, &layer);
429 if (!status.isOk()) {
430 ALOGE("createLayer failed %s", status.getDescription().c_str());
431 return static_cast<Error>(status.getServiceSpecificError());
432 }
433 } else {
434 // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
435 // Add this as a new displayCommand in execute command.
436 // return the SF generated layerID instead of calling HWC
437 layer = mLayerID++;
438 mMutex.lock_shared();
439 if (auto writer = getWriter(display)) {
440 writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
441 translate<int64_t>(layer),
442 LayerLifecycleBatchCommandType::CREATE);
443 writer->get().setNewBufferSlotCount(translate<int64_t>(display),
444 translate<int64_t>(layer), kMaxLayerBufferCount);
445 } else {
446 error = Error::BAD_DISPLAY;
447 }
448 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700449 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700450 *outLayer = translate<Layer>(layer);
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000451 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700452}
453
454Error AidlComposer::destroyLayer(Display display, Layer layer) {
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000455 Error error = Error::NONE;
456 if (!mEnableLayerCommandBatchingFlag) {
457 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
458 translate<int64_t>(layer));
459 if (!status.isOk()) {
460 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
461 return static_cast<Error>(status.getServiceSpecificError());
462 }
463 } else {
464 mMutex.lock_shared();
465 if (auto writer = getWriter(display)) {
466 writer->get()
467 .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
468 translate<int64_t>(layer),
469 LayerLifecycleBatchCommandType::DESTROY);
470 } else {
471 error = Error::BAD_DISPLAY;
472 }
473 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700474 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000475
476 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700477}
478
479Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
480 int32_t config;
481 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
482 if (!status.isOk()) {
483 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
484 return static_cast<Error>(status.getServiceSpecificError());
485 }
486 *outConfig = translate<Config>(config);
487 return Error::NONE;
488}
489
490Error AidlComposer::getChangedCompositionTypes(
491 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500492 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400493 std::vector<ChangedCompositionLayer> changedLayers;
494 Error error = Error::NONE;
495 {
496 mMutex.lock_shared();
497 if (auto reader = getReader(display)) {
498 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
499 } else {
500 error = Error::BAD_DISPLAY;
501 }
502 mMutex.unlock_shared();
503 }
Ady Abrahamde792782021-12-20 10:00:49 -0800504 outLayers->reserve(changedLayers.size());
505 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800506
Ady Abrahamde792782021-12-20 10:00:49 -0800507 for (const auto& layer : changedLayers) {
508 outLayers->emplace_back(translate<Layer>(layer.layer));
509 outTypes->emplace_back(layer.composition);
510 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400511 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700512}
513
514Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
515 std::vector<AidlColorMode> modes;
516 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
517 if (!status.isOk()) {
518 ALOGE("getColorModes failed %s", status.getDescription().c_str());
519 return static_cast<Error>(status.getServiceSpecificError());
520 }
521 *outModes = translate<ColorMode>(modes);
522 return Error::NONE;
523}
524
525Error AidlComposer::getDisplayAttribute(Display display, Config config,
526 IComposerClient::Attribute attribute, int32_t* outValue) {
527 const auto status =
528 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
529 translate<int32_t>(config),
530 static_cast<AidlDisplayAttribute>(attribute),
531 outValue);
532 if (!status.isOk()) {
533 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
534 return static_cast<Error>(status.getServiceSpecificError());
535 }
536 return Error::NONE;
537}
538
539Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
540 std::vector<int32_t> configs;
541 const auto status =
542 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
543 if (!status.isOk()) {
544 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
545 return static_cast<Error>(status.getServiceSpecificError());
546 }
547 *outConfigs = translate<Config>(configs);
548 return Error::NONE;
549}
550
ramindani263a3f12023-07-18 20:44:49 -0700551Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700552 std::vector<DisplayConfiguration>* outConfigs) {
553 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700554 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
555 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700556 if (!status.isOk()) {
557 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
558 return static_cast<Error>(status.getServiceSpecificError());
559 }
560
561 return Error::NONE;
562}
563
Ady Abrahame7385f72021-09-05 00:54:25 -0700564Error AidlComposer::getDisplayName(Display display, std::string* outName) {
565 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
566 if (!status.isOk()) {
567 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
568 return static_cast<Error>(status.getServiceSpecificError());
569 }
570 return Error::NONE;
571}
572
573Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
574 std::vector<Layer>* outLayers,
575 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400576 Error error = Error::NONE;
577 DisplayRequest displayRequests;
578 {
579 mMutex.lock_shared();
580 if (auto reader = getReader(display)) {
581 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
582 } else {
583 error = Error::BAD_DISPLAY;
584 }
585 mMutex.unlock_shared();
586 }
Ady Abrahamde792782021-12-20 10:00:49 -0800587 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
588 outLayers->reserve(displayRequests.layerRequests.size());
589 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
590
591 for (const auto& layer : displayRequests.layerRequests) {
592 outLayers->emplace_back(translate<Layer>(layer.layer));
593 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
594 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400595 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700596}
597
598Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800599 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700600 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800601 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700602 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800603 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700604 return static_cast<Error>(status.getServiceSpecificError());
605 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800606 *outSupport = std::find(capabilities.begin(), capabilities.end(),
607 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700608 return Error::NONE;
609}
610
ramindani32cf0602022-03-02 02:30:29 +0000611Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
612 std::vector<AidlDisplayCapability> capabilities;
613 const auto status =
614 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
615 if (!status.isOk()) {
616 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
617 return static_cast<Error>(status.getServiceSpecificError());
618 }
619 *outSupport = std::find(capabilities.begin(), capabilities.end(),
620 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
621 return Error::NONE;
622}
623
Ady Abrahame7385f72021-09-05 00:54:25 -0700624Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
625 float* outMaxLuminance, float* outMaxAverageLuminance,
626 float* outMinLuminance) {
627 AidlHdrCapabilities capabilities;
628 const auto status =
629 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
630 if (!status.isOk()) {
631 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
632 return static_cast<Error>(status.getServiceSpecificError());
633 }
634
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100635 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700636 *outMaxLuminance = capabilities.maxLuminance;
637 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
638 *outMinLuminance = capabilities.minLuminance;
639 return Error::NONE;
640}
641
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000642bool AidlComposer::getLayerLifecycleBatchCommand() {
643 std::vector<Capability> capabilities = getCapabilities();
644 bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
645 Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
646 return hasCapability;
647}
648
Sally Qibb866c12022-10-17 11:31:20 -0700649Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
650 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
651 if (!status.isOk()) {
652 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
653 return static_cast<Error>(status.getServiceSpecificError());
654 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700655 return Error::NONE;
656}
657
Ady Abrahame7385f72021-09-05 00:54:25 -0700658Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
659 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400660 Error error = Error::NONE;
661 std::vector<ReleaseFences::Layer> fences;
662 {
663 mMutex.lock_shared();
664 if (auto reader = getReader(display)) {
665 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
666 } else {
667 error = Error::BAD_DISPLAY;
668 }
669 mMutex.unlock_shared();
670 }
Ady Abrahamde792782021-12-20 10:00:49 -0800671 outLayers->reserve(fences.size());
672 outReleaseFences->reserve(fences.size());
673
674 for (auto& fence : fences) {
675 outLayers->emplace_back(translate<Layer>(fence.layer));
676 // take ownership
677 const int fenceOwner = fence.fence.get();
678 *fence.fence.getR() = -1;
679 outReleaseFences->emplace_back(fenceOwner);
680 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400681 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700682}
683
684Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500685 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000686 SFTRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500687
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400688 Error error = Error::NONE;
689 mMutex.lock_shared();
690 auto writer = getWriter(display);
691 auto reader = getReader(display);
692 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500693 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400694 error = execute(display);
695 } else {
696 error = Error::BAD_DISPLAY;
697 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700698
Ady Abrahame7385f72021-09-05 00:54:25 -0700699 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400700 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return error;
702 }
703
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500704 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400705 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800706 // take ownership
707 *outPresentFence = fence.get();
708 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700709 return Error::NONE;
710}
711
712Error AidlComposer::setActiveConfig(Display display, Config config) {
713 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
714 translate<int32_t>(config));
715 if (!status.isOk()) {
716 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
717 return static_cast<Error>(status.getServiceSpecificError());
718 }
719 return Error::NONE;
720}
721
722Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
723 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000724 const std::vector<IComposerClient::Rect>& damage,
725 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700726 const native_handle_t* handle = nullptr;
727 if (target.get()) {
728 handle = target->getNativeBuffer()->handle;
729 }
730
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400731 Error error = Error::NONE;
732 mMutex.lock_shared();
733 if (auto writer = getWriter(display)) {
734 writer->get()
735 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
736 translate<aidl::android::hardware::graphics::common::Dataspace>(
737 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000738 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400739 } else {
740 error = Error::BAD_DISPLAY;
741 }
742 mMutex.unlock_shared();
743 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700744}
745
746Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
747 const auto status =
748 mAidlComposerClient->setColorMode(translate<int64_t>(display),
749 translate<AidlColorMode>(mode),
750 translate<AidlRenderIntent>(renderIntent));
751 if (!status.isOk()) {
752 ALOGE("setColorMode failed %s", status.getDescription().c_str());
753 return static_cast<Error>(status.getServiceSpecificError());
754 }
755 return Error::NONE;
756}
757
Ady Abrahamdc011a92021-12-21 14:06:44 -0800758Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400759 auto error = Error::NONE;
760 mMutex.lock_shared();
761 if (auto writer = getWriter(display)) {
762 writer->get().setColorTransform(translate<int64_t>(display), matrix);
763 } else {
764 error = Error::BAD_DISPLAY;
765 }
766 mMutex.unlock_shared();
767 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700768}
769
770Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
771 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400772 auto error = Error::NONE;
773 mMutex.lock_shared();
774 if (auto writer = getWriter(display)) {
775 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
776 } else {
777 error = Error::BAD_DISPLAY;
778 }
779 mMutex.unlock_shared();
780 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700781}
782
783Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
784 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
785 translate<PowerMode>(mode));
786 if (!status.isOk()) {
787 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
788 return static_cast<Error>(status.getServiceSpecificError());
789 }
790 return Error::NONE;
791}
792
793Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
794 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
795 const auto status =
796 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
797 if (!status.isOk()) {
798 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
799 return static_cast<Error>(status.getServiceSpecificError());
800 }
801 return Error::NONE;
802}
803
804Error AidlComposer::setClientTargetSlotCount(Display display) {
805 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
806 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
807 bufferSlotCount);
808 if (!status.isOk()) {
809 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
810 return static_cast<Error>(status.getServiceSpecificError());
811 }
812 return Error::NONE;
813}
814
Ady Abraham43065bd2021-12-10 17:22:15 -0800815Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700816 int32_t frameIntervalNs, uint32_t* outNumTypes,
817 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400818 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000819 SFTRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500820
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400821 Error error = Error::NONE;
822 mMutex.lock_shared();
823 auto writer = getWriter(display);
824 auto reader = getReader(display);
825 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700826 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
827 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400828 error = execute(display);
829 } else {
830 error = Error::BAD_DISPLAY;
831 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700832
Ady Abrahame7385f72021-09-05 00:54:25 -0700833 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400834 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700835 return error;
836 }
837
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400838 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700839
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400840 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700841 return Error::NONE;
842}
843
Ady Abraham43065bd2021-12-10 17:22:15 -0800844Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700845 int32_t frameIntervalNs, uint32_t* outNumTypes,
846 uint32_t* outNumRequests, int* outPresentFence,
847 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400848 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000849 SFTRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500850
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400851 Error error = Error::NONE;
852 mMutex.lock_shared();
853 auto writer = getWriter(display);
854 auto reader = getReader(display);
855 if (writer && reader) {
856 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700857 ClockMonotonicTimestamp{expectedPresentTime},
858 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400859 error = execute(display);
860 } else {
861 error = Error::BAD_DISPLAY;
862 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700863
Ady Abrahame7385f72021-09-05 00:54:25 -0700864 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400865 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700866 return error;
867 }
868
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400869 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800870 if (!result.has_value()) {
871 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400872 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800873 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700874 }
875
Ady Abrahamde792782021-12-20 10:00:49 -0800876 *state = translate<uint32_t>(*result);
877
878 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400879 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800880 // take ownership
881 *outPresentFence = fence.get();
882 *fence.getR() = -1;
883 }
884
885 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400886 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700887 }
888
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400889 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700890 return Error::NONE;
891}
892
893Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400894 Error error = Error::NONE;
895 mMutex.lock_shared();
896 if (auto writer = getWriter(display)) {
897 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
898 x, y);
899 } else {
900 error = Error::BAD_DISPLAY;
901 }
902 mMutex.unlock_shared();
903 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700904}
905
906Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
907 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700908 const native_handle_t* handle = nullptr;
909 if (buffer.get()) {
910 handle = buffer->getNativeBuffer()->handle;
911 }
912
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400913 Error error = Error::NONE;
914 mMutex.lock_shared();
915 if (auto writer = getWriter(display)) {
916 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
917 handle, acquireFence);
918 } else {
919 error = Error::BAD_DISPLAY;
920 }
921 mMutex.unlock_shared();
922 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700923}
924
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700925Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
926 const std::vector<uint32_t>& slotsToClear,
927 uint32_t activeBufferSlot) {
928 if (slotsToClear.empty()) {
929 return Error::NONE;
930 }
931
Brian Lindahl90553da2022-12-06 13:36:30 -0700932 Error error = Error::NONE;
933 mMutex.lock_shared();
934 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700935 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700936 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
937 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600938 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
939 // placeholder buffer, using the slot that needs to cleared... tricky.
940 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700941 for (uint32_t slot : slotsToClear) {
942 // Don't clear the active buffer slot because we need to restore the active buffer
943 // after clearing the requested buffer slots with a placeholder buffer.
944 if (slot != activeBufferSlot) {
945 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
946 translate<int64_t>(layer), slot,
947 mClearSlotBuffer->handle,
948 /*fence*/ -1);
949 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700950 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700951 // Since we clear buffers by setting them to a placeholder buffer, we want to make
952 // sure that the last setLayerBuffer command is sent with the currently active
953 // buffer, not the placeholder buffer, so that there is no perceptual change when
954 // buffers are discarded.
955 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
956 translate<int64_t>(layer), activeBufferSlot,
957 // The active buffer is still cached in
958 // its slot and doesn't need a fence.
959 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700960 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700961 } else {
962 error = Error::BAD_DISPLAY;
963 }
964 mMutex.unlock_shared();
965 return error;
966}
967
Ady Abrahame7385f72021-09-05 00:54:25 -0700968Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
969 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400970 Error error = Error::NONE;
971 mMutex.lock_shared();
972 if (auto writer = getWriter(display)) {
973 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
974 translate<AidlRect>(damage));
975 } else {
976 error = Error::BAD_DISPLAY;
977 }
978 mMutex.unlock_shared();
979 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700980}
981
982Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
983 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400984 Error error = Error::NONE;
985 mMutex.lock_shared();
986 if (auto writer = getWriter(display)) {
987 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
988 translate<BlendMode>(mode));
989 } else {
990 error = Error::BAD_DISPLAY;
991 }
992 mMutex.unlock_shared();
993 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700994}
995
Ady Abraham6e60b142022-01-06 18:10:35 -0800996Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400997 Error error = Error::NONE;
998 mMutex.lock_shared();
999 if (auto writer = getWriter(display)) {
1000 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
1001 } else {
1002 error = Error::BAD_DISPLAY;
1003 }
1004 mMutex.unlock_shared();
1005 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001006}
1007
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001008Error AidlComposer::setLayerCompositionType(
1009 Display display, Layer layer,
1010 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001011 Error error = Error::NONE;
1012 mMutex.lock_shared();
1013 if (auto writer = getWriter(display)) {
1014 writer->get().setLayerCompositionType(translate<int64_t>(display),
1015 translate<int64_t>(layer), type);
1016 } else {
1017 error = Error::BAD_DISPLAY;
1018 }
1019 mMutex.unlock_shared();
1020 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001021}
1022
1023Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
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().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1028 translate<AidlDataspace>(dataspace));
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::setLayerDisplayFrame(Display display, Layer layer,
1037 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001038 Error error = Error::NONE;
1039 mMutex.lock_shared();
1040 if (auto writer = getWriter(display)) {
1041 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1042 translate<AidlRect>(frame));
1043 } else {
1044 error = Error::BAD_DISPLAY;
1045 }
1046 mMutex.unlock_shared();
1047 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001048}
1049
1050Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
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().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1055 alpha);
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::setLayerSidebandStream(Display display, Layer layer,
1064 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001065 Error error = Error::NONE;
1066 mMutex.lock_shared();
1067 if (auto writer = getWriter(display)) {
1068 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1069 stream);
1070 } else {
1071 error = Error::BAD_DISPLAY;
1072 }
1073 mMutex.unlock_shared();
1074 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001075}
1076
1077Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1078 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001079 Error error = Error::NONE;
1080 mMutex.lock_shared();
1081 if (auto writer = getWriter(display)) {
1082 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1083 translate<AidlFRect>(crop));
1084 } else {
1085 error = Error::BAD_DISPLAY;
1086 }
1087 mMutex.unlock_shared();
1088 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001089}
1090
1091Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001092 Error error = Error::NONE;
1093 mMutex.lock_shared();
1094 if (auto writer = getWriter(display)) {
1095 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1096 translate<AidlTransform>(transform));
1097 } else {
1098 error = Error::BAD_DISPLAY;
1099 }
1100 mMutex.unlock_shared();
1101 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001102}
1103
1104Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1105 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001106 Error error = Error::NONE;
1107 mMutex.lock_shared();
1108 if (auto writer = getWriter(display)) {
1109 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1110 translate<AidlRect>(visible));
1111 } else {
1112 error = Error::BAD_DISPLAY;
1113 }
1114 mMutex.unlock_shared();
1115 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001116}
1117
1118Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001119 Error error = Error::NONE;
1120 mMutex.lock_shared();
1121 if (auto writer = getWriter(display)) {
1122 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1123 } else {
1124 error = Error::BAD_DISPLAY;
1125 }
1126 mMutex.unlock_shared();
1127 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001128}
1129
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001130Error AidlComposer::execute(Display display) {
1131 auto writer = getWriter(display);
1132 auto reader = getReader(display);
1133 if (!writer || !reader) {
1134 return Error::BAD_DISPLAY;
1135 }
1136
Huihong Luoe7382c12023-04-21 20:24:32 +00001137 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001138 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001139 return Error::NONE;
1140 }
1141
Ady Abrahamde792782021-12-20 10:00:49 -08001142 { // scope for results
1143 std::vector<CommandResultPayload> results;
1144 auto status = mAidlComposerClient->executeCommands(commands, &results);
1145 if (!status.isOk()) {
1146 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1147 return static_cast<Error>(status.getServiceSpecificError());
1148 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001149
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001150 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001151 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001152 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001153 Error error = Error::NONE;
1154 for (const auto& cmdErr : commandErrors) {
1155 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1156 if (index < 0 || index >= commands.size()) {
1157 ALOGE("invalid command index %zu", index);
1158 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001159 }
1160
Ady Abrahama6388c02021-11-11 21:11:51 -08001161 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001162 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1163 error = translate<Error>(cmdErr.errorCode);
1164 } else {
1165 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1166 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001167 }
1168 }
1169
Ady Abrahame7385f72021-09-05 00:54:25 -07001170 return error;
1171}
1172
1173Error AidlComposer::setLayerPerFrameMetadata(
1174 Display display, Layer layer,
1175 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001176 Error error = Error::NONE;
1177 mMutex.lock_shared();
1178 if (auto writer = getWriter(display)) {
1179 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1180 translate<int64_t>(layer),
1181 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1182 } else {
1183 error = Error::BAD_DISPLAY;
1184 }
1185 mMutex.unlock_shared();
1186 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001187}
1188
1189std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1190 Display display) {
1191 std::vector<AidlPerFrameMetadataKey> keys;
1192 const auto status =
1193 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1194 if (!status.isOk()) {
1195 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1196 return {};
1197 }
1198 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1199}
1200
1201Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1202 std::vector<RenderIntent>* outRenderIntents) {
1203 std::vector<AidlRenderIntent> renderIntents;
1204 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1205 translate<AidlColorMode>(colorMode),
1206 &renderIntents);
1207 if (!status.isOk()) {
1208 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1209 return static_cast<Error>(status.getServiceSpecificError());
1210 }
1211 *outRenderIntents = translate<RenderIntent>(renderIntents);
1212 return Error::NONE;
1213}
1214
1215Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1216 std::vector<float> matrix;
1217 const auto status =
1218 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1219 &matrix);
1220 if (!status.isOk()) {
1221 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1222 return static_cast<Error>(status.getServiceSpecificError());
1223 }
1224 *outMatrix = makeMat4(matrix);
1225 return Error::NONE;
1226}
1227
1228Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1229 std::vector<uint8_t>* outData) {
1230 AidlDisplayIdentification displayIdentification;
1231 const auto status =
1232 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1233 &displayIdentification);
1234 if (!status.isOk()) {
1235 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1236 return static_cast<Error>(status.getServiceSpecificError());
1237 }
1238
1239 *outPort = static_cast<uint8_t>(displayIdentification.port);
1240 *outData = displayIdentification.data;
1241
1242 return Error::NONE;
1243}
1244
1245Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001246 Error error = Error::NONE;
1247 mMutex.lock_shared();
1248 if (auto writer = getWriter(display)) {
1249 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1250 matrix);
1251 } else {
1252 error = Error::BAD_DISPLAY;
1253 }
1254 mMutex.unlock_shared();
1255 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001256}
1257
1258Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1259 Dataspace* outDataspace,
1260 uint8_t* outComponentMask) {
1261 if (!outFormat || !outDataspace || !outComponentMask) {
1262 return Error::BAD_PARAMETER;
1263 }
1264
1265 AidlDisplayContentSamplingAttributes attributes;
1266 const auto status =
1267 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1268 &attributes);
1269 if (!status.isOk()) {
1270 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1271 return static_cast<Error>(status.getServiceSpecificError());
1272 }
1273
1274 *outFormat = translate<PixelFormat>(attributes.format);
1275 *outDataspace = translate<Dataspace>(attributes.dataspace);
1276 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1277 return Error::NONE;
1278}
1279
1280Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1281 uint8_t componentMask, uint64_t maxFrames) {
1282 const auto status =
1283 mAidlComposerClient
1284 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1285 static_cast<AidlFormatColorComponent>(
1286 componentMask),
1287 static_cast<int64_t>(maxFrames));
1288 if (!status.isOk()) {
1289 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1290 return static_cast<Error>(status.getServiceSpecificError());
1291 }
1292 return Error::NONE;
1293}
1294
1295Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1296 uint64_t timestamp, DisplayedFrameStats* outStats) {
1297 if (!outStats) {
1298 return Error::BAD_PARAMETER;
1299 }
1300
1301 AidlDisplayContentSample sample;
1302 const auto status =
1303 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1304 static_cast<int64_t>(maxFrames),
1305 static_cast<int64_t>(timestamp),
1306 &sample);
1307 if (!status.isOk()) {
1308 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1309 return static_cast<Error>(status.getServiceSpecificError());
1310 }
1311 *outStats = translate<DisplayedFrameStats>(sample);
1312 return Error::NONE;
1313}
1314
1315Error AidlComposer::setLayerPerFrameMetadataBlobs(
1316 Display display, Layer layer,
1317 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001318 Error error = Error::NONE;
1319 mMutex.lock_shared();
1320 if (auto writer = getWriter(display)) {
1321 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1322 translate<int64_t>(layer),
1323 translate<AidlPerFrameMetadataBlob>(metadata));
1324 } else {
1325 error = Error::BAD_DISPLAY;
1326 }
1327 mMutex.unlock_shared();
1328 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001329}
1330
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001331Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001332 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001333 Error error = Error::NONE;
1334 mMutex.lock_shared();
1335 if (auto writer = getWriter(display)) {
1336 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001337
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001338 if (options.applyImmediately) {
1339 error = execute(display);
1340 mMutex.unlock_shared();
1341 return error;
1342 }
1343 } else {
1344 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001345 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001346 mMutex.unlock_shared();
1347 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001348}
1349
1350Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001351 std::vector<AidlDisplayCapability>* outCapabilities) {
1352 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1353 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001354 if (!status.isOk()) {
1355 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001356 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001357 return static_cast<Error>(status.getServiceSpecificError());
1358 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001359 return Error::NONE;
1360}
1361
1362V2_4::Error AidlComposer::getDisplayConnectionType(
1363 Display display, IComposerClient::DisplayConnectionType* outType) {
1364 AidlDisplayConnectionType type;
1365 const auto status =
1366 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1367 if (!status.isOk()) {
1368 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1369 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1370 }
1371 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1372 return V2_4::Error::NONE;
1373}
1374
1375V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1376 int32_t vsyncPeriod;
1377 const auto status =
1378 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1379 if (!status.isOk()) {
1380 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1381 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1382 }
1383 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1384 return V2_4::Error::NONE;
1385}
1386
1387V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1388 Display display, Config config,
1389 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1390 VsyncPeriodChangeTimeline* outTimeline) {
1391 AidlVsyncPeriodChangeTimeline timeline;
1392 const auto status =
1393 mAidlComposerClient
1394 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1395 translate<int32_t>(config),
1396 translate<AidlVsyncPeriodChangeConstraints>(
1397 vsyncPeriodChangeConstraints),
1398 &timeline);
1399 if (!status.isOk()) {
1400 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1401 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1402 }
1403 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1404 return V2_4::Error::NONE;
1405}
1406
1407V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1408 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1409 if (!status.isOk()) {
1410 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1411 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1412 }
1413 return V2_4::Error::NONE;
1414}
1415
1416V2_4::Error AidlComposer::getSupportedContentTypes(
1417 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1418 std::vector<AidlContentType> types;
1419 const auto status =
1420 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1421 if (!status.isOk()) {
1422 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1423 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1424 }
1425 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1426 return V2_4::Error::NONE;
1427}
1428
1429V2_4::Error AidlComposer::setContentType(Display display,
1430 IComposerClient::ContentType contentType) {
1431 const auto status =
1432 mAidlComposerClient->setContentType(translate<int64_t>(display),
1433 translate<AidlContentType>(contentType));
1434 if (!status.isOk()) {
1435 ALOGE("setContentType failed %s", status.getDescription().c_str());
1436 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1437 }
1438 return V2_4::Error::NONE;
1439}
1440
Ady Abraham3f976752021-12-20 16:17:50 -08001441V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1442 const std::vector<uint8_t>&) {
1443 // There are no users for this API. See b/209691612.
1444 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001445}
1446
1447V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001448 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1449 // There are no users for this API. See b/209691612.
1450 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001451}
1452
Kriti Dang7defaf32021-11-15 11:55:43 +01001453Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1454 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1455 translate<int32_t>(config));
1456 if (!status.isOk()) {
1457 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1458 return static_cast<Error>(status.getServiceSpecificError());
1459 }
1460 return Error::NONE;
1461}
1462
1463Error AidlComposer::clearBootDisplayConfig(Display display) {
1464 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1465 if (!status.isOk()) {
1466 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1467 return static_cast<Error>(status.getServiceSpecificError());
1468 }
1469 return Error::NONE;
1470}
1471
1472Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1473 int32_t displayConfig;
1474 const auto status =
1475 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1476 &displayConfig);
1477 if (!status.isOk()) {
1478 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1479 return static_cast<Error>(status.getServiceSpecificError());
1480 }
1481 *config = translate<uint32_t>(displayConfig);
1482 return Error::NONE;
1483}
1484
Kriti Dang674b9372022-11-18 10:58:44 +01001485Error AidlComposer::getHdrConversionCapabilities(
1486 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1487 const auto status =
1488 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1489 if (!status.isOk()) {
1490 hdrConversionCapabilities = {};
1491 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1492 return static_cast<Error>(status.getServiceSpecificError());
1493 }
1494 return Error::NONE;
1495}
1496
Kriti Dangd432bb52023-02-09 18:21:04 +01001497Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1498 Hdr* outPreferredHdrOutputType) {
1499 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1500 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001501 if (!status.isOk()) {
1502 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1503 return static_cast<Error>(status.getServiceSpecificError());
1504 }
1505 return Error::NONE;
1506}
1507
ramindanib2158ee2023-02-13 20:29:59 -08001508Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1509 const auto status =
1510 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1511 displayId),
1512 enabled);
1513 if (!status.isOk()) {
1514 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1515 status.getDescription().c_str());
1516 return static_cast<Error>(status.getServiceSpecificError());
1517 }
1518 return Error::NONE;
1519}
1520
ramindani3acaaf52023-09-25 10:31:27 -07001521Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1522 int32_t frameIntervalNs) {
1523 const auto status =
1524 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1525 ClockMonotonicTimestamp{expectedPresentTime},
1526 frameIntervalNs);
1527
1528 if (!status.isOk()) {
1529 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1530 return static_cast<Error>(status.getServiceSpecificError());
1531 }
1532 return Error::NONE;
1533}
1534
Ady Abrahame7385f72021-09-05 00:54:25 -07001535Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001536 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001537 Error error = Error::NONE;
1538 mMutex.lock_shared();
1539 if (auto reader = getReader(display)) {
1540 *outClientTargetProperty =
1541 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1542 } else {
1543 error = Error::BAD_DISPLAY;
1544 }
1545 mMutex.unlock_shared();
1546 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001547}
1548
Sally Qi95f669a2024-08-27 11:31:42 -07001549Error AidlComposer::getRequestedLuts(Display display, std::vector<Layer>* outLayers,
1550 std::vector<DisplayLuts::LayerLut>* outLuts) {
Sally Qi492cec32024-06-28 14:34:47 -07001551 Error error = Error::NONE;
1552 mMutex.lock_shared();
1553 if (auto reader = getReader(display)) {
1554 *outLuts = reader->get().takeDisplayLuts(translate<int64_t>(display));
1555 } else {
1556 error = Error::BAD_DISPLAY;
1557 }
1558 mMutex.unlock_shared();
Sally Qi95f669a2024-08-27 11:31:42 -07001559
1560 outLayers->reserve(outLuts->size());
1561 for (const auto& layerLut : *outLuts) {
1562 outLayers->emplace_back(translate<Layer>(layerLut.layer));
1563 }
Sally Qi492cec32024-06-28 14:34:47 -07001564 return error;
1565}
1566
Sally Qi0abc4a52024-09-26 16:13:06 -07001567Error AidlComposer::setLayerLuts(Display display, Layer layer, Luts& luts) {
Sally Qi11dcd582024-08-16 18:11:27 -07001568 Error error = Error::NONE;
1569 mMutex.lock_shared();
1570 if (auto writer = getWriter(display)) {
1571 writer->get().setLayerLuts(translate<int64_t>(display), translate<int64_t>(layer), luts);
1572 } else {
1573 error = Error::BAD_DISPLAY;
1574 }
1575 mMutex.unlock_shared();
1576 return error;
1577}
1578
Alec Mouri6da0e272022-02-07 12:45:57 -08001579Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001580 Error error = Error::NONE;
1581 mMutex.lock_shared();
1582 if (auto writer = getWriter(display)) {
1583 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1584 brightness);
1585 } else {
1586 error = Error::BAD_DISPLAY;
1587 }
1588 mMutex.unlock_shared();
1589 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001590}
1591
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001592Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1593 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001594 Error error = Error::NONE;
1595 mMutex.lock_shared();
1596 if (auto writer = getWriter(display)) {
1597 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1598 translate<AidlRect>(blocking));
1599 } else {
1600 error = Error::BAD_DISPLAY;
1601 }
1602 mMutex.unlock_shared();
1603 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001604}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001605
1606Error AidlComposer::getDisplayDecorationSupport(Display display,
1607 std::optional<DisplayDecorationSupport>* support) {
1608 const auto status =
1609 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1610 if (!status.isOk()) {
1611 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1612 support->reset();
1613 return static_cast<Error>(status.getServiceSpecificError());
1614 }
1615 return Error::NONE;
1616}
ramindani32cf0602022-03-02 02:30:29 +00001617
1618Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1619 const auto status =
1620 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1621 translate<int32_t>(timeout.count()));
1622 if (!status.isOk()) {
1623 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1624 return static_cast<Error>(status.getServiceSpecificError());
1625 }
1626 return Error::NONE;
1627}
1628
ramindani06e518e2022-03-14 18:47:53 +00001629Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1630 AidlTransform* outDisplayOrientation) {
1631 const auto status =
1632 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1633 outDisplayOrientation);
1634 if (!status.isOk()) {
1635 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1636 return static_cast<Error>(status.getServiceSpecificError());
1637 }
1638 return Error::NONE;
1639}
1640
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -06001641Error AidlComposer::getMaxLayerPictureProfiles(Display display, int32_t* outMaxProfiles) {
1642 const auto status = mAidlComposerClient->getMaxLayerPictureProfiles(translate<int64_t>(display),
1643 outMaxProfiles);
1644 if (!status.isOk()) {
1645 ALOGE("getMaxLayerPictureProfiles failed %s", status.getDescription().c_str());
1646 return static_cast<Error>(status.getServiceSpecificError());
1647 }
1648 return Error::NONE;
1649}
1650
1651Error AidlComposer::setDisplayPictureProfileId(Display display, PictureProfileId id) {
1652 Error error = Error::NONE;
1653 mMutex.lock_shared();
1654 if (auto writer = getWriter(display)) {
1655 writer->get().setDisplayPictureProfileId(translate<int64_t>(display), id);
1656 } else {
1657 error = Error::BAD_DISPLAY;
1658 }
1659 mMutex.unlock_shared();
1660 return error;
1661}
1662
1663Error AidlComposer::setLayerPictureProfileId(Display display, Layer layer, PictureProfileId id) {
1664 Error error = Error::NONE;
1665 mMutex.lock_shared();
1666 if (auto writer = getWriter(display)) {
1667 writer->get().setLayerPictureProfileId(translate<int64_t>(display),
1668 translate<int64_t>(layer), id);
1669 } else {
1670 error = Error::BAD_DISPLAY;
1671 }
1672 mMutex.unlock_shared();
1673 return error;
1674}
1675
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001676ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1677 REQUIRES_SHARED(mMutex) {
1678 return mWriters.get(display);
1679}
1680
1681ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1682 REQUIRES_SHARED(mMutex) {
1683 if (mSingleReader) {
1684 display = translate<Display>(kSingleReaderKey);
1685 }
1686 return mReaders.get(display);
1687}
1688
1689void AidlComposer::removeDisplay(Display display) {
1690 mMutex.lock();
1691 bool wasErased = mWriters.erase(display);
1692 ALOGW_IF(!wasErased,
1693 "Attempting to remove writer for display %" PRId64 " which is not connected",
1694 translate<int64_t>(display));
1695 if (!mSingleReader) {
1696 removeReader(display);
1697 }
1698 mMutex.unlock();
1699}
1700
1701void AidlComposer::onHotplugDisconnect(Display display) {
1702 removeDisplay(display);
1703}
1704
1705bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001706 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001707 const auto displayId = translate<int64_t>(display);
1708 std::vector<AidlDisplayCapability> capabilities;
1709 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1710 if (!status.isOk()) {
1711 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1712 return false;
1713 }
1714 return std::find(capabilities.begin(), capabilities.end(),
1715 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1716}
1717
1718void AidlComposer::addReader(Display display) {
1719 const auto displayId = translate<int64_t>(display);
1720 std::optional<int64_t> displayOpt;
1721 if (displayId != kSingleReaderKey) {
1722 displayOpt.emplace(displayId);
1723 }
1724 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1725 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1726 displayId);
1727}
1728
1729void AidlComposer::removeReader(Display display) {
1730 bool wasErased = mReaders.erase(display);
1731 ALOGW_IF(!wasErased,
1732 "Attempting to remove reader for display %" PRId64 " which is not connected",
1733 translate<int64_t>(display));
1734}
1735
1736void AidlComposer::addDisplay(Display display) {
1737 const auto displayId = translate<int64_t>(display);
1738 mMutex.lock();
1739 auto [it, added] = mWriters.try_emplace(display, displayId);
1740 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1741 displayId);
1742 if (mSingleReader) {
1743 if (hasMultiThreadedPresentSupport(display)) {
1744 mSingleReader = false;
1745 removeReader(translate<Display>(kSingleReaderKey));
1746 // Note that this includes the new display.
1747 for (const auto& [existingDisplay, _] : mWriters) {
1748 addReader(existingDisplay);
1749 }
1750 }
1751 } else {
1752 addReader(display);
1753 }
1754 mMutex.unlock();
1755}
1756
1757void AidlComposer::onHotplugConnect(Display display) {
1758 addDisplay(display);
1759}
Ady Abrahame7385f72021-09-05 00:54:25 -07001760} // namespace Hwc2
1761} // namespace android