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