blob: ed52b9583c5d82c0a22dec26ddf5f11c7d65d6d9 [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
ramindani0cd1d8d2023-06-13 13:43:23 -0700279bool HidlComposer::getDisplayConfigurationsSupported() const {
280 // getDisplayConfigurations is not supported on the HIDL composer.
281 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,
611 const std::vector<IComposerClient::Rect>& damage) {
612 mWriter.selectDisplay(display);
613
614 const native_handle_t* handle = nullptr;
615 if (target.get()) {
616 handle = target->getNativeBuffer()->handle;
617 }
618
619 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
620 return Error::NONE;
621}
622
623Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
624 hardware::Return<Error> ret(kDefaultError);
625 if (mClient_2_3) {
626 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
627 } else if (mClient_2_2) {
628 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
629 renderIntent);
630 } else {
631 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
632 }
633 return unwrapRet(ret);
634}
635
Ady Abrahamdc011a92021-12-21 14:06:44 -0800636Error HidlComposer::setColorTransform(Display display, const float* matrix) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700637 mWriter.selectDisplay(display);
Ady Abrahamdc011a92021-12-21 14:06:44 -0800638 const bool isIdentity = (mat4(matrix) == mat4());
639 mWriter.setColorTransform(matrix,
640 isIdentity ? ColorTransform::IDENTITY
641 : ColorTransform::ARBITRARY_MATRIX);
Ady Abraham9fc28052021-10-14 17:21:38 -0700642 return Error::NONE;
643}
644
645Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
646 int releaseFence) {
647 mWriter.selectDisplay(display);
648 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
649 return Error::NONE;
650}
651
652Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
653 Return<Error> ret(Error::UNSUPPORTED);
654 if (mClient_2_2) {
655 ret = mClient_2_2->setPowerMode_2_2(display, mode);
656 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
657 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
658 }
659
660 return unwrapRet(ret);
661}
662
663Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
664 auto ret = mClient->setVsyncEnabled(display, enabled);
665 return unwrapRet(ret);
666}
667
668Error HidlComposer::setClientTargetSlotCount(Display display) {
669 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
670 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
671 return unwrapRet(ret);
672}
673
Ady Abraham43065bd2021-12-10 17:22:15 -0800674Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
ramindani09acbb82023-11-03 09:02:38 -0700675 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
676 uint32_t* outNumRequests) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700677 ATRACE_NAME("HwcValidateDisplay");
678 mWriter.selectDisplay(display);
679 mWriter.validateDisplay();
680
681 Error error = execute();
682 if (error != Error::NONE) {
683 return error;
684 }
685
686 mReader.hasChanges(display, outNumTypes, outNumRequests);
687
688 return Error::NONE;
689}
690
Ady Abraham43065bd2021-12-10 17:22:15 -0800691Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
ramindani4aac32c2023-10-30 14:13:30 -0700692 int32_t /*frameIntervalNs*/, uint32_t* outNumTypes,
693 uint32_t* outNumRequests, int* outPresentFence,
694 uint32_t* state) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700695 ATRACE_NAME("HwcPresentOrValidateDisplay");
696 mWriter.selectDisplay(display);
697 mWriter.presentOrvalidateDisplay();
698
699 Error error = execute();
700 if (error != Error::NONE) {
701 return error;
702 }
703
704 mReader.takePresentOrValidateStage(display, state);
705
706 if (*state == 1) { // Present succeeded
707 mReader.takePresentFence(display, outPresentFence);
708 }
709
710 if (*state == 0) { // Validate succeeded.
711 mReader.hasChanges(display, outNumTypes, outNumRequests);
712 }
713
714 return Error::NONE;
715}
716
717Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
718 mWriter.selectDisplay(display);
719 mWriter.selectLayer(layer);
720 mWriter.setLayerCursorPosition(x, y);
721 return Error::NONE;
722}
723
724Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
725 const sp<GraphicBuffer>& buffer, int acquireFence) {
726 mWriter.selectDisplay(display);
727 mWriter.selectLayer(layer);
728
729 const native_handle_t* handle = nullptr;
730 if (buffer.get()) {
731 handle = buffer->getNativeBuffer()->handle;
732 }
733
734 mWriter.setLayerBuffer(slot, handle, acquireFence);
735 return Error::NONE;
736}
737
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700738Error HidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
739 const std::vector<uint32_t>& slotsToClear,
740 uint32_t activeBufferSlot) {
741 if (slotsToClear.empty()) {
742 return Error::NONE;
743 }
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600744 // This can be null when the HAL hasn't explicitly enabled this feature.
745 if (mClearSlotBuffer == nullptr) {
746 return Error::NONE;
747 }
748 // Backwards compatible way of clearing buffer is to set the layer buffer with a placeholder
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700749 // buffer, using the slot that needs to cleared... tricky.
750 for (uint32_t slot : slotsToClear) {
751 // Don't clear the active buffer slot because we need to restore the active buffer after
752 // setting the requested buffer slots with a placeholder buffer.
753 if (slot != activeBufferSlot) {
754 mWriter.selectDisplay(display);
755 mWriter.selectLayer(layer);
756 mWriter.setLayerBuffer(slot, mClearSlotBuffer->handle, /*fence*/ -1);
757 }
758 }
759 // Since we clear buffers by setting them to a placeholder buffer, we want to make sure that the
760 // last setLayerBuffer command is sent with the currently active buffer, not the placeholder
761 // buffer, so that there is no perceptual change.
Brian Lindahl90553da2022-12-06 13:36:30 -0700762 mWriter.selectDisplay(display);
763 mWriter.selectLayer(layer);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700764 mWriter.setLayerBuffer(activeBufferSlot, /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahl90553da2022-12-06 13:36:30 -0700765 return Error::NONE;
766}
767
Ady Abraham9fc28052021-10-14 17:21:38 -0700768Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
769 const std::vector<IComposerClient::Rect>& damage) {
770 mWriter.selectDisplay(display);
771 mWriter.selectLayer(layer);
772 mWriter.setLayerSurfaceDamage(damage);
773 return Error::NONE;
774}
775
776Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
777 IComposerClient::BlendMode mode) {
778 mWriter.selectDisplay(display);
779 mWriter.selectLayer(layer);
780 mWriter.setLayerBlendMode(mode);
781 return Error::NONE;
782}
783
Ady Abraham6e60b142022-01-06 18:10:35 -0800784static IComposerClient::Color to_hidl_type(
785 aidl::android::hardware::graphics::composer3::Color color) {
786 const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
787 const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
788 const auto minVal = static_cast<uint64_t>(0);
789 const auto maxVal = static_cast<uint64_t>(255);
790 return std::clamp(intVal, minVal, maxVal);
791 };
792
793 return IComposerClient::Color{
794 floatColorToUint8Clamped(color.r),
795 floatColorToUint8Clamped(color.g),
796 floatColorToUint8Clamped(color.b),
797 floatColorToUint8Clamped(color.a),
798 };
799}
800
801Error HidlComposer::setLayerColor(
802 Display display, Layer layer,
803 const aidl::android::hardware::graphics::composer3::Color& color) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700804 mWriter.selectDisplay(display);
805 mWriter.selectLayer(layer);
Ady Abraham6e60b142022-01-06 18:10:35 -0800806 mWriter.setLayerColor(to_hidl_type(color));
Ady Abraham9fc28052021-10-14 17:21:38 -0700807 return Error::NONE;
808}
809
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500810static IComposerClient::Composition to_hidl_type(
811 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500812 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
813 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
814 "Trying to use %s, which is not supported by HidlComposer!",
815 android::to_string(type).c_str());
816
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500817 return static_cast<IComposerClient::Composition>(type);
818}
819
820Error HidlComposer::setLayerCompositionType(
821 Display display, Layer layer,
822 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700823 mWriter.selectDisplay(display);
824 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500825 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700826 return Error::NONE;
827}
828
829Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
830 mWriter.selectDisplay(display);
831 mWriter.selectLayer(layer);
832 mWriter.setLayerDataspace(dataspace);
833 return Error::NONE;
834}
835
836Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
837 const IComposerClient::Rect& frame) {
838 mWriter.selectDisplay(display);
839 mWriter.selectLayer(layer);
840 mWriter.setLayerDisplayFrame(frame);
841 return Error::NONE;
842}
843
844Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
845 mWriter.selectDisplay(display);
846 mWriter.selectLayer(layer);
847 mWriter.setLayerPlaneAlpha(alpha);
848 return Error::NONE;
849}
850
851Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
852 const native_handle_t* stream) {
853 mWriter.selectDisplay(display);
854 mWriter.selectLayer(layer);
855 mWriter.setLayerSidebandStream(stream);
856 return Error::NONE;
857}
858
859Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
860 const IComposerClient::FRect& crop) {
861 mWriter.selectDisplay(display);
862 mWriter.selectLayer(layer);
863 mWriter.setLayerSourceCrop(crop);
864 return Error::NONE;
865}
866
867Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
868 mWriter.selectDisplay(display);
869 mWriter.selectLayer(layer);
870 mWriter.setLayerTransform(transform);
871 return Error::NONE;
872}
873
874Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
875 const std::vector<IComposerClient::Rect>& visible) {
876 mWriter.selectDisplay(display);
877 mWriter.selectLayer(layer);
878 mWriter.setLayerVisibleRegion(visible);
879 return Error::NONE;
880}
881
882Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
883 mWriter.selectDisplay(display);
884 mWriter.selectLayer(layer);
885 mWriter.setLayerZOrder(z);
886 return Error::NONE;
887}
888
889Error HidlComposer::execute() {
890 // prepare input command queue
891 bool queueChanged = false;
892 uint32_t commandLength = 0;
893 hidl_vec<hidl_handle> commandHandles;
894 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
895 mWriter.reset();
896 return Error::NO_RESOURCES;
897 }
898
899 // set up new input command queue if necessary
900 if (queueChanged) {
901 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
902 auto error = unwrapRet(ret);
903 if (error != Error::NONE) {
904 mWriter.reset();
905 return error;
906 }
907 }
908
909 if (commandLength == 0) {
910 mWriter.reset();
911 return Error::NONE;
912 }
913
914 Error error = kDefaultError;
915 hardware::Return<void> ret;
916 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
917 const auto& tmpOutLength, const auto& tmpOutHandles) {
918 error = tmpError;
919
920 // set up new output command queue if necessary
921 if (error == Error::NONE && tmpOutChanged) {
922 error = kDefaultError;
923 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
924 error = tmpError;
925 if (error != Error::NONE) {
926 return;
927 }
928
929 mReader.setMQDescriptor(tmpDescriptor);
930 });
931 }
932
933 if (error != Error::NONE) {
934 return;
935 }
936
937 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
938 error = mReader.parse();
939 mReader.reset();
940 } else {
941 error = Error::NO_RESOURCES;
942 }
943 };
944 if (mClient_2_2) {
945 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
946 } else {
947 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
948 }
949 // executeCommands can fail because of out-of-fd and we do not want to
950 // abort() in that case
951 if (!ret.isOk()) {
952 ALOGE("executeCommands failed because of %s", ret.description().c_str());
953 }
954
955 if (error == Error::NONE) {
956 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
957
958 for (const auto& cmdErr : commandErrors) {
959 auto command =
960 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
961
962 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
963 command == IComposerClient::Command::PRESENT_DISPLAY ||
964 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
965 error = cmdErr.error;
966 } else {
967 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
968 }
969 }
970 }
971
972 mWriter.reset();
973
974 return error;
975}
976
977// Composer HAL 2.2
978
979Error HidlComposer::setLayerPerFrameMetadata(
980 Display display, Layer layer,
981 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
982 if (!mClient_2_2) {
983 return Error::UNSUPPORTED;
984 }
985
986 mWriter.selectDisplay(display);
987 mWriter.selectLayer(layer);
988 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
989 return Error::NONE;
990}
991
992std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
993 Display display) {
994 std::vector<IComposerClient::PerFrameMetadataKey> keys;
995 if (!mClient_2_2) {
996 return keys;
997 }
998
999 Error error = kDefaultError;
1000 if (mClient_2_3) {
1001 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
1002 [&](const auto& tmpError, const auto& tmpKeys) {
1003 error = tmpError;
1004 if (error != Error::NONE) {
1005 ALOGW("getPerFrameMetadataKeys failed "
1006 "with %d",
1007 tmpError);
1008 return;
1009 }
1010 keys = tmpKeys;
1011 });
1012 } else {
1013 mClient_2_2
1014 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
1015 error = tmpError;
1016 if (error != Error::NONE) {
1017 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
1018 return;
1019 }
1020
1021 keys.clear();
1022 for (auto key : tmpKeys) {
1023 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
1024 }
1025 });
1026 }
1027
1028 return keys;
1029}
1030
1031Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1032 std::vector<RenderIntent>* outRenderIntents) {
1033 if (!mClient_2_2) {
1034 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1035 return Error::NONE;
1036 }
1037
1038 Error error = kDefaultError;
1039
1040 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
1041 error = tmpError;
1042 if (error != Error::NONE) {
1043 return;
1044 }
1045
1046 *outRenderIntents = tmpKeys;
1047 };
1048
1049 if (mClient_2_3) {
1050 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1051 } else {
1052 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1053 getRenderIntentsLambda);
1054 }
1055
1056 return error;
1057}
1058
1059Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1060 if (!mClient_2_2) {
1061 *outMatrix = mat4();
1062 return Error::NONE;
1063 }
1064
1065 Error error = kDefaultError;
1066 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1067 [&](const auto& tmpError, const auto& tmpMatrix) {
1068 error = tmpError;
1069 if (error != Error::NONE) {
1070 return;
1071 }
1072 *outMatrix = mat4(tmpMatrix.data());
1073 });
1074
1075 return error;
1076}
1077
1078// Composer HAL 2.3
1079
1080Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1081 std::vector<uint8_t>* outData) {
1082 if (!mClient_2_3) {
1083 return Error::UNSUPPORTED;
1084 }
1085
1086 Error error = kDefaultError;
1087 mClient_2_3->getDisplayIdentificationData(display,
1088 [&](const auto& tmpError, const auto& tmpPort,
1089 const auto& tmpData) {
1090 error = tmpError;
1091 if (error != Error::NONE) {
1092 return;
1093 }
1094
1095 *outPort = tmpPort;
1096 *outData = tmpData;
1097 });
1098
1099 return error;
1100}
1101
1102Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
1103 if (!mClient_2_3) {
1104 return Error::UNSUPPORTED;
1105 }
1106
1107 mWriter.selectDisplay(display);
1108 mWriter.selectLayer(layer);
1109 mWriter.setLayerColorTransform(matrix);
1110 return Error::NONE;
1111}
1112
1113Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1114 Dataspace* outDataspace,
1115 uint8_t* outComponentMask) {
1116 if (!outFormat || !outDataspace || !outComponentMask) {
1117 return Error::BAD_PARAMETER;
1118 }
1119 if (!mClient_2_3) {
1120 return Error::UNSUPPORTED;
1121 }
1122 Error error = kDefaultError;
1123 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1124 [&](const auto tmpError,
1125 const auto& tmpFormat,
1126 const auto& tmpDataspace,
1127 const auto& tmpComponentMask) {
1128 error = tmpError;
1129 if (error == Error::NONE) {
1130 *outFormat = tmpFormat;
1131 *outDataspace = tmpDataspace;
1132 *outComponentMask =
1133 static_cast<uint8_t>(
1134 tmpComponentMask);
1135 }
1136 });
1137 return error;
1138}
1139
1140Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1141 uint8_t componentMask, uint64_t maxFrames) {
1142 if (!mClient_2_3) {
1143 return Error::UNSUPPORTED;
1144 }
1145
1146 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1147 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1148 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1149 maxFrames);
1150}
1151
1152Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1153 uint64_t timestamp, DisplayedFrameStats* outStats) {
1154 if (!outStats) {
1155 return Error::BAD_PARAMETER;
1156 }
1157 if (!mClient_2_3) {
1158 return Error::UNSUPPORTED;
1159 }
1160 Error error = kDefaultError;
1161 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1162 [&](const auto tmpError, auto tmpNumFrames,
1163 const auto& tmpSamples0, const auto& tmpSamples1,
1164 const auto& tmpSamples2, const auto& tmpSamples3) {
1165 error = tmpError;
1166 if (error == Error::NONE) {
1167 outStats->numFrames = tmpNumFrames;
1168 outStats->component_0_sample = tmpSamples0;
1169 outStats->component_1_sample = tmpSamples1;
1170 outStats->component_2_sample = tmpSamples2;
1171 outStats->component_3_sample = tmpSamples3;
1172 }
1173 });
1174 return error;
1175}
1176
1177Error HidlComposer::setLayerPerFrameMetadataBlobs(
1178 Display display, Layer layer,
1179 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1180 if (!mClient_2_3) {
1181 return Error::UNSUPPORTED;
1182 }
1183
1184 mWriter.selectDisplay(display);
1185 mWriter.selectLayer(layer);
1186 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1187 return Error::NONE;
1188}
1189
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001190Error HidlComposer::setDisplayBrightness(Display display, float brightness, float,
Alec Mouricdf16792021-12-10 13:16:06 -08001191 const DisplayBrightnessOptions&) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001192 if (!mClient_2_3) {
1193 return Error::UNSUPPORTED;
1194 }
1195 return mClient_2_3->setDisplayBrightness(display, brightness);
1196}
1197
1198// Composer HAL 2.4
1199
1200Error HidlComposer::getDisplayCapabilities(Display display,
1201 std::vector<DisplayCapability>* outCapabilities) {
1202 if (!mClient_2_3) {
1203 return Error::UNSUPPORTED;
1204 }
1205
1206 V2_4::Error error = kDefaultError_2_4;
1207 if (mClient_2_4) {
1208 mClient_2_4->getDisplayCapabilities_2_4(display,
1209 [&](const auto& tmpError, const auto& tmpCaps) {
1210 error = tmpError;
1211 if (error != V2_4::Error::NONE) {
1212 return;
1213 }
Ady Abrahamde549d42022-01-26 19:19:17 -08001214 *outCapabilities =
1215 translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001216 });
1217 } else {
1218 mClient_2_3
1219 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1220 error = static_cast<V2_4::Error>(tmpError);
1221 if (error != V2_4::Error::NONE) {
1222 return;
1223 }
1224
Ady Abrahamde549d42022-01-26 19:19:17 -08001225 *outCapabilities = translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001226 });
1227 }
1228
1229 return static_cast<Error>(error);
1230}
1231
1232V2_4::Error HidlComposer::getDisplayConnectionType(
1233 Display display, IComposerClient::DisplayConnectionType* outType) {
1234 using Error = V2_4::Error;
1235 if (!mClient_2_4) {
1236 return Error::UNSUPPORTED;
1237 }
1238
1239 Error error = kDefaultError_2_4;
1240 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1241 error = tmpError;
1242 if (error != V2_4::Error::NONE) {
1243 return;
1244 }
1245
1246 *outType = tmpType;
1247 });
1248
1249 return error;
1250}
1251
1252V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1253 using Error = V2_4::Error;
1254 if (!mClient_2_4) {
1255 return Error::UNSUPPORTED;
1256 }
1257
1258 Error error = kDefaultError_2_4;
1259 mClient_2_4->getDisplayVsyncPeriod(display,
1260 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1261 error = tmpError;
1262 if (error != Error::NONE) {
1263 return;
1264 }
1265
1266 *outVsyncPeriod = tmpVsyncPeriod;
1267 });
1268
1269 return error;
1270}
1271
1272V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1273 Display display, Config config,
1274 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1275 VsyncPeriodChangeTimeline* outTimeline) {
1276 using Error = V2_4::Error;
1277 if (!mClient_2_4) {
1278 return Error::UNSUPPORTED;
1279 }
1280
1281 Error error = kDefaultError_2_4;
1282 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1283 [&](const auto& tmpError, const auto& tmpTimeline) {
1284 error = tmpError;
1285 if (error != Error::NONE) {
1286 return;
1287 }
1288
1289 *outTimeline = tmpTimeline;
1290 });
1291
1292 return error;
1293}
1294
1295V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1296 using Error = V2_4::Error;
1297 if (!mClient_2_4) {
1298 return Error::UNSUPPORTED;
1299 }
1300
1301 return mClient_2_4->setAutoLowLatencyMode(display, on);
1302}
1303
1304V2_4::Error HidlComposer::getSupportedContentTypes(
1305 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1306 using Error = V2_4::Error;
1307 if (!mClient_2_4) {
1308 return Error::UNSUPPORTED;
1309 }
1310
1311 Error error = kDefaultError_2_4;
1312 mClient_2_4->getSupportedContentTypes(displayId,
1313 [&](const auto& tmpError,
1314 const auto& tmpSupportedContentTypes) {
1315 error = tmpError;
1316 if (error != Error::NONE) {
1317 return;
1318 }
1319
1320 *outSupportedContentTypes = tmpSupportedContentTypes;
1321 });
1322 return error;
1323}
1324
1325V2_4::Error HidlComposer::setContentType(Display display,
1326 IComposerClient::ContentType contentType) {
1327 using Error = V2_4::Error;
1328 if (!mClient_2_4) {
1329 return Error::UNSUPPORTED;
1330 }
1331
1332 return mClient_2_4->setContentType(display, contentType);
1333}
1334
1335V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1336 const std::string& key, bool mandatory,
1337 const std::vector<uint8_t>& value) {
1338 using Error = V2_4::Error;
1339 if (!mClient_2_4) {
1340 return Error::UNSUPPORTED;
1341 }
1342 mWriter.selectDisplay(display);
1343 mWriter.selectLayer(layer);
1344 mWriter.setLayerGenericMetadata(key, mandatory, value);
1345 return Error::NONE;
1346}
1347
1348V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1349 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1350 using Error = V2_4::Error;
1351 if (!mClient_2_4) {
1352 return Error::UNSUPPORTED;
1353 }
1354 Error error = kDefaultError_2_4;
1355 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1356 error = tmpError;
1357 if (error != Error::NONE) {
1358 return;
1359 }
1360
1361 *outKeys = tmpKeys;
1362 });
1363 return error;
1364}
1365
Kriti Dang7defaf32021-11-15 11:55:43 +01001366Error HidlComposer::setBootDisplayConfig(Display /*displayId*/, Config) {
1367 return Error::UNSUPPORTED;
1368}
1369
1370Error HidlComposer::clearBootDisplayConfig(Display /*displayId*/) {
1371 return Error::UNSUPPORTED;
1372}
1373
1374Error HidlComposer::getPreferredBootDisplayConfig(Display /*displayId*/, Config*) {
1375 return Error::UNSUPPORTED;
1376}
1377
Kriti Dang674b9372022-11-18 10:58:44 +01001378Error HidlComposer::getHdrConversionCapabilities(std::vector<HdrConversionCapability>*) {
1379 return Error::UNSUPPORTED;
1380}
1381
Kriti Dangd432bb52023-02-09 18:21:04 +01001382Error HidlComposer::setHdrConversionStrategy(HdrConversionStrategy, Hdr*) {
Kriti Dang674b9372022-11-18 10:58:44 +01001383 return Error::UNSUPPORTED;
1384}
1385
ramindanib2158ee2023-02-13 20:29:59 -08001386Error HidlComposer::setRefreshRateChangedCallbackDebugEnabled(Display, bool) {
1387 return Error::UNSUPPORTED;
1388}
1389
ramindani3acaaf52023-09-25 10:31:27 -07001390Error HidlComposer::notifyExpectedPresent(Display, nsecs_t, int32_t) {
1391 return Error::UNSUPPORTED;
1392}
1393
Ady Abraham9fc28052021-10-14 17:21:38 -07001394Error HidlComposer::getClientTargetProperty(
Alec Mouri85065692022-03-18 00:58:26 +00001395 Display display, ClientTargetPropertyWithBrightness* outClientTargetProperty) {
1396 IComposerClient::ClientTargetProperty property;
1397 mReader.takeClientTargetProperty(display, &property);
1398 outClientTargetProperty->display = display;
1399 outClientTargetProperty->clientTargetProperty.dataspace =
1400 static_cast<::aidl::android::hardware::graphics::common::Dataspace>(property.dataspace);
1401 outClientTargetProperty->clientTargetProperty.pixelFormat =
1402 static_cast<::aidl::android::hardware::graphics::common::PixelFormat>(
1403 property.pixelFormat);
1404 outClientTargetProperty->brightness = 1.f;
1405 outClientTargetProperty->dimmingStage = DimmingStage::NONE;
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001406 return Error::NONE;
1407}
1408
Alec Mouri6da0e272022-02-07 12:45:57 -08001409Error HidlComposer::setLayerBrightness(Display, Layer, float) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001410 return Error::NONE;
1411}
1412
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001413Error HidlComposer::setLayerBlockingRegion(Display, Layer,
1414 const std::vector<IComposerClient::Rect>&) {
1415 return Error::NONE;
1416}
1417
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001418Error HidlComposer::getDisplayDecorationSupport(
1419 Display,
1420 std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
1421 support) {
1422 support->reset();
1423 return Error::UNSUPPORTED;
1424}
1425
ramindani32cf0602022-03-02 02:30:29 +00001426Error HidlComposer::setIdleTimerEnabled(Display, std::chrono::milliseconds) {
1427 LOG_ALWAYS_FATAL("setIdleTimerEnabled should have never been called on this as "
1428 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
1429}
1430
ramindani06e518e2022-03-14 18:47:53 +00001431Error HidlComposer::getPhysicalDisplayOrientation(Display, AidlTransform*) {
1432 LOG_ALWAYS_FATAL("getPhysicalDisplayOrientation should have never been called on this as "
1433 "OptionalFeature::PhysicalDisplayOrientation is not supported on HIDL");
1434}
1435
Yichi Chen3401b562022-01-17 15:42:35 +08001436void HidlComposer::registerCallback(ComposerCallback& callback) {
1437 const bool vsyncSwitchingSupported =
1438 isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
1439
1440 registerCallback(sp<ComposerCallbackBridge>::make(callback, vsyncSwitchingSupported));
1441}
1442
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -04001443void HidlComposer::onHotplugConnect(Display) {}
1444void HidlComposer::onHotplugDisconnect(Display) {}
1445
Ady Abraham9fc28052021-10-14 17:21:38 -07001446CommandReader::~CommandReader() {
1447 resetData();
1448}
1449
1450Error CommandReader::parse() {
1451 resetData();
1452
1453 IComposerClient::Command command;
1454 uint16_t length = 0;
1455
1456 while (!isEmpty()) {
1457 if (!beginCommand(&command, &length)) {
1458 break;
1459 }
1460
1461 bool parsed = false;
1462 switch (command) {
1463 case IComposerClient::Command::SELECT_DISPLAY:
1464 parsed = parseSelectDisplay(length);
1465 break;
1466 case IComposerClient::Command::SET_ERROR:
1467 parsed = parseSetError(length);
1468 break;
1469 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1470 parsed = parseSetChangedCompositionTypes(length);
1471 break;
1472 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1473 parsed = parseSetDisplayRequests(length);
1474 break;
1475 case IComposerClient::Command::SET_PRESENT_FENCE:
1476 parsed = parseSetPresentFence(length);
1477 break;
1478 case IComposerClient::Command::SET_RELEASE_FENCES:
1479 parsed = parseSetReleaseFences(length);
1480 break;
1481 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1482 parsed = parseSetPresentOrValidateDisplayResult(length);
1483 break;
1484 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1485 parsed = parseSetClientTargetProperty(length);
1486 break;
1487 default:
1488 parsed = false;
1489 break;
1490 }
1491
1492 endCommand();
1493
1494 if (!parsed) {
1495 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1496 break;
1497 }
1498 }
1499
1500 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1501}
1502
1503bool CommandReader::parseSelectDisplay(uint16_t length) {
1504 if (length != CommandWriterBase::kSelectDisplayLength) {
1505 return false;
1506 }
1507
1508 mCurrentReturnData = &mReturnData[read64()];
1509
1510 return true;
1511}
1512
1513bool CommandReader::parseSetError(uint16_t length) {
1514 if (length != CommandWriterBase::kSetErrorLength) {
1515 return false;
1516 }
1517
1518 auto location = read();
1519 auto error = static_cast<Error>(readSigned());
1520
1521 mErrors.emplace_back(CommandError{location, error});
1522
1523 return true;
1524}
1525
1526bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1527 // (layer id, composition type) pairs
1528 if (length % 3 != 0 || !mCurrentReturnData) {
1529 return false;
1530 }
1531
1532 uint32_t count = length / 3;
1533 mCurrentReturnData->changedLayers.reserve(count);
1534 mCurrentReturnData->compositionTypes.reserve(count);
1535 while (count > 0) {
1536 auto layer = read64();
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001537 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1538 readSigned());
Ady Abraham9fc28052021-10-14 17:21:38 -07001539
1540 mCurrentReturnData->changedLayers.push_back(layer);
1541 mCurrentReturnData->compositionTypes.push_back(type);
1542
1543 count--;
1544 }
1545
1546 return true;
1547}
1548
1549bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1550 // display requests followed by (layer id, layer requests) pairs
1551 if (length % 3 != 1 || !mCurrentReturnData) {
1552 return false;
1553 }
1554
1555 mCurrentReturnData->displayRequests = read();
1556
1557 uint32_t count = (length - 1) / 3;
1558 mCurrentReturnData->requestedLayers.reserve(count);
1559 mCurrentReturnData->requestMasks.reserve(count);
1560 while (count > 0) {
1561 auto layer = read64();
1562 auto layerRequestMask = read();
1563
1564 mCurrentReturnData->requestedLayers.push_back(layer);
1565 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1566
1567 count--;
1568 }
1569
1570 return true;
1571}
1572
1573bool CommandReader::parseSetPresentFence(uint16_t length) {
1574 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1575 return false;
1576 }
1577
1578 if (mCurrentReturnData->presentFence >= 0) {
1579 close(mCurrentReturnData->presentFence);
1580 }
1581 mCurrentReturnData->presentFence = readFence();
1582
1583 return true;
1584}
1585
1586bool CommandReader::parseSetReleaseFences(uint16_t length) {
1587 // (layer id, release fence index) pairs
1588 if (length % 3 != 0 || !mCurrentReturnData) {
1589 return false;
1590 }
1591
1592 uint32_t count = length / 3;
1593 mCurrentReturnData->releasedLayers.reserve(count);
1594 mCurrentReturnData->releaseFences.reserve(count);
1595 while (count > 0) {
1596 auto layer = read64();
1597 auto fence = readFence();
1598
1599 mCurrentReturnData->releasedLayers.push_back(layer);
1600 mCurrentReturnData->releaseFences.push_back(fence);
1601
1602 count--;
1603 }
1604
1605 return true;
1606}
1607
1608bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1609 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1610 return false;
1611 }
1612 mCurrentReturnData->presentOrValidateState = read();
1613 return true;
1614}
1615
1616bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1617 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1618 return false;
1619 }
1620 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1621 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1622 return true;
1623}
1624
1625void CommandReader::resetData() {
1626 mErrors.clear();
1627
1628 for (auto& data : mReturnData) {
1629 if (data.second.presentFence >= 0) {
1630 close(data.second.presentFence);
1631 }
1632 for (auto fence : data.second.releaseFences) {
1633 if (fence >= 0) {
1634 close(fence);
1635 }
1636 }
1637 }
1638
1639 mReturnData.clear();
1640 mCurrentReturnData = nullptr;
1641}
1642
1643std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1644 return std::move(mErrors);
1645}
1646
1647bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1648 uint32_t* outNumLayerRequestMasks) const {
1649 auto found = mReturnData.find(display);
1650 if (found == mReturnData.end()) {
1651 *outNumChangedCompositionTypes = 0;
1652 *outNumLayerRequestMasks = 0;
1653 return false;
1654 }
1655
1656 const ReturnData& data = found->second;
1657
1658 *outNumChangedCompositionTypes = data.compositionTypes.size();
1659 *outNumLayerRequestMasks = data.requestMasks.size();
1660
1661 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1662}
1663
1664void CommandReader::takeChangedCompositionTypes(
1665 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001666 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001667 auto found = mReturnData.find(display);
1668 if (found == mReturnData.end()) {
1669 outLayers->clear();
1670 outTypes->clear();
1671 return;
1672 }
1673
1674 ReturnData& data = found->second;
1675
1676 *outLayers = std::move(data.changedLayers);
1677 *outTypes = std::move(data.compositionTypes);
1678}
1679
1680void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1681 std::vector<Layer>* outLayers,
1682 std::vector<uint32_t>* outLayerRequestMasks) {
1683 auto found = mReturnData.find(display);
1684 if (found == mReturnData.end()) {
1685 *outDisplayRequestMask = 0;
1686 outLayers->clear();
1687 outLayerRequestMasks->clear();
1688 return;
1689 }
1690
1691 ReturnData& data = found->second;
1692
1693 *outDisplayRequestMask = data.displayRequests;
1694 *outLayers = std::move(data.requestedLayers);
1695 *outLayerRequestMasks = std::move(data.requestMasks);
1696}
1697
1698void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1699 std::vector<int>* outReleaseFences) {
1700 auto found = mReturnData.find(display);
1701 if (found == mReturnData.end()) {
1702 outLayers->clear();
1703 outReleaseFences->clear();
1704 return;
1705 }
1706
1707 ReturnData& data = found->second;
1708
1709 *outLayers = std::move(data.releasedLayers);
1710 *outReleaseFences = std::move(data.releaseFences);
1711}
1712
1713void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1714 auto found = mReturnData.find(display);
1715 if (found == mReturnData.end()) {
1716 *outPresentFence = -1;
1717 return;
1718 }
1719
1720 ReturnData& data = found->second;
1721
1722 *outPresentFence = data.presentFence;
1723 data.presentFence = -1;
1724}
1725
1726void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1727 auto found = mReturnData.find(display);
1728 if (found == mReturnData.end()) {
1729 *state = -1;
1730 return;
1731 }
1732 ReturnData& data = found->second;
1733 *state = data.presentOrValidateState;
1734}
1735
1736void CommandReader::takeClientTargetProperty(
1737 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1738 auto found = mReturnData.find(display);
1739
1740 // If not found, return the default values.
1741 if (found == mReturnData.end()) {
1742 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1743 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1744 return;
1745 }
1746
1747 ReturnData& data = found->second;
1748 *outClientTargetProperty = data.clientTargetProperty;
1749}
1750
1751} // namespace Hwc2
1752} // namespace android
1753
1754// TODO(b/129481165): remove the #pragma below and fix conversion issues
1755#pragma clang diagnostic pop // ignored "-Wconversion"