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