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