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