blob: 17f6f314411b229911e834934ba0d48348acf11f [file] [log] [blame]
Ady Abrahame7385f72021-09-05 00:54:25 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "HwcComposer"
19#define ATRACE_TAG ATRACE_TAG_GRAPHICS
20
Ady Abraham9fc28052021-10-14 17:21:38 -070021#include "AidlComposerHal.h"
Ady Abrahame7385f72021-09-05 00:54:25 -070022
Brian Lindahl5b0ffe02023-06-15 14:19:43 -060023#include <SurfaceFlingerProperties.h>
Ady Abrahamc4acf512022-02-18 17:11:59 -080024#include <android-base/file.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070025#include <android/binder_ibinder_platform.h>
26#include <android/binder_manager.h>
Alec Mouri9b133ca2023-11-14 19:00:01 +000027#include <common/FlagManager.h>
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -050028#include <gui/TraceUtils.h>
Ady Abrahame7385f72021-09-05 00:54:25 -070029#include <log/log.h>
30#include <utils/Trace.h>
31
32#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
33
34#include <algorithm>
35#include <cinttypes>
36
Yichi Chen3401b562022-01-17 15:42:35 +080037#include "HWC2.h"
38
Ady Abrahame7385f72021-09-05 00:54:25 -070039namespace android {
40
41using hardware::hidl_handle;
42using hardware::hidl_vec;
43using hardware::Return;
44
45using aidl::android::hardware::graphics::composer3::BnComposerCallback;
46using aidl::android::hardware::graphics::composer3::Capability;
Alec Mouri85065692022-03-18 00:58:26 +000047using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
Ady Abrahame7385f72021-09-05 00:54:25 -070048using aidl::android::hardware::graphics::composer3::PowerMode;
49using aidl::android::hardware::graphics::composer3::VirtualDisplay;
50
Ady Abraham42977362021-12-07 21:04:49 -080051using aidl::android::hardware::graphics::composer3::CommandResultPayload;
Ady Abrahama6388c02021-11-11 21:11:51 -080052
Ady Abrahame7385f72021-09-05 00:54:25 -070053using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
54using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
55using AidlDisplayIdentification =
56 aidl::android::hardware::graphics::composer3::DisplayIdentification;
57using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
58using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
59using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
Ady Abrahame7385f72021-09-05 00:54:25 -070060using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
Kriti Dang674b9372022-11-18 10:58:44 +010061using AidlHdrConversionCapability =
62 aidl::android::hardware::graphics::common::HdrConversionCapability;
63using AidlHdrConversionStrategy = aidl::android::hardware::graphics::common::HdrConversionStrategy;
Sally Qi0cbd08b2022-08-17 12:12:28 -070064using AidlOverlayProperties = aidl::android::hardware::graphics::composer3::OverlayProperties;
Ady Abrahame7385f72021-09-05 00:54:25 -070065using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
66using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
67using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
68using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
69using AidlVsyncPeriodChangeConstraints =
70 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
71using AidlVsyncPeriodChangeTimeline =
72 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
Ady Abrahame7385f72021-09-05 00:54:25 -070073using AidlDisplayContentSamplingAttributes =
74 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
75using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
76using AidlDisplayConnectionType =
77 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
Ady Abrahame7385f72021-09-05 00:54:25 -070078
79using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
80using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
Huihong Luo791bef92023-09-19 21:18:45 -070081using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Ady Abrahame7385f72021-09-05 00:54:25 -070082using AidlFRect = aidl::android::hardware::graphics::common::FRect;
83using AidlRect = aidl::android::hardware::graphics::common::Rect;
84using AidlTransform = aidl::android::hardware::graphics::common::Transform;
85
86namespace Hwc2 {
87
88namespace {
89
90template <typename To, typename From>
91To translate(From x) {
92 return static_cast<To>(x);
93}
94
95template <typename To, typename From>
96std::vector<To> translate(const std::vector<From>& in) {
97 std::vector<To> out;
98 out.reserve(in.size());
99 std::transform(in.begin(), in.end(), std::back_inserter(out),
100 [](From x) { return translate<To>(x); });
101 return out;
102}
103
104template <>
105AidlRect translate(IComposerClient::Rect x) {
106 return AidlRect{
107 .left = x.left,
108 .top = x.top,
109 .right = x.right,
110 .bottom = x.bottom,
111 };
112}
113
114template <>
115AidlFRect translate(IComposerClient::FRect x) {
116 return AidlFRect{
117 .left = x.left,
118 .top = x.top,
119 .right = x.right,
120 .bottom = x.bottom,
121 };
122}
123
124template <>
Ady Abrahame7385f72021-09-05 00:54:25 -0700125AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
126 AidlPerFrameMetadataBlob blob;
127 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
Long Linga4628782022-02-18 13:44:26 -0800128 std::copy(x.blob.begin(), x.blob.end(), std::inserter(blob.blob, blob.blob.end()));
Ady Abrahame7385f72021-09-05 00:54:25 -0700129 return blob;
130}
131
132template <>
133AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
134 return AidlPerFrameMetadata{
135 .key = translate<AidlPerFrameMetadataKey>(x.key),
136 .value = x.value,
137 };
138}
139
140template <>
141DisplayedFrameStats translate(AidlDisplayContentSample x) {
142 return DisplayedFrameStats{
143 .numFrames = static_cast<uint64_t>(x.frameCount),
144 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
145 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
146 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
147 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
148 };
149}
150
151template <>
152AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
153 return AidlVsyncPeriodChangeConstraints{
154 .desiredTimeNanos = x.desiredTimeNanos,
155 .seamlessRequired = x.seamlessRequired,
156 };
157}
158
159template <>
160VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
161 return VsyncPeriodChangeTimeline{
162 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
163 .refreshRequired = x.refreshRequired,
164 .refreshTimeNanos = x.refreshTimeNanos,
165 };
166}
Ady Abrahame7385f72021-09-05 00:54:25 -0700167mat4 makeMat4(std::vector<float> in) {
168 return mat4(static_cast<const float*>(in.data()));
169}
170
171} // namespace
172
173class AidlIComposerCallbackWrapper : public BnComposerCallback {
174public:
Yichi Chen3401b562022-01-17 15:42:35 +0800175 AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {}
Ady Abrahame7385f72021-09-05 00:54:25 -0700176
177 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
Huihong Luo791bef92023-09-19 21:18:45 -0700178 const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED
179 : AidlDisplayHotplugEvent::DISCONNECTED;
180 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
Ady Abrahame7385f72021-09-05 00:54:25 -0700181 return ::ndk::ScopedAStatus::ok();
182 }
183
184 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800185 mCallback.onComposerHalRefresh(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700186 return ::ndk::ScopedAStatus::ok();
187 }
Yichi Chen3401b562022-01-17 15:42:35 +0800188
Ady Abrahame7385f72021-09-05 00:54:25 -0700189 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800190 mCallback.onComposerHalSeamlessPossible(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700191 return ::ndk::ScopedAStatus::ok();
192 }
Yichi Chen3401b562022-01-17 15:42:35 +0800193
Ady Abrahame7385f72021-09-05 00:54:25 -0700194 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
195 int32_t in_vsyncPeriodNanos) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800196 mCallback.onComposerHalVsync(translate<Display>(in_display), in_timestamp,
197 static_cast<uint32_t>(in_vsyncPeriodNanos));
Ady Abrahame7385f72021-09-05 00:54:25 -0700198 return ::ndk::ScopedAStatus::ok();
199 }
Yichi Chen3401b562022-01-17 15:42:35 +0800200
Ady Abrahame7385f72021-09-05 00:54:25 -0700201 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
202 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
Yichi Chen3401b562022-01-17 15:42:35 +0800203 mCallback.onComposerHalVsyncPeriodTimingChanged(translate<Display>(in_display),
204 translate<V2_4::VsyncPeriodChangeTimeline>(
205 in_updatedTimeline));
206 return ::ndk::ScopedAStatus::ok();
207 }
208
209 ::ndk::ScopedAStatus onVsyncIdle(int64_t in_display) override {
210 mCallback.onComposerHalVsyncIdle(translate<Display>(in_display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700211 return ::ndk::ScopedAStatus::ok();
212 }
213
ramindani12bfe6b2023-02-03 13:29:19 -0800214 ::ndk::ScopedAStatus onRefreshRateChangedDebug(
215 const RefreshRateChangedDebugData& refreshRateChangedDebugData) override {
216 mCallback.onRefreshRateChangedDebug(refreshRateChangedDebugData);
217 return ::ndk::ScopedAStatus::ok();
218 }
219
Huihong Luo791bef92023-09-19 21:18:45 -0700220 ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display,
221 AidlDisplayHotplugEvent event) override {
222 mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event);
223 return ::ndk::ScopedAStatus::ok();
224 }
225
Ady Abrahame7385f72021-09-05 00:54:25 -0700226private:
Yichi Chen3401b562022-01-17 15:42:35 +0800227 HWC2::ComposerCallback& mCallback;
Ady Abrahame7385f72021-09-05 00:54:25 -0700228};
229
Ady Abraham9fc28052021-10-14 17:21:38 -0700230std::string AidlComposer::instance(const std::string& serviceName) {
231 return std::string(AidlIComposer::descriptor) + "/" + serviceName;
232}
233
234bool AidlComposer::isDeclared(const std::string& serviceName) {
235 return AServiceManager_isDeclared(instance(serviceName).c_str());
236}
Ady Abrahame7385f72021-09-05 00:54:25 -0700237
Ady Abrahama6388c02021-11-11 21:11:51 -0800238AidlComposer::AidlComposer(const std::string& serviceName) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700239 // This only waits if the service is actually declared
Ady Abraham9fc28052021-10-14 17:21:38 -0700240 mAidlComposer = AidlIComposer::fromBinder(
241 ndk::SpAIBinder(AServiceManager_waitForService(instance(serviceName).c_str())));
Ady Abrahame7385f72021-09-05 00:54:25 -0700242 if (!mAidlComposer) {
243 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
244 return;
245 }
246
247 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
248 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
249 return;
250 }
251
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400252 addReader(translate<Display>(kSingleReaderKey));
253
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700254 // If unable to read interface version, then become backwards compatible.
ramindani0cd1d8d2023-06-13 13:43:23 -0700255 const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700256 if (!status.isOk()) {
257 ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
258 status.getDescription().c_str());
259 }
ramindani0cd1d8d2023-06-13 13:43:23 -0700260
261 if (mComposerInterfaceVersion <= 1) {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600262 if (sysprop::clear_slots_with_set_layer_buffer(false)) {
263 mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
264 GraphicBuffer::USAGE_HW_COMPOSER |
265 GraphicBuffer::USAGE_SW_READ_OFTEN |
266 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
267 "AidlComposer");
268 if (!mClearSlotBuffer || mClearSlotBuffer->initCheck() != ::android::OK) {
269 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
270 return;
271 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700272 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700273 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000274 if (getLayerLifecycleBatchCommand()) {
275 mEnableLayerCommandBatchingFlag =
276 FlagManager::getInstance().enable_layer_command_batching();
277 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700278 ALOGI("Loaded AIDL composer3 HAL service");
279}
280
281AidlComposer::~AidlComposer() = default;
282
Ady Abraham4d211cf2021-12-14 16:19:03 -0800283bool AidlComposer::isSupported(OptionalFeature feature) const {
284 switch (feature) {
285 case OptionalFeature::RefreshRateSwitching:
Ady Abraham43065bd2021-12-10 17:22:15 -0800286 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800287 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000288 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000289 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham4d211cf2021-12-14 16:19:03 -0800290 return true;
291 }
292}
293
ramindani19919ff2023-12-07 11:27:06 -0800294bool AidlComposer::isVrrSupported() const {
Sally Qid57eb0d2023-11-07 16:46:15 -0800295 return mComposerInterfaceVersion >= 3 && FlagManager::getInstance().vrr_config();
ramindani0cd1d8d2023-06-13 13:43:23 -0700296}
297
Ady Abrahamde549d42022-01-26 19:19:17 -0800298std::vector<Capability> AidlComposer::getCapabilities() {
Ady Abrahame7385f72021-09-05 00:54:25 -0700299 std::vector<Capability> capabilities;
300 const auto status = mAidlComposer->getCapabilities(&capabilities);
301 if (!status.isOk()) {
302 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
303 return {};
304 }
Ady Abrahamde549d42022-01-26 19:19:17 -0800305 return capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700306}
307
308std::string AidlComposer::dumpDebugInfo() {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800309 int pipefds[2];
310 int result = pipe(pipefds);
311 if (result < 0) {
312 ALOGE("dumpDebugInfo: pipe failed: %s", strerror(errno));
Ady Abrahame7385f72021-09-05 00:54:25 -0700313 return {};
314 }
Ady Abrahamc4acf512022-02-18 17:11:59 -0800315
316 std::string str;
yihsing.shen58847c52022-09-23 15:39:30 +0800317 // Use other thread to read pipe to prevent
318 // pipe is full, making HWC be blocked in writing.
319 std::thread t([&]() {
320 base::ReadFdToString(pipefds[0], &str);
321 });
Ady Abrahamc4acf512022-02-18 17:11:59 -0800322 const auto status = mAidlComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
323 // Close the write-end of the pipe to make sure that when reading from the
324 // read-end we will get eof instead of blocking forever
325 close(pipefds[1]);
326
yihsing.shen58847c52022-09-23 15:39:30 +0800327 if (status != STATUS_OK) {
Ady Abrahamc4acf512022-02-18 17:11:59 -0800328 ALOGE("dumpDebugInfo: dump failed: %d", status);
329 }
330
yihsing.shen58847c52022-09-23 15:39:30 +0800331 t.join();
Ady Abrahamc4acf512022-02-18 17:11:59 -0800332 close(pipefds[0]);
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800333
334 std::string hash;
335 mAidlComposer->getInterfaceHash(&hash);
336 return std::string(mAidlComposer->descriptor) +
337 " version:" + std::to_string(mComposerInterfaceVersion) + " hash:" + hash + str;
Ady Abrahame7385f72021-09-05 00:54:25 -0700338}
339
Yichi Chen3401b562022-01-17 15:42:35 +0800340void AidlComposer::registerCallback(HWC2::ComposerCallback& callback) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700341 if (mAidlComposerCallback) {
342 ALOGE("Callback already registered");
343 }
Yichi Chen3401b562022-01-17 15:42:35 +0800344
Ady Abraham9fc28052021-10-14 17:21:38 -0700345 mAidlComposerCallback = ndk::SharedRefBase::make<AidlIComposerCallbackWrapper>(callback);
Ady Abrahame7385f72021-09-05 00:54:25 -0700346 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
347
348 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
349 if (!status.isOk()) {
350 ALOGE("registerCallback failed %s", status.getDescription().c_str());
351 }
352}
353
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400354Error AidlComposer::executeCommands(Display display) {
355 mMutex.lock_shared();
356 auto error = execute(display);
357 mMutex.unlock_shared();
358 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700359}
360
361uint32_t AidlComposer::getMaxVirtualDisplayCount() {
362 int32_t count = 0;
363 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
364 if (!status.isOk()) {
365 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
366 return 0;
367 }
368 return static_cast<uint32_t>(count);
369}
370
371Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
372 Display* outDisplay) {
373 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
374 const int32_t bufferSlotCount = 1;
375 VirtualDisplay virtualDisplay;
376 const auto status =
377 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
378 static_cast<int32_t>(height),
379 static_cast<AidlPixelFormat>(*format),
380 bufferSlotCount, &virtualDisplay);
381
382 if (!status.isOk()) {
383 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
384 return static_cast<Error>(status.getServiceSpecificError());
385 }
386
387 *outDisplay = translate<Display>(virtualDisplay.display);
388 *format = static_cast<PixelFormat>(virtualDisplay.format);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400389 addDisplay(translate<Display>(virtualDisplay.display));
Ady Abrahame7385f72021-09-05 00:54:25 -0700390 return Error::NONE;
391}
392
393Error AidlComposer::destroyVirtualDisplay(Display display) {
394 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
395 if (!status.isOk()) {
396 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
397 return static_cast<Error>(status.getServiceSpecificError());
398 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400399 removeDisplay(display);
Ady Abrahame7385f72021-09-05 00:54:25 -0700400 return Error::NONE;
401}
402
403Error AidlComposer::acceptDisplayChanges(Display display) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400404 Error error = Error::NONE;
405 mMutex.lock_shared();
406 if (auto writer = getWriter(display)) {
407 writer->get().acceptDisplayChanges(translate<int64_t>(display));
408 } else {
409 error = Error::BAD_DISPLAY;
410 }
411 mMutex.unlock_shared();
412 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700413}
414
415Error AidlComposer::createLayer(Display display, Layer* outLayer) {
416 int64_t layer;
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000417 Error error = Error::NONE;
418 if (!mEnableLayerCommandBatchingFlag) {
419 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
420 kMaxLayerBufferCount, &layer);
421 if (!status.isOk()) {
422 ALOGE("createLayer failed %s", status.getDescription().c_str());
423 return static_cast<Error>(status.getServiceSpecificError());
424 }
425 } else {
426 // generate a unique layerID. map in AidlComposer with <SF_layerID, HWC_layerID>
427 // Add this as a new displayCommand in execute command.
428 // return the SF generated layerID instead of calling HWC
429 layer = mLayerID++;
430 mMutex.lock_shared();
431 if (auto writer = getWriter(display)) {
432 writer->get().setLayerLifecycleBatchCommandType(translate<int64_t>(display),
433 translate<int64_t>(layer),
434 LayerLifecycleBatchCommandType::CREATE);
435 writer->get().setNewBufferSlotCount(translate<int64_t>(display),
436 translate<int64_t>(layer), kMaxLayerBufferCount);
437 } else {
438 error = Error::BAD_DISPLAY;
439 }
440 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700441 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700442 *outLayer = translate<Layer>(layer);
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000443 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700444}
445
446Error AidlComposer::destroyLayer(Display display, Layer layer) {
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000447 Error error = Error::NONE;
448 if (!mEnableLayerCommandBatchingFlag) {
449 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
450 translate<int64_t>(layer));
451 if (!status.isOk()) {
452 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
453 return static_cast<Error>(status.getServiceSpecificError());
454 }
455 } else {
456 mMutex.lock_shared();
457 if (auto writer = getWriter(display)) {
458 writer->get()
459 .setLayerLifecycleBatchCommandType(translate<int64_t>(display),
460 translate<int64_t>(layer),
461 LayerLifecycleBatchCommandType::DESTROY);
462 } else {
463 error = Error::BAD_DISPLAY;
464 }
465 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700466 }
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000467
468 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700469}
470
471Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
472 int32_t config;
473 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
474 if (!status.isOk()) {
475 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
476 return static_cast<Error>(status.getServiceSpecificError());
477 }
478 *outConfig = translate<Config>(config);
479 return Error::NONE;
480}
481
482Error AidlComposer::getChangedCompositionTypes(
483 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500484 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400485 std::vector<ChangedCompositionLayer> changedLayers;
486 Error error = Error::NONE;
487 {
488 mMutex.lock_shared();
489 if (auto reader = getReader(display)) {
490 changedLayers = reader->get().takeChangedCompositionTypes(translate<int64_t>(display));
491 } else {
492 error = Error::BAD_DISPLAY;
493 }
494 mMutex.unlock_shared();
495 }
Ady Abrahamde792782021-12-20 10:00:49 -0800496 outLayers->reserve(changedLayers.size());
497 outTypes->reserve(changedLayers.size());
Ady Abrahama6388c02021-11-11 21:11:51 -0800498
Ady Abrahamde792782021-12-20 10:00:49 -0800499 for (const auto& layer : changedLayers) {
500 outLayers->emplace_back(translate<Layer>(layer.layer));
501 outTypes->emplace_back(layer.composition);
502 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400503 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700504}
505
506Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
507 std::vector<AidlColorMode> modes;
508 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
509 if (!status.isOk()) {
510 ALOGE("getColorModes failed %s", status.getDescription().c_str());
511 return static_cast<Error>(status.getServiceSpecificError());
512 }
513 *outModes = translate<ColorMode>(modes);
514 return Error::NONE;
515}
516
517Error AidlComposer::getDisplayAttribute(Display display, Config config,
518 IComposerClient::Attribute attribute, int32_t* outValue) {
519 const auto status =
520 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
521 translate<int32_t>(config),
522 static_cast<AidlDisplayAttribute>(attribute),
523 outValue);
524 if (!status.isOk()) {
525 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
526 return static_cast<Error>(status.getServiceSpecificError());
527 }
528 return Error::NONE;
529}
530
531Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
532 std::vector<int32_t> configs;
533 const auto status =
534 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
535 if (!status.isOk()) {
536 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
537 return static_cast<Error>(status.getServiceSpecificError());
538 }
539 *outConfigs = translate<Config>(configs);
540 return Error::NONE;
541}
542
ramindani263a3f12023-07-18 20:44:49 -0700543Error AidlComposer::getDisplayConfigurations(Display display, int32_t maxFrameIntervalNs,
ramindani0cd1d8d2023-06-13 13:43:23 -0700544 std::vector<DisplayConfiguration>* outConfigs) {
545 const auto status =
ramindani263a3f12023-07-18 20:44:49 -0700546 mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display),
547 maxFrameIntervalNs, outConfigs);
ramindani0cd1d8d2023-06-13 13:43:23 -0700548 if (!status.isOk()) {
549 ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
550 return static_cast<Error>(status.getServiceSpecificError());
551 }
552
553 return Error::NONE;
554}
555
Ady Abrahame7385f72021-09-05 00:54:25 -0700556Error AidlComposer::getDisplayName(Display display, std::string* outName) {
557 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
558 if (!status.isOk()) {
559 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
560 return static_cast<Error>(status.getServiceSpecificError());
561 }
562 return Error::NONE;
563}
564
565Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
566 std::vector<Layer>* outLayers,
567 std::vector<uint32_t>* outLayerRequestMasks) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400568 Error error = Error::NONE;
569 DisplayRequest displayRequests;
570 {
571 mMutex.lock_shared();
572 if (auto reader = getReader(display)) {
573 displayRequests = reader->get().takeDisplayRequests(translate<int64_t>(display));
574 } else {
575 error = Error::BAD_DISPLAY;
576 }
577 mMutex.unlock_shared();
578 }
Ady Abrahamde792782021-12-20 10:00:49 -0800579 *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
580 outLayers->reserve(displayRequests.layerRequests.size());
581 outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
582
583 for (const auto& layer : displayRequests.layerRequests) {
584 outLayers->emplace_back(translate<Layer>(layer.layer));
585 outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
586 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400587 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700588}
589
590Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800591 std::vector<AidlDisplayCapability> capabilities;
Ady Abrahame7385f72021-09-05 00:54:25 -0700592 const auto status =
Ady Abraham33b92b92021-12-08 18:30:27 -0800593 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -0700594 if (!status.isOk()) {
Ady Abraham33b92b92021-12-08 18:30:27 -0800595 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Ady Abrahame7385f72021-09-05 00:54:25 -0700596 return static_cast<Error>(status.getServiceSpecificError());
597 }
Ady Abraham33b92b92021-12-08 18:30:27 -0800598 *outSupport = std::find(capabilities.begin(), capabilities.end(),
599 AidlDisplayCapability::DOZE) != capabilities.end();
Ady Abrahame7385f72021-09-05 00:54:25 -0700600 return Error::NONE;
601}
602
ramindani32cf0602022-03-02 02:30:29 +0000603Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
604 std::vector<AidlDisplayCapability> capabilities;
605 const auto status =
606 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
607 if (!status.isOk()) {
608 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
609 return static_cast<Error>(status.getServiceSpecificError());
610 }
611 *outSupport = std::find(capabilities.begin(), capabilities.end(),
612 AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
613 return Error::NONE;
614}
615
Ady Abrahame7385f72021-09-05 00:54:25 -0700616Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
617 float* outMaxLuminance, float* outMaxAverageLuminance,
618 float* outMinLuminance) {
619 AidlHdrCapabilities capabilities;
620 const auto status =
621 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
622 if (!status.isOk()) {
623 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
624 return static_cast<Error>(status.getServiceSpecificError());
625 }
626
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100627 *outTypes = capabilities.types;
Ady Abrahame7385f72021-09-05 00:54:25 -0700628 *outMaxLuminance = capabilities.maxLuminance;
629 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
630 *outMinLuminance = capabilities.minLuminance;
631 return Error::NONE;
632}
633
Manali Bhutiyani96f866c2023-11-09 18:09:44 +0000634bool AidlComposer::getLayerLifecycleBatchCommand() {
635 std::vector<Capability> capabilities = getCapabilities();
636 bool hasCapability = std::find(capabilities.begin(), capabilities.end(),
637 Capability::LAYER_LIFECYCLE_BATCH_COMMAND) != capabilities.end();
638 return hasCapability;
639}
640
Sally Qibb866c12022-10-17 11:31:20 -0700641Error AidlComposer::getOverlaySupport(AidlOverlayProperties* outProperties) {
642 const auto status = mAidlComposerClient->getOverlaySupport(outProperties);
643 if (!status.isOk()) {
644 ALOGE("getOverlaySupport failed %s", status.getDescription().c_str());
645 return static_cast<Error>(status.getServiceSpecificError());
646 }
Sally Qi0cbd08b2022-08-17 12:12:28 -0700647 return Error::NONE;
648}
649
Ady Abrahame7385f72021-09-05 00:54:25 -0700650Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
651 std::vector<int>* outReleaseFences) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400652 Error error = Error::NONE;
653 std::vector<ReleaseFences::Layer> fences;
654 {
655 mMutex.lock_shared();
656 if (auto reader = getReader(display)) {
657 fences = reader->get().takeReleaseFences(translate<int64_t>(display));
658 } else {
659 error = Error::BAD_DISPLAY;
660 }
661 mMutex.unlock_shared();
662 }
Ady Abrahamde792782021-12-20 10:00:49 -0800663 outLayers->reserve(fences.size());
664 outReleaseFences->reserve(fences.size());
665
666 for (auto& fence : fences) {
667 outLayers->emplace_back(translate<Layer>(fence.layer));
668 // take ownership
669 const int fenceOwner = fence.fence.get();
670 *fence.fence.getR() = -1;
671 outReleaseFences->emplace_back(fenceOwner);
672 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400673 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700674}
675
676Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500677 const auto displayId = translate<int64_t>(display);
678 ATRACE_FORMAT("HwcPresentDisplay %" PRId64, displayId);
679
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400680 Error error = Error::NONE;
681 mMutex.lock_shared();
682 auto writer = getWriter(display);
683 auto reader = getReader(display);
684 if (writer && reader) {
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500685 writer->get().presentDisplay(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400686 error = execute(display);
687 } else {
688 error = Error::BAD_DISPLAY;
689 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700690
Ady Abrahame7385f72021-09-05 00:54:25 -0700691 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400692 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700693 return error;
694 }
695
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500696 auto fence = reader->get().takePresentFence(displayId);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400697 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800698 // take ownership
699 *outPresentFence = fence.get();
700 *fence.getR() = -1;
Ady Abrahame7385f72021-09-05 00:54:25 -0700701 return Error::NONE;
702}
703
704Error AidlComposer::setActiveConfig(Display display, Config config) {
705 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
706 translate<int32_t>(config));
707 if (!status.isOk()) {
708 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
709 return static_cast<Error>(status.getServiceSpecificError());
710 }
711 return Error::NONE;
712}
713
714Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
715 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000716 const std::vector<IComposerClient::Rect>& damage,
717 float hdrSdrRatio) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700718 const native_handle_t* handle = nullptr;
719 if (target.get()) {
720 handle = target->getNativeBuffer()->handle;
721 }
722
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400723 Error error = Error::NONE;
724 mMutex.lock_shared();
725 if (auto writer = getWriter(display)) {
726 writer->get()
727 .setClientTarget(translate<int64_t>(display), slot, handle, acquireFence,
728 translate<aidl::android::hardware::graphics::common::Dataspace>(
729 dataspace),
Alec Mourif97df4d2023-09-06 02:10:05 +0000730 translate<AidlRect>(damage), hdrSdrRatio);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400731 } else {
732 error = Error::BAD_DISPLAY;
733 }
734 mMutex.unlock_shared();
735 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700736}
737
738Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
739 const auto status =
740 mAidlComposerClient->setColorMode(translate<int64_t>(display),
741 translate<AidlColorMode>(mode),
742 translate<AidlRenderIntent>(renderIntent));
743 if (!status.isOk()) {
744 ALOGE("setColorMode failed %s", status.getDescription().c_str());
745 return static_cast<Error>(status.getServiceSpecificError());
746 }
747 return Error::NONE;
748}
749
Ady Abrahamdc011a92021-12-21 14:06:44 -0800750Error AidlComposer::setColorTransform(Display display, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400751 auto error = Error::NONE;
752 mMutex.lock_shared();
753 if (auto writer = getWriter(display)) {
754 writer->get().setColorTransform(translate<int64_t>(display), matrix);
755 } else {
756 error = Error::BAD_DISPLAY;
757 }
758 mMutex.unlock_shared();
759 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700760}
761
762Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
763 int releaseFence) {
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().setOutputBuffer(translate<int64_t>(display), 0, buffer, dup(releaseFence));
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::setPowerMode(Display display, IComposerClient::PowerMode mode) {
776 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
777 translate<PowerMode>(mode));
778 if (!status.isOk()) {
779 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
780 return static_cast<Error>(status.getServiceSpecificError());
781 }
782 return Error::NONE;
783}
784
785Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
786 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
787 const auto status =
788 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
789 if (!status.isOk()) {
790 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
791 return static_cast<Error>(status.getServiceSpecificError());
792 }
793 return Error::NONE;
794}
795
796Error AidlComposer::setClientTargetSlotCount(Display display) {
797 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
798 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
799 bufferSlotCount);
800 if (!status.isOk()) {
801 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
802 return static_cast<Error>(status.getServiceSpecificError());
803 }
804 return Error::NONE;
805}
806
Ady Abraham43065bd2021-12-10 17:22:15 -0800807Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani09acbb82023-11-03 09:02:38 -0700808 int32_t frameIntervalNs, uint32_t* outNumTypes,
809 uint32_t* outNumRequests) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400810 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500811 ATRACE_FORMAT("HwcValidateDisplay %" PRId64, displayId);
812
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400813 Error error = Error::NONE;
814 mMutex.lock_shared();
815 auto writer = getWriter(display);
816 auto reader = getReader(display);
817 if (writer && reader) {
ramindani09acbb82023-11-03 09:02:38 -0700818 writer->get().validateDisplay(displayId, ClockMonotonicTimestamp{expectedPresentTime},
819 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400820 error = execute(display);
821 } else {
822 error = Error::BAD_DISPLAY;
823 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700824
Ady Abrahame7385f72021-09-05 00:54:25 -0700825 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400826 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700827 return error;
828 }
829
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400830 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700831
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400832 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700833 return Error::NONE;
834}
835
Ady Abraham43065bd2021-12-10 17:22:15 -0800836Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700837 int32_t frameIntervalNs, uint32_t* outNumTypes,
838 uint32_t* outNumRequests, int* outPresentFence,
839 uint32_t* state) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400840 const auto displayId = translate<int64_t>(display);
Leon Scroggins IIIe85e16e2022-12-12 12:51:18 -0500841 ATRACE_FORMAT("HwcPresentOrValidateDisplay %" PRId64, displayId);
842
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400843 Error error = Error::NONE;
844 mMutex.lock_shared();
845 auto writer = getWriter(display);
846 auto reader = getReader(display);
847 if (writer && reader) {
848 writer->get().presentOrvalidateDisplay(displayId,
ramindani4aac32c2023-10-30 14:13:30 -0700849 ClockMonotonicTimestamp{expectedPresentTime},
850 frameIntervalNs);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400851 error = execute(display);
852 } else {
853 error = Error::BAD_DISPLAY;
854 }
Ady Abrahame7385f72021-09-05 00:54:25 -0700855
Ady Abrahame7385f72021-09-05 00:54:25 -0700856 if (error != Error::NONE) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400857 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700858 return error;
859 }
860
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400861 const auto result = reader->get().takePresentOrValidateStage(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800862 if (!result.has_value()) {
863 *state = translate<uint32_t>(-1);
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400864 mMutex.unlock_shared();
Ady Abrahamde792782021-12-20 10:00:49 -0800865 return Error::NO_RESOURCES;
Ady Abrahame7385f72021-09-05 00:54:25 -0700866 }
867
Ady Abrahamde792782021-12-20 10:00:49 -0800868 *state = translate<uint32_t>(*result);
869
870 if (*result == PresentOrValidate::Result::Presented) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400871 auto fence = reader->get().takePresentFence(displayId);
Ady Abrahamde792782021-12-20 10:00:49 -0800872 // take ownership
873 *outPresentFence = fence.get();
874 *fence.getR() = -1;
875 }
876
877 if (*result == PresentOrValidate::Result::Validated) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400878 reader->get().hasChanges(displayId, outNumTypes, outNumRequests);
Ady Abrahame7385f72021-09-05 00:54:25 -0700879 }
880
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400881 mMutex.unlock_shared();
Ady Abrahame7385f72021-09-05 00:54:25 -0700882 return Error::NONE;
883}
884
885Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400886 Error error = Error::NONE;
887 mMutex.lock_shared();
888 if (auto writer = getWriter(display)) {
889 writer->get().setLayerCursorPosition(translate<int64_t>(display), translate<int64_t>(layer),
890 x, y);
891 } else {
892 error = Error::BAD_DISPLAY;
893 }
894 mMutex.unlock_shared();
895 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700896}
897
898Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
899 const sp<GraphicBuffer>& buffer, int acquireFence) {
Ady Abrahame7385f72021-09-05 00:54:25 -0700900 const native_handle_t* handle = nullptr;
901 if (buffer.get()) {
902 handle = buffer->getNativeBuffer()->handle;
903 }
904
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400905 Error error = Error::NONE;
906 mMutex.lock_shared();
907 if (auto writer = getWriter(display)) {
908 writer->get().setLayerBuffer(translate<int64_t>(display), translate<int64_t>(layer), slot,
909 handle, acquireFence);
910 } else {
911 error = Error::BAD_DISPLAY;
912 }
913 mMutex.unlock_shared();
914 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700915}
916
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700917Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
918 const std::vector<uint32_t>& slotsToClear,
919 uint32_t activeBufferSlot) {
920 if (slotsToClear.empty()) {
921 return Error::NONE;
922 }
923
Brian Lindahl90553da2022-12-06 13:36:30 -0700924 Error error = Error::NONE;
925 mMutex.lock_shared();
926 if (auto writer = getWriter(display)) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700927 if (mComposerInterfaceVersion > 1) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700928 writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
929 translate<int64_t>(layer), slotsToClear);
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600930 // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
931 // placeholder buffer, using the slot that needs to cleared... tricky.
932 } else if (mClearSlotBuffer != nullptr) {
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700933 for (uint32_t slot : slotsToClear) {
934 // Don't clear the active buffer slot because we need to restore the active buffer
935 // after clearing the requested buffer slots with a placeholder buffer.
936 if (slot != activeBufferSlot) {
937 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
938 translate<int64_t>(layer), slot,
939 mClearSlotBuffer->handle,
940 /*fence*/ -1);
941 }
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700942 }
Brian Lindahldbf7e3a2022-12-16 11:43:39 -0700943 // Since we clear buffers by setting them to a placeholder buffer, we want to make
944 // sure that the last setLayerBuffer command is sent with the currently active
945 // buffer, not the placeholder buffer, so that there is no perceptual change when
946 // buffers are discarded.
947 writer->get().setLayerBufferWithNewCommand(translate<int64_t>(display),
948 translate<int64_t>(layer), activeBufferSlot,
949 // The active buffer is still cached in
950 // its slot and doesn't need a fence.
951 /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700952 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700953 } else {
954 error = Error::BAD_DISPLAY;
955 }
956 mMutex.unlock_shared();
957 return error;
958}
959
Ady Abrahame7385f72021-09-05 00:54:25 -0700960Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
961 const std::vector<IComposerClient::Rect>& damage) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400962 Error error = Error::NONE;
963 mMutex.lock_shared();
964 if (auto writer = getWriter(display)) {
965 writer->get().setLayerSurfaceDamage(translate<int64_t>(display), translate<int64_t>(layer),
966 translate<AidlRect>(damage));
967 } else {
968 error = Error::BAD_DISPLAY;
969 }
970 mMutex.unlock_shared();
971 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700972}
973
974Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
975 IComposerClient::BlendMode mode) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400976 Error error = Error::NONE;
977 mMutex.lock_shared();
978 if (auto writer = getWriter(display)) {
979 writer->get().setLayerBlendMode(translate<int64_t>(display), translate<int64_t>(layer),
980 translate<BlendMode>(mode));
981 } else {
982 error = Error::BAD_DISPLAY;
983 }
984 mMutex.unlock_shared();
985 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700986}
987
Ady Abraham6e60b142022-01-06 18:10:35 -0800988Error AidlComposer::setLayerColor(Display display, Layer layer, const Color& color) {
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().setLayerColor(translate<int64_t>(display), translate<int64_t>(layer), color);
993 } else {
994 error = Error::BAD_DISPLAY;
995 }
996 mMutex.unlock_shared();
997 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -0700998}
999
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001000Error AidlComposer::setLayerCompositionType(
1001 Display display, Layer layer,
1002 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001003 Error error = Error::NONE;
1004 mMutex.lock_shared();
1005 if (auto writer = getWriter(display)) {
1006 writer->get().setLayerCompositionType(translate<int64_t>(display),
1007 translate<int64_t>(layer), type);
1008 } else {
1009 error = Error::BAD_DISPLAY;
1010 }
1011 mMutex.unlock_shared();
1012 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001013}
1014
1015Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
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().setLayerDataspace(translate<int64_t>(display), translate<int64_t>(layer),
1020 translate<AidlDataspace>(dataspace));
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::setLayerDisplayFrame(Display display, Layer layer,
1029 const IComposerClient::Rect& frame) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001030 Error error = Error::NONE;
1031 mMutex.lock_shared();
1032 if (auto writer = getWriter(display)) {
1033 writer->get().setLayerDisplayFrame(translate<int64_t>(display), translate<int64_t>(layer),
1034 translate<AidlRect>(frame));
1035 } else {
1036 error = Error::BAD_DISPLAY;
1037 }
1038 mMutex.unlock_shared();
1039 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001040}
1041
1042Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
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().setLayerPlaneAlpha(translate<int64_t>(display), translate<int64_t>(layer),
1047 alpha);
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::setLayerSidebandStream(Display display, Layer layer,
1056 const native_handle_t* stream) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001057 Error error = Error::NONE;
1058 mMutex.lock_shared();
1059 if (auto writer = getWriter(display)) {
1060 writer->get().setLayerSidebandStream(translate<int64_t>(display), translate<int64_t>(layer),
1061 stream);
1062 } else {
1063 error = Error::BAD_DISPLAY;
1064 }
1065 mMutex.unlock_shared();
1066 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001067}
1068
1069Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
1070 const IComposerClient::FRect& crop) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001071 Error error = Error::NONE;
1072 mMutex.lock_shared();
1073 if (auto writer = getWriter(display)) {
1074 writer->get().setLayerSourceCrop(translate<int64_t>(display), translate<int64_t>(layer),
1075 translate<AidlFRect>(crop));
1076 } else {
1077 error = Error::BAD_DISPLAY;
1078 }
1079 mMutex.unlock_shared();
1080 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001081}
1082
1083Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
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().setLayerTransform(translate<int64_t>(display), translate<int64_t>(layer),
1088 translate<AidlTransform>(transform));
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::setLayerVisibleRegion(Display display, Layer layer,
1097 const std::vector<IComposerClient::Rect>& visible) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001098 Error error = Error::NONE;
1099 mMutex.lock_shared();
1100 if (auto writer = getWriter(display)) {
1101 writer->get().setLayerVisibleRegion(translate<int64_t>(display), translate<int64_t>(layer),
1102 translate<AidlRect>(visible));
1103 } else {
1104 error = Error::BAD_DISPLAY;
1105 }
1106 mMutex.unlock_shared();
1107 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001108}
1109
1110Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
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().setLayerZOrder(translate<int64_t>(display), translate<int64_t>(layer), z);
1115 } else {
1116 error = Error::BAD_DISPLAY;
1117 }
1118 mMutex.unlock_shared();
1119 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001120}
1121
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001122Error AidlComposer::execute(Display display) {
1123 auto writer = getWriter(display);
1124 auto reader = getReader(display);
1125 if (!writer || !reader) {
1126 return Error::BAD_DISPLAY;
1127 }
1128
Huihong Luoe7382c12023-04-21 20:24:32 +00001129 auto commands = writer->get().takePendingCommands();
Ady Abrahama6388c02021-11-11 21:11:51 -08001130 if (commands.empty()) {
Ady Abrahame7385f72021-09-05 00:54:25 -07001131 return Error::NONE;
1132 }
1133
Ady Abrahamde792782021-12-20 10:00:49 -08001134 { // scope for results
1135 std::vector<CommandResultPayload> results;
1136 auto status = mAidlComposerClient->executeCommands(commands, &results);
1137 if (!status.isOk()) {
1138 ALOGE("executeCommands failed %s", status.getDescription().c_str());
1139 return static_cast<Error>(status.getServiceSpecificError());
1140 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001141
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001142 reader->get().parse(std::move(results));
Ady Abrahamde792782021-12-20 10:00:49 -08001143 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001144 const auto commandErrors = reader->get().takeErrors();
Ady Abrahama6388c02021-11-11 21:11:51 -08001145 Error error = Error::NONE;
1146 for (const auto& cmdErr : commandErrors) {
1147 const auto index = static_cast<size_t>(cmdErr.commandIndex);
1148 if (index < 0 || index >= commands.size()) {
1149 ALOGE("invalid command index %zu", index);
1150 return Error::BAD_PARAMETER;
Ady Abrahame7385f72021-09-05 00:54:25 -07001151 }
1152
Ady Abrahama6388c02021-11-11 21:11:51 -08001153 const auto& command = commands[index];
Ady Abraham42977362021-12-07 21:04:49 -08001154 if (command.validateDisplay || command.presentDisplay || command.presentOrValidateDisplay) {
1155 error = translate<Error>(cmdErr.errorCode);
1156 } else {
1157 ALOGW("command '%s' generated error %" PRId32, command.toString().c_str(),
1158 cmdErr.errorCode);
Ady Abrahame7385f72021-09-05 00:54:25 -07001159 }
1160 }
1161
Ady Abrahame7385f72021-09-05 00:54:25 -07001162 return error;
1163}
1164
1165Error AidlComposer::setLayerPerFrameMetadata(
1166 Display display, Layer layer,
1167 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001168 Error error = Error::NONE;
1169 mMutex.lock_shared();
1170 if (auto writer = getWriter(display)) {
1171 writer->get().setLayerPerFrameMetadata(translate<int64_t>(display),
1172 translate<int64_t>(layer),
1173 translate<AidlPerFrameMetadata>(perFrameMetadatas));
1174 } else {
1175 error = Error::BAD_DISPLAY;
1176 }
1177 mMutex.unlock_shared();
1178 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001179}
1180
1181std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
1182 Display display) {
1183 std::vector<AidlPerFrameMetadataKey> keys;
1184 const auto status =
1185 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
1186 if (!status.isOk()) {
1187 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
1188 return {};
1189 }
1190 return translate<IComposerClient::PerFrameMetadataKey>(keys);
1191}
1192
1193Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1194 std::vector<RenderIntent>* outRenderIntents) {
1195 std::vector<AidlRenderIntent> renderIntents;
1196 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
1197 translate<AidlColorMode>(colorMode),
1198 &renderIntents);
1199 if (!status.isOk()) {
1200 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
1201 return static_cast<Error>(status.getServiceSpecificError());
1202 }
1203 *outRenderIntents = translate<RenderIntent>(renderIntents);
1204 return Error::NONE;
1205}
1206
1207Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1208 std::vector<float> matrix;
1209 const auto status =
1210 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
1211 &matrix);
1212 if (!status.isOk()) {
1213 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
1214 return static_cast<Error>(status.getServiceSpecificError());
1215 }
1216 *outMatrix = makeMat4(matrix);
1217 return Error::NONE;
1218}
1219
1220Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1221 std::vector<uint8_t>* outData) {
1222 AidlDisplayIdentification displayIdentification;
1223 const auto status =
1224 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
1225 &displayIdentification);
1226 if (!status.isOk()) {
1227 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
1228 return static_cast<Error>(status.getServiceSpecificError());
1229 }
1230
1231 *outPort = static_cast<uint8_t>(displayIdentification.port);
1232 *outData = displayIdentification.data;
1233
1234 return Error::NONE;
1235}
1236
1237Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001238 Error error = Error::NONE;
1239 mMutex.lock_shared();
1240 if (auto writer = getWriter(display)) {
1241 writer->get().setLayerColorTransform(translate<int64_t>(display), translate<int64_t>(layer),
1242 matrix);
1243 } else {
1244 error = Error::BAD_DISPLAY;
1245 }
1246 mMutex.unlock_shared();
1247 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001248}
1249
1250Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1251 Dataspace* outDataspace,
1252 uint8_t* outComponentMask) {
1253 if (!outFormat || !outDataspace || !outComponentMask) {
1254 return Error::BAD_PARAMETER;
1255 }
1256
1257 AidlDisplayContentSamplingAttributes attributes;
1258 const auto status =
1259 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
1260 &attributes);
1261 if (!status.isOk()) {
1262 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
1263 return static_cast<Error>(status.getServiceSpecificError());
1264 }
1265
1266 *outFormat = translate<PixelFormat>(attributes.format);
1267 *outDataspace = translate<Dataspace>(attributes.dataspace);
1268 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
1269 return Error::NONE;
1270}
1271
1272Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1273 uint8_t componentMask, uint64_t maxFrames) {
1274 const auto status =
1275 mAidlComposerClient
1276 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
1277 static_cast<AidlFormatColorComponent>(
1278 componentMask),
1279 static_cast<int64_t>(maxFrames));
1280 if (!status.isOk()) {
1281 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
1282 return static_cast<Error>(status.getServiceSpecificError());
1283 }
1284 return Error::NONE;
1285}
1286
1287Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1288 uint64_t timestamp, DisplayedFrameStats* outStats) {
1289 if (!outStats) {
1290 return Error::BAD_PARAMETER;
1291 }
1292
1293 AidlDisplayContentSample sample;
1294 const auto status =
1295 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
1296 static_cast<int64_t>(maxFrames),
1297 static_cast<int64_t>(timestamp),
1298 &sample);
1299 if (!status.isOk()) {
1300 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
1301 return static_cast<Error>(status.getServiceSpecificError());
1302 }
1303 *outStats = translate<DisplayedFrameStats>(sample);
1304 return Error::NONE;
1305}
1306
1307Error AidlComposer::setLayerPerFrameMetadataBlobs(
1308 Display display, Layer layer,
1309 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001310 Error error = Error::NONE;
1311 mMutex.lock_shared();
1312 if (auto writer = getWriter(display)) {
1313 writer->get().setLayerPerFrameMetadataBlobs(translate<int64_t>(display),
1314 translate<int64_t>(layer),
1315 translate<AidlPerFrameMetadataBlob>(metadata));
1316 } else {
1317 error = Error::BAD_DISPLAY;
1318 }
1319 mMutex.unlock_shared();
1320 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001321}
1322
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001323Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -08001324 const DisplayBrightnessOptions& options) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001325 Error error = Error::NONE;
1326 mMutex.lock_shared();
1327 if (auto writer = getWriter(display)) {
1328 writer->get().setDisplayBrightness(translate<int64_t>(display), brightness, brightnessNits);
Alec Mouricdf16792021-12-10 13:16:06 -08001329
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001330 if (options.applyImmediately) {
1331 error = execute(display);
1332 mMutex.unlock_shared();
1333 return error;
1334 }
1335 } else {
1336 error = Error::BAD_DISPLAY;
Alec Mouricdf16792021-12-10 13:16:06 -08001337 }
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001338 mMutex.unlock_shared();
1339 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001340}
1341
1342Error AidlComposer::getDisplayCapabilities(Display display,
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001343 std::vector<AidlDisplayCapability>* outCapabilities) {
1344 const auto status = mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display),
1345 outCapabilities);
Ady Abrahame7385f72021-09-05 00:54:25 -07001346 if (!status.isOk()) {
1347 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001348 outCapabilities->clear();
Ady Abrahame7385f72021-09-05 00:54:25 -07001349 return static_cast<Error>(status.getServiceSpecificError());
1350 }
Ady Abrahame7385f72021-09-05 00:54:25 -07001351 return Error::NONE;
1352}
1353
1354V2_4::Error AidlComposer::getDisplayConnectionType(
1355 Display display, IComposerClient::DisplayConnectionType* outType) {
1356 AidlDisplayConnectionType type;
1357 const auto status =
1358 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
1359 if (!status.isOk()) {
1360 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
1361 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1362 }
1363 *outType = translate<IComposerClient::DisplayConnectionType>(type);
1364 return V2_4::Error::NONE;
1365}
1366
1367V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1368 int32_t vsyncPeriod;
1369 const auto status =
1370 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
1371 if (!status.isOk()) {
1372 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
1373 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1374 }
1375 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
1376 return V2_4::Error::NONE;
1377}
1378
1379V2_4::Error AidlComposer::setActiveConfigWithConstraints(
1380 Display display, Config config,
1381 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1382 VsyncPeriodChangeTimeline* outTimeline) {
1383 AidlVsyncPeriodChangeTimeline timeline;
1384 const auto status =
1385 mAidlComposerClient
1386 ->setActiveConfigWithConstraints(translate<int64_t>(display),
1387 translate<int32_t>(config),
1388 translate<AidlVsyncPeriodChangeConstraints>(
1389 vsyncPeriodChangeConstraints),
1390 &timeline);
1391 if (!status.isOk()) {
1392 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
1393 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1394 }
1395 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
1396 return V2_4::Error::NONE;
1397}
1398
1399V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1400 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
1401 if (!status.isOk()) {
1402 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
1403 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1404 }
1405 return V2_4::Error::NONE;
1406}
1407
1408V2_4::Error AidlComposer::getSupportedContentTypes(
1409 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1410 std::vector<AidlContentType> types;
1411 const auto status =
1412 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1413 if (!status.isOk()) {
1414 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1415 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1416 }
1417 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1418 return V2_4::Error::NONE;
1419}
1420
1421V2_4::Error AidlComposer::setContentType(Display display,
1422 IComposerClient::ContentType contentType) {
1423 const auto status =
1424 mAidlComposerClient->setContentType(translate<int64_t>(display),
1425 translate<AidlContentType>(contentType));
1426 if (!status.isOk()) {
1427 ALOGE("setContentType failed %s", status.getDescription().c_str());
1428 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1429 }
1430 return V2_4::Error::NONE;
1431}
1432
Ady Abraham3f976752021-12-20 16:17:50 -08001433V2_4::Error AidlComposer::setLayerGenericMetadata(Display, Layer, const std::string&, bool,
1434 const std::vector<uint8_t>&) {
1435 // There are no users for this API. See b/209691612.
1436 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001437}
1438
1439V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
Ady Abraham3f976752021-12-20 16:17:50 -08001440 std::vector<IComposerClient::LayerGenericMetadataKey>*) {
1441 // There are no users for this API. See b/209691612.
1442 return V2_4::Error::UNSUPPORTED;
Ady Abrahame7385f72021-09-05 00:54:25 -07001443}
1444
Kriti Dang7defaf32021-11-15 11:55:43 +01001445Error AidlComposer::setBootDisplayConfig(Display display, Config config) {
1446 const auto status = mAidlComposerClient->setBootDisplayConfig(translate<int64_t>(display),
1447 translate<int32_t>(config));
1448 if (!status.isOk()) {
1449 ALOGE("setBootDisplayConfig failed %s", status.getDescription().c_str());
1450 return static_cast<Error>(status.getServiceSpecificError());
1451 }
1452 return Error::NONE;
1453}
1454
1455Error AidlComposer::clearBootDisplayConfig(Display display) {
1456 const auto status = mAidlComposerClient->clearBootDisplayConfig(translate<int64_t>(display));
1457 if (!status.isOk()) {
1458 ALOGE("clearBootDisplayConfig failed %s", status.getDescription().c_str());
1459 return static_cast<Error>(status.getServiceSpecificError());
1460 }
1461 return Error::NONE;
1462}
1463
1464Error AidlComposer::getPreferredBootDisplayConfig(Display display, Config* config) {
1465 int32_t displayConfig;
1466 const auto status =
1467 mAidlComposerClient->getPreferredBootDisplayConfig(translate<int64_t>(display),
1468 &displayConfig);
1469 if (!status.isOk()) {
1470 ALOGE("getPreferredBootDisplayConfig failed %s", status.getDescription().c_str());
1471 return static_cast<Error>(status.getServiceSpecificError());
1472 }
1473 *config = translate<uint32_t>(displayConfig);
1474 return Error::NONE;
1475}
1476
Kriti Dang674b9372022-11-18 10:58:44 +01001477Error AidlComposer::getHdrConversionCapabilities(
1478 std::vector<AidlHdrConversionCapability>* hdrConversionCapabilities) {
1479 const auto status =
1480 mAidlComposerClient->getHdrConversionCapabilities(hdrConversionCapabilities);
1481 if (!status.isOk()) {
1482 hdrConversionCapabilities = {};
1483 ALOGE("getHdrConversionCapabilities failed %s", status.getDescription().c_str());
1484 return static_cast<Error>(status.getServiceSpecificError());
1485 }
1486 return Error::NONE;
1487}
1488
Kriti Dangd432bb52023-02-09 18:21:04 +01001489Error AidlComposer::setHdrConversionStrategy(AidlHdrConversionStrategy hdrConversionStrategy,
1490 Hdr* outPreferredHdrOutputType) {
1491 const auto status = mAidlComposerClient->setHdrConversionStrategy(hdrConversionStrategy,
1492 outPreferredHdrOutputType);
Kriti Dang674b9372022-11-18 10:58:44 +01001493 if (!status.isOk()) {
1494 ALOGE("setHdrConversionStrategy failed %s", status.getDescription().c_str());
1495 return static_cast<Error>(status.getServiceSpecificError());
1496 }
1497 return Error::NONE;
1498}
1499
ramindanib2158ee2023-02-13 20:29:59 -08001500Error AidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display displayId, bool enabled) {
1501 const auto status =
1502 mAidlComposerClient->setRefreshRateChangedCallbackDebugEnabled(translate<int64_t>(
1503 displayId),
1504 enabled);
1505 if (!status.isOk()) {
1506 ALOGE("setRefreshRateChangedCallbackDebugEnabled failed %s",
1507 status.getDescription().c_str());
1508 return static_cast<Error>(status.getServiceSpecificError());
1509 }
1510 return Error::NONE;
1511}
1512
ramindani3acaaf52023-09-25 10:31:27 -07001513Error AidlComposer::notifyExpectedPresent(Display displayId, nsecs_t expectedPresentTime,
1514 int32_t frameIntervalNs) {
1515 const auto status =
1516 mAidlComposerClient->notifyExpectedPresent(translate<int64_t>(displayId),
1517 ClockMonotonicTimestamp{expectedPresentTime},
1518 frameIntervalNs);
1519
1520 if (!status.isOk()) {
1521 ALOGE("notifyExpectedPresent failed %s", status.getDescription().c_str());
1522 return static_cast<Error>(status.getServiceSpecificError());
1523 }
1524 return Error::NONE;
1525}
1526
Ady Abrahame7385f72021-09-05 00:54:25 -07001527Error AidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001528 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001529 Error error = Error::NONE;
1530 mMutex.lock_shared();
1531 if (auto reader = getReader(display)) {
1532 *outClientTargetProperty =
1533 reader->get().takeClientTargetProperty(translate<int64_t>(display));
1534 } else {
1535 error = Error::BAD_DISPLAY;
1536 }
1537 mMutex.unlock_shared();
1538 return error;
Ady Abrahame7385f72021-09-05 00:54:25 -07001539}
1540
Alec Mouri6da0e272022-02-07 12:45:57 -08001541Error AidlComposer::setLayerBrightness(Display display, Layer layer, float brightness) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001542 Error error = Error::NONE;
1543 mMutex.lock_shared();
1544 if (auto writer = getWriter(display)) {
1545 writer->get().setLayerBrightness(translate<int64_t>(display), translate<int64_t>(layer),
1546 brightness);
1547 } else {
1548 error = Error::BAD_DISPLAY;
1549 }
1550 mMutex.unlock_shared();
1551 return error;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001552}
1553
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001554Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer,
1555 const std::vector<IComposerClient::Rect>& blocking) {
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001556 Error error = Error::NONE;
1557 mMutex.lock_shared();
1558 if (auto writer = getWriter(display)) {
1559 writer->get().setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer),
1560 translate<AidlRect>(blocking));
1561 } else {
1562 error = Error::BAD_DISPLAY;
1563 }
1564 mMutex.unlock_shared();
1565 return error;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001566}
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001567
1568Error AidlComposer::getDisplayDecorationSupport(Display display,
1569 std::optional<DisplayDecorationSupport>* support) {
1570 const auto status =
1571 mAidlComposerClient->getDisplayDecorationSupport(translate<int64_t>(display), support);
1572 if (!status.isOk()) {
1573 ALOGE("getDisplayDecorationSupport failed %s", status.getDescription().c_str());
1574 support->reset();
1575 return static_cast<Error>(status.getServiceSpecificError());
1576 }
1577 return Error::NONE;
1578}
ramindani32cf0602022-03-02 02:30:29 +00001579
1580Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
1581 const auto status =
1582 mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
1583 translate<int32_t>(timeout.count()));
1584 if (!status.isOk()) {
1585 ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
1586 return static_cast<Error>(status.getServiceSpecificError());
1587 }
1588 return Error::NONE;
1589}
1590
ramindani06e518e2022-03-14 18:47:53 +00001591Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
1592 AidlTransform* outDisplayOrientation) {
1593 const auto status =
1594 mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId),
1595 outDisplayOrientation);
1596 if (!status.isOk()) {
1597 ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str());
1598 return static_cast<Error>(status.getServiceSpecificError());
1599 }
1600 return Error::NONE;
1601}
1602
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001603ftl::Optional<std::reference_wrapper<ComposerClientWriter>> AidlComposer::getWriter(Display display)
1604 REQUIRES_SHARED(mMutex) {
1605 return mWriters.get(display);
1606}
1607
1608ftl::Optional<std::reference_wrapper<ComposerClientReader>> AidlComposer::getReader(Display display)
1609 REQUIRES_SHARED(mMutex) {
1610 if (mSingleReader) {
1611 display = translate<Display>(kSingleReaderKey);
1612 }
1613 return mReaders.get(display);
1614}
1615
1616void AidlComposer::removeDisplay(Display display) {
1617 mMutex.lock();
1618 bool wasErased = mWriters.erase(display);
1619 ALOGW_IF(!wasErased,
1620 "Attempting to remove writer for display %" PRId64 " which is not connected",
1621 translate<int64_t>(display));
1622 if (!mSingleReader) {
1623 removeReader(display);
1624 }
1625 mMutex.unlock();
1626}
1627
1628void AidlComposer::onHotplugDisconnect(Display display) {
1629 removeDisplay(display);
1630}
1631
1632bool AidlComposer::hasMultiThreadedPresentSupport(Display display) {
Leon Scroggins IIIdb635042023-10-20 09:58:17 -04001633 if (!FlagManager::getInstance().multithreaded_present()) return false;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001634 const auto displayId = translate<int64_t>(display);
1635 std::vector<AidlDisplayCapability> capabilities;
1636 const auto status = mAidlComposerClient->getDisplayCapabilities(displayId, &capabilities);
1637 if (!status.isOk()) {
1638 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
1639 return false;
1640 }
1641 return std::find(capabilities.begin(), capabilities.end(),
1642 AidlDisplayCapability::MULTI_THREADED_PRESENT) != capabilities.end();
1643}
1644
1645void AidlComposer::addReader(Display display) {
1646 const auto displayId = translate<int64_t>(display);
1647 std::optional<int64_t> displayOpt;
1648 if (displayId != kSingleReaderKey) {
1649 displayOpt.emplace(displayId);
1650 }
1651 auto [it, added] = mReaders.try_emplace(display, std::move(displayOpt));
1652 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1653 displayId);
1654}
1655
1656void AidlComposer::removeReader(Display display) {
1657 bool wasErased = mReaders.erase(display);
1658 ALOGW_IF(!wasErased,
1659 "Attempting to remove reader for display %" PRId64 " which is not connected",
1660 translate<int64_t>(display));
1661}
1662
1663void AidlComposer::addDisplay(Display display) {
1664 const auto displayId = translate<int64_t>(display);
1665 mMutex.lock();
1666 auto [it, added] = mWriters.try_emplace(display, displayId);
1667 ALOGW_IF(!added, "Attempting to add writer for display %" PRId64 " which is already connected",
1668 displayId);
1669 if (mSingleReader) {
1670 if (hasMultiThreadedPresentSupport(display)) {
1671 mSingleReader = false;
1672 removeReader(translate<Display>(kSingleReaderKey));
1673 // Note that this includes the new display.
1674 for (const auto& [existingDisplay, _] : mWriters) {
1675 addReader(existingDisplay);
1676 }
1677 }
1678 } else {
1679 addReader(display);
1680 }
1681 mMutex.unlock();
1682}
1683
1684void AidlComposer::onHotplugConnect(Display display) {
1685 addDisplay(display);
1686}
Ady Abrahame7385f72021-09-05 00:54:25 -07001687} // namespace Hwc2
1688} // namespace android