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