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