blob: 66237b9d8a1213a14555c3eb6f77ee633d0fae6a [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;
Sally Qi492cec32024-06-28 14:34:47 -070047using aidl::android::hardware::graphics::composer3::Lut;
Ady Abrahame7385f72021-09-05 00:54:25 -070048using aidl::android::hardware::graphics::composer3::PowerMode;
49using aidl::android::hardware::graphics::composer3::VirtualDisplay;
50
Ady Abraham42977362021-12-07 21:04:49 -080051using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080052
Ady Abrahame7385f72021-09-05 00:54:25 -070053using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
54using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
55using AidlDisplayIdentification =
56 aidl::android::hardware::graphics::composer3::DisplayIdentification;
57using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
58using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
59using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070060using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
Kriti Dang674b9372022-11-18 10:58:44 +010061using AidlHdrConversionCapability =
62 aidl::android::hardware::graphics::common::HdrConversionCapability;
Huihong Luo817ebb82023-12-13 12:54:24 -080063using AidlHdcpLevels = aidl::android::hardware::drm::HdcpLevels;
Kriti Dang674b9372022-11-18 10:58:44 +010064using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
Sally Qi0cbd08b2022-08-17 12:12:28 -070065using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
Ady Abrahame7385f72021-09-05 00:54:25 -070066using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
67using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
68using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
69using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
70using AidlVsyncPeriodChangeConstraints =
71 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
72using AidlVsyncPeriodChangeTimeline =
73 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070074using AidlDisplayContentSamplingAttributes =
75 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
76using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
77using AidlDisplayConnectionType =
78 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070079
80using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
81using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
Huihong Luo791bef92023-09-19 21:18:45 -070082using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Ady Abrahame7385f72021-09-05 00:54:25 -070083using AidlFRect = aidl::android::hardware::graphics::common::FRect;
84using AidlRect = aidl::android::hardware::graphics::common::Rect;
85using AidlTransform = aidl::android::hardware::graphics::common::Transform;
86
87namespace Hwc2 {
88
89namespace {
90
91template <typename To, typename From>
92To translate(From x) {
93 return static_cast<To>(x);
94}
95
96template <typename To, typename From>
97std::vector<To> translate(const std::vector<From>& in) {
98 std::vector<To> out;
99 out.reserve(in.size());
100 std::transform(in.begin(), in.end(), std::back_inserter(out),
101 [](From x) { return translate<To>(x); });
102 return out;
103}
104
105template <>
106AidlRect translate(IComposerClient::Rect x) {
107 return AidlRect{
108 .left = x.left,
109 .top = x.top,
110 .right = x.right,
111 .bottom = x.bottom,
112 };
113}
114
115template <>
116AidlFRect translate(IComposerClient::FRect x) {
117 return AidlFRect{
118 .left = x.left,
119 .top = x.top,
120 .right = x.right,
121 .bottom = x.bottom,
122 };
123}
124
125template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700126AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
127 AidlPerFrameMetadataBlob blob;
128 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800129 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700130 return blob;
131}
132
133template <>
134AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
135 return AidlPerFrameMetadata{
136 .key = translate<AidlPerFrameMetadataKey>(x.key),
137 .value = x.value,
138 };
139}
140
141template <>
142DisplayedFrameStats translate(AidlDisplayContentSample x) {
143 return DisplayedFrameStats{
144 .numFrames = static_cast<uint64_t>(x.frameCount),
145 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
146 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
147 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
148 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
149 };
150}
151
152template <>
153AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
154 return AidlVsyncPeriodChangeConstraints{
155 .desiredTimeNanos = x.desiredTimeNanos,
156 .seamlessRequired = x.seamlessRequired,
157 };
158}
159
160template <>
161VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
162 return VsyncPeriodChangeTimeline{
163 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
164 .refreshRequired = x.refreshRequired,
165 .refreshTimeNanos = x.refreshTimeNanos,
166 };
167}
Ady Abrahame7385f72021-09-05 00:54:25 -0700168mat4 makeMat4(std::vector<float> in) {
169 return mat4(static_cast<const float*>(in.data()));
170}
171
172} // namespace
173
174class AidlIComposerCallbackWrapper : public BnComposerCallback {
175public:
Yichi Chen3401b562022-01-17 15:42:35 +0800176 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700177
178 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
Huihong Luo791bef92023-09-19 21:18:45 -0700179 const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
180 : AidlDisplayHotplugEvent::DISCONNECTED;
181 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
Ady Abrahame7385f72021-09-05 00:54:25 -0700182 return ::ndk::ScopedAStatus::ok();
183 }
184
185 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800186 mCallback.onComposerHalRefresh(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 onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800191 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700192 return ::ndk::ScopedAStatus::ok();
193 }
Yichi Chen3401b562022-01-17 15:42:35 +0800194
Ady Abrahame7385f72021-09-05 00:54:25 -0700195 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
196 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800197 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
198 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700199 return ::ndk::ScopedAStatus::ok();
200 }
Yichi Chen3401b562022-01-17 15:42:35 +0800201
Ady Abrahame7385f72021-09-05 00:54:25 -0700202 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
203 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800204 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
205 translate<V2_4::VsyncPeriodChangeTimeline>(
206 in_updatedTimeline));
207 return ::ndk::ScopedAStatus::ok();
208 }
209
210 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
211 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700212 return ::ndk::ScopedAStatus::ok();
213 }
214
ramindani12bfe6b2023-02-03 13:29:19 -0800215 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
216 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
217 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
218 return ::ndk::ScopedAStatus::ok();
219 }
220
Huihong Luo791bef92023-09-19 21:18:45 -0700221 ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
222 AidlDisplayHotplugEvent event) override {
223 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
224 return ::ndk::ScopedAStatus::ok();
225 }
226
Huihong Luo817ebb82023-12-13 12:54:24 -0800227 ::ndk::ScopedAStatus onHdcpLevelsChanged(int64_t in_display,
228 const AidlHdcpLevels& levels) override {
229 mCallback.onComposerHalHdcpLevelsChanged(translate<Display>(in_display), levels);
230 return ::ndk::ScopedAStatus::ok();
231 }
232
Ady Abrahame7385f72021-09-05 00:54:25 -0700233private:
Yichi Chen3401b562022-01-17 15:42:35 +0800234 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700235};
236
Ady Abraham9fc28052021-10-14 17:21:38 -0700237std::string AidlComposer::instance(const std::string& serviceName) {
238 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
239}
240
241bool AidlComposer::isDeclared(const std::string& serviceName) {
242 return AServiceManager_isDeclared(instance(serviceName).c_str());
243}
Ady Abrahame7385f72021-09-05 00:54:25 -0700244
Ady Abrahama6388c02021-11-11 21:11:51 -0800245AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700246 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700247 mAidlComposer = AidlIComposer::fromBinder(
248 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700249 if (!mAidlComposer) {
250 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
251 return;
252 }
253
254 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
255 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
256 return;
257 }
258
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400259 addReader(translate<Display>(kSingleReaderKey));
260
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700261 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700262 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700263 if (!status.isOk()) {
264 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
265 status.getDescription().c_str());
266 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700267
268 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600269 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
270 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
271 GraphicBuffer::USAGE_HW_COMPOSER |
272 GraphicBuffer::USAGE_SW_READ_OFTEN |
273 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
274 "AidlComposer");
275 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
276 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
277 return;
278 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700279 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700280 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000281 if (getLayerLifecycleBatchCommand()) {
282 mEnableLayerCommandBatchingFlag =
283 FlagManager::getInstance().enable_layer_command_batching();
284 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700285 ALOGI("Loaded AIDL composer3 HAL service");
286}
287
288AidlComposer::~AidlComposer() = default;
289
Ady Abraham4d211cf2021-12-14 16:19:03 -0800290bool AidlComposer::isSupported(OptionalFeature feature) const {
291 switch (feature) {
292 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800293 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800294 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000295 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000296 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800297 return true;
298 }
299}
300
ramindani19919ff2023-12-07 11:27:06 -0800301bool AidlComposer::isVrrSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800302 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700303}
304
Ady Abrahamde549d42022-01-26 19:19:17 -0800305std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700306 std::vector<Capability> capabilities;
307 const auto status = mAidlComposer->getCapabilities(&capabilities);
308 if (!status.isOk()) {
309 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
310 return {};
311 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800312 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700313}
314
315std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800316 int pipefds[2];
317 int result = pipe(pipefds);
318 if (result < 0) {
319 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700320 return {};
321 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800322
323 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800324 // Use other thread to read pipe to prevent
325 // pipe is full, making HWC be blocked in writing.
326 std::thread t([&]() {
327 base::ReadFdToString(pipefds[0], &str);
328 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800329 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
330 // Close the write-end of the pipe to make sure that when reading from the
331 // read-end we will get eof instead of blocking forever
332 close(pipefds[1]);
333
yihsing.shen58847c52022-09-23 15:39:30 +0800334 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800335 ALOGE("dumpDebugInfo: dump failed: %d", status);
336 }
337
yihsing.shen58847c52022-09-23 15:39:30 +0800338 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800339 close(pipefds[0]);
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800340
341 std::string hash;
342 mAidlComposer->getInterfaceHash(&hash);
343 return std::string(mAidlComposer->descriptor) +
344 " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700345}
346
Yichi Chen3401b562022-01-17 15:42:35 +0800347void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700348 if (mAidlComposerCallback) {
349 ALOGE("Callback already registered");
350 }
Yichi Chen3401b562022-01-17 15:42:35 +0800351
Ady Abraham9fc28052021-10-14 17:21:38 -0700352 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
shuide chenf1111e12024-01-03 18:41:38 +0800353
354 ndk::SpAIBinder binder = mAidlComposerCallback->asBinder();
355 AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_FIFO, 2);
Ady Abrahame7385f72021-09-05 00:54:25 -0700356
357 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
358 if (!status.isOk()) {
359 ALOGE("registerCallback failed %s", status.getDescription().c_str());
360 }
361}
362
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400363Error AidlComposer::executeCommands(Display display) {
364 mMutex.lock_shared();
365 auto error = execute(display);
366 mMutex.unlock_shared();
367 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700368}
369
370uint32_t AidlComposer::getMaxVirtualDisplayCount() {
371 int32_t count = 0;
372 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
373 if (!status.isOk()) {
374 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
375 return 0;
376 }
377 return static_cast<uint32_t>(count);
378}
379
380Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
381 Display* outDisplay) {
382 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
383 const int32_t bufferSlotCount = 1;
384 VirtualDisplay virtualDisplay;
385 const auto status =
386 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
387 static_cast<int32_t>(height),
388 static_cast<AidlPixelFormat>(*format),
389 bufferSlotCount, &virtualDisplay);
390
391 if (!status.isOk()) {
392 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
393 return static_cast<Error>(status.getServiceSpecificError());
394 }
395
396 *outDisplay = translate<Display>(virtualDisplay.display);
397 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400398 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700399 return Error::NONE;
400}
401
402Error AidlComposer::destroyVirtualDisplay(Display display) {
403 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
404 if (!status.isOk()) {
405 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
406 return static_cast<Error>(status.getServiceSpecificError());
407 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400408 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700409 return Error::NONE;
410}
411
412Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400413 Error error = Error::NONE;
414 mMutex.lock_shared();
415 if (auto writer = getWriter(display)) {
416 writer->get().acceptDisplayChanges(translate<int64_t>(display));
417 } else {
418 error = Error::BAD_DISPLAY;
419 }
420 mMutex.unlock_shared();
421 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700422}
423
424Error AidlComposer::createLayer(Display display, Layer* outLayer) {
425 int64_t layer;
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000426 Error error = Error::NONE;
427 if (!mEnableLayerCommandBatchingFlag) {
428 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
429 kMaxLayerBufferCount, &layer);
430 if (!status.isOk()) {
431 ALOGE("createLayer failed %s", status.getDescription().c_str());
432 return static_cast<Error>(status.getServiceSpecificError());
433 }
434 } else {
435 // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
436 // Add this as a new displayCommand in execute command.
437 // return the SF generated layerID instead of calling HWC
438 layer = mLayerID++;
439 mMutex.lock_shared();
440 if (auto writer = getWriter(display)) {
441 writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
442 translate<int64_t>(layer),
443 LayerLifecycleBatchCommandType::CREATE);
444 writer->get().setNewBufferSlotCount(translate<int64_t>(display),
445 translate<int64_t>(layer), kMaxLayerBufferCount);
446 } else {
447 error = Error::BAD_DISPLAY;
448 }
449 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700450 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700451 *outLayer = translate<Layer>(layer);
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000452 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700453}
454
455Error AidlComposer::destroyLayer(Display display, Layer layer) {
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000456 Error error = Error::NONE;
457 if (!mEnableLayerCommandBatchingFlag) {
458 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
459 translate<int64_t>(layer));
460 if (!status.isOk()) {
461 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
462 return static_cast<Error>(status.getServiceSpecificError());
463 }
464 } else {
465 mMutex.lock_shared();
466 if (auto writer = getWriter(display)) {
467 writer->get()
468 .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
469 translate<int64_t>(layer),
470 LayerLifecycleBatchCommandType::DESTROY);
471 } else {
472 error = Error::BAD_DISPLAY;
473 }
474 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700475 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000476
477 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700478}
479
480Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
481 int32_t config;
482 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
483 if (!status.isOk()) {
484 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
485 return static_cast<Error>(status.getServiceSpecificError());
486 }
487 *outConfig = translate<Config>(config);
488 return Error::NONE;
489}
490
491Error AidlComposer::getChangedCompositionTypes(
492 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500493 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400494 std::vector<ChangedCompositionLayer> changedLayers;
495 Error error = Error::NONE;
496 {
497 mMutex.lock_shared();
498 if (auto reader = getReader(display)) {
499 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
500 } else {
501 error = Error::BAD_DISPLAY;
502 }
503 mMutex.unlock_shared();
504 }
Ady Abrahamde792782021-12-20 10:00:49 -0800505 outLayers->reserve(changedLayers.size());
506 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800507
Ady Abrahamde792782021-12-20 10:00:49 -0800508 for (const auto& layer : changedLayers) {
509 outLayers->emplace_back(translate<Layer>(layer.layer));
510 outTypes->emplace_back(layer.composition);
511 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400512 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700513}
514
515Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
516 std::vector<AidlColorMode> modes;
517 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
518 if (!status.isOk()) {
519 ALOGE("getColorModes failed %s", status.getDescription().c_str());
520 return static_cast<Error>(status.getServiceSpecificError());
521 }
522 *outModes = translate<ColorMode>(modes);
523 return Error::NONE;
524}
525
526Error AidlComposer::getDisplayAttribute(Display display, Config config,
527 IComposerClient::Attribute attribute, int32_t* outValue) {
528 const auto status =
529 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
530 translate<int32_t>(config),
531 static_cast<AidlDisplayAttribute>(attribute),
532 outValue);
533 if (!status.isOk()) {
534 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
535 return static_cast<Error>(status.getServiceSpecificError());
536 }
537 return Error::NONE;
538}
539
540Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
541 std::vector<int32_t> configs;
542 const auto status =
543 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
544 if (!status.isOk()) {
545 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
546 return static_cast<Error>(status.getServiceSpecificError());
547 }
548 *outConfigs = translate<Config>(configs);
549 return Error::NONE;
550}
551
ramindani263a3f12023-07-18 20:44:49 -0700552Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700553 std::vector<DisplayConfiguration>* outConfigs) {
554 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700555 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
556 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700557 if (!status.isOk()) {
558 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
559 return static_cast<Error>(status.getServiceSpecificError());
560 }
561
562 return Error::NONE;
563}
564
Ady Abrahame7385f72021-09-05 00:54:25 -0700565Error AidlComposer::getDisplayName(Display display, std::string* outName) {
566 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
567 if (!status.isOk()) {
568 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
569 return static_cast<Error>(status.getServiceSpecificError());
570 }
571 return Error::NONE;
572}
573
574Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
575 std::vector<Layer>* outLayers,
576 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400577 Error error = Error::NONE;
578 DisplayRequest displayRequests;
579 {
580 mMutex.lock_shared();
581 if (auto reader = getReader(display)) {
582 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
583 } else {
584 error = Error::BAD_DISPLAY;
585 }
586 mMutex.unlock_shared();
587 }
Ady Abrahamde792782021-12-20 10:00:49 -0800588 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
589 outLayers->reserve(displayRequests.layerRequests.size());
590 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
591
592 for (const auto& layer : displayRequests.layerRequests) {
593 outLayers->emplace_back(translate<Layer>(layer.layer));
594 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
595 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400596 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700597}
598
599Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800600 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700601 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800602 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700603 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800604 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700605 return static_cast<Error>(status.getServiceSpecificError());
606 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800607 *outSupport = std::find(capabilities.begin(), capabilities.end(),
608 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700609 return Error::NONE;
610}
611
ramindani32cf0602022-03-02 02:30:29 +0000612Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
613 std::vector<AidlDisplayCapability> capabilities;
614 const auto status =
615 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
616 if (!status.isOk()) {
617 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
618 return static_cast<Error>(status.getServiceSpecificError());
619 }
620 *outSupport = std::find(capabilities.begin(), capabilities.end(),
621 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
622 return Error::NONE;
623}
624
Ady Abrahame7385f72021-09-05 00:54:25 -0700625Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
626 float* outMaxLuminance, float* outMaxAverageLuminance,
627 float* outMinLuminance) {
628 AidlHdrCapabilities capabilities;
629 const auto status =
630 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
631 if (!status.isOk()) {
632 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
633 return static_cast<Error>(status.getServiceSpecificError());
634 }
635
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100636 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700637 *outMaxLuminance = capabilities.maxLuminance;
638 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
639 *outMinLuminance = capabilities.minLuminance;
640 return Error::NONE;
641}
642
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000643bool AidlComposer::getLayerLifecycleBatchCommand() {
644 std::vector<Capability> capabilities = getCapabilities();
645 bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
646 Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
647 return hasCapability;
648}
649
Sally Qibb866c12022-10-17 11:31:20 -0700650Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
651 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
652 if (!status.isOk()) {
653 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
654 return static_cast<Error>(status.getServiceSpecificError());
655 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700656 return Error::NONE;
657}
658
Ady Abrahame7385f72021-09-05 00:54:25 -0700659Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
660 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400661 Error error = Error::NONE;
662 std::vector<ReleaseFences::Layer> fences;
663 {
664 mMutex.lock_shared();
665 if (auto reader = getReader(display)) {
666 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
667 } else {
668 error = Error::BAD_DISPLAY;
669 }
670 mMutex.unlock_shared();
671 }
Ady Abrahamde792782021-12-20 10:00:49 -0800672 outLayers->reserve(fences.size());
673 outReleaseFences->reserve(fences.size());
674
675 for (auto& fence : fences) {
676 outLayers->emplace_back(translate<Layer>(fence.layer));
677 // take ownership
678 const int fenceOwner = fence.fence.get();
679 *fence.fence.getR() = -1;
680 outReleaseFences->emplace_back(fenceOwner);
681 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400682 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700683}
684
685Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500686 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000687 SFTRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500688
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400689 Error error = Error::NONE;
690 mMutex.lock_shared();
691 auto writer = getWriter(display);
692 auto reader = getReader(display);
693 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500694 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400695 error = execute(display);
696 } else {
697 error = Error::BAD_DISPLAY;
698 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700699
Ady Abrahame7385f72021-09-05 00:54:25 -0700700 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400701 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700702 return error;
703 }
704
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500705 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400706 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800707 // take ownership
708 *outPresentFence = fence.get();
709 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700710 return Error::NONE;
711}
712
713Error AidlComposer::setActiveConfig(Display display, Config config) {
714 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
715 translate<int32_t>(config));
716 if (!status.isOk()) {
717 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
718 return static_cast<Error>(status.getServiceSpecificError());
719 }
720 return Error::NONE;
721}
722
723Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
724 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000725 const std::vector<IComposerClient::Rect>& damage,
726 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700727 const native_handle_t* handle = nullptr;
728 if (target.get()) {
729 handle = target->getNativeBuffer()->handle;
730 }
731
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400732 Error error = Error::NONE;
733 mMutex.lock_shared();
734 if (auto writer = getWriter(display)) {
735 writer->get()
736 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
737 translate<aidl::android::hardware::graphics::common::Dataspace>(
738 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000739 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400740 } else {
741 error = Error::BAD_DISPLAY;
742 }
743 mMutex.unlock_shared();
744 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700745}
746
747Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
748 const auto status =
749 mAidlComposerClient->setColorMode(translate<int64_t>(display),
750 translate<AidlColorMode>(mode),
751 translate<AidlRenderIntent>(renderIntent));
752 if (!status.isOk()) {
753 ALOGE("setColorMode failed %s", status.getDescription().c_str());
754 return static_cast<Error>(status.getServiceSpecificError());
755 }
756 return Error::NONE;
757}
758
Ady Abrahamdc011a92021-12-21 14:06:44 -0800759Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400760 auto error = Error::NONE;
761 mMutex.lock_shared();
762 if (auto writer = getWriter(display)) {
763 writer->get().setColorTransform(translate<int64_t>(display), matrix);
764 } else {
765 error = Error::BAD_DISPLAY;
766 }
767 mMutex.unlock_shared();
768 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700769}
770
771Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
772 int releaseFence) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400773 auto error = Error::NONE;
774 mMutex.lock_shared();
775 if (auto writer = getWriter(display)) {
776 writer->get().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
777 } else {
778 error = Error::BAD_DISPLAY;
779 }
780 mMutex.unlock_shared();
781 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700782}
783
784Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
785 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
786 translate<PowerMode>(mode));
787 if (!status.isOk()) {
788 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
789 return static_cast<Error>(status.getServiceSpecificError());
790 }
791 return Error::NONE;
792}
793
794Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
795 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
796 const auto status =
797 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
798 if (!status.isOk()) {
799 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
800 return static_cast<Error>(status.getServiceSpecificError());
801 }
802 return Error::NONE;
803}
804
805Error AidlComposer::setClientTargetSlotCount(Display display) {
806 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
807 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
808 bufferSlotCount);
809 if (!status.isOk()) {
810 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
811 return static_cast<Error>(status.getServiceSpecificError());
812 }
813 return Error::NONE;
814}
815
Ady Abraham43065bd2021-12-10 17:22:15 -0800816Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700817 int32_t frameIntervalNs, uint32_t* outNumTypes,
818 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400819 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000820 SFTRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500821
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400822 Error error = Error::NONE;
823 mMutex.lock_shared();
824 auto writer = getWriter(display);
825 auto reader = getReader(display);
826 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700827 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
828 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400829 error = execute(display);
830 } else {
831 error = Error::BAD_DISPLAY;
832 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700833
Ady Abrahame7385f72021-09-05 00:54:25 -0700834 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400835 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700836 return error;
837 }
838
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400839 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700840
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400841 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700842 return Error::NONE;
843}
844
Ady Abraham43065bd2021-12-10 17:22:15 -0800845Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700846 int32_t frameIntervalNs, uint32_t* outNumTypes,
847 uint32_t* outNumRequests, int* outPresentFence,
848 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400849 const auto displayId = translate<int64_t>(display);
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000850 SFTRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500851
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400852 Error error = Error::NONE;
853 mMutex.lock_shared();
854 auto writer = getWriter(display);
855 auto reader = getReader(display);
856 if (writer && reader) {
857 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700858 ClockMonotonicTimestamp{expectedPresentTime},
859 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400860 error = execute(display);
861 } else {
862 error = Error::BAD_DISPLAY;
863 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700864
Ady Abrahame7385f72021-09-05 00:54:25 -0700865 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400866 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700867 return error;
868 }
869
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400870 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800871 if (!result.has_value()) {
872 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400873 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800874 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700875 }
876
Ady Abrahamde792782021-12-20 10:00:49 -0800877 *state = translate<uint32_t>(*result);
878
879 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400880 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800881 // take ownership
882 *outPresentFence = fence.get();
883 *fence.getR() = -1;
884 }
885
886 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400887 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700888 }
889
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400890 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700891 return Error::NONE;
892}
893
894Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400895 Error error = Error::NONE;
896 mMutex.lock_shared();
897 if (auto writer = getWriter(display)) {
898 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
899 x, y);
900 } else {
901 error = Error::BAD_DISPLAY;
902 }
903 mMutex.unlock_shared();
904 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700905}
906
907Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
908 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700909 const native_handle_t* handle = nullptr;
910 if (buffer.get()) {
911 handle = buffer->getNativeBuffer()->handle;
912 }
913
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400914 Error error = Error::NONE;
915 mMutex.lock_shared();
916 if (auto writer = getWriter(display)) {
917 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
918 handle, acquireFence);
919 } else {
920 error = Error::BAD_DISPLAY;
921 }
922 mMutex.unlock_shared();
923 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700924}
925
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700926Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
927 const std::vector<uint32_t>& slotsToClear,
928 uint32_t activeBufferSlot) {
929 if (slotsToClear.empty()) {
930 return Error::NONE;
931 }
932
Brian Lindahl90553da2022-12-06 13:36:30 -0700933 Error error = Error::NONE;
934 mMutex.lock_shared();
935 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700936 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700937 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
938 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600939 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
940 // placeholder buffer, using the slot that needs to cleared... tricky.
941 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700942 for (uint32_t slot : slotsToClear) {
943 // Don't clear the active buffer slot because we need to restore the active buffer
944 // after clearing the requested buffer slots with a placeholder buffer.
945 if (slot != activeBufferSlot) {
946 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
947 translate<int64_t>(layer), slot,
948 mClearSlotBuffer->handle,
949 /*fence*/ -1);
950 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700951 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700952 // Since we clear buffers by setting them to a placeholder buffer, we want to make
953 // sure that the last setLayerBuffer command is sent with the currently active
954 // buffer, not the placeholder buffer, so that there is no perceptual change when
955 // buffers are discarded.
956 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
957 translate<int64_t>(layer), activeBufferSlot,
958 // The active buffer is still cached in
959 // its slot and doesn't need a fence.
960 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700961 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700962 } else {
963 error = Error::BAD_DISPLAY;
964 }
965 mMutex.unlock_shared();
966 return error;
967}
968
Ady Abrahame7385f72021-09-05 00:54:25 -0700969Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
970 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400971 Error error = Error::NONE;
972 mMutex.lock_shared();
973 if (auto writer = getWriter(display)) {
974 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
975 translate<AidlRect>(damage));
976 } else {
977 error = Error::BAD_DISPLAY;
978 }
979 mMutex.unlock_shared();
980 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700981}
982
983Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
984 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400985 Error error = Error::NONE;
986 mMutex.lock_shared();
987 if (auto writer = getWriter(display)) {
988 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
989 translate<BlendMode>(mode));
990 } else {
991 error = Error::BAD_DISPLAY;
992 }
993 mMutex.unlock_shared();
994 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700995}
996
Ady Abraham6e60b142022-01-06 18:10:35 -0800997Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400998 Error error = Error::NONE;
999 mMutex.lock_shared();
1000 if (auto writer = getWriter(display)) {
1001 writer->get().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
1002 } else {
1003 error = Error::BAD_DISPLAY;
1004 }
1005 mMutex.unlock_shared();
1006 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001007}
1008
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001009Error AidlComposer::setLayerCompositionType(
1010 Display display, Layer layer,
1011 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001012 Error error = Error::NONE;
1013 mMutex.lock_shared();
1014 if (auto writer = getWriter(display)) {
1015 writer->get().setLayerCompositionType(translate<int64_t>(display),
1016 translate<int64_t>(layer), type);
1017 } else {
1018 error = Error::BAD_DISPLAY;
1019 }
1020 mMutex.unlock_shared();
1021 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001022}
1023
1024Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001025 Error error = Error::NONE;
1026 mMutex.lock_shared();
1027 if (auto writer = getWriter(display)) {
1028 writer->get().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1029 translate<AidlDataspace>(dataspace));
1030 } else {
1031 error = Error::BAD_DISPLAY;
1032 }
1033 mMutex.unlock_shared();
1034 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001035}
1036
1037Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
1038 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001039 Error error = Error::NONE;
1040 mMutex.lock_shared();
1041 if (auto writer = getWriter(display)) {
1042 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1043 translate<AidlRect>(frame));
1044 } else {
1045 error = Error::BAD_DISPLAY;
1046 }
1047 mMutex.unlock_shared();
1048 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001049}
1050
1051Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001052 Error error = Error::NONE;
1053 mMutex.lock_shared();
1054 if (auto writer = getWriter(display)) {
1055 writer->get().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1056 alpha);
1057 } else {
1058 error = Error::BAD_DISPLAY;
1059 }
1060 mMutex.unlock_shared();
1061 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001062}
1063
1064Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
1065 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001066 Error error = Error::NONE;
1067 mMutex.lock_shared();
1068 if (auto writer = getWriter(display)) {
1069 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1070 stream);
1071 } else {
1072 error = Error::BAD_DISPLAY;
1073 }
1074 mMutex.unlock_shared();
1075 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001076}
1077
1078Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1079 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001080 Error error = Error::NONE;
1081 mMutex.lock_shared();
1082 if (auto writer = getWriter(display)) {
1083 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1084 translate<AidlFRect>(crop));
1085 } else {
1086 error = Error::BAD_DISPLAY;
1087 }
1088 mMutex.unlock_shared();
1089 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001090}
1091
1092Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001093 Error error = Error::NONE;
1094 mMutex.lock_shared();
1095 if (auto writer = getWriter(display)) {
1096 writer->get().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1097 translate<AidlTransform>(transform));
1098 } else {
1099 error = Error::BAD_DISPLAY;
1100 }
1101 mMutex.unlock_shared();
1102 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001103}
1104
1105Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
1106 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001107 Error error = Error::NONE;
1108 mMutex.lock_shared();
1109 if (auto writer = getWriter(display)) {
1110 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1111 translate<AidlRect>(visible));
1112 } else {
1113 error = Error::BAD_DISPLAY;
1114 }
1115 mMutex.unlock_shared();
1116 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001117}
1118
1119Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001120 Error error = Error::NONE;
1121 mMutex.lock_shared();
1122 if (auto writer = getWriter(display)) {
1123 writer->get().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1124 } else {
1125 error = Error::BAD_DISPLAY;
1126 }
1127 mMutex.unlock_shared();
1128 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001129}
1130
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001131Error AidlComposer::execute(Display display) {
1132 auto writer = getWriter(display);
1133 auto reader = getReader(display);
1134 if (!writer || !reader) {
1135 return Error::BAD_DISPLAY;
1136 }
1137
Huihong Luoe7382c12023-04-21 20:24:32 +00001138 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001139 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001140 return Error::NONE;
1141 }
1142
Ady Abrahamde792782021-12-20 10:00:49 -08001143 { // scope for results
1144 std::vector<CommandResultPayload> results;
1145 auto status = mAidlComposerClient->executeCommands(commands, &results);
1146 if (!status.isOk()) {
1147 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1148 return static_cast<Error>(status.getServiceSpecificError());
1149 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001150
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001151 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001152 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001153 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001154 Error error = Error::NONE;
1155 for (const auto& cmdErr : commandErrors) {
1156 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1157 if (index < 0 || index >= commands.size()) {
1158 ALOGE("invalid command index %zu", index);
1159 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001160 }
1161
Ady Abrahama6388c02021-11-11 21:11:51 -08001162 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001163 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1164 error = translate<Error>(cmdErr.errorCode);
1165 } else {
1166 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1167 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001168 }
1169 }
1170
Ady Abrahame7385f72021-09-05 00:54:25 -07001171 return error;
1172}
1173
1174Error AidlComposer::setLayerPerFrameMetadata(
1175 Display display, Layer layer,
1176 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001177 Error error = Error::NONE;
1178 mMutex.lock_shared();
1179 if (auto writer = getWriter(display)) {
1180 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1181 translate<int64_t>(layer),
1182 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1183 } else {
1184 error = Error::BAD_DISPLAY;
1185 }
1186 mMutex.unlock_shared();
1187 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001188}
1189
1190std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1191 Display display) {
1192 std::vector<AidlPerFrameMetadataKey> keys;
1193 const auto status =
1194 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1195 if (!status.isOk()) {
1196 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1197 return {};
1198 }
1199 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1200}
1201
1202Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1203 std::vector<RenderIntent>* outRenderIntents) {
1204 std::vector<AidlRenderIntent> renderIntents;
1205 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1206 translate<AidlColorMode>(colorMode),
1207 &renderIntents);
1208 if (!status.isOk()) {
1209 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1210 return static_cast<Error>(status.getServiceSpecificError());
1211 }
1212 *outRenderIntents = translate<RenderIntent>(renderIntents);
1213 return Error::NONE;
1214}
1215
1216Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1217 std::vector<float> matrix;
1218 const auto status =
1219 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1220 &matrix);
1221 if (!status.isOk()) {
1222 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1223 return static_cast<Error>(status.getServiceSpecificError());
1224 }
1225 *outMatrix = makeMat4(matrix);
1226 return Error::NONE;
1227}
1228
1229Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1230 std::vector<uint8_t>* outData) {
1231 AidlDisplayIdentification displayIdentification;
1232 const auto status =
1233 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1234 &displayIdentification);
1235 if (!status.isOk()) {
1236 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1237 return static_cast<Error>(status.getServiceSpecificError());
1238 }
1239
1240 *outPort = static_cast<uint8_t>(displayIdentification.port);
1241 *outData = displayIdentification.data;
1242
1243 return Error::NONE;
1244}
1245
1246Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001247 Error error = Error::NONE;
1248 mMutex.lock_shared();
1249 if (auto writer = getWriter(display)) {
1250 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1251 matrix);
1252 } else {
1253 error = Error::BAD_DISPLAY;
1254 }
1255 mMutex.unlock_shared();
1256 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001257}
1258
1259Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1260 Dataspace* outDataspace,
1261 uint8_t* outComponentMask) {
1262 if (!outFormat || !outDataspace || !outComponentMask) {
1263 return Error::BAD_PARAMETER;
1264 }
1265
1266 AidlDisplayContentSamplingAttributes attributes;
1267 const auto status =
1268 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1269 &attributes);
1270 if (!status.isOk()) {
1271 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1272 return static_cast<Error>(status.getServiceSpecificError());
1273 }
1274
1275 *outFormat = translate<PixelFormat>(attributes.format);
1276 *outDataspace = translate<Dataspace>(attributes.dataspace);
1277 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1278 return Error::NONE;
1279}
1280
1281Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1282 uint8_t componentMask, uint64_t maxFrames) {
1283 const auto status =
1284 mAidlComposerClient
1285 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1286 static_cast<AidlFormatColorComponent>(
1287 componentMask),
1288 static_cast<int64_t>(maxFrames));
1289 if (!status.isOk()) {
1290 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1291 return static_cast<Error>(status.getServiceSpecificError());
1292 }
1293 return Error::NONE;
1294}
1295
1296Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1297 uint64_t timestamp, DisplayedFrameStats* outStats) {
1298 if (!outStats) {
1299 return Error::BAD_PARAMETER;
1300 }
1301
1302 AidlDisplayContentSample sample;
1303 const auto status =
1304 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1305 static_cast<int64_t>(maxFrames),
1306 static_cast<int64_t>(timestamp),
1307 &sample);
1308 if (!status.isOk()) {
1309 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1310 return static_cast<Error>(status.getServiceSpecificError());
1311 }
1312 *outStats = translate<DisplayedFrameStats>(sample);
1313 return Error::NONE;
1314}
1315
1316Error AidlComposer::setLayerPerFrameMetadataBlobs(
1317 Display display, Layer layer,
1318 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001319 Error error = Error::NONE;
1320 mMutex.lock_shared();
1321 if (auto writer = getWriter(display)) {
1322 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1323 translate<int64_t>(layer),
1324 translate<AidlPerFrameMetadataBlob>(metadata));
1325 } else {
1326 error = Error::BAD_DISPLAY;
1327 }
1328 mMutex.unlock_shared();
1329 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001330}
1331
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001332Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001333 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001334 Error error = Error::NONE;
1335 mMutex.lock_shared();
1336 if (auto writer = getWriter(display)) {
1337 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001338
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001339 if (options.applyImmediately) {
1340 error = execute(display);
1341 mMutex.unlock_shared();
1342 return error;
1343 }
1344 } else {
1345 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001346 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001347 mMutex.unlock_shared();
1348 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001349}
1350
1351Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001352 std::vector<AidlDisplayCapability>* outCapabilities) {
1353 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1354 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001355 if (!status.isOk()) {
1356 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001357 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001358 return static_cast<Error>(status.getServiceSpecificError());
1359 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001360 return Error::NONE;
1361}
1362
1363V2_4::Error AidlComposer::getDisplayConnectionType(
1364 Display display, IComposerClient::DisplayConnectionType* outType) {
1365 AidlDisplayConnectionType type;
1366 const auto status =
1367 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1368 if (!status.isOk()) {
1369 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1370 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1371 }
1372 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1373 return V2_4::Error::NONE;
1374}
1375
1376V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1377 int32_t vsyncPeriod;
1378 const auto status =
1379 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1380 if (!status.isOk()) {
1381 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1382 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1383 }
1384 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1385 return V2_4::Error::NONE;
1386}
1387
1388V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1389 Display display, Config config,
1390 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1391 VsyncPeriodChangeTimeline* outTimeline) {
1392 AidlVsyncPeriodChangeTimeline timeline;
1393 const auto status =
1394 mAidlComposerClient
1395 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1396 translate<int32_t>(config),
1397 translate<AidlVsyncPeriodChangeConstraints>(
1398 vsyncPeriodChangeConstraints),
1399 &timeline);
1400 if (!status.isOk()) {
1401 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1402 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1403 }
1404 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1405 return V2_4::Error::NONE;
1406}
1407
1408V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1409 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1410 if (!status.isOk()) {
1411 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1412 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1413 }
1414 return V2_4::Error::NONE;
1415}
1416
1417V2_4::Error AidlComposer::getSupportedContentTypes(
1418 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1419 std::vector<AidlContentType> types;
1420 const auto status =
1421 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1422 if (!status.isOk()) {
1423 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1424 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1425 }
1426 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1427 return V2_4::Error::NONE;
1428}
1429
1430V2_4::Error AidlComposer::setContentType(Display display,
1431 IComposerClient::ContentType contentType) {
1432 const auto status =
1433 mAidlComposerClient->setContentType(translate<int64_t>(display),
1434 translate<AidlContentType>(contentType));
1435 if (!status.isOk()) {
1436 ALOGE("setContentType failed %s", status.getDescription().c_str());
1437 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1438 }
1439 return V2_4::Error::NONE;
1440}
1441
Ady Abraham3f976752021-12-20 16:17:50 -08001442V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1443 const std::vector<uint8_t>&) {
1444 // There are no users for this API. See b/209691612.
1445 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001446}
1447
1448V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001449 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1450 // There are no users for this API. See b/209691612.
1451 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001452}
1453
Kriti Dang7defaf32021-11-15 11:55:43 +01001454Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1455 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1456 translate<int32_t>(config));
1457 if (!status.isOk()) {
1458 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1459 return static_cast<Error>(status.getServiceSpecificError());
1460 }
1461 return Error::NONE;
1462}
1463
1464Error AidlComposer::clearBootDisplayConfig(Display display) {
1465 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1466 if (!status.isOk()) {
1467 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1468 return static_cast<Error>(status.getServiceSpecificError());
1469 }
1470 return Error::NONE;
1471}
1472
1473Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1474 int32_t displayConfig;
1475 const auto status =
1476 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1477 &displayConfig);
1478 if (!status.isOk()) {
1479 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1480 return static_cast<Error>(status.getServiceSpecificError());
1481 }
1482 *config = translate<uint32_t>(displayConfig);
1483 return Error::NONE;
1484}
1485
Kriti Dang674b9372022-11-18 10:58:44 +01001486Error AidlComposer::getHdrConversionCapabilities(
1487 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1488 const auto status =
1489 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1490 if (!status.isOk()) {
1491 hdrConversionCapabilities = {};
1492 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1493 return static_cast<Error>(status.getServiceSpecificError());
1494 }
1495 return Error::NONE;
1496}
1497
Kriti Dangd432bb52023-02-09 18:21:04 +01001498Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1499 Hdr* outPreferredHdrOutputType) {
1500 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1501 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001502 if (!status.isOk()) {
1503 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1504 return static_cast<Error>(status.getServiceSpecificError());
1505 }
1506 return Error::NONE;
1507}
1508
ramindanib2158ee2023-02-13 20:29:59 -08001509Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1510 const auto status =
1511 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1512 displayId),
1513 enabled);
1514 if (!status.isOk()) {
1515 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1516 status.getDescription().c_str());
1517 return static_cast<Error>(status.getServiceSpecificError());
1518 }
1519 return Error::NONE;
1520}
1521
ramindani3acaaf52023-09-25 10:31:27 -07001522Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1523 int32_t frameIntervalNs) {
1524 const auto status =
1525 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1526 ClockMonotonicTimestamp{expectedPresentTime},
1527 frameIntervalNs);
1528
1529 if (!status.isOk()) {
1530 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1531 return static_cast<Error>(status.getServiceSpecificError());
1532 }
1533 return Error::NONE;
1534}
1535
Ady Abrahame7385f72021-09-05 00:54:25 -07001536Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001537 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001538 Error error = Error::NONE;
1539 mMutex.lock_shared();
1540 if (auto reader = getReader(display)) {
1541 *outClientTargetProperty =
1542 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1543 } else {
1544 error = Error::BAD_DISPLAY;
1545 }
1546 mMutex.unlock_shared();
1547 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001548}
1549
Sally Qi11dcd582024-08-16 18:11:27 -07001550Error AidlComposer::getRequestedLuts(Display display, 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();
1559 return error;
1560}
1561
Sally Qi11dcd582024-08-16 18:11:27 -07001562Error AidlComposer::setLayerLuts(Display display, Layer layer, std::vector<Lut>& luts) {
1563 Error error = Error::NONE;
1564 mMutex.lock_shared();
1565 if (auto writer = getWriter(display)) {
1566 writer->get().setLayerLuts(translate<int64_t>(display), translate<int64_t>(layer), luts);
1567 } else {
1568 error = Error::BAD_DISPLAY;
1569 }
1570 mMutex.unlock_shared();
1571 return error;
1572}
1573
Alec Mouri6da0e272022-02-07 12:45:57 -08001574Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001575 Error error = Error::NONE;
1576 mMutex.lock_shared();
1577 if (auto writer = getWriter(display)) {
1578 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1579 brightness);
1580 } else {
1581 error = Error::BAD_DISPLAY;
1582 }
1583 mMutex.unlock_shared();
1584 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001585}
1586
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001587Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1588 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001589 Error error = Error::NONE;
1590 mMutex.lock_shared();
1591 if (auto writer = getWriter(display)) {
1592 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1593 translate<AidlRect>(blocking));
1594 } else {
1595 error = Error::BAD_DISPLAY;
1596 }
1597 mMutex.unlock_shared();
1598 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001599}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001600
1601Error AidlComposer::getDisplayDecorationSupport(Display display,
1602 std::optional<DisplayDecorationSupport>* support) {
1603 const auto status =
1604 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1605 if (!status.isOk()) {
1606 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1607 support->reset();
1608 return static_cast<Error>(status.getServiceSpecificError());
1609 }
1610 return Error::NONE;
1611}
ramindani32cf0602022-03-02 02:30:29 +00001612
1613Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1614 const auto status =
1615 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1616 translate<int32_t>(timeout.count()));
1617 if (!status.isOk()) {
1618 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1619 return static_cast<Error>(status.getServiceSpecificError());
1620 }
1621 return Error::NONE;
1622}
1623
ramindani06e518e2022-03-14 18:47:53 +00001624Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1625 AidlTransform* outDisplayOrientation) {
1626 const auto status =
1627 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1628 outDisplayOrientation);
1629 if (!status.isOk()) {
1630 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1631 return static_cast<Error>(status.getServiceSpecificError());
1632 }
1633 return Error::NONE;
1634}
1635
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001636ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1637 REQUIRES_SHARED(mMutex) {
1638 return mWriters.get(display);
1639}
1640
1641ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1642 REQUIRES_SHARED(mMutex) {
1643 if (mSingleReader) {
1644 display = translate<Display>(kSingleReaderKey);
1645 }
1646 return mReaders.get(display);
1647}
1648
1649void AidlComposer::removeDisplay(Display display) {
1650 mMutex.lock();
1651 bool wasErased = mWriters.erase(display);
1652 ALOGW_IF(!wasErased,
1653 "Attempting to remove writer for display %" PRId64 " which is not connected",
1654 translate<int64_t>(display));
1655 if (!mSingleReader) {
1656 removeReader(display);
1657 }
1658 mMutex.unlock();
1659}
1660
1661void AidlComposer::onHotplugDisconnect(Display display) {
1662 removeDisplay(display);
1663}
1664
1665bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001666 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001667 const auto displayId = translate<int64_t>(display);
1668 std::vector<AidlDisplayCapability> capabilities;
1669 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1670 if (!status.isOk()) {
1671 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1672 return false;
1673 }
1674 return std::find(capabilities.begin(), capabilities.end(),
1675 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1676}
1677
1678void AidlComposer::addReader(Display display) {
1679 const auto displayId = translate<int64_t>(display);
1680 std::optional<int64_t> displayOpt;
1681 if (displayId != kSingleReaderKey) {
1682 displayOpt.emplace(displayId);
1683 }
1684 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1685 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1686 displayId);
1687}
1688
1689void AidlComposer::removeReader(Display display) {
1690 bool wasErased = mReaders.erase(display);
1691 ALOGW_IF(!wasErased,
1692 "Attempting to remove reader for display %" PRId64 " which is not connected",
1693 translate<int64_t>(display));
1694}
1695
1696void AidlComposer::addDisplay(Display display) {
1697 const auto displayId = translate<int64_t>(display);
1698 mMutex.lock();
1699 auto [it, added] = mWriters.try_emplace(display, displayId);
1700 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1701 displayId);
1702 if (mSingleReader) {
1703 if (hasMultiThreadedPresentSupport(display)) {
1704 mSingleReader = false;
1705 removeReader(translate<Display>(kSingleReaderKey));
1706 // Note that this includes the new display.
1707 for (const auto& [existingDisplay, _] : mWriters) {
1708 addReader(existingDisplay);
1709 }
1710 }
1711 } else {
1712 addReader(display);
1713 }
1714 mMutex.unlock();
1715}
1716
1717void AidlComposer::onHotplugConnect(Display display) {
1718 addDisplay(display);
1719}
Ady Abrahame7385f72021-09-05 00:54:25 -07001720} // namespace Hwc2
1721} // namespace android