blob: 6fdb2d79f31befa5d3bf8b6c85fa47e4017c08d3 [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 -0400296void HidlComposer::resetCommands(Display) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700297 mWriter.reset();
298}
299
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400300Error HidlComposer::executeCommands(Display) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700301 return execute();
302}
303
304uint32_t HidlComposer::getMaxVirtualDisplayCount() {
305 auto ret = mClient->getMaxVirtualDisplayCount();
306 return unwrapRet(ret, 0);
307}
308
309Error HidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
310 Display* outDisplay) {
311 const uint32_t bufferSlotCount = 1;
312 Error error = kDefaultError;
313 if (mClient_2_2) {
314 mClient_2_2->createVirtualDisplay_2_2(width, height,
315 static_cast<types::V1_1::PixelFormat>(*format),
316 bufferSlotCount,
317 [&](const auto& tmpError, const auto& tmpDisplay,
318 const auto& tmpFormat) {
319 error = tmpError;
320 if (error != Error::NONE) {
321 return;
322 }
323
324 *outDisplay = tmpDisplay;
325 *format = static_cast<types::V1_2::PixelFormat>(
326 tmpFormat);
327 });
328 } else {
329 mClient->createVirtualDisplay(width, height, static_cast<types::V1_0::PixelFormat>(*format),
330 bufferSlotCount,
331 [&](const auto& tmpError, const auto& tmpDisplay,
332 const auto& tmpFormat) {
333 error = tmpError;
334 if (error != Error::NONE) {
335 return;
336 }
337
338 *outDisplay = tmpDisplay;
339 *format = static_cast<PixelFormat>(tmpFormat);
340 });
341 }
342
343 return error;
344}
345
346Error HidlComposer::destroyVirtualDisplay(Display display) {
347 auto ret = mClient->destroyVirtualDisplay(display);
348 return unwrapRet(ret);
349}
350
351Error HidlComposer::acceptDisplayChanges(Display display) {
352 mWriter.selectDisplay(display);
353 mWriter.acceptDisplayChanges();
354 return Error::NONE;
355}
356
357Error HidlComposer::createLayer(Display display, Layer* outLayer) {
358 Error error = kDefaultError;
359 mClient->createLayer(display, kMaxLayerBufferCount,
360 [&](const auto& tmpError, const auto& tmpLayer) {
361 error = tmpError;
362 if (error != Error::NONE) {
363 return;
364 }
365
366 *outLayer = tmpLayer;
367 });
368
369 return error;
370}
371
372Error HidlComposer::destroyLayer(Display display, Layer layer) {
373 auto ret = mClient->destroyLayer(display, layer);
374 return unwrapRet(ret);
375}
376
377Error HidlComposer::getActiveConfig(Display display, Config* outConfig) {
378 Error error = kDefaultError;
379 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
380 error = tmpError;
381 if (error != Error::NONE) {
382 return;
383 }
384
385 *outConfig = tmpConfig;
386 });
387
388 return error;
389}
390
391Error HidlComposer::getChangedCompositionTypes(
392 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500393 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700394 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
395 return Error::NONE;
396}
397
398Error HidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
399 Error error = kDefaultError;
400
401 if (mClient_2_3) {
402 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
403 error = tmpError;
404 if (error != Error::NONE) {
405 return;
406 }
407
408 *outModes = tmpModes;
409 });
410 } else if (mClient_2_2) {
411 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
412 error = tmpError;
413 if (error != Error::NONE) {
414 return;
415 }
416
417 for (types::V1_1::ColorMode colorMode : tmpModes) {
418 outModes->push_back(static_cast<ColorMode>(colorMode));
419 }
420 });
421 } else {
422 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpModes) {
423 error = tmpError;
424 if (error != Error::NONE) {
425 return;
426 }
427 for (types::V1_0::ColorMode colorMode : tmpModes) {
428 outModes->push_back(static_cast<ColorMode>(colorMode));
429 }
430 });
431 }
432
433 return error;
434}
435
436Error HidlComposer::getDisplayAttribute(Display display, Config config,
437 IComposerClient::Attribute attribute, int32_t* outValue) {
438 Error error = kDefaultError;
439 if (mClient_2_4) {
440 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
441 [&](const auto& tmpError, const auto& tmpValue) {
442 error = static_cast<Error>(tmpError);
443 if (error != Error::NONE) {
444 return;
445 }
446
447 *outValue = tmpValue;
448 });
449 } else {
450 mClient->getDisplayAttribute(display, config,
451 static_cast<V2_1::IComposerClient::Attribute>(attribute),
452 [&](const auto& tmpError, const auto& tmpValue) {
453 error = tmpError;
454 if (error != Error::NONE) {
455 return;
456 }
457
458 *outValue = tmpValue;
459 });
460 }
461
462 return error;
463}
464
465Error HidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
466 Error error = kDefaultError;
467 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
468 error = tmpError;
469 if (error != Error::NONE) {
470 return;
471 }
472
473 *outConfigs = tmpConfigs;
474 });
475
476 return error;
477}
478
479Error HidlComposer::getDisplayName(Display display, std::string* outName) {
480 Error error = kDefaultError;
481 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
482 error = tmpError;
483 if (error != Error::NONE) {
484 return;
485 }
486
487 *outName = tmpName.c_str();
488 });
489
490 return error;
491}
492
493Error HidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
494 std::vector<Layer>* outLayers,
495 std::vector<uint32_t>* outLayerRequestMasks) {
496 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
497 return Error::NONE;
498}
499
500Error HidlComposer::getDozeSupport(Display display, bool* outSupport) {
501 Error error = kDefaultError;
502 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
503 error = tmpError;
504 if (error != Error::NONE) {
505 return;
506 }
507
508 *outSupport = tmpSupport;
509 });
510
511 return error;
512}
513
ramindani32cf0602022-03-02 02:30:29 +0000514Error HidlComposer::hasDisplayIdleTimerCapability(Display, bool*) {
515 LOG_ALWAYS_FATAL("hasDisplayIdleTimerCapability should have never been called on this as "
516 "OptionalFeature::KernelIdleTimer is not supported on HIDL");
517}
518
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100519Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700520 float* outMaxLuminance, float* outMaxAverageLuminance,
521 float* outMinLuminance) {
522 Error error = kDefaultError;
523 if (mClient_2_3) {
524 mClient_2_3->getHdrCapabilities_2_3(display,
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100525 [&](const auto& tmpError, const auto& tmpHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700526 const auto& tmpMaxLuminance,
527 const auto& tmpMaxAverageLuminance,
528 const auto& tmpMinLuminance) {
529 error = tmpError;
530 if (error != Error::NONE) {
531 return;
532 }
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100533 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
Ady Abraham9fc28052021-10-14 17:21:38 -0700534
Ady Abraham9fc28052021-10-14 17:21:38 -0700535 *outMaxLuminance = tmpMaxLuminance;
536 *outMaxAverageLuminance = tmpMaxAverageLuminance;
537 *outMinLuminance = tmpMinLuminance;
538 });
539 } else {
540 mClient->getHdrCapabilities(display,
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100541 [&](const auto& tmpError, const auto& tmpHdrTypes,
Ady Abraham9fc28052021-10-14 17:21:38 -0700542 const auto& tmpMaxLuminance,
543 const auto& tmpMaxAverageLuminance,
544 const auto& tmpMinLuminance) {
545 error = tmpError;
546 if (error != Error::NONE) {
547 return;
548 }
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100549 *outHdrTypes = translate<ui::Hdr>(tmpHdrTypes);
Ady Abraham9fc28052021-10-14 17:21:38 -0700550
551 *outMaxLuminance = tmpMaxLuminance;
552 *outMaxAverageLuminance = tmpMaxAverageLuminance;
553 *outMinLuminance = tmpMinLuminance;
554 });
555 }
556
557 return error;
558}
559
Sally Qi0cbd08b2022-08-17 12:12:28 -0700560Error HidlComposer::getOverlaySupport(OverlayProperties* /*outProperties*/) {
561 return Error::NONE;
562}
563
Ady Abraham9fc28052021-10-14 17:21:38 -0700564Error HidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
565 std::vector<int>* outReleaseFences) {
566 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
567 return Error::NONE;
568}
569
570Error HidlComposer::presentDisplay(Display display, int* outPresentFence) {
571 ATRACE_NAME("HwcPresentDisplay");
572 mWriter.selectDisplay(display);
573 mWriter.presentDisplay();
574
575 Error error = execute();
576 if (error != Error::NONE) {
577 return error;
578 }
579
580 mReader.takePresentFence(display, outPresentFence);
581
582 return Error::NONE;
583}
584
585Error HidlComposer::setActiveConfig(Display display, Config config) {
586 auto ret = mClient->setActiveConfig(display, config);
587 return unwrapRet(ret);
588}
589
590Error HidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
591 int acquireFence, Dataspace dataspace,
592 const std::vector<IComposerClient::Rect>& damage) {
593 mWriter.selectDisplay(display);
594
595 const native_handle_t* handle = nullptr;
596 if (target.get()) {
597 handle = target->getNativeBuffer()->handle;
598 }
599
600 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
601 return Error::NONE;
602}
603
604Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
605 hardware::Return<Error> ret(kDefaultError);
606 if (mClient_2_3) {
607 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
608 } else if (mClient_2_2) {
609 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
610 renderIntent);
611 } else {
612 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
613 }
614 return unwrapRet(ret);
615}
616
Ady Abrahamdc011a92021-12-21 14:06:44 -0800617Error HidlComposer::setColorTransform(Display display, const float* matrix) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700618 mWriter.selectDisplay(display);
Ady Abrahamdc011a92021-12-21 14:06:44 -0800619 const bool isIdentity = (mat4(matrix) == mat4());
620 mWriter.setColorTransform(matrix,
621 isIdentity ? ColorTransform::IDENTITY
622 : ColorTransform::ARBITRARY_MATRIX);
Ady Abraham9fc28052021-10-14 17:21:38 -0700623 return Error::NONE;
624}
625
626Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
627 int releaseFence) {
628 mWriter.selectDisplay(display);
629 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
630 return Error::NONE;
631}
632
633Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
634 Return<Error> ret(Error::UNSUPPORTED);
635 if (mClient_2_2) {
636 ret = mClient_2_2->setPowerMode_2_2(display, mode);
637 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
638 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
639 }
640
641 return unwrapRet(ret);
642}
643
644Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
645 auto ret = mClient->setVsyncEnabled(display, enabled);
646 return unwrapRet(ret);
647}
648
649Error HidlComposer::setClientTargetSlotCount(Display display) {
650 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
651 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
652 return unwrapRet(ret);
653}
654
Ady Abraham43065bd2021-12-10 17:22:15 -0800655Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
656 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700657 ATRACE_NAME("HwcValidateDisplay");
658 mWriter.selectDisplay(display);
659 mWriter.validateDisplay();
660
661 Error error = execute();
662 if (error != Error::NONE) {
663 return error;
664 }
665
666 mReader.hasChanges(display, outNumTypes, outNumRequests);
667
668 return Error::NONE;
669}
670
Ady Abraham43065bd2021-12-10 17:22:15 -0800671Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
672 uint32_t* outNumTypes, uint32_t* outNumRequests,
673 int* outPresentFence, uint32_t* state) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700674 ATRACE_NAME("HwcPresentOrValidateDisplay");
675 mWriter.selectDisplay(display);
676 mWriter.presentOrvalidateDisplay();
677
678 Error error = execute();
679 if (error != Error::NONE) {
680 return error;
681 }
682
683 mReader.takePresentOrValidateStage(display, state);
684
685 if (*state == 1) { // Present succeeded
686 mReader.takePresentFence(display, outPresentFence);
687 }
688
689 if (*state == 0) { // Validate succeeded.
690 mReader.hasChanges(display, outNumTypes, outNumRequests);
691 }
692
693 return Error::NONE;
694}
695
696Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
697 mWriter.selectDisplay(display);
698 mWriter.selectLayer(layer);
699 mWriter.setLayerCursorPosition(x, y);
700 return Error::NONE;
701}
702
703Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
704 const sp<GraphicBuffer>& buffer, int acquireFence) {
705 mWriter.selectDisplay(display);
706 mWriter.selectLayer(layer);
707
708 const native_handle_t* handle = nullptr;
709 if (buffer.get()) {
710 handle = buffer->getNativeBuffer()->handle;
711 }
712
713 mWriter.setLayerBuffer(slot, handle, acquireFence);
714 return Error::NONE;
715}
716
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700717Error HidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
718 const std::vector<uint32_t>& slotsToClear,
719 uint32_t activeBufferSlot) {
720 if (slotsToClear.empty()) {
721 return Error::NONE;
722 }
723 // Backwards compatible way of clearing buffer is to set the layer buffer with a placeholder
724 // buffer, using the slot that needs to cleared... tricky.
725 for (uint32_t slot : slotsToClear) {
726 // Don't clear the active buffer slot because we need to restore the active buffer after
727 // setting the requested buffer slots with a placeholder buffer.
728 if (slot != activeBufferSlot) {
729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731 mWriter.setLayerBuffer(slot, mClearSlotBuffer->handle, /*fence*/ -1);
732 }
733 }
734 // Since we clear buffers by setting them to a placeholder buffer, we want to make sure that the
735 // last setLayerBuffer command is sent with the currently active buffer, not the placeholder
736 // buffer, so that there is no perceptual change.
Brian Lindahl90553da2022-12-06 13:36:30 -0700737 mWriter.selectDisplay(display);
738 mWriter.selectLayer(layer);
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700739 mWriter.setLayerBuffer(activeBufferSlot, /*buffer*/ nullptr, /*fence*/ -1);
Brian Lindahl90553da2022-12-06 13:36:30 -0700740 return Error::NONE;
741}
742
Ady Abraham9fc28052021-10-14 17:21:38 -0700743Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
744 const std::vector<IComposerClient::Rect>& damage) {
745 mWriter.selectDisplay(display);
746 mWriter.selectLayer(layer);
747 mWriter.setLayerSurfaceDamage(damage);
748 return Error::NONE;
749}
750
751Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
752 IComposerClient::BlendMode mode) {
753 mWriter.selectDisplay(display);
754 mWriter.selectLayer(layer);
755 mWriter.setLayerBlendMode(mode);
756 return Error::NONE;
757}
758
Ady Abraham6e60b142022-01-06 18:10:35 -0800759static IComposerClient::Color to_hidl_type(
760 aidl::android::hardware::graphics::composer3::Color color) {
761 const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
762 const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
763 const auto minVal = static_cast<uint64_t>(0);
764 const auto maxVal = static_cast<uint64_t>(255);
765 return std::clamp(intVal, minVal, maxVal);
766 };
767
768 return IComposerClient::Color{
769 floatColorToUint8Clamped(color.r),
770 floatColorToUint8Clamped(color.g),
771 floatColorToUint8Clamped(color.b),
772 floatColorToUint8Clamped(color.a),
773 };
774}
775
776Error HidlComposer::setLayerColor(
777 Display display, Layer layer,
778 const aidl::android::hardware::graphics::composer3::Color& color) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700779 mWriter.selectDisplay(display);
780 mWriter.selectLayer(layer);
Ady Abraham6e60b142022-01-06 18:10:35 -0800781 mWriter.setLayerColor(to_hidl_type(color));
Ady Abraham9fc28052021-10-14 17:21:38 -0700782 return Error::NONE;
783}
784
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500785static IComposerClient::Composition to_hidl_type(
786 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500787 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
788 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
789 "Trying to use %s, which is not supported by HidlComposer!",
790 android::to_string(type).c_str());
791
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500792 return static_cast<IComposerClient::Composition>(type);
793}
794
795Error HidlComposer::setLayerCompositionType(
796 Display display, Layer layer,
797 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700798 mWriter.selectDisplay(display);
799 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500800 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700801 return Error::NONE;
802}
803
804Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
805 mWriter.selectDisplay(display);
806 mWriter.selectLayer(layer);
807 mWriter.setLayerDataspace(dataspace);
808 return Error::NONE;
809}
810
811Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
812 const IComposerClient::Rect& frame) {
813 mWriter.selectDisplay(display);
814 mWriter.selectLayer(layer);
815 mWriter.setLayerDisplayFrame(frame);
816 return Error::NONE;
817}
818
819Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
820 mWriter.selectDisplay(display);
821 mWriter.selectLayer(layer);
822 mWriter.setLayerPlaneAlpha(alpha);
823 return Error::NONE;
824}
825
826Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
827 const native_handle_t* stream) {
828 mWriter.selectDisplay(display);
829 mWriter.selectLayer(layer);
830 mWriter.setLayerSidebandStream(stream);
831 return Error::NONE;
832}
833
834Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
835 const IComposerClient::FRect& crop) {
836 mWriter.selectDisplay(display);
837 mWriter.selectLayer(layer);
838 mWriter.setLayerSourceCrop(crop);
839 return Error::NONE;
840}
841
842Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
843 mWriter.selectDisplay(display);
844 mWriter.selectLayer(layer);
845 mWriter.setLayerTransform(transform);
846 return Error::NONE;
847}
848
849Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
850 const std::vector<IComposerClient::Rect>& visible) {
851 mWriter.selectDisplay(display);
852 mWriter.selectLayer(layer);
853 mWriter.setLayerVisibleRegion(visible);
854 return Error::NONE;
855}
856
857Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
858 mWriter.selectDisplay(display);
859 mWriter.selectLayer(layer);
860 mWriter.setLayerZOrder(z);
861 return Error::NONE;
862}
863
864Error HidlComposer::execute() {
865 // prepare input command queue
866 bool queueChanged = false;
867 uint32_t commandLength = 0;
868 hidl_vec<hidl_handle> commandHandles;
869 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
870 mWriter.reset();
871 return Error::NO_RESOURCES;
872 }
873
874 // set up new input command queue if necessary
875 if (queueChanged) {
876 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
877 auto error = unwrapRet(ret);
878 if (error != Error::NONE) {
879 mWriter.reset();
880 return error;
881 }
882 }
883
884 if (commandLength == 0) {
885 mWriter.reset();
886 return Error::NONE;
887 }
888
889 Error error = kDefaultError;
890 hardware::Return<void> ret;
891 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
892 const auto& tmpOutLength, const auto& tmpOutHandles) {
893 error = tmpError;
894
895 // set up new output command queue if necessary
896 if (error == Error::NONE && tmpOutChanged) {
897 error = kDefaultError;
898 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
899 error = tmpError;
900 if (error != Error::NONE) {
901 return;
902 }
903
904 mReader.setMQDescriptor(tmpDescriptor);
905 });
906 }
907
908 if (error != Error::NONE) {
909 return;
910 }
911
912 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
913 error = mReader.parse();
914 mReader.reset();
915 } else {
916 error = Error::NO_RESOURCES;
917 }
918 };
919 if (mClient_2_2) {
920 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
921 } else {
922 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
923 }
924 // executeCommands can fail because of out-of-fd and we do not want to
925 // abort() in that case
926 if (!ret.isOk()) {
927 ALOGE("executeCommands failed because of %s", ret.description().c_str());
928 }
929
930 if (error == Error::NONE) {
931 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
932
933 for (const auto& cmdErr : commandErrors) {
934 auto command =
935 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
936
937 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
938 command == IComposerClient::Command::PRESENT_DISPLAY ||
939 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
940 error = cmdErr.error;
941 } else {
942 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
943 }
944 }
945 }
946
947 mWriter.reset();
948
949 return error;
950}
951
952// Composer HAL 2.2
953
954Error HidlComposer::setLayerPerFrameMetadata(
955 Display display, Layer layer,
956 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
957 if (!mClient_2_2) {
958 return Error::UNSUPPORTED;
959 }
960
961 mWriter.selectDisplay(display);
962 mWriter.selectLayer(layer);
963 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
964 return Error::NONE;
965}
966
967std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
968 Display display) {
969 std::vector<IComposerClient::PerFrameMetadataKey> keys;
970 if (!mClient_2_2) {
971 return keys;
972 }
973
974 Error error = kDefaultError;
975 if (mClient_2_3) {
976 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
977 [&](const auto& tmpError, const auto& tmpKeys) {
978 error = tmpError;
979 if (error != Error::NONE) {
980 ALOGW("getPerFrameMetadataKeys failed "
981 "with %d",
982 tmpError);
983 return;
984 }
985 keys = tmpKeys;
986 });
987 } else {
988 mClient_2_2
989 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
990 error = tmpError;
991 if (error != Error::NONE) {
992 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
993 return;
994 }
995
996 keys.clear();
997 for (auto key : tmpKeys) {
998 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
999 }
1000 });
1001 }
1002
1003 return keys;
1004}
1005
1006Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
1007 std::vector<RenderIntent>* outRenderIntents) {
1008 if (!mClient_2_2) {
1009 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
1010 return Error::NONE;
1011 }
1012
1013 Error error = kDefaultError;
1014
1015 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
1016 error = tmpError;
1017 if (error != Error::NONE) {
1018 return;
1019 }
1020
1021 *outRenderIntents = tmpKeys;
1022 };
1023
1024 if (mClient_2_3) {
1025 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
1026 } else {
1027 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
1028 getRenderIntentsLambda);
1029 }
1030
1031 return error;
1032}
1033
1034Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
1035 if (!mClient_2_2) {
1036 *outMatrix = mat4();
1037 return Error::NONE;
1038 }
1039
1040 Error error = kDefaultError;
1041 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
1042 [&](const auto& tmpError, const auto& tmpMatrix) {
1043 error = tmpError;
1044 if (error != Error::NONE) {
1045 return;
1046 }
1047 *outMatrix = mat4(tmpMatrix.data());
1048 });
1049
1050 return error;
1051}
1052
1053// Composer HAL 2.3
1054
1055Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
1056 std::vector<uint8_t>* outData) {
1057 if (!mClient_2_3) {
1058 return Error::UNSUPPORTED;
1059 }
1060
1061 Error error = kDefaultError;
1062 mClient_2_3->getDisplayIdentificationData(display,
1063 [&](const auto& tmpError, const auto& tmpPort,
1064 const auto& tmpData) {
1065 error = tmpError;
1066 if (error != Error::NONE) {
1067 return;
1068 }
1069
1070 *outPort = tmpPort;
1071 *outData = tmpData;
1072 });
1073
1074 return error;
1075}
1076
1077Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
1078 if (!mClient_2_3) {
1079 return Error::UNSUPPORTED;
1080 }
1081
1082 mWriter.selectDisplay(display);
1083 mWriter.selectLayer(layer);
1084 mWriter.setLayerColorTransform(matrix);
1085 return Error::NONE;
1086}
1087
1088Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
1089 Dataspace* outDataspace,
1090 uint8_t* outComponentMask) {
1091 if (!outFormat || !outDataspace || !outComponentMask) {
1092 return Error::BAD_PARAMETER;
1093 }
1094 if (!mClient_2_3) {
1095 return Error::UNSUPPORTED;
1096 }
1097 Error error = kDefaultError;
1098 mClient_2_3->getDisplayedContentSamplingAttributes(display,
1099 [&](const auto tmpError,
1100 const auto& tmpFormat,
1101 const auto& tmpDataspace,
1102 const auto& tmpComponentMask) {
1103 error = tmpError;
1104 if (error == Error::NONE) {
1105 *outFormat = tmpFormat;
1106 *outDataspace = tmpDataspace;
1107 *outComponentMask =
1108 static_cast<uint8_t>(
1109 tmpComponentMask);
1110 }
1111 });
1112 return error;
1113}
1114
1115Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
1116 uint8_t componentMask, uint64_t maxFrames) {
1117 if (!mClient_2_3) {
1118 return Error::UNSUPPORTED;
1119 }
1120
1121 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
1122 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
1123 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
1124 maxFrames);
1125}
1126
1127Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
1128 uint64_t timestamp, DisplayedFrameStats* outStats) {
1129 if (!outStats) {
1130 return Error::BAD_PARAMETER;
1131 }
1132 if (!mClient_2_3) {
1133 return Error::UNSUPPORTED;
1134 }
1135 Error error = kDefaultError;
1136 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1137 [&](const auto tmpError, auto tmpNumFrames,
1138 const auto& tmpSamples0, const auto& tmpSamples1,
1139 const auto& tmpSamples2, const auto& tmpSamples3) {
1140 error = tmpError;
1141 if (error == Error::NONE) {
1142 outStats->numFrames = tmpNumFrames;
1143 outStats->component_0_sample = tmpSamples0;
1144 outStats->component_1_sample = tmpSamples1;
1145 outStats->component_2_sample = tmpSamples2;
1146 outStats->component_3_sample = tmpSamples3;
1147 }
1148 });
1149 return error;
1150}
1151
1152Error HidlComposer::setLayerPerFrameMetadataBlobs(
1153 Display display, Layer layer,
1154 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1155 if (!mClient_2_3) {
1156 return Error::UNSUPPORTED;
1157 }
1158
1159 mWriter.selectDisplay(display);
1160 mWriter.selectLayer(layer);
1161 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1162 return Error::NONE;
1163}
1164
Alec Mouri4d8a05d2022-03-23 18:14:26 +00001165Error HidlComposer::setDisplayBrightness(Display display, float brightness, float,
Alec Mouricdf16792021-12-10 13:16:06 -08001166 const DisplayBrightnessOptions&) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001167 if (!mClient_2_3) {
1168 return Error::UNSUPPORTED;
1169 }
1170 return mClient_2_3->setDisplayBrightness(display, brightness);
1171}
1172
1173// Composer HAL 2.4
1174
1175Error HidlComposer::getDisplayCapabilities(Display display,
1176 std::vector<DisplayCapability>* outCapabilities) {
1177 if (!mClient_2_3) {
1178 return Error::UNSUPPORTED;
1179 }
1180
1181 V2_4::Error error = kDefaultError_2_4;
1182 if (mClient_2_4) {
1183 mClient_2_4->getDisplayCapabilities_2_4(display,
1184 [&](const auto& tmpError, const auto& tmpCaps) {
1185 error = tmpError;
1186 if (error != V2_4::Error::NONE) {
1187 return;
1188 }
Ady Abrahamde549d42022-01-26 19:19:17 -08001189 *outCapabilities =
1190 translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001191 });
1192 } else {
1193 mClient_2_3
1194 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1195 error = static_cast<V2_4::Error>(tmpError);
1196 if (error != V2_4::Error::NONE) {
1197 return;
1198 }
1199
Ady Abrahamde549d42022-01-26 19:19:17 -08001200 *outCapabilities = translate<DisplayCapability>(tmpCaps);
Ady Abraham9fc28052021-10-14 17:21:38 -07001201 });
1202 }
1203
1204 return static_cast<Error>(error);
1205}
1206
1207V2_4::Error HidlComposer::getDisplayConnectionType(
1208 Display display, IComposerClient::DisplayConnectionType* outType) {
1209 using Error = V2_4::Error;
1210 if (!mClient_2_4) {
1211 return Error::UNSUPPORTED;
1212 }
1213
1214 Error error = kDefaultError_2_4;
1215 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1216 error = tmpError;
1217 if (error != V2_4::Error::NONE) {
1218 return;
1219 }
1220
1221 *outType = tmpType;
1222 });
1223
1224 return error;
1225}
1226
1227V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1228 using Error = V2_4::Error;
1229 if (!mClient_2_4) {
1230 return Error::UNSUPPORTED;
1231 }
1232
1233 Error error = kDefaultError_2_4;
1234 mClient_2_4->getDisplayVsyncPeriod(display,
1235 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1236 error = tmpError;
1237 if (error != Error::NONE) {
1238 return;
1239 }
1240
1241 *outVsyncPeriod = tmpVsyncPeriod;
1242 });
1243
1244 return error;
1245}
1246
1247V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1248 Display display, Config config,
1249 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1250 VsyncPeriodChangeTimeline* outTimeline) {
1251 using Error = V2_4::Error;
1252 if (!mClient_2_4) {
1253 return Error::UNSUPPORTED;
1254 }
1255
1256 Error error = kDefaultError_2_4;
1257 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1258 [&](const auto& tmpError, const auto& tmpTimeline) {
1259 error = tmpError;
1260 if (error != Error::NONE) {
1261 return;
1262 }
1263
1264 *outTimeline = tmpTimeline;
1265 });
1266
1267 return error;
1268}
1269
1270V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1271 using Error = V2_4::Error;
1272 if (!mClient_2_4) {
1273 return Error::UNSUPPORTED;
1274 }
1275
1276 return mClient_2_4->setAutoLowLatencyMode(display, on);
1277}
1278
1279V2_4::Error HidlComposer::getSupportedContentTypes(
1280 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1281 using Error = V2_4::Error;
1282 if (!mClient_2_4) {
1283 return Error::UNSUPPORTED;
1284 }
1285
1286 Error error = kDefaultError_2_4;
1287 mClient_2_4->getSupportedContentTypes(displayId,
1288 [&](const auto& tmpError,
1289 const auto& tmpSupportedContentTypes) {
1290 error = tmpError;
1291 if (error != Error::NONE) {
1292 return;
1293 }
1294
1295 *outSupportedContentTypes = tmpSupportedContentTypes;
1296 });
1297 return error;
1298}
1299
1300V2_4::Error HidlComposer::setContentType(Display display,
1301 IComposerClient::ContentType contentType) {
1302 using Error = V2_4::Error;
1303 if (!mClient_2_4) {
1304 return Error::UNSUPPORTED;
1305 }
1306
1307 return mClient_2_4->setContentType(display, contentType);
1308}
1309
1310V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1311 const std::string& key, bool mandatory,
1312 const std::vector<uint8_t>& value) {
1313 using Error = V2_4::Error;
1314 if (!mClient_2_4) {
1315 return Error::UNSUPPORTED;
1316 }
1317 mWriter.selectDisplay(display);
1318 mWriter.selectLayer(layer);
1319 mWriter.setLayerGenericMetadata(key, mandatory, value);
1320 return Error::NONE;
1321}
1322
1323V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1324 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1325 using Error = V2_4::Error;
1326 if (!mClient_2_4) {
1327 return Error::UNSUPPORTED;
1328 }
1329 Error error = kDefaultError_2_4;
1330 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1331 error = tmpError;
1332 if (error != Error::NONE) {
1333 return;
1334 }
1335
1336 *outKeys = tmpKeys;
1337 });
1338 return error;
1339}
1340
Kriti Dang7defaf32021-11-15 11:55:43 +01001341Error HidlComposer::setBootDisplayConfig(Display /*displayId*/, Config) {
1342 return Error::UNSUPPORTED;
1343}
1344
1345Error HidlComposer::clearBootDisplayConfig(Display /*displayId*/) {
1346 return Error::UNSUPPORTED;
1347}
1348
1349Error HidlComposer::getPreferredBootDisplayConfig(Display /*displayId*/, Config*) {
1350 return Error::UNSUPPORTED;
1351}
1352
Kriti Dang674b9372022-11-18 10:58:44 +01001353Error HidlComposer::getHdrConversionCapabilities(std::vector<HdrConversionCapability>*) {
1354 return Error::UNSUPPORTED;
1355}
1356
1357Error HidlComposer::setHdrConversionStrategy(HdrConversionStrategy) {
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"