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