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