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