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