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