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