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