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