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