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