blob: e359a26f16abddca418f3470d074fed445cef900 [file] [log] [blame]
Ady Abraham9fc28052021-10-14 17:21:38 -07001/*
2 * Copyright 2016 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// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
21#undef LOG_TAG
22#define LOG_TAG "HwcComposer"
23#define ATRACE_TAG ATRACE_TAG_GRAPHICS
24
25#include "HidlComposerHal.h"
26
Brian Lindahl5b0ffe02023-06-15 14:19:43 -060027#include <SurfaceFlingerProperties.h>
Huihong Luo791bef92023-09-19 21:18:45 -070028#include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h>
Ady Abraham9fc28052021-10-14 17:21:38 -070029#include <android/binder_manager.h>
Vishnu Nairbe0ad902024-06-27 23:38:43 +000030#include <common/trace.h>
Ady Abraham9fc28052021-10-14 17:21:38 -070031#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
32#include <hidl/HidlTransportSupport.h>
33#include <hidl/HidlTransportUtils.h>
34#include <log/log.h>
Brian Lindahl5b0ffe02023-06-15 14:19:43 -060035
Yichi Chen3401b562022-01-17 15:42:35 +080036#include "HWC2.h"
Leon Scroggins III09c25412021-12-02 14:49:56 -050037#include "Hal.h"
Ady Abraham9fc28052021-10-14 17:21:38 -070038
39#include <algorithm>
40#include <cinttypes>
41
Huihong Luo791bef92023-09-19 21:18:45 -070042using aidl::android::hardware::graphics::common::DisplayHotplugEvent;
Kriti Dang674b9372022-11-18 10:58:44 +010043using aidl::android::hardware::graphics::common::HdrConversionCapability;
44using aidl::android::hardware::graphics::common::HdrConversionStrategy;
Ady Abrahamde549d42022-01-26 19:19:17 -080045using aidl::android::hardware::graphics::composer3::Capability;
Alec Mouri85065692022-03-18 00:58:26 +000046using aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness;
47using aidl::android::hardware::graphics::composer3::DimmingStage;
Leon Scroggins III5967aec2021-12-29 11:14:22 -050048using aidl::android::hardware::graphics::composer3::DisplayCapability;
Sally Qi11dcd582024-08-16 18:11:27 -070049using aidl::android::hardware::graphics::composer3::DisplayLuts;
Sally Qi0abc4a52024-09-26 16:13:06 -070050using aidl::android::hardware::graphics::composer3::Luts;
Sally Qi0cbd08b2022-08-17 12:12:28 -070051using aidl::android::hardware::graphics::composer3::OverlayProperties;
Leon Scroggins III5967aec2021-12-29 11:14:22 -050052
Ady Abraham9fc28052021-10-14 17:21:38 -070053namespace android {
54
55using hardware::hidl_handle;
56using hardware::hidl_vec;
57using hardware::Return;
58
59namespace Hwc2 {
Yichi Chen3401b562022-01-17 15:42:35 +080060namespace {
61
62using android::hardware::Return;
63using android::hardware::Void;
64using android::HWC2::ComposerCallback;
65
66class ComposerCallbackBridge : public IComposerCallback {
67public:
68 ComposerCallbackBridge(ComposerCallback& callback, bool vsyncSwitchingSupported)
69 : mCallback(callback), mVsyncSwitchingSupported(vsyncSwitchingSupported) {}
70
Huihong Luo791bef92023-09-19 21:18:45 -070071 // For code sharing purposes, `ComposerCallback` (implemented by SurfaceFlinger)
72 // replaced `onComposerHalHotplug` with `onComposerHalHotplugEvent` by converting
73 // from HIDL's connection into an AIDL DisplayHotplugEvent.
Yichi Chen3401b562022-01-17 15:42:35 +080074 Return<void> onHotplug(Display display, Connection connection) override {
Huihong Luo791bef92023-09-19 21:18:45 -070075 const auto event = connection == Connection::CONNECTED ? DisplayHotplugEvent::CONNECTED
76 : DisplayHotplugEvent::DISCONNECTED;
77 mCallback.onComposerHalHotplugEvent(display, event);
Yichi Chen3401b562022-01-17 15:42:35 +080078 return Void();
79 }
80
81 Return<void> onRefresh(Display display) override {
82 mCallback.onComposerHalRefresh(display);
83 return Void();
84 }
85
86 Return<void> onVsync(Display display, int64_t timestamp) override {
87 if (!mVsyncSwitchingSupported) {
88 mCallback.onComposerHalVsync(display, timestamp, std::nullopt);
89 } else {
90 ALOGW("Unexpected onVsync callback on composer >= 2.4, ignoring.");
91 }
92 return Void();
93 }
94
95 Return<void> onVsync_2_4(Display display, int64_t timestamp,
96 VsyncPeriodNanos vsyncPeriodNanos) override {
97 if (mVsyncSwitchingSupported) {
98 mCallback.onComposerHalVsync(display, timestamp, vsyncPeriodNanos);
99 } else {
100 ALOGW("Unexpected onVsync_2_4 callback on composer <= 2.3, ignoring.");
101 }
102 return Void();
103 }
104
105 Return<void> onVsyncPeriodTimingChanged(Display display,
106 const VsyncPeriodChangeTimeline& timeline) override {
107 mCallback.onComposerHalVsyncPeriodTimingChanged(display, timeline);
108 return Void();
109 }
110
111 Return<void> onSeamlessPossible(Display display) override {
112 mCallback.onComposerHalSeamlessPossible(display);
113 return Void();
114 }
115
116private:
117 ComposerCallback& mCallback;
118 const bool mVsyncSwitchingSupported;
119};
120
121} // namespace
Ady Abraham9fc28052021-10-14 17:21:38 -0700122
123HidlComposer::~HidlComposer() = default;
124
125namespace {
126
127class BufferHandle {
128public:
129 explicit BufferHandle(const native_handle_t* buffer) {
130 // nullptr is not a valid handle to HIDL
131 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
132 }
133
134 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
135 {
136 return mHandle;
137 }
138
139private:
140 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
141 hidl_handle mHandle;
142};
143
144class FenceHandle {
145public:
146 FenceHandle(int fd, bool owned) : mOwned(owned) {
147 native_handle_t* handle;
148 if (fd >= 0) {
149 handle = native_handle_init(mStorage, 1, 0);
150 handle->data[0] = fd;
151 } else {
152 // nullptr is not a valid handle to HIDL
153 handle = native_handle_init(mStorage, 0, 0);
154 }
155 mHandle = handle;
156 }
157
158 ~FenceHandle() {
159 if (mOwned) {
160 native_handle_close(mHandle);
161 }
162 }
163
164 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
165 {
166 return mHandle;
167 }
168
169private:
170 bool mOwned;
171 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
172 hidl_handle mHandle;
173};
174
175// assume NO_RESOURCES when Status::isOk returns false
176constexpr Error kDefaultError = Error::NO_RESOURCES;
177constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
178
179template <typename T, typename U>
180T unwrapRet(Return<T>& ret, const U& default_val) {
181 return (ret.isOk()) ? static_cast<T>(ret) : static_cast<T>(default_val);
182}
183
184Error unwrapRet(Return<Error>& ret) {
185 return unwrapRet(ret, kDefaultError);
186}
187
Ady Abrahamde549d42022-01-26 19:19:17 -0800188template <typename To, typename From>
189To translate(From x) {
190 return static_cast<To>(x);
191}
192
193template <typename To, typename From>
194std::vector<To> translate(const hidl_vec<From>& in) {
195 std::vector<To> out;
196 out.reserve(in.size());
197 std::transform(in.begin(), in.end(), std::back_inserter(out),
198 [](From x) { return translate<To>(x); });
199 return out;
200}
201
Brian Lindahl90553da2022-12-06 13:36:30 -0700202sp<GraphicBuffer> allocateClearSlotBuffer() {
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600203 if (!sysprop::clear_slots_with_set_layer_buffer(false)) {
204 return nullptr;
205 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700206 sp<GraphicBuffer> buffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
207 GraphicBuffer::USAGE_HW_COMPOSER |
208 GraphicBuffer::USAGE_SW_READ_OFTEN |
209 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
210 "HidlComposer");
211 if (!buffer || buffer->initCheck() != ::android::OK) {
212 return nullptr;
213 }
Yi Kong01b81262024-08-12 07:30:15 +0800214 return buffer;
Brian Lindahl90553da2022-12-06 13:36:30 -0700215}
216
Ady Abraham9fc28052021-10-14 17:21:38 -0700217} // anonymous namespace
218
Brian Lindahl90553da2022-12-06 13:36:30 -0700219HidlComposer::HidlComposer(const std::string& serviceName)
220 : mClearSlotBuffer(allocateClearSlotBuffer()), mWriter(kWriterInitialSize) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700221 mComposer = V2_1::IComposer::getService(serviceName);
222
223 if (mComposer == nullptr) {
224 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
225 }
226
227 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
228 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
229 if (tmpError == V2_4::Error::NONE) {
230 mClient = tmpClient;
231 mClient_2_2 = tmpClient;
232 mClient_2_3 = tmpClient;
233 mClient_2_4 = tmpClient;
234 }
235 });
236 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
237 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
238 if (tmpError == Error::NONE) {
239 mClient = tmpClient;
240 mClient_2_2 = tmpClient;
241 mClient_2_3 = tmpClient;
242 }
243 });
244 } else {
245 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
246 if (tmpError != Error::NONE) {
247 return;
248 }
249
250 mClient = tmpClient;
251 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
252 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
253 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
254 "IComposer 2.2 did not return IComposerClient 2.2");
255 }
256 });
257 }
258
259 if (mClient == nullptr) {
260 LOG_ALWAYS_FATAL("failed to create composer client");
261 }
Brian Lindahl90553da2022-12-06 13:36:30 -0700262
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600263 if (!mClearSlotBuffer && sysprop::clear_slots_with_set_layer_buffer(false)) {
Brian Lindahl90553da2022-12-06 13:36:30 -0700264 LOG_ALWAYS_FATAL("Failed to allocate a buffer for clearing layer buffer slots");
265 return;
266 }
Ady Abraham9fc28052021-10-14 17:21:38 -0700267}
268
Ady Abraham4d211cf2021-12-14 16:19:03 -0800269bool HidlComposer::isSupported(OptionalFeature feature) const {
270 switch (feature) {
271 case OptionalFeature::RefreshRateSwitching:
272 return mClient_2_4 != nullptr;
Ady Abraham43065bd2021-12-10 17:22:15 -0800273 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800274 case OptionalFeature::DisplayBrightnessCommand:
ramindani32cf0602022-03-02 02:30:29 +0000275 case OptionalFeature::KernelIdleTimer:
ramindani06e518e2022-03-14 18:47:53 +0000276 case OptionalFeature::PhysicalDisplayOrientation:
Ady Abraham43065bd2021-12-10 17:22:15 -0800277 return false;
Ady Abraham4d211cf2021-12-14 16:19:03 -0800278 }
279}
280
ramindani19919ff2023-12-07 11:27:06 -0800281bool HidlComposer::isVrrSupported() const {
282 // VRR is not supported on the HIDL composer.
ramindani0cd1d8d2023-06-13 13:43:23 -0700283 return false;
284};
285
Ady Abrahamde549d42022-01-26 19:19:17 -0800286std::vector<Capability> HidlComposer::getCapabilities() {
287 std::vector<Capability> capabilities;
288 mComposer->getCapabilities([&](const auto& tmpCapabilities) {
289 capabilities = translate<Capability>(tmpCapabilities);
290 });
Ady Abraham9fc28052021-10-14 17:21:38 -0700291 return capabilities;
292}
293
294std::string HidlComposer::dumpDebugInfo() {
295 std::string info;
Ady Abrahamb7b9a4f2024-01-25 15:57:24 -0800296 info += std::string(mComposer->descriptor) + "\n";
Ady Abraham9fc28052021-10-14 17:21:38 -0700297 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { info = tmpInfo.c_str(); });
298
299 return info;
300}
301
302void HidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
303 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
304
305 auto ret = [&]() {
306 if (mClient_2_4) {
307 return mClient_2_4->registerCallback_2_4(callback);
308 }
309 return mClient->registerCallback(callback);
310 }();
311 if (!ret.isOk()) {
312 ALOGE("failed to register IComposerCallback");
313 }
314}
315
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400316Error HidlComposer::executeCommands(Display) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700317 return execute();
318}
319
320uint32_t HidlComposer::getMaxVirtualDisplayCount() {
321 auto ret = mClient->getMaxVirtualDisplayCount();
322 return unwrapRet(ret, 0);
323}
324
325Error HidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
326 Display* outDisplay) {
327 const uint32_t bufferSlotCount = 1;
328 Error error = kDefaultError;
329 if (mClient_2_2) {
330 mClient_2_2->createVirtualDisplay_2_2(width, height,
331 static_cast<types::V1_1::PixelFormat>(*format),
332 bufferSlotCount,
333 [&](const auto& tmpError, const auto& tmpDisplay,
334 const auto& tmpFormat) {
335 error = tmpError;
336 if (error != Error::NONE) {
337 return;
338 }
339
340 *outDisplay = tmpDisplay;
341 *format = static_cast<types::V1_2::PixelFormat>(
342 tmpFormat);
343 });
344 } else {
345 mClient->createVirtualDisplay(width, height, static_cast<types::V1_0::PixelFormat>(*format),
346 bufferSlotCount,
347 [&](const auto& tmpError, const auto& tmpDisplay,
348 const auto& tmpFormat) {
349 error = tmpError;
350 if (error != Error::NONE) {
351 return;
352 }
353
354 *outDisplay = tmpDisplay;
355 *format = static_cast<PixelFormat>(tmpFormat);
356 });
357 }
358
359 return error;
360}
361
362Error HidlComposer::destroyVirtualDisplay(Display display) {
363 auto ret = mClient->destroyVirtualDisplay(display);
364 return unwrapRet(ret);
365}
366
367Error HidlComposer::acceptDisplayChanges(Display display) {
368 mWriter.selectDisplay(display);
369 mWriter.acceptDisplayChanges();
370 return Error::NONE;
371}
372
373Error HidlComposer::createLayer(Display display, Layer* outLayer) {
374 Error error = kDefaultError;
375 mClient->createLayer(display, kMaxLayerBufferCount,
376 [&](const auto& tmpError, const auto& tmpLayer) {
377 error = tmpError;
378 if (error != Error::NONE) {
379 return;
380 }
381
382 *outLayer = tmpLayer;
383 });
384
385 return error;
386}
387
388Error HidlComposer::destroyLayer(Display display, Layer layer) {
389 auto ret = mClient->destroyLayer(display, layer);
390 return unwrapRet(ret);
391}
392
393Error HidlComposer::getActiveConfig(Display display, Config* outConfig) {
394 Error error = kDefaultError;
395 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
396 error = tmpError;
397 if (error != Error::NONE) {
398 return;
399 }
400
401 *outConfig = tmpConfig;
402 });
403
404 return error;
405}
406
407Error HidlComposer::getChangedCompositionTypes(
408 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500409 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700410 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
411 return Error::NONE;
412}
413
414Error HidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
415 Error error = kDefaultError;
416
417 if (mClient_2_3) {
418 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
419 error = tmpError;
420 if (error != Error::NONE) {
421 return;
422 }
423
424 *outModes = tmpModes;
425 });
426 } else if (mClient_2_2) {
427 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
428 error = tmpError;
429 if (error != Error::NONE) {
430 return;
431 }
432
433 for (types::V1_1::ColorMode colorMode : tmpModes) {
434 outModes->push_back(static_cast<ColorMode>(colorMode));
435 }
436 });
437 } else {
438 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpModes) {
439 error = tmpError;
440 if (error != Error::NONE) {
441 return;
442 }
443 for (types::V1_0::ColorMode colorMode : tmpModes) {
444 outModes->push_back(static_cast<ColorMode>(colorMode));
445 }
446 });
447 }
448
449 return error;
450}
451
452Error HidlComposer::getDisplayAttribute(Display display, Config config,
453 IComposerClient::Attribute attribute, int32_t* outValue) {
454 Error error = kDefaultError;
455 if (mClient_2_4) {
456 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
457 [&](const auto& tmpError, const auto& tmpValue) {
458 error = static_cast<Error>(tmpError);
459 if (error != Error::NONE) {
460 return;
461 }
462
463 *outValue = tmpValue;
464 });
465 } else {
466 mClient->getDisplayAttribute(display, config,
467 static_cast<V2_1::IComposerClient::Attribute>(attribute),
468 [&](const auto& tmpError, const auto& tmpValue) {
469 error = tmpError;
470 if (error != Error::NONE) {
471 return;
472 }
473
474 *outValue = tmpValue;
475 });
476 }
477
478 return error;
479}
480
481Error HidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
482 Error error = kDefaultError;
483 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
484 error = tmpError;
485 if (error != Error::NONE) {
486 return;
487 }
488
489 *outConfigs = tmpConfigs;
490 });
491
492 return error;
493}
494
ramindani263a3f12023-07-18 20:44:49 -0700495Error HidlComposer::getDisplayConfigurations(Display, int32_t /*maxFrameIntervalNs*/,
496 std::vector<DisplayConfiguration>*) {
ramindani0cd1d8d2023-06-13 13:43:23 -0700497 LOG_ALWAYS_FATAL("getDisplayConfigurations should not have been called on this, as "
498 "it's a HWC3 interface version 3 feature");
499}
500
Ady Abraham9fc28052021-10-14 17:21:38 -0700501Error HidlComposer::getDisplayName(Display display, std::string* outName) {
502 Error error = kDefaultError;
503 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
504 error = tmpError;
505 if (error != Error::NONE) {
506 return;
507 }
508
509 *outName = tmpName.c_str();
510 });
511
512 return error;
513}
514
515Error HidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
516 std::vector<Layer>* outLayers,
517 std::vector<uint32_t>* outLayerRequestMasks) {
518 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
519 return Error::NONE;
520}
521
522Error HidlComposer::getDozeSupport(Display display, bool* outSupport) {
523 Error error = kDefaultError;
524 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
525 error = tmpError;
526 if (error != Error::NONE) {
527 return;
528 }
529
530 *outSupport = tmpSupport;
531 });
532
533 return error;
534}
535
ramindani32cf0602022-03-02 02:30:29 +0000536Error HidlComposer::hasDisplayIdleTimerCapability(Display, bool*) {
537 LOG_ALWAYS_FATAL("hasDisplayIdleTimerCapability should have never been called on this as "
538 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
539}
540
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100541Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700542 float* outMaxLuminance, float* outMaxAverageLuminance,
543 float* outMinLuminance) {
544 Error error = kDefaultError;
545 if (mClient_2_3) {
546 mClient_2_3->getHdrCapabilities_2_3(display,
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100547 [&](const auto& tmpError, const auto& tmpHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700548 const auto& tmpMaxLuminance,
549 const auto& tmpMaxAverageLuminance,
550 const auto& tmpMinLuminance) {
551 error = tmpError;
552 if (error != Error::NONE) {
553 return;
554 }
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100555 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
Ady Abraham9fc28052021-10-14 17:21:38 -0700556
Ady Abraham9fc28052021-10-14 17:21:38 -0700557 *outMaxLuminance = tmpMaxLuminance;
558 *outMaxAverageLuminance = tmpMaxAverageLuminance;
559 *outMinLuminance = tmpMinLuminance;
560 });
561 } else {
562 mClient->getHdrCapabilities(display,
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100563 [&](const auto& tmpError, const auto& tmpHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700564 const auto& tmpMaxLuminance,
565 const auto& tmpMaxAverageLuminance,
566 const auto& tmpMinLuminance) {
567 error = tmpError;
568 if (error != Error::NONE) {
569 return;
570 }
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100571 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
Ady Abraham9fc28052021-10-14 17:21:38 -0700572
573 *outMaxLuminance = tmpMaxLuminance;
574 *outMaxAverageLuminance = tmpMaxAverageLuminance;
575 *outMinLuminance = tmpMinLuminance;
576 });
577 }
578
579 return error;
580}
581
Sally Qi0cbd08b2022-08-17 12:12:28 -0700582Error HidlComposer::getOverlaySupport(OverlayProperties* /*outProperties*/) {
583 return Error::NONE;
584}
585
Ady Abraham9fc28052021-10-14 17:21:38 -0700586Error HidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
587 std::vector<int>* outReleaseFences) {
588 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
589 return Error::NONE;
590}
591
592Error HidlComposer::presentDisplay(Display display, int* outPresentFence) {
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000593 SFTRACE_NAME("HwcPresentDisplay");
Ady Abraham9fc28052021-10-14 17:21:38 -0700594 mWriter.selectDisplay(display);
595 mWriter.presentDisplay();
596
597 Error error = execute();
598 if (error != Error::NONE) {
599 return error;
600 }
601
602 mReader.takePresentFence(display, outPresentFence);
603
604 return Error::NONE;
605}
606
607Error HidlComposer::setActiveConfig(Display display, Config config) {
608 auto ret = mClient->setActiveConfig(display, config);
609 return unwrapRet(ret);
610}
611
612Error HidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
613 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000614 const std::vector<IComposerClient::Rect>& damage,
615 float /*hdrSdrRatio*/) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700616 mWriter.selectDisplay(display);
617
618 const native_handle_t* handle = nullptr;
619 if (target.get()) {
620 handle = target->getNativeBuffer()->handle;
621 }
622
623 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
624 return Error::NONE;
625}
626
627Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
628 hardware::Return<Error> ret(kDefaultError);
629 if (mClient_2_3) {
630 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
631 } else if (mClient_2_2) {
632 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
633 renderIntent);
634 } else {
635 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
636 }
637 return unwrapRet(ret);
638}
639
Ady Abrahamdc011a92021-12-21 14:06:44 -0800640Error HidlComposer::setColorTransform(Display display, const float* matrix) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700641 mWriter.selectDisplay(display);
Ady Abrahamdc011a92021-12-21 14:06:44 -0800642 const bool isIdentity = (mat4(matrix) == mat4());
643 mWriter.setColorTransform(matrix,
644 isIdentity ? ColorTransform::IDENTITY
645 : ColorTransform::ARBITRARY_MATRIX);
Ady Abraham9fc28052021-10-14 17:21:38 -0700646 return Error::NONE;
647}
648
649Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
650 int releaseFence) {
651 mWriter.selectDisplay(display);
652 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
653 return Error::NONE;
654}
655
656Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
657 Return<Error> ret(Error::UNSUPPORTED);
658 if (mClient_2_2) {
659 ret = mClient_2_2->setPowerMode_2_2(display, mode);
660 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
661 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
662 }
663
664 return unwrapRet(ret);
665}
666
667Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
668 auto ret = mClient->setVsyncEnabled(display, enabled);
669 return unwrapRet(ret);
670}
671
672Error HidlComposer::setClientTargetSlotCount(Display display) {
673 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
674 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
675 return unwrapRet(ret);
676}
677
Ady Abraham43065bd2021-12-10 17:22:15 -0800678Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
ramindani09acbb82023-11-03 09:02:38 -0700679 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
680 uint32_t* outNumRequests) {
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000681 SFTRACE_NAME("HwcValidateDisplay");
Ady Abraham9fc28052021-10-14 17:21:38 -0700682 mWriter.selectDisplay(display);
683 mWriter.validateDisplay();
684
685 Error error = execute();
686 if (error != Error::NONE) {
687 return error;
688 }
689
690 mReader.hasChanges(display, outNumTypes, outNumRequests);
691
692 return Error::NONE;
693}
694
Ady Abraham43065bd2021-12-10 17:22:15 -0800695Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
ramindani4aac32c2023-10-30 14:13:30 -0700696 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
697 uint32_t* outNumRequests, int* outPresentFence,
698 uint32_t* state) {
Vishnu Nairbe0ad902024-06-27 23:38:43 +0000699 SFTRACE_NAME("HwcPresentOrValidateDisplay");
Ady Abraham9fc28052021-10-14 17:21:38 -0700700 mWriter.selectDisplay(display);
701 mWriter.presentOrvalidateDisplay();
702
703 Error error = execute();
704 if (error != Error::NONE) {
705 return error;
706 }
707
708 mReader.takePresentOrValidateStage(display, state);
709
710 if (*state == 1) { // Present succeeded
711 mReader.takePresentFence(display, outPresentFence);
712 }
713
714 if (*state == 0) { // Validate succeeded.
715 mReader.hasChanges(display, outNumTypes, outNumRequests);
716 }
717
718 return Error::NONE;
719}
720
721Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
722 mWriter.selectDisplay(display);
723 mWriter.selectLayer(layer);
724 mWriter.setLayerCursorPosition(x, y);
725 return Error::NONE;
726}
727
728Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
729 const sp<GraphicBuffer>& buffer, int acquireFence) {
730 mWriter.selectDisplay(display);
731 mWriter.selectLayer(layer);
732
733 const native_handle_t* handle = nullptr;
734 if (buffer.get()) {
735 handle = buffer->getNativeBuffer()->handle;
736 }
737
738 mWriter.setLayerBuffer(slot, handle, acquireFence);
739 return Error::NONE;
740}
741
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700742Error HidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
743 const std::vector<uint32_t>& slotsToClear,
744 uint32_t activeBufferSlot) {
745 if (slotsToClear.empty()) {
746 return Error::NONE;
747 }
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600748 // This can be null when the HAL hasn't explicitly enabled this feature.
749 if (mClearSlotBuffer == nullptr) {
750 return Error::NONE;
751 }
752 // Backwards compatible way of clearing buffer is to set the layer buffer with a placeholder
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700753 // buffer, using the slot that needs to cleared... tricky.
754 for (uint32_t slot : slotsToClear) {
755 // Don't clear the active buffer slot because we need to restore the active buffer after
756 // setting the requested buffer slots with a placeholder buffer.
757 if (slot != activeBufferSlot) {
758 mWriter.selectDisplay(display);
759 mWriter.selectLayer(layer);
760 mWriter.setLayerBuffer(slot, mClearSlotBuffer->handle, /*fence*/ -1);
761 }
762 }
763 // Since we clear buffers by setting them to a placeholder buffer, we want to make sure that the
764 // last setLayerBuffer command is sent with the currently active buffer, not the placeholder
765 // buffer, so that there is no perceptual change.
Brian Lindahl90553da2022-12-06 13:36:30 -0700766 mWriter.selectDisplay(display);
767 mWriter.selectLayer(layer);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700768 mWriter.setLayerBuffer(activeBufferSlot, /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahl90553da2022-12-06 13:36:30 -0700769 return Error::NONE;
770}
771
Ady Abraham9fc28052021-10-14 17:21:38 -0700772Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
773 const std::vector<IComposerClient::Rect>& damage) {
774 mWriter.selectDisplay(display);
775 mWriter.selectLayer(layer);
776 mWriter.setLayerSurfaceDamage(damage);
777 return Error::NONE;
778}
779
780Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
781 IComposerClient::BlendMode mode) {
782 mWriter.selectDisplay(display);
783 mWriter.selectLayer(layer);
784 mWriter.setLayerBlendMode(mode);
785 return Error::NONE;
786}
787
Ady Abraham6e60b142022-01-06 18:10:35 -0800788static IComposerClient::Color to_hidl_type(
789 aidl::android::hardware::graphics::composer3::Color color) {
790 const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
791 const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
792 const auto minVal = static_cast<uint64_t>(0);
793 const auto maxVal = static_cast<uint64_t>(255);
794 return std::clamp(intVal, minVal, maxVal);
795 };
796
797 return IComposerClient::Color{
798 floatColorToUint8Clamped(color.r),
799 floatColorToUint8Clamped(color.g),
800 floatColorToUint8Clamped(color.b),
801 floatColorToUint8Clamped(color.a),
802 };
803}
804
805Error HidlComposer::setLayerColor(
806 Display display, Layer layer,
807 const aidl::android::hardware::graphics::composer3::Color& color) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700808 mWriter.selectDisplay(display);
809 mWriter.selectLayer(layer);
Ady Abraham6e60b142022-01-06 18:10:35 -0800810 mWriter.setLayerColor(to_hidl_type(color));
Ady Abraham9fc28052021-10-14 17:21:38 -0700811 return Error::NONE;
812}
813
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500814static IComposerClient::Composition to_hidl_type(
815 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500816 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
817 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
818 "Trying to use %s, which is not supported by HidlComposer!",
819 android::to_string(type).c_str());
820
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500821 return static_cast<IComposerClient::Composition>(type);
822}
823
824Error HidlComposer::setLayerCompositionType(
825 Display display, Layer layer,
826 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700827 mWriter.selectDisplay(display);
828 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500829 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700830 return Error::NONE;
831}
832
833Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
834 mWriter.selectDisplay(display);
835 mWriter.selectLayer(layer);
836 mWriter.setLayerDataspace(dataspace);
837 return Error::NONE;
838}
839
840Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
841 const IComposerClient::Rect& frame) {
842 mWriter.selectDisplay(display);
843 mWriter.selectLayer(layer);
844 mWriter.setLayerDisplayFrame(frame);
845 return Error::NONE;
846}
847
848Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
849 mWriter.selectDisplay(display);
850 mWriter.selectLayer(layer);
851 mWriter.setLayerPlaneAlpha(alpha);
852 return Error::NONE;
853}
854
855Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
856 const native_handle_t* stream) {
857 mWriter.selectDisplay(display);
858 mWriter.selectLayer(layer);
859 mWriter.setLayerSidebandStream(stream);
860 return Error::NONE;
861}
862
863Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
864 const IComposerClient::FRect& crop) {
865 mWriter.selectDisplay(display);
866 mWriter.selectLayer(layer);
867 mWriter.setLayerSourceCrop(crop);
868 return Error::NONE;
869}
870
871Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
872 mWriter.selectDisplay(display);
873 mWriter.selectLayer(layer);
874 mWriter.setLayerTransform(transform);
875 return Error::NONE;
876}
877
878Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
879 const std::vector<IComposerClient::Rect>& visible) {
880 mWriter.selectDisplay(display);
881 mWriter.selectLayer(layer);
882 mWriter.setLayerVisibleRegion(visible);
883 return Error::NONE;
884}
885
886Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
887 mWriter.selectDisplay(display);
888 mWriter.selectLayer(layer);
889 mWriter.setLayerZOrder(z);
890 return Error::NONE;
891}
892
893Error HidlComposer::execute() {
894 // prepare input command queue
895 bool queueChanged = false;
896 uint32_t commandLength = 0;
897 hidl_vec<hidl_handle> commandHandles;
898 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
899 mWriter.reset();
900 return Error::NO_RESOURCES;
901 }
902
903 // set up new input command queue if necessary
904 if (queueChanged) {
905 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
906 auto error = unwrapRet(ret);
907 if (error != Error::NONE) {
908 mWriter.reset();
909 return error;
910 }
911 }
912
913 if (commandLength == 0) {
914 mWriter.reset();
915 return Error::NONE;
916 }
917
918 Error error = kDefaultError;
919 hardware::Return<void> ret;
920 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
921 const auto& tmpOutLength, const auto& tmpOutHandles) {
922 error = tmpError;
923
924 // set up new output command queue if necessary
925 if (error == Error::NONE && tmpOutChanged) {
926 error = kDefaultError;
927 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
928 error = tmpError;
929 if (error != Error::NONE) {
930 return;
931 }
932
933 mReader.setMQDescriptor(tmpDescriptor);
934 });
935 }
936
937 if (error != Error::NONE) {
938 return;
939 }
940
941 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
942 error = mReader.parse();
943 mReader.reset();
944 } else {
945 error = Error::NO_RESOURCES;
946 }
947 };
948 if (mClient_2_2) {
949 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
950 } else {
951 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
952 }
953 // executeCommands can fail because of out-of-fd and we do not want to
954 // abort() in that case
955 if (!ret.isOk()) {
956 ALOGE("executeCommands failed because of %s", ret.description().c_str());
957 }
958
959 if (error == Error::NONE) {
960 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
961
962 for (const auto& cmdErr : commandErrors) {
963 auto command =
964 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
965
966 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
967 command == IComposerClient::Command::PRESENT_DISPLAY ||
968 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
969 error = cmdErr.error;
970 } else {
971 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
972 }
973 }
974 }
975
976 mWriter.reset();
977
978 return error;
979}
980
981// Composer HAL 2.2
982
983Error HidlComposer::setLayerPerFrameMetadata(
984 Display display, Layer layer,
985 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
986 if (!mClient_2_2) {
987 return Error::UNSUPPORTED;
988 }
989
990 mWriter.selectDisplay(display);
991 mWriter.selectLayer(layer);
992 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
993 return Error::NONE;
994}
995
996std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
997 Display display) {
998 std::vector<IComposerClient::PerFrameMetadataKey> keys;
999 if (!mClient_2_2) {
1000 return keys;
1001 }
1002
1003 Error error = kDefaultError;
1004 if (mClient_2_3) {
1005 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
1006 [&](const auto& tmpError, const auto& tmpKeys) {
1007 error = tmpError;
1008 if (error != Error::NONE) {
1009 ALOGW("getPerFrameMetadataKeys failed "
1010 "with %d",
1011 tmpError);
1012 return;
1013 }
1014 keys = tmpKeys;
1015 });
1016 } else {
1017 mClient_2_2
1018 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
1019 error = tmpError;
1020 if (error != Error::NONE) {
1021 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
1022 return;
1023 }
1024
1025 keys.clear();
1026 for (auto key : tmpKeys) {
1027 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
1028 }
1029 });
1030 }
1031
1032 return keys;
1033}
1034
1035Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1036 std::vector<RenderIntent>* outRenderIntents) {
1037 if (!mClient_2_2) {
1038 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1039 return Error::NONE;
1040 }
1041
1042 Error error = kDefaultError;
1043
1044 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
1045 error = tmpError;
1046 if (error != Error::NONE) {
1047 return;
1048 }
1049
1050 *outRenderIntents = tmpKeys;
1051 };
1052
1053 if (mClient_2_3) {
1054 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1055 } else {
1056 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1057 getRenderIntentsLambda);
1058 }
1059
1060 return error;
1061}
1062
1063Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1064 if (!mClient_2_2) {
1065 *outMatrix = mat4();
1066 return Error::NONE;
1067 }
1068
1069 Error error = kDefaultError;
1070 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1071 [&](const auto& tmpError, const auto& tmpMatrix) {
1072 error = tmpError;
1073 if (error != Error::NONE) {
1074 return;
1075 }
1076 *outMatrix = mat4(tmpMatrix.data());
1077 });
1078
1079 return error;
1080}
1081
1082// Composer HAL 2.3
1083
1084Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1085 std::vector<uint8_t>* outData) {
1086 if (!mClient_2_3) {
1087 return Error::UNSUPPORTED;
1088 }
1089
1090 Error error = kDefaultError;
1091 mClient_2_3->getDisplayIdentificationData(display,
1092 [&](const auto& tmpError, const auto& tmpPort,
1093 const auto& tmpData) {
1094 error = tmpError;
1095 if (error != Error::NONE) {
1096 return;
1097 }
1098
1099 *outPort = tmpPort;
1100 *outData = tmpData;
1101 });
1102
1103 return error;
1104}
1105
1106Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
1107 if (!mClient_2_3) {
1108 return Error::UNSUPPORTED;
1109 }
1110
1111 mWriter.selectDisplay(display);
1112 mWriter.selectLayer(layer);
1113 mWriter.setLayerColorTransform(matrix);
1114 return Error::NONE;
1115}
1116
1117Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1118 Dataspace* outDataspace,
1119 uint8_t* outComponentMask) {
1120 if (!outFormat || !outDataspace || !outComponentMask) {
1121 return Error::BAD_PARAMETER;
1122 }
1123 if (!mClient_2_3) {
1124 return Error::UNSUPPORTED;
1125 }
1126 Error error = kDefaultError;
1127 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1128 [&](const auto tmpError,
1129 const auto& tmpFormat,
1130 const auto& tmpDataspace,
1131 const auto& tmpComponentMask) {
1132 error = tmpError;
1133 if (error == Error::NONE) {
1134 *outFormat = tmpFormat;
1135 *outDataspace = tmpDataspace;
1136 *outComponentMask =
1137 static_cast<uint8_t>(
1138 tmpComponentMask);
1139 }
1140 });
1141 return error;
1142}
1143
1144Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1145 uint8_t componentMask, uint64_t maxFrames) {
1146 if (!mClient_2_3) {
1147 return Error::UNSUPPORTED;
1148 }
1149
1150 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1151 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1152 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1153 maxFrames);
1154}
1155
1156Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1157 uint64_t timestamp, DisplayedFrameStats* outStats) {
1158 if (!outStats) {
1159 return Error::BAD_PARAMETER;
1160 }
1161 if (!mClient_2_3) {
1162 return Error::UNSUPPORTED;
1163 }
1164 Error error = kDefaultError;
1165 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1166 [&](const auto tmpError, auto tmpNumFrames,
1167 const auto& tmpSamples0, const auto& tmpSamples1,
1168 const auto& tmpSamples2, const auto& tmpSamples3) {
1169 error = tmpError;
1170 if (error == Error::NONE) {
1171 outStats->numFrames = tmpNumFrames;
1172 outStats->component_0_sample = tmpSamples0;
1173 outStats->component_1_sample = tmpSamples1;
1174 outStats->component_2_sample = tmpSamples2;
1175 outStats->component_3_sample = tmpSamples3;
1176 }
1177 });
1178 return error;
1179}
1180
1181Error HidlComposer::setLayerPerFrameMetadataBlobs(
1182 Display display, Layer layer,
1183 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1184 if (!mClient_2_3) {
1185 return Error::UNSUPPORTED;
1186 }
1187
1188 mWriter.selectDisplay(display);
1189 mWriter.selectLayer(layer);
1190 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1191 return Error::NONE;
1192}
1193
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001194Error HidlComposer::setDisplayBrightness(Display display, float brightness, float,
Alec Mouricdf16792021-12-10 13:16:06 -08001195 const DisplayBrightnessOptions&) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001196 if (!mClient_2_3) {
1197 return Error::UNSUPPORTED;
1198 }
1199 return mClient_2_3->setDisplayBrightness(display, brightness);
1200}
1201
1202// Composer HAL 2.4
1203
1204Error HidlComposer::getDisplayCapabilities(Display display,
1205 std::vector<DisplayCapability>* outCapabilities) {
1206 if (!mClient_2_3) {
1207 return Error::UNSUPPORTED;
1208 }
1209
1210 V2_4::Error error = kDefaultError_2_4;
1211 if (mClient_2_4) {
1212 mClient_2_4->getDisplayCapabilities_2_4(display,
1213 [&](const auto& tmpError, const auto& tmpCaps) {
1214 error = tmpError;
1215 if (error != V2_4::Error::NONE) {
1216 return;
1217 }
Ady Abrahamde549d42022-01-26 19:19:17 -08001218 *outCapabilities =
1219 translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001220 });
1221 } else {
1222 mClient_2_3
1223 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1224 error = static_cast<V2_4::Error>(tmpError);
1225 if (error != V2_4::Error::NONE) {
1226 return;
1227 }
1228
Ady Abrahamde549d42022-01-26 19:19:17 -08001229 *outCapabilities = translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001230 });
1231 }
1232
1233 return static_cast<Error>(error);
1234}
1235
1236V2_4::Error HidlComposer::getDisplayConnectionType(
1237 Display display, IComposerClient::DisplayConnectionType* outType) {
1238 using Error = V2_4::Error;
1239 if (!mClient_2_4) {
1240 return Error::UNSUPPORTED;
1241 }
1242
1243 Error error = kDefaultError_2_4;
1244 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1245 error = tmpError;
1246 if (error != V2_4::Error::NONE) {
1247 return;
1248 }
1249
1250 *outType = tmpType;
1251 });
1252
1253 return error;
1254}
1255
1256V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1257 using Error = V2_4::Error;
1258 if (!mClient_2_4) {
1259 return Error::UNSUPPORTED;
1260 }
1261
1262 Error error = kDefaultError_2_4;
1263 mClient_2_4->getDisplayVsyncPeriod(display,
1264 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1265 error = tmpError;
1266 if (error != Error::NONE) {
1267 return;
1268 }
1269
1270 *outVsyncPeriod = tmpVsyncPeriod;
1271 });
1272
1273 return error;
1274}
1275
1276V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1277 Display display, Config config,
1278 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1279 VsyncPeriodChangeTimeline* outTimeline) {
1280 using Error = V2_4::Error;
1281 if (!mClient_2_4) {
1282 return Error::UNSUPPORTED;
1283 }
1284
1285 Error error = kDefaultError_2_4;
1286 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1287 [&](const auto& tmpError, const auto& tmpTimeline) {
1288 error = tmpError;
1289 if (error != Error::NONE) {
1290 return;
1291 }
1292
1293 *outTimeline = tmpTimeline;
1294 });
1295
1296 return error;
1297}
1298
1299V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1300 using Error = V2_4::Error;
1301 if (!mClient_2_4) {
1302 return Error::UNSUPPORTED;
1303 }
1304
1305 return mClient_2_4->setAutoLowLatencyMode(display, on);
1306}
1307
1308V2_4::Error HidlComposer::getSupportedContentTypes(
1309 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1310 using Error = V2_4::Error;
1311 if (!mClient_2_4) {
1312 return Error::UNSUPPORTED;
1313 }
1314
1315 Error error = kDefaultError_2_4;
1316 mClient_2_4->getSupportedContentTypes(displayId,
1317 [&](const auto& tmpError,
1318 const auto& tmpSupportedContentTypes) {
1319 error = tmpError;
1320 if (error != Error::NONE) {
1321 return;
1322 }
1323
1324 *outSupportedContentTypes = tmpSupportedContentTypes;
1325 });
1326 return error;
1327}
1328
1329V2_4::Error HidlComposer::setContentType(Display display,
1330 IComposerClient::ContentType contentType) {
1331 using Error = V2_4::Error;
1332 if (!mClient_2_4) {
1333 return Error::UNSUPPORTED;
1334 }
1335
1336 return mClient_2_4->setContentType(display, contentType);
1337}
1338
1339V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1340 const std::string& key, bool mandatory,
1341 const std::vector<uint8_t>& value) {
1342 using Error = V2_4::Error;
1343 if (!mClient_2_4) {
1344 return Error::UNSUPPORTED;
1345 }
1346 mWriter.selectDisplay(display);
1347 mWriter.selectLayer(layer);
1348 mWriter.setLayerGenericMetadata(key, mandatory, value);
1349 return Error::NONE;
1350}
1351
1352V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1353 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1354 using Error = V2_4::Error;
1355 if (!mClient_2_4) {
1356 return Error::UNSUPPORTED;
1357 }
1358 Error error = kDefaultError_2_4;
1359 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1360 error = tmpError;
1361 if (error != Error::NONE) {
1362 return;
1363 }
1364
1365 *outKeys = tmpKeys;
1366 });
1367 return error;
1368}
1369
Kriti Dang7defaf32021-11-15 11:55:43 +01001370Error HidlComposer::setBootDisplayConfig(Display /*displayId*/, Config) {
1371 return Error::UNSUPPORTED;
1372}
1373
1374Error HidlComposer::clearBootDisplayConfig(Display /*displayId*/) {
1375 return Error::UNSUPPORTED;
1376}
1377
1378Error HidlComposer::getPreferredBootDisplayConfig(Display /*displayId*/, Config*) {
1379 return Error::UNSUPPORTED;
1380}
1381
Kriti Dang674b9372022-11-18 10:58:44 +01001382Error HidlComposer::getHdrConversionCapabilities(std::vector<HdrConversionCapability>*) {
1383 return Error::UNSUPPORTED;
1384}
1385
Kriti Dangd432bb52023-02-09 18:21:04 +01001386Error HidlComposer::setHdrConversionStrategy(HdrConversionStrategy, Hdr*) {
Kriti Dang674b9372022-11-18 10:58:44 +01001387 return Error::UNSUPPORTED;
1388}
1389
ramindanib2158ee2023-02-13 20:29:59 -08001390Error HidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display, bool) {
1391 return Error::UNSUPPORTED;
1392}
1393
ramindani3acaaf52023-09-25 10:31:27 -07001394Error HidlComposer::notifyExpectedPresent(Display, nsecs_t, int32_t) {
1395 return Error::UNSUPPORTED;
1396}
1397
Ady Abraham9fc28052021-10-14 17:21:38 -07001398Error HidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001399 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1400 IComposerClient::ClientTargetProperty property;
1401 mReader.takeClientTargetProperty(display, &property);
1402 outClientTargetProperty->display = display;
1403 outClientTargetProperty->clientTargetProperty.dataspace =
1404 static_cast<::aidl::android::hardware::graphics::common::Dataspace>(property.dataspace);
1405 outClientTargetProperty->clientTargetProperty.pixelFormat =
1406 static_cast<::aidl::android::hardware::graphics::common::PixelFormat>(
1407 property.pixelFormat);
1408 outClientTargetProperty->brightness = 1.f;
1409 outClientTargetProperty->dimmingStage = DimmingStage::NONE;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001410 return Error::NONE;
1411}
1412
Sally Qi95f669a2024-08-27 11:31:42 -07001413Error HidlComposer::getRequestedLuts(Display, std::vector<Layer>*,
1414 std::vector<DisplayLuts::LayerLut>*) {
Sally Qi11dcd582024-08-16 18:11:27 -07001415 return Error::NONE;
1416}
1417
Sally Qi0abc4a52024-09-26 16:13:06 -07001418Error HidlComposer::setLayerLuts(Display, Layer, Luts&) {
Sally Qi492cec32024-06-28 14:34:47 -07001419 return Error::NONE;
1420}
1421
Alec Mouri6da0e272022-02-07 12:45:57 -08001422Error HidlComposer::setLayerBrightness(Display, Layer, float) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001423 return Error::NONE;
1424}
1425
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001426Error HidlComposer::setLayerBlockingRegion(Display, Layer,
1427 const std::vector<IComposerClient::Rect>&) {
1428 return Error::NONE;
1429}
1430
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001431Error HidlComposer::getDisplayDecorationSupport(
1432 Display,
1433 std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
1434 support) {
1435 support->reset();
1436 return Error::UNSUPPORTED;
1437}
1438
ramindani32cf0602022-03-02 02:30:29 +00001439Error HidlComposer::setIdleTimerEnabled(Display, std::chrono::milliseconds) {
1440 LOG_ALWAYS_FATAL("setIdleTimerEnabled should have never been called on this as "
1441 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
1442}
1443
ramindani06e518e2022-03-14 18:47:53 +00001444Error HidlComposer::getPhysicalDisplayOrientation(Display, AidlTransform*) {
1445 LOG_ALWAYS_FATAL("getPhysicalDisplayOrientation should have never been called on this as "
1446 "OptionalFeature::PhysicalDisplayOrientation is not supported on HIDL");
1447}
1448
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -06001449Error HidlComposer::getMaxLayerPictureProfiles(Display, int32_t*) {
1450 return Error::UNSUPPORTED;
1451}
1452
1453Error HidlComposer::setDisplayPictureProfileId(Display, PictureProfileId) {
1454 return Error::UNSUPPORTED;
1455}
1456
1457Error HidlComposer::setLayerPictureProfileId(Display, Layer, PictureProfileId) {
1458 return Error::UNSUPPORTED;
1459}
1460
Yichi Chen3401b562022-01-17 15:42:35 +08001461void HidlComposer::registerCallback(ComposerCallback& callback) {
1462 const bool vsyncSwitchingSupported =
1463 isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
1464
1465 registerCallback(sp<ComposerCallbackBridge>::make(callback, vsyncSwitchingSupported));
1466}
1467
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001468void HidlComposer::onHotplugConnect(Display) {}
1469void HidlComposer::onHotplugDisconnect(Display) {}
1470
Ady Abraham9fc28052021-10-14 17:21:38 -07001471CommandReader::~CommandReader() {
1472 resetData();
1473}
1474
1475Error CommandReader::parse() {
1476 resetData();
1477
1478 IComposerClient::Command command;
1479 uint16_t length = 0;
1480
1481 while (!isEmpty()) {
1482 if (!beginCommand(&command, &length)) {
1483 break;
1484 }
1485
1486 bool parsed = false;
1487 switch (command) {
1488 case IComposerClient::Command::SELECT_DISPLAY:
1489 parsed = parseSelectDisplay(length);
1490 break;
1491 case IComposerClient::Command::SET_ERROR:
1492 parsed = parseSetError(length);
1493 break;
1494 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1495 parsed = parseSetChangedCompositionTypes(length);
1496 break;
1497 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1498 parsed = parseSetDisplayRequests(length);
1499 break;
1500 case IComposerClient::Command::SET_PRESENT_FENCE:
1501 parsed = parseSetPresentFence(length);
1502 break;
1503 case IComposerClient::Command::SET_RELEASE_FENCES:
1504 parsed = parseSetReleaseFences(length);
1505 break;
1506 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1507 parsed = parseSetPresentOrValidateDisplayResult(length);
1508 break;
1509 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1510 parsed = parseSetClientTargetProperty(length);
1511 break;
1512 default:
1513 parsed = false;
1514 break;
1515 }
1516
1517 endCommand();
1518
1519 if (!parsed) {
1520 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1521 break;
1522 }
1523 }
1524
1525 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1526}
1527
1528bool CommandReader::parseSelectDisplay(uint16_t length) {
1529 if (length != CommandWriterBase::kSelectDisplayLength) {
1530 return false;
1531 }
1532
1533 mCurrentReturnData = &mReturnData[read64()];
1534
1535 return true;
1536}
1537
1538bool CommandReader::parseSetError(uint16_t length) {
1539 if (length != CommandWriterBase::kSetErrorLength) {
1540 return false;
1541 }
1542
1543 auto location = read();
1544 auto error = static_cast<Error>(readSigned());
1545
1546 mErrors.emplace_back(CommandError{location, error});
1547
1548 return true;
1549}
1550
1551bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1552 // (layer id, composition type) pairs
1553 if (length % 3 != 0 || !mCurrentReturnData) {
1554 return false;
1555 }
1556
1557 uint32_t count = length / 3;
1558 mCurrentReturnData->changedLayers.reserve(count);
1559 mCurrentReturnData->compositionTypes.reserve(count);
1560 while (count > 0) {
1561 auto layer = read64();
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001562 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1563 readSigned());
Ady Abraham9fc28052021-10-14 17:21:38 -07001564
1565 mCurrentReturnData->changedLayers.push_back(layer);
1566 mCurrentReturnData->compositionTypes.push_back(type);
1567
1568 count--;
1569 }
1570
1571 return true;
1572}
1573
1574bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1575 // display requests followed by (layer id, layer requests) pairs
1576 if (length % 3 != 1 || !mCurrentReturnData) {
1577 return false;
1578 }
1579
1580 mCurrentReturnData->displayRequests = read();
1581
1582 uint32_t count = (length - 1) / 3;
1583 mCurrentReturnData->requestedLayers.reserve(count);
1584 mCurrentReturnData->requestMasks.reserve(count);
1585 while (count > 0) {
1586 auto layer = read64();
1587 auto layerRequestMask = read();
1588
1589 mCurrentReturnData->requestedLayers.push_back(layer);
1590 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1591
1592 count--;
1593 }
1594
1595 return true;
1596}
1597
1598bool CommandReader::parseSetPresentFence(uint16_t length) {
1599 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1600 return false;
1601 }
1602
1603 if (mCurrentReturnData->presentFence >= 0) {
1604 close(mCurrentReturnData->presentFence);
1605 }
1606 mCurrentReturnData->presentFence = readFence();
1607
1608 return true;
1609}
1610
1611bool CommandReader::parseSetReleaseFences(uint16_t length) {
1612 // (layer id, release fence index) pairs
1613 if (length % 3 != 0 || !mCurrentReturnData) {
1614 return false;
1615 }
1616
1617 uint32_t count = length / 3;
1618 mCurrentReturnData->releasedLayers.reserve(count);
1619 mCurrentReturnData->releaseFences.reserve(count);
1620 while (count > 0) {
1621 auto layer = read64();
1622 auto fence = readFence();
1623
1624 mCurrentReturnData->releasedLayers.push_back(layer);
1625 mCurrentReturnData->releaseFences.push_back(fence);
1626
1627 count--;
1628 }
1629
1630 return true;
1631}
1632
1633bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1634 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1635 return false;
1636 }
1637 mCurrentReturnData->presentOrValidateState = read();
1638 return true;
1639}
1640
1641bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1642 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1643 return false;
1644 }
1645 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1646 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1647 return true;
1648}
1649
1650void CommandReader::resetData() {
1651 mErrors.clear();
1652
1653 for (auto& data : mReturnData) {
1654 if (data.second.presentFence >= 0) {
1655 close(data.second.presentFence);
1656 }
1657 for (auto fence : data.second.releaseFences) {
1658 if (fence >= 0) {
1659 close(fence);
1660 }
1661 }
1662 }
1663
1664 mReturnData.clear();
1665 mCurrentReturnData = nullptr;
1666}
1667
1668std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1669 return std::move(mErrors);
1670}
1671
1672bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1673 uint32_t* outNumLayerRequestMasks) const {
1674 auto found = mReturnData.find(display);
1675 if (found == mReturnData.end()) {
1676 *outNumChangedCompositionTypes = 0;
1677 *outNumLayerRequestMasks = 0;
1678 return false;
1679 }
1680
1681 const ReturnData& data = found->second;
1682
1683 *outNumChangedCompositionTypes = data.compositionTypes.size();
1684 *outNumLayerRequestMasks = data.requestMasks.size();
1685
1686 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1687}
1688
1689void CommandReader::takeChangedCompositionTypes(
1690 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001691 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001692 auto found = mReturnData.find(display);
1693 if (found == mReturnData.end()) {
1694 outLayers->clear();
1695 outTypes->clear();
1696 return;
1697 }
1698
1699 ReturnData& data = found->second;
1700
1701 *outLayers = std::move(data.changedLayers);
1702 *outTypes = std::move(data.compositionTypes);
1703}
1704
1705void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1706 std::vector<Layer>* outLayers,
1707 std::vector<uint32_t>* outLayerRequestMasks) {
1708 auto found = mReturnData.find(display);
1709 if (found == mReturnData.end()) {
1710 *outDisplayRequestMask = 0;
1711 outLayers->clear();
1712 outLayerRequestMasks->clear();
1713 return;
1714 }
1715
1716 ReturnData& data = found->second;
1717
1718 *outDisplayRequestMask = data.displayRequests;
1719 *outLayers = std::move(data.requestedLayers);
1720 *outLayerRequestMasks = std::move(data.requestMasks);
1721}
1722
1723void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1724 std::vector<int>* outReleaseFences) {
1725 auto found = mReturnData.find(display);
1726 if (found == mReturnData.end()) {
1727 outLayers->clear();
1728 outReleaseFences->clear();
1729 return;
1730 }
1731
1732 ReturnData& data = found->second;
1733
1734 *outLayers = std::move(data.releasedLayers);
1735 *outReleaseFences = std::move(data.releaseFences);
1736}
1737
1738void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1739 auto found = mReturnData.find(display);
1740 if (found == mReturnData.end()) {
1741 *outPresentFence = -1;
1742 return;
1743 }
1744
1745 ReturnData& data = found->second;
1746
1747 *outPresentFence = data.presentFence;
1748 data.presentFence = -1;
1749}
1750
1751void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1752 auto found = mReturnData.find(display);
1753 if (found == mReturnData.end()) {
1754 *state = -1;
1755 return;
1756 }
1757 ReturnData& data = found->second;
1758 *state = data.presentOrValidateState;
1759}
1760
1761void CommandReader::takeClientTargetProperty(
1762 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1763 auto found = mReturnData.find(display);
1764
1765 // If not found, return the default values.
1766 if (found == mReturnData.end()) {
1767 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1768 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1769 return;
1770 }
1771
1772 ReturnData& data = found->second;
1773 *outClientTargetProperty = data.clientTargetProperty;
1774}
1775
1776} // namespace Hwc2
1777} // namespace android
1778
1779// TODO(b/129481165): remove the #pragma below and fix conversion issues
1780#pragma clang diagnostic pop // ignored "-Wconversion"