blob: 25f6513ffadf47a7b5a6eb9a0b049a6d31076bcc [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
Ady Abrahame7385f72021-09-05 00:54:25 -070040using aidl::android::hardware::graphics::composer3::BnComposerCallback;
41using aidl::android::hardware::graphics::composer3::Capability;
Alec Mouri85065692022-03-18 00:58:26 +000042using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -060043using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Sally Qi0abc4a52024-09-26 16:13:06 -070044using aidl::android::hardware::graphics::composer3::Luts;
Ady Abrahame7385f72021-09-05 00:54:25 -070045using aidl::android::hardware::graphics::composer3::PowerMode;
46using aidl::android::hardware::graphics::composer3::VirtualDisplay;
47
48using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
49using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
50using AidlDisplayIdentification =
51 aidl::android::hardware::graphics::composer3::DisplayIdentification;
52using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
53using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
54using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070055using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
Kriti Dang674b9372022-11-18 10:58:44 +010056using AidlHdrConversionCapability =
57 aidl::android::hardware::graphics::common::HdrConversionCapability;
Huihong Luo817ebb82023-12-13 12:54:24 -080058using AidlHdcpLevels = aidl::android::hardware::drm::HdcpLevels;
Kriti Dang674b9372022-11-18 10:58:44 +010059using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
Sally Qi0cbd08b2022-08-17 12:12:28 -070060using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
Ady Abrahame7385f72021-09-05 00:54:25 -070061using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
62using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
63using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
64using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
65using AidlVsyncPeriodChangeConstraints =
66 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
67using AidlVsyncPeriodChangeTimeline =
68 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070069using AidlDisplayContentSamplingAttributes =
70 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
71using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
72using AidlDisplayConnectionType =
73 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070074
75using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
76using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
Huihong Luo791bef92023-09-19 21:18:45 -070077using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Ady Abrahame7385f72021-09-05 00:54:25 -070078using AidlFRect = aidl::android::hardware::graphics::common::FRect;
79using AidlRect = aidl::android::hardware::graphics::common::Rect;
80using AidlTransform = aidl::android::hardware::graphics::common::Transform;
81
82namespace Hwc2 {
83
84namespace {
85
86template <typename To, typename From>
87To translate(From x) {
88 return static_cast<To>(x);
89}
90
91template <typename To, typename From>
92std::vector<To> translate(const std::vector<From>& in) {
93 std::vector<To> out;
94 out.reserve(in.size());
95 std::transform(in.begin(), in.end(), std::back_inserter(out),
96 [](From x) { return translate<To>(x); });
97 return out;
98}
99
100template <>
101AidlRect translate(IComposerClient::Rect x) {
102 return AidlRect{
103 .left = x.left,
104 .top = x.top,
105 .right = x.right,
106 .bottom = x.bottom,
107 };
108}
109
110template <>
111AidlFRect translate(IComposerClient::FRect x) {
112 return AidlFRect{
113 .left = x.left,
114 .top = x.top,
115 .right = x.right,
116 .bottom = x.bottom,
117 };
118}
119
120template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700121AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
122 AidlPerFrameMetadataBlob blob;
123 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800124 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700125 return blob;
126}
127
128template <>
129AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
130 return AidlPerFrameMetadata{
131 .key = translate<AidlPerFrameMetadataKey>(x.key),
132 .value = x.value,
133 };
134}
135
136template <>
137DisplayedFrameStats translate(AidlDisplayContentSample x) {
138 return DisplayedFrameStats{
139 .numFrames = static_cast<uint64_t>(x.frameCount),
140 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
141 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
142 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
143 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
144 };
145}
146
147template <>
148AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
149 return AidlVsyncPeriodChangeConstraints{
150 .desiredTimeNanos = x.desiredTimeNanos,
151 .seamlessRequired = x.seamlessRequired,
152 };
153}
154
155template <>
156VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
157 return VsyncPeriodChangeTimeline{
158 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
159 .refreshRequired = x.refreshRequired,
160 .refreshTimeNanos = x.refreshTimeNanos,
161 };
162}
Ady Abrahame7385f72021-09-05 00:54:25 -0700163mat4 makeMat4(std::vector<float> in) {
164 return mat4(static_cast<const float*>(in.data()));
165}
166
167} // namespace
168
169class AidlIComposerCallbackWrapper : public BnComposerCallback {
170public:
Yichi Chen3401b562022-01-17 15:42:35 +0800171 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700172
173 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
Huihong Luo791bef92023-09-19 21:18:45 -0700174 const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
175 : AidlDisplayHotplugEvent::DISCONNECTED;
176 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
Ady Abrahame7385f72021-09-05 00:54:25 -0700177 return ::ndk::ScopedAStatus::ok();
178 }
179
180 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800181 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700182 return ::ndk::ScopedAStatus::ok();
183 }
Yichi Chen3401b562022-01-17 15:42:35 +0800184
Ady Abrahame7385f72021-09-05 00:54:25 -0700185 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800186 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700187 return ::ndk::ScopedAStatus::ok();
188 }
Yichi Chen3401b562022-01-17 15:42:35 +0800189
Ady Abrahame7385f72021-09-05 00:54:25 -0700190 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
191 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800192 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
193 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700194 return ::ndk::ScopedAStatus::ok();
195 }
Yichi Chen3401b562022-01-17 15:42:35 +0800196
Ady Abrahame7385f72021-09-05 00:54:25 -0700197 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
198 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800199 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
200 translate<V2_4::VsyncPeriodChangeTimeline>(
201 in_updatedTimeline));
202 return ::ndk::ScopedAStatus::ok();
203 }
204
205 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
206 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700207 return ::ndk::ScopedAStatus::ok();
208 }
209
ramindani12bfe6b2023-02-03 13:29:19 -0800210 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
211 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
212 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
213 return ::ndk::ScopedAStatus::ok();
214 }
215
Huihong Luo791bef92023-09-19 21:18:45 -0700216 ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
217 AidlDisplayHotplugEvent event) override {
218 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
219 return ::ndk::ScopedAStatus::ok();
220 }
221
Huihong Luo817ebb82023-12-13 12:54:24 -0800222 ::ndk::ScopedAStatus onHdcpLevelsChanged(int64_t in_display,
223 const AidlHdcpLevels& levels) override {
224 mCallback.onComposerHalHdcpLevelsChanged(translate<Display>(in_display), levels);
225 return ::ndk::ScopedAStatus::ok();
226 }
227
Ady Abrahame7385f72021-09-05 00:54:25 -0700228private:
Yichi Chen3401b562022-01-17 15:42:35 +0800229 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700230};
231
Ady Abraham9fc28052021-10-14 17:21:38 -0700232std::string AidlComposer::instance(const std::string& serviceName) {
233 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
234}
235
236bool AidlComposer::isDeclared(const std::string& serviceName) {
237 return AServiceManager_isDeclared(instance(serviceName).c_str());
238}
Ady Abrahame7385f72021-09-05 00:54:25 -0700239
Ady Abrahama6388c02021-11-11 21:11:51 -0800240AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700241 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700242 mAidlComposer = AidlIComposer::fromBinder(
243 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700244 if (!mAidlComposer) {
245 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
246 return;
247 }
248
249 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
250 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
251 return;
252 }
253
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400254 addReader(translate<Display>(kSingleReaderKey));
255
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700256 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700257 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700258 if (!status.isOk()) {
259 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
260 status.getDescription().c_str());
261 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700262
263 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600264 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
265 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
266 GraphicBuffer::USAGE_HW_COMPOSER |
267 GraphicBuffer::USAGE_SW_READ_OFTEN |
268 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
269 "AidlComposer");
270 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
271 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
272 return;
273 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700274 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700275 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000276 if (getLayerLifecycleBatchCommand()) {
277 mEnableLayerCommandBatchingFlag =
278 FlagManager::getInstance().enable_layer_command_batching();
279 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700280 ALOGI("Loaded AIDL composer3 HAL service");
281}
282
283AidlComposer::~AidlComposer() = default;
284
Ady Abraham4d211cf2021-12-14 16:19:03 -0800285bool AidlComposer::isSupported(OptionalFeature feature) const {
286 switch (feature) {
287 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800288 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800289 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000290 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000291 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800292 return true;
293 }
294}
295
ramindani19919ff2023-12-07 11:27:06 -0800296bool AidlComposer::isVrrSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800297 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700298}
299
Ady Abrahamde549d42022-01-26 19:19:17 -0800300std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700301 std::vector<Capability> capabilities;
302 const auto status = mAidlComposer->getCapabilities(&capabilities);
303 if (!status.isOk()) {
304 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
305 return {};
306 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800307 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700308}
309
310std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800311 int pipefds[2];
312 int result = pipe(pipefds);
313 if (result < 0) {
314 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700315 return {};
316 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800317
318 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800319 // Use other thread to read pipe to prevent
320 // pipe is full, making HWC be blocked in writing.
321 std::thread t([&]() {
322 base::ReadFdToString(pipefds[0], &str);
323 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800324 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
325 // Close the write-end of the pipe to make sure that when reading from the
326 // read-end we will get eof instead of blocking forever
327 close(pipefds[1]);
328
yihsing.shen58847c52022-09-23 15:39:30 +0800329 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800330 ALOGE("dumpDebugInfo: dump failed: %d", status);
331 }
332
yihsing.shen58847c52022-09-23 15:39:30 +0800333 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800334 close(pipefds[0]);
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800335
336 std::string hash;
337 mAidlComposer->getInterfaceHash(&hash);
338 return std::string(mAidlComposer->descriptor) +
339 " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700340}
341
Yichi Chen3401b562022-01-17 15:42:35 +0800342void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700343 if (mAidlComposerCallback) {
344 ALOGE("Callback already registered");
345 }
Yichi Chen3401b562022-01-17 15:42:35 +0800346
Ady Abraham9fc28052021-10-14 17:21:38 -0700347 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
shuide chenf1111e12024-01-03 18:41:38 +0800348
349 ndk::SpAIBinder binder = mAidlComposerCallback->asBinder();
350 AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_FIFO, 2);
Ady Abrahame7385f72021-09-05 00:54:25 -0700351
352 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
353 if (!status.isOk()) {
354 ALOGE("registerCallback failed %s", status.getDescription().c_str());
355 }
356}
357
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400358Error AidlComposer::executeCommands(Display display) {
359 mMutex.lock_shared();
360 auto error = execute(display);
361 mMutex.unlock_shared();
362 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700363}
364
365uint32_t AidlComposer::getMaxVirtualDisplayCount() {
366 int32_t count = 0;
367 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
368 if (!status.isOk()) {
369 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
370 return 0;
371 }
372 return static_cast<uint32_t>(count);
373}
374
375Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
376 Display* outDisplay) {
377 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
378 const int32_t bufferSlotCount = 1;
379 VirtualDisplay virtualDisplay;
380 const auto status =
381 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
382 static_cast<int32_t>(height),
383 static_cast<AidlPixelFormat>(*format),
384 bufferSlotCount, &virtualDisplay);
385
386 if (!status.isOk()) {
387 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
388 return static_cast<Error>(status.getServiceSpecificError());
389 }
390
391 *outDisplay = translate<Display>(virtualDisplay.display);
392 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400393 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700394 return Error::NONE;
395}
396
397Error AidlComposer::destroyVirtualDisplay(Display display) {
398 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
399 if (!status.isOk()) {
400 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
401 return static_cast<Error>(status.getServiceSpecificError());
402 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400403 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700404 return Error::NONE;
405}
406
407Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400408 Error error = Error::NONE;
409 mMutex.lock_shared();
410 if (auto writer = getWriter(display)) {
411 writer->get().acceptDisplayChanges(translate<int64_t>(display));
412 } else {
413 error = Error::BAD_DISPLAY;
414 }
415 mMutex.unlock_shared();
416 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700417}
418
419Error AidlComposer::createLayer(Display display, Layer* outLayer) {
420 int64_t layer;
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000421 Error error = Error::NONE;
422 if (!mEnableLayerCommandBatchingFlag) {
423 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
424 kMaxLayerBufferCount, &layer);
425 if (!status.isOk()) {
426 ALOGE("createLayer failed %s", status.getDescription().c_str());
427 return static_cast<Error>(status.getServiceSpecificError());
428 }
429 } else {
430 // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
431 // Add this as a new displayCommand in execute command.
432 // return the SF generated layerID instead of calling HWC
433 layer = mLayerID++;
434 mMutex.lock_shared();
435 if (auto writer = getWriter(display)) {
436 writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
437 translate<int64_t>(layer),
438 LayerLifecycleBatchCommandType::CREATE);
439 writer->get().setNewBufferSlotCount(translate<int64_t>(display),
440 translate<int64_t>(layer), kMaxLayerBufferCount);
441 } else {
442 error = Error::BAD_DISPLAY;
443 }
444 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700445 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700446 *outLayer = translate<Layer>(layer);
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000447 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700448}
449
450Error AidlComposer::destroyLayer(Display display, Layer layer) {
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000451 Error error = Error::NONE;
452 if (!mEnableLayerCommandBatchingFlag) {
453 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
454 translate<int64_t>(layer));
455 if (!status.isOk()) {
456 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
457 return static_cast<Error>(status.getServiceSpecificError());
458 }
459 } else {
460 mMutex.lock_shared();
461 if (auto writer = getWriter(display)) {
462 writer->get()
463 .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
464 translate<int64_t>(layer),
465 LayerLifecycleBatchCommandType::DESTROY);
466 } else {
467 error = Error::BAD_DISPLAY;
468 }
469 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700470 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000471
472 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700473}
474
475Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
476 int32_t config;
477 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
478 if (!status.isOk()) {
479 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
480 return static_cast<Error>(status.getServiceSpecificError());
481 }
482 *outConfig = translate<Config>(config);
483 return Error::NONE;
484}
485
486Error AidlComposer::getChangedCompositionTypes(
487 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500488 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400489 std::vector<ChangedCompositionLayer> changedLayers;
490 Error error = Error::NONE;
491 {
492 mMutex.lock_shared();
493 if (auto reader = getReader(display)) {
494 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
495 } else {
496 error = Error::BAD_DISPLAY;
497 }
498 mMutex.unlock_shared();
499 }
Ady Abrahamde792782021-12-20 10:00:49 -0800500 outLayers->reserve(changedLayers.size());
501 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800502
Ady Abrahamde792782021-12-20 10:00:49 -0800503 for (const auto& layer : changedLayers) {
504 outLayers->emplace_back(translate<Layer>(layer.layer));
505 outTypes->emplace_back(layer.composition);
506 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400507 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700508}
509
510Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
511 std::vector<AidlColorMode> modes;
512 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
513 if (!status.isOk()) {
514 ALOGE("getColorModes failed %s", status.getDescription().c_str());
515 return static_cast<Error>(status.getServiceSpecificError());
516 }
517 *outModes = translate<ColorMode>(modes);
518 return Error::NONE;
519}
520
521Error AidlComposer::getDisplayAttribute(Display display, Config config,
522 IComposerClient::Attribute attribute, int32_t* outValue) {
Lloyd Pique62757762024-11-26 12:31:25 -0800523#pragma clang diagnostic push
524#pragma clang diagnostic ignored "-Wdeprecated-declarations"
Ady Abrahame7385f72021-09-05 00:54:25 -0700525 const auto status =
526 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
527 translate<int32_t>(config),
528 static_cast<AidlDisplayAttribute>(attribute),
529 outValue);
Lloyd Pique62757762024-11-26 12:31:25 -0800530#pragma clang diagnostic pop
531
Ady Abrahame7385f72021-09-05 00:54:25 -0700532 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;
Lloyd Pique62757762024-11-26 12:31:25 -0800541
542#pragma clang diagnostic push
543#pragma clang diagnostic ignored "-Wdeprecated-declarations"
Ady Abrahame7385f72021-09-05 00:54:25 -0700544 const auto status =
545 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
Lloyd Pique62757762024-11-26 12:31:25 -0800546#pragma clang diagnostic pop
547
Ady Abrahame7385f72021-09-05 00:54:25 -0700548 if (!status.isOk()) {
549 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
550 return static_cast<Error>(status.getServiceSpecificError());
551 }
552 *outConfigs = translate<Config>(configs);
553 return Error::NONE;
554}
555
ramindani263a3f12023-07-18 20:44:49 -0700556Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700557 std::vector<DisplayConfiguration>* outConfigs) {
558 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700559 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
560 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700561 if (!status.isOk()) {
562 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
563 return static_cast<Error>(status.getServiceSpecificError());
564 }
565
566 return Error::NONE;
567}
568
Ady Abrahame7385f72021-09-05 00:54:25 -0700569Error AidlComposer::getDisplayName(Display display, std::string* outName) {
570 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
571 if (!status.isOk()) {
572 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
573 return static_cast<Error>(status.getServiceSpecificError());
574 }
575 return Error::NONE;
576}
577
578Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
579 std::vector<Layer>* outLayers,
580 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400581 Error error = Error::NONE;
582 DisplayRequest displayRequests;
583 {
584 mMutex.lock_shared();
585 if (auto reader = getReader(display)) {
586 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
587 } else {
588 error = Error::BAD_DISPLAY;
589 }
590 mMutex.unlock_shared();
591 }
Ady Abrahamde792782021-12-20 10:00:49 -0800592 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
593 outLayers->reserve(displayRequests.layerRequests.size());
594 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
595
596 for (const auto& layer : displayRequests.layerRequests) {
597 outLayers->emplace_back(translate<Layer>(layer.layer));
598 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
599 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400600 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700601}
602
603Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800604 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700605 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800606 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700607 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800608 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700609 return static_cast<Error>(status.getServiceSpecificError());
610 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800611 *outSupport = std::find(capabilities.begin(), capabilities.end(),
612 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700613 return Error::NONE;
614}
615
ramindani32cf0602022-03-02 02:30:29 +0000616Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
617 std::vector<AidlDisplayCapability> capabilities;
618 const auto status =
619 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
620 if (!status.isOk()) {
621 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
622 return static_cast<Error>(status.getServiceSpecificError());
623 }
624 *outSupport = std::find(capabilities.begin(), capabilities.end(),
625 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
626 return Error::NONE;
627}
628
Ady Abrahame7385f72021-09-05 00:54:25 -0700629Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
630 float* outMaxLuminance, float* outMaxAverageLuminance,
631 float* outMinLuminance) {
632 AidlHdrCapabilities capabilities;
633 const auto status =
634 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
635 if (!status.isOk()) {
636 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
637 return static_cast<Error>(status.getServiceSpecificError());
638 }
639
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100640 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700641 *outMaxLuminance = capabilities.maxLuminance;
642 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
643 *outMinLuminance = capabilities.minLuminance;
644 return Error::NONE;
645}
646
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000647bool AidlComposer::getLayerLifecycleBatchCommand() {
648 std::vector<Capability> capabilities = getCapabilities();
649 bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
650 Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
651 return hasCapability;
652}
653
Sally Qibb866c12022-10-17 11:31:20 -0700654Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
655 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
656 if (!status.isOk()) {
657 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
658 return static_cast<Error>(status.getServiceSpecificError());
659 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700660 return Error::NONE;
661}
662
Ady Abrahame7385f72021-09-05 00:54:25 -0700663Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
664 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400665 Error error = Error::NONE;
666 std::vector<ReleaseFences::Layer> fences;
667 {
668 mMutex.lock_shared();
669 if (auto reader = getReader(display)) {
670 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
671 } else {
672 error = Error::BAD_DISPLAY;
673 }
674 mMutex.unlock_shared();
675 }
Ady Abrahamde792782021-12-20 10:00:49 -0800676 outLayers->reserve(fences.size());
677 outReleaseFences->reserve(fences.size());
678
679 for (auto& fence : fences) {
680 outLayers->emplace_back(translate<Layer>(fence.layer));
681 // take ownership
682 const int fenceOwner = fence.fence.get();
683 *fence.fence.getR() = -1;
684 outReleaseFences->emplace_back(fenceOwner);
685 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400686 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700687}
688
689Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500690 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000691 SFTRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500692
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400693 Error error = Error::NONE;
694 mMutex.lock_shared();
695 auto writer = getWriter(display);
696 auto reader = getReader(display);
697 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500698 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400699 error = execute(display);
700 } else {
701 error = Error::BAD_DISPLAY;
702 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700703
Ady Abrahame7385f72021-09-05 00:54:25 -0700704 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400705 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700706 return error;
707 }
708
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500709 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400710 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800711 // take ownership
712 *outPresentFence = fence.get();
713 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700714 return Error::NONE;
715}
716
717Error AidlComposer::setActiveConfig(Display display, Config config) {
718 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
719 translate<int32_t>(config));
720 if (!status.isOk()) {
721 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
722 return static_cast<Error>(status.getServiceSpecificError());
723 }
724 return Error::NONE;
725}
726
727Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
728 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000729 const std::vector<IComposerClient::Rect>& damage,
730 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700731 const native_handle_t* handle = nullptr;
732 if (target.get()) {
733 handle = target->getNativeBuffer()->handle;
734 }
735
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400736 Error error = Error::NONE;
737 mMutex.lock_shared();
738 if (auto writer = getWriter(display)) {
739 writer->get()
740 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
741 translate<aidl::android::hardware::graphics::common::Dataspace>(
742 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000743 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400744 } else {
745 error = Error::BAD_DISPLAY;
746 }
747 mMutex.unlock_shared();
748 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700749}
750
751Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
752 const auto status =
753 mAidlComposerClient->setColorMode(translate<int64_t>(display),
754 translate<AidlColorMode>(mode),
755 translate<AidlRenderIntent>(renderIntent));
756 if (!status.isOk()) {
757 ALOGE("setColorMode failed %s", status.getDescription().c_str());
758 return static_cast<Error>(status.getServiceSpecificError());
759 }
760 return Error::NONE;
761}
762
Ady Abrahamdc011a92021-12-21 14:06:44 -0800763Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400764 auto error = Error::NONE;
765 mMutex.lock_shared();
766 if (auto writer = getWriter(display)) {
767 writer->get().setColorTransform(translate<int64_t>(display), matrix);
768 } else {
769 error = Error::BAD_DISPLAY;
770 }
771 mMutex.unlock_shared();
772 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700773}
774
775Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
776 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400777 auto error = Error::NONE;
778 mMutex.lock_shared();
779 if (auto writer = getWriter(display)) {
780 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
781 } else {
782 error = Error::BAD_DISPLAY;
783 }
784 mMutex.unlock_shared();
785 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700786}
787
788Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
789 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
790 translate<PowerMode>(mode));
791 if (!status.isOk()) {
792 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
793 return static_cast<Error>(status.getServiceSpecificError());
794 }
795 return Error::NONE;
796}
797
798Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
799 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
800 const auto status =
801 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
802 if (!status.isOk()) {
803 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
804 return static_cast<Error>(status.getServiceSpecificError());
805 }
806 return Error::NONE;
807}
808
809Error AidlComposer::setClientTargetSlotCount(Display display) {
810 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
811 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
812 bufferSlotCount);
813 if (!status.isOk()) {
814 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
815 return static_cast<Error>(status.getServiceSpecificError());
816 }
817 return Error::NONE;
818}
819
Ady Abraham43065bd2021-12-10 17:22:15 -0800820Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700821 int32_t frameIntervalNs, uint32_t* outNumTypes,
822 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400823 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000824 SFTRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500825
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400826 Error error = Error::NONE;
827 mMutex.lock_shared();
828 auto writer = getWriter(display);
829 auto reader = getReader(display);
830 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700831 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
832 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400833 error = execute(display);
834 } else {
835 error = Error::BAD_DISPLAY;
836 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700837
Ady Abrahame7385f72021-09-05 00:54:25 -0700838 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400839 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700840 return error;
841 }
842
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400843 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700844
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400845 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700846 return Error::NONE;
847}
848
Ady Abraham43065bd2021-12-10 17:22:15 -0800849Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700850 int32_t frameIntervalNs, uint32_t* outNumTypes,
851 uint32_t* outNumRequests, int* outPresentFence,
852 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400853 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000854 SFTRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500855
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400856 Error error = Error::NONE;
857 mMutex.lock_shared();
858 auto writer = getWriter(display);
859 auto reader = getReader(display);
860 if (writer && reader) {
861 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700862 ClockMonotonicTimestamp{expectedPresentTime},
863 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400864 error = execute(display);
865 } else {
866 error = Error::BAD_DISPLAY;
867 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700868
Ady Abrahame7385f72021-09-05 00:54:25 -0700869 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400870 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700871 return error;
872 }
873
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400874 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800875 if (!result.has_value()) {
876 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400877 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800878 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700879 }
880
Ady Abrahamde792782021-12-20 10:00:49 -0800881 *state = translate<uint32_t>(*result);
882
883 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400884 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800885 // take ownership
886 *outPresentFence = fence.get();
887 *fence.getR() = -1;
888 }
889
890 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400891 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700892 }
893
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400894 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700895 return Error::NONE;
896}
897
898Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400899 Error error = Error::NONE;
900 mMutex.lock_shared();
901 if (auto writer = getWriter(display)) {
902 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
903 x, y);
904 } else {
905 error = Error::BAD_DISPLAY;
906 }
907 mMutex.unlock_shared();
908 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700909}
910
911Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
912 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700913 const native_handle_t* handle = nullptr;
914 if (buffer.get()) {
915 handle = buffer->getNativeBuffer()->handle;
916 }
917
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400918 Error error = Error::NONE;
919 mMutex.lock_shared();
920 if (auto writer = getWriter(display)) {
921 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
922 handle, acquireFence);
923 } else {
924 error = Error::BAD_DISPLAY;
925 }
926 mMutex.unlock_shared();
927 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700928}
929
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700930Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
931 const std::vector<uint32_t>& slotsToClear,
932 uint32_t activeBufferSlot) {
933 if (slotsToClear.empty()) {
934 return Error::NONE;
935 }
936
Brian Lindahl90553da2022-12-06 13:36:30 -0700937 Error error = Error::NONE;
938 mMutex.lock_shared();
939 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700940 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700941 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
942 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600943 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
944 // placeholder buffer, using the slot that needs to cleared... tricky.
945 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700946 for (uint32_t slot : slotsToClear) {
947 // Don't clear the active buffer slot because we need to restore the active buffer
948 // after clearing the requested buffer slots with a placeholder buffer.
949 if (slot != activeBufferSlot) {
950 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
951 translate<int64_t>(layer), slot,
952 mClearSlotBuffer->handle,
953 /*fence*/ -1);
954 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700955 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700956 // Since we clear buffers by setting them to a placeholder buffer, we want to make
957 // sure that the last setLayerBuffer command is sent with the currently active
958 // buffer, not the placeholder buffer, so that there is no perceptual change when
959 // buffers are discarded.
960 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
961 translate<int64_t>(layer), activeBufferSlot,
962 // The active buffer is still cached in
963 // its slot and doesn't need a fence.
964 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700965 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700966 } else {
967 error = Error::BAD_DISPLAY;
968 }
969 mMutex.unlock_shared();
970 return error;
971}
972
Ady Abrahame7385f72021-09-05 00:54:25 -0700973Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
974 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400975 Error error = Error::NONE;
976 mMutex.lock_shared();
977 if (auto writer = getWriter(display)) {
978 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
979 translate<AidlRect>(damage));
980 } else {
981 error = Error::BAD_DISPLAY;
982 }
983 mMutex.unlock_shared();
984 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700985}
986
987Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
988 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400989 Error error = Error::NONE;
990 mMutex.lock_shared();
991 if (auto writer = getWriter(display)) {
992 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
993 translate<BlendMode>(mode));
994 } else {
995 error = Error::BAD_DISPLAY;
996 }
997 mMutex.unlock_shared();
998 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700999}
1000
Ady Abraham6e60b142022-01-06 18:10:35 -08001001Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001002 Error error = Error::NONE;
1003 mMutex.lock_shared();
1004 if (auto writer = getWriter(display)) {
1005 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
1006 } else {
1007 error = Error::BAD_DISPLAY;
1008 }
1009 mMutex.unlock_shared();
1010 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001011}
1012
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001013Error AidlComposer::setLayerCompositionType(
1014 Display display, Layer layer,
1015 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001016 Error error = Error::NONE;
1017 mMutex.lock_shared();
1018 if (auto writer = getWriter(display)) {
1019 writer->get().setLayerCompositionType(translate<int64_t>(display),
1020 translate<int64_t>(layer), type);
1021 } else {
1022 error = Error::BAD_DISPLAY;
1023 }
1024 mMutex.unlock_shared();
1025 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001026}
1027
1028Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001029 Error error = Error::NONE;
1030 mMutex.lock_shared();
1031 if (auto writer = getWriter(display)) {
1032 writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1033 translate<AidlDataspace>(dataspace));
1034 } else {
1035 error = Error::BAD_DISPLAY;
1036 }
1037 mMutex.unlock_shared();
1038 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001039}
1040
1041Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
1042 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001043 Error error = Error::NONE;
1044 mMutex.lock_shared();
1045 if (auto writer = getWriter(display)) {
1046 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1047 translate<AidlRect>(frame));
1048 } else {
1049 error = Error::BAD_DISPLAY;
1050 }
1051 mMutex.unlock_shared();
1052 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001053}
1054
1055Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001056 Error error = Error::NONE;
1057 mMutex.lock_shared();
1058 if (auto writer = getWriter(display)) {
1059 writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1060 alpha);
1061 } else {
1062 error = Error::BAD_DISPLAY;
1063 }
1064 mMutex.unlock_shared();
1065 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001066}
1067
1068Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
1069 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001070 Error error = Error::NONE;
1071 mMutex.lock_shared();
1072 if (auto writer = getWriter(display)) {
1073 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1074 stream);
1075 } else {
1076 error = Error::BAD_DISPLAY;
1077 }
1078 mMutex.unlock_shared();
1079 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001080}
1081
1082Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1083 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001084 Error error = Error::NONE;
1085 mMutex.lock_shared();
1086 if (auto writer = getWriter(display)) {
1087 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1088 translate<AidlFRect>(crop));
1089 } else {
1090 error = Error::BAD_DISPLAY;
1091 }
1092 mMutex.unlock_shared();
1093 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001094}
1095
1096Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001097 Error error = Error::NONE;
1098 mMutex.lock_shared();
1099 if (auto writer = getWriter(display)) {
1100 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1101 translate<AidlTransform>(transform));
1102 } else {
1103 error = Error::BAD_DISPLAY;
1104 }
1105 mMutex.unlock_shared();
1106 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001107}
1108
1109Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1110 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001111 Error error = Error::NONE;
1112 mMutex.lock_shared();
1113 if (auto writer = getWriter(display)) {
1114 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1115 translate<AidlRect>(visible));
1116 } else {
1117 error = Error::BAD_DISPLAY;
1118 }
1119 mMutex.unlock_shared();
1120 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001121}
1122
1123Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001124 Error error = Error::NONE;
1125 mMutex.lock_shared();
1126 if (auto writer = getWriter(display)) {
1127 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1128 } else {
1129 error = Error::BAD_DISPLAY;
1130 }
1131 mMutex.unlock_shared();
1132 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001133}
1134
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001135Error AidlComposer::execute(Display display) {
1136 auto writer = getWriter(display);
1137 auto reader = getReader(display);
1138 if (!writer || !reader) {
1139 return Error::BAD_DISPLAY;
1140 }
1141
Huihong Luoe7382c12023-04-21 20:24:32 +00001142 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001143 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001144 return Error::NONE;
1145 }
1146
Ady Abrahamde792782021-12-20 10:00:49 -08001147 { // scope for results
1148 std::vector<CommandResultPayload> results;
1149 auto status = mAidlComposerClient->executeCommands(commands, &results);
1150 if (!status.isOk()) {
1151 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1152 return static_cast<Error>(status.getServiceSpecificError());
1153 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001154
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001155 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001156 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001157 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001158 Error error = Error::NONE;
1159 for (const auto& cmdErr : commandErrors) {
1160 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1161 if (index < 0 || index >= commands.size()) {
1162 ALOGE("invalid command index %zu", index);
1163 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001164 }
1165
Ady Abrahama6388c02021-11-11 21:11:51 -08001166 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001167 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1168 error = translate<Error>(cmdErr.errorCode);
1169 } else {
1170 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1171 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001172 }
1173 }
1174
Ady Abrahame7385f72021-09-05 00:54:25 -07001175 return error;
1176}
1177
1178Error AidlComposer::setLayerPerFrameMetadata(
1179 Display display, Layer layer,
1180 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001181 Error error = Error::NONE;
1182 mMutex.lock_shared();
1183 if (auto writer = getWriter(display)) {
1184 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1185 translate<int64_t>(layer),
1186 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1187 } else {
1188 error = Error::BAD_DISPLAY;
1189 }
1190 mMutex.unlock_shared();
1191 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001192}
1193
1194std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1195 Display display) {
1196 std::vector<AidlPerFrameMetadataKey> keys;
1197 const auto status =
1198 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1199 if (!status.isOk()) {
1200 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1201 return {};
1202 }
1203 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1204}
1205
1206Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1207 std::vector<RenderIntent>* outRenderIntents) {
1208 std::vector<AidlRenderIntent> renderIntents;
1209 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1210 translate<AidlColorMode>(colorMode),
1211 &renderIntents);
1212 if (!status.isOk()) {
1213 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1214 return static_cast<Error>(status.getServiceSpecificError());
1215 }
1216 *outRenderIntents = translate<RenderIntent>(renderIntents);
1217 return Error::NONE;
1218}
1219
1220Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1221 std::vector<float> matrix;
1222 const auto status =
1223 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1224 &matrix);
1225 if (!status.isOk()) {
1226 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1227 return static_cast<Error>(status.getServiceSpecificError());
1228 }
1229 *outMatrix = makeMat4(matrix);
1230 return Error::NONE;
1231}
1232
1233Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1234 std::vector<uint8_t>* outData) {
1235 AidlDisplayIdentification displayIdentification;
1236 const auto status =
1237 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1238 &displayIdentification);
1239 if (!status.isOk()) {
1240 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1241 return static_cast<Error>(status.getServiceSpecificError());
1242 }
1243
1244 *outPort = static_cast<uint8_t>(displayIdentification.port);
1245 *outData = displayIdentification.data;
1246
1247 return Error::NONE;
1248}
1249
1250Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001251 Error error = Error::NONE;
1252 mMutex.lock_shared();
1253 if (auto writer = getWriter(display)) {
1254 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1255 matrix);
1256 } else {
1257 error = Error::BAD_DISPLAY;
1258 }
1259 mMutex.unlock_shared();
1260 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001261}
1262
1263Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1264 Dataspace* outDataspace,
1265 uint8_t* outComponentMask) {
1266 if (!outFormat || !outDataspace || !outComponentMask) {
1267 return Error::BAD_PARAMETER;
1268 }
1269
1270 AidlDisplayContentSamplingAttributes attributes;
1271 const auto status =
1272 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1273 &attributes);
1274 if (!status.isOk()) {
1275 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1276 return static_cast<Error>(status.getServiceSpecificError());
1277 }
1278
1279 *outFormat = translate<PixelFormat>(attributes.format);
1280 *outDataspace = translate<Dataspace>(attributes.dataspace);
1281 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1282 return Error::NONE;
1283}
1284
1285Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1286 uint8_t componentMask, uint64_t maxFrames) {
1287 const auto status =
1288 mAidlComposerClient
1289 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1290 static_cast<AidlFormatColorComponent>(
1291 componentMask),
1292 static_cast<int64_t>(maxFrames));
1293 if (!status.isOk()) {
1294 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1295 return static_cast<Error>(status.getServiceSpecificError());
1296 }
1297 return Error::NONE;
1298}
1299
1300Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1301 uint64_t timestamp, DisplayedFrameStats* outStats) {
1302 if (!outStats) {
1303 return Error::BAD_PARAMETER;
1304 }
1305
1306 AidlDisplayContentSample sample;
1307 const auto status =
1308 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1309 static_cast<int64_t>(maxFrames),
1310 static_cast<int64_t>(timestamp),
1311 &sample);
1312 if (!status.isOk()) {
1313 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1314 return static_cast<Error>(status.getServiceSpecificError());
1315 }
1316 *outStats = translate<DisplayedFrameStats>(sample);
1317 return Error::NONE;
1318}
1319
1320Error AidlComposer::setLayerPerFrameMetadataBlobs(
1321 Display display, Layer layer,
1322 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001323 Error error = Error::NONE;
1324 mMutex.lock_shared();
1325 if (auto writer = getWriter(display)) {
1326 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1327 translate<int64_t>(layer),
1328 translate<AidlPerFrameMetadataBlob>(metadata));
1329 } else {
1330 error = Error::BAD_DISPLAY;
1331 }
1332 mMutex.unlock_shared();
1333 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001334}
1335
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001336Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001337 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001338 Error error = Error::NONE;
1339 mMutex.lock_shared();
1340 if (auto writer = getWriter(display)) {
1341 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001342
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001343 if (options.applyImmediately) {
1344 error = execute(display);
1345 mMutex.unlock_shared();
1346 return error;
1347 }
1348 } else {
1349 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001350 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001351 mMutex.unlock_shared();
1352 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001353}
1354
1355Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001356 std::vector<AidlDisplayCapability>* outCapabilities) {
1357 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1358 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001359 if (!status.isOk()) {
1360 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001361 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001362 return static_cast<Error>(status.getServiceSpecificError());
1363 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001364 return Error::NONE;
1365}
1366
1367V2_4::Error AidlComposer::getDisplayConnectionType(
1368 Display display, IComposerClient::DisplayConnectionType* outType) {
1369 AidlDisplayConnectionType type;
1370 const auto status =
1371 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1372 if (!status.isOk()) {
1373 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1374 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1375 }
1376 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1377 return V2_4::Error::NONE;
1378}
1379
1380V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1381 int32_t vsyncPeriod;
1382 const auto status =
1383 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1384 if (!status.isOk()) {
1385 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1386 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1387 }
1388 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1389 return V2_4::Error::NONE;
1390}
1391
Manasi Navarefc2a4a72024-11-12 23:59:21 +00001392Error AidlComposer::setActiveConfigWithConstraints(
Ady Abrahame7385f72021-09-05 00:54:25 -07001393 Display display, Config config,
1394 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1395 VsyncPeriodChangeTimeline* outTimeline) {
1396 AidlVsyncPeriodChangeTimeline timeline;
1397 const auto status =
1398 mAidlComposerClient
1399 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1400 translate<int32_t>(config),
1401 translate<AidlVsyncPeriodChangeConstraints>(
1402 vsyncPeriodChangeConstraints),
1403 &timeline);
1404 if (!status.isOk()) {
1405 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
Manasi Navarefc2a4a72024-11-12 23:59:21 +00001406 return static_cast<Error>(status.getServiceSpecificError());
Ady Abrahame7385f72021-09-05 00:54:25 -07001407 }
1408 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
Manasi Navarefc2a4a72024-11-12 23:59:21 +00001409 return Error::NONE;
Ady Abrahame7385f72021-09-05 00:54:25 -07001410}
1411
1412V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1413 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1414 if (!status.isOk()) {
1415 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1416 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1417 }
1418 return V2_4::Error::NONE;
1419}
1420
1421V2_4::Error AidlComposer::getSupportedContentTypes(
1422 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1423 std::vector<AidlContentType> types;
1424 const auto status =
1425 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1426 if (!status.isOk()) {
1427 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1428 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1429 }
1430 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1431 return V2_4::Error::NONE;
1432}
1433
1434V2_4::Error AidlComposer::setContentType(Display display,
1435 IComposerClient::ContentType contentType) {
1436 const auto status =
1437 mAidlComposerClient->setContentType(translate<int64_t>(display),
1438 translate<AidlContentType>(contentType));
1439 if (!status.isOk()) {
1440 ALOGE("setContentType failed %s", status.getDescription().c_str());
1441 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1442 }
1443 return V2_4::Error::NONE;
1444}
1445
Ady Abraham3f976752021-12-20 16:17:50 -08001446V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1447 const std::vector<uint8_t>&) {
1448 // There are no users for this API. See b/209691612.
1449 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001450}
1451
1452V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001453 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1454 // There are no users for this API. See b/209691612.
1455 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001456}
1457
Kriti Dang7defaf32021-11-15 11:55:43 +01001458Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1459 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1460 translate<int32_t>(config));
1461 if (!status.isOk()) {
1462 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1463 return static_cast<Error>(status.getServiceSpecificError());
1464 }
1465 return Error::NONE;
1466}
1467
1468Error AidlComposer::clearBootDisplayConfig(Display display) {
1469 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1470 if (!status.isOk()) {
1471 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1472 return static_cast<Error>(status.getServiceSpecificError());
1473 }
1474 return Error::NONE;
1475}
1476
1477Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1478 int32_t displayConfig;
1479 const auto status =
1480 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1481 &displayConfig);
1482 if (!status.isOk()) {
1483 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1484 return static_cast<Error>(status.getServiceSpecificError());
1485 }
1486 *config = translate<uint32_t>(displayConfig);
1487 return Error::NONE;
1488}
1489
Kriti Dang674b9372022-11-18 10:58:44 +01001490Error AidlComposer::getHdrConversionCapabilities(
1491 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1492 const auto status =
1493 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1494 if (!status.isOk()) {
1495 hdrConversionCapabilities = {};
1496 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1497 return static_cast<Error>(status.getServiceSpecificError());
1498 }
1499 return Error::NONE;
1500}
1501
Kriti Dangd432bb52023-02-09 18:21:04 +01001502Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1503 Hdr* outPreferredHdrOutputType) {
1504 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1505 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001506 if (!status.isOk()) {
1507 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1508 return static_cast<Error>(status.getServiceSpecificError());
1509 }
1510 return Error::NONE;
1511}
1512
ramindanib2158ee2023-02-13 20:29:59 -08001513Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1514 const auto status =
1515 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1516 displayId),
1517 enabled);
1518 if (!status.isOk()) {
1519 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1520 status.getDescription().c_str());
1521 return static_cast<Error>(status.getServiceSpecificError());
1522 }
1523 return Error::NONE;
1524}
1525
ramindani3acaaf52023-09-25 10:31:27 -07001526Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1527 int32_t frameIntervalNs) {
1528 const auto status =
1529 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1530 ClockMonotonicTimestamp{expectedPresentTime},
1531 frameIntervalNs);
1532
1533 if (!status.isOk()) {
1534 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1535 return static_cast<Error>(status.getServiceSpecificError());
1536 }
1537 return Error::NONE;
1538}
1539
Ady Abrahame7385f72021-09-05 00:54:25 -07001540Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001541 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001542 Error error = Error::NONE;
1543 mMutex.lock_shared();
1544 if (auto reader = getReader(display)) {
1545 *outClientTargetProperty =
1546 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1547 } else {
1548 error = Error::BAD_DISPLAY;
1549 }
1550 mMutex.unlock_shared();
1551 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001552}
1553
Sally Qi95f669a2024-08-27 11:31:42 -07001554Error AidlComposer::getRequestedLuts(Display display, std::vector<Layer>* outLayers,
1555 std::vector<DisplayLuts::LayerLut>* outLuts) {
Sally Qi492cec32024-06-28 14:34:47 -07001556 Error error = Error::NONE;
1557 mMutex.lock_shared();
1558 if (auto reader = getReader(display)) {
1559 *outLuts = reader->get().takeDisplayLuts(translate<int64_t>(display));
1560 } else {
1561 error = Error::BAD_DISPLAY;
1562 }
1563 mMutex.unlock_shared();
Sally Qi95f669a2024-08-27 11:31:42 -07001564
1565 outLayers->reserve(outLuts->size());
1566 for (const auto& layerLut : *outLuts) {
1567 outLayers->emplace_back(translate<Layer>(layerLut.layer));
1568 }
Sally Qi492cec32024-06-28 14:34:47 -07001569 return error;
1570}
1571
Sally Qi0abc4a52024-09-26 16:13:06 -07001572Error AidlComposer::setLayerLuts(Display display, Layer layer, Luts& luts) {
Sally Qi11dcd582024-08-16 18:11:27 -07001573 Error error = Error::NONE;
1574 mMutex.lock_shared();
1575 if (auto writer = getWriter(display)) {
1576 writer->get().setLayerLuts(translate<int64_t>(display), translate<int64_t>(layer), luts);
1577 } else {
1578 error = Error::BAD_DISPLAY;
1579 }
1580 mMutex.unlock_shared();
1581 return error;
1582}
1583
Alec Mouri6da0e272022-02-07 12:45:57 -08001584Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001585 Error error = Error::NONE;
1586 mMutex.lock_shared();
1587 if (auto writer = getWriter(display)) {
1588 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1589 brightness);
1590 } else {
1591 error = Error::BAD_DISPLAY;
1592 }
1593 mMutex.unlock_shared();
1594 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001595}
1596
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001597Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1598 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001599 Error error = Error::NONE;
1600 mMutex.lock_shared();
1601 if (auto writer = getWriter(display)) {
1602 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1603 translate<AidlRect>(blocking));
1604 } else {
1605 error = Error::BAD_DISPLAY;
1606 }
1607 mMutex.unlock_shared();
1608 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001609}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001610
1611Error AidlComposer::getDisplayDecorationSupport(Display display,
1612 std::optional<DisplayDecorationSupport>* support) {
1613 const auto status =
1614 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1615 if (!status.isOk()) {
1616 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1617 support->reset();
1618 return static_cast<Error>(status.getServiceSpecificError());
1619 }
1620 return Error::NONE;
1621}
ramindani32cf0602022-03-02 02:30:29 +00001622
1623Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1624 const auto status =
1625 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1626 translate<int32_t>(timeout.count()));
1627 if (!status.isOk()) {
1628 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1629 return static_cast<Error>(status.getServiceSpecificError());
1630 }
1631 return Error::NONE;
1632}
1633
ramindani06e518e2022-03-14 18:47:53 +00001634Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1635 AidlTransform* outDisplayOrientation) {
1636 const auto status =
1637 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1638 outDisplayOrientation);
1639 if (!status.isOk()) {
1640 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1641 return static_cast<Error>(status.getServiceSpecificError());
1642 }
1643 return Error::NONE;
1644}
1645
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -06001646Error AidlComposer::getMaxLayerPictureProfiles(Display display, int32_t* outMaxProfiles) {
1647 const auto status = mAidlComposerClient->getMaxLayerPictureProfiles(translate<int64_t>(display),
1648 outMaxProfiles);
1649 if (!status.isOk()) {
1650 ALOGE("getMaxLayerPictureProfiles failed %s", status.getDescription().c_str());
1651 return static_cast<Error>(status.getServiceSpecificError());
1652 }
1653 return Error::NONE;
1654}
1655
1656Error AidlComposer::setDisplayPictureProfileId(Display display, PictureProfileId id) {
1657 Error error = Error::NONE;
1658 mMutex.lock_shared();
1659 if (auto writer = getWriter(display)) {
1660 writer->get().setDisplayPictureProfileId(translate<int64_t>(display), id);
1661 } else {
1662 error = Error::BAD_DISPLAY;
1663 }
1664 mMutex.unlock_shared();
1665 return error;
1666}
1667
1668Error AidlComposer::setLayerPictureProfileId(Display display, Layer layer, PictureProfileId id) {
1669 Error error = Error::NONE;
1670 mMutex.lock_shared();
1671 if (auto writer = getWriter(display)) {
1672 writer->get().setLayerPictureProfileId(translate<int64_t>(display),
1673 translate<int64_t>(layer), id);
1674 } else {
1675 error = Error::BAD_DISPLAY;
1676 }
1677 mMutex.unlock_shared();
1678 return error;
1679}
1680
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001681ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1682 REQUIRES_SHARED(mMutex) {
1683 return mWriters.get(display);
1684}
1685
1686ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1687 REQUIRES_SHARED(mMutex) {
1688 if (mSingleReader) {
1689 display = translate<Display>(kSingleReaderKey);
1690 }
1691 return mReaders.get(display);
1692}
1693
1694void AidlComposer::removeDisplay(Display display) {
1695 mMutex.lock();
1696 bool wasErased = mWriters.erase(display);
1697 ALOGW_IF(!wasErased,
1698 "Attempting to remove writer for display %" PRId64 " which is not connected",
1699 translate<int64_t>(display));
1700 if (!mSingleReader) {
1701 removeReader(display);
1702 }
1703 mMutex.unlock();
1704}
1705
1706void AidlComposer::onHotplugDisconnect(Display display) {
1707 removeDisplay(display);
1708}
1709
1710bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001711 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001712 const auto displayId = translate<int64_t>(display);
1713 std::vector<AidlDisplayCapability> capabilities;
1714 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1715 if (!status.isOk()) {
1716 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1717 return false;
1718 }
1719 return std::find(capabilities.begin(), capabilities.end(),
1720 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1721}
1722
1723void AidlComposer::addReader(Display display) {
1724 const auto displayId = translate<int64_t>(display);
1725 std::optional<int64_t> displayOpt;
1726 if (displayId != kSingleReaderKey) {
1727 displayOpt.emplace(displayId);
1728 }
1729 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1730 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1731 displayId);
1732}
1733
1734void AidlComposer::removeReader(Display display) {
1735 bool wasErased = mReaders.erase(display);
1736 ALOGW_IF(!wasErased,
1737 "Attempting to remove reader for display %" PRId64 " which is not connected",
1738 translate<int64_t>(display));
1739}
1740
1741void AidlComposer::addDisplay(Display display) {
1742 const auto displayId = translate<int64_t>(display);
1743 mMutex.lock();
1744 auto [it, added] = mWriters.try_emplace(display, displayId);
1745 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1746 displayId);
1747 if (mSingleReader) {
1748 if (hasMultiThreadedPresentSupport(display)) {
1749 mSingleReader = false;
1750 removeReader(translate<Display>(kSingleReaderKey));
1751 // Note that this includes the new display.
1752 for (const auto& [existingDisplay, _] : mWriters) {
1753 addReader(existingDisplay);
1754 }
1755 }
1756 } else {
1757 addReader(display);
1758 }
1759 mMutex.unlock();
1760}
1761
1762void AidlComposer::onHotplugConnect(Display display) {
1763 addDisplay(display);
1764}
Ady Abrahame7385f72021-09-05 00:54:25 -07001765} // namespace Hwc2
1766} // namespace android