HWC2.cpp revision 016d73c2d8f8fae544f09a6eebe827791f499470
1651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza/*
2651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Copyright 2015 The Android Open Source Project
3651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
4651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
5651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * you may not use this file except in compliance with the License.
6651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * You may obtain a copy of the License at
7651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
8651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
9651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
10651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Unless required by applicable law or agreed to in writing, software
11651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
12651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * See the License for the specific language governing permissions and
14651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * limitations under the License.
15651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza */
16651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
17651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// #define LOG_NDEBUG 0
18651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
19651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef LOG_TAG
20651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define LOG_TAG "HWC2"
21651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define ATRACE_TAG ATRACE_TAG_GRAPHICS
22651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
23651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include "HWC2.h"
24aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include "ComposerHal.h"
25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
26651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Fence.h>
275a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza#include <ui/FloatRect.h>
28651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/GraphicBuffer.h>
29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Region.h>
30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <android/configuration.h>
32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
3309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza#include <algorithm>
34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <inttypes.h>
35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
36651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaextern "C" {
37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void hotplug_hook(hwc2_callback_data_t callbackData,
38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId, int32_t intConnected) {
39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto connected = static_cast<HWC2::Connection>(intConnected);
43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callHotplug(std::move(display), connected);
44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Hotplug callback called with unknown display %" PRIu64,
46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
48651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void refresh_hook(hwc2_callback_data_t callbackData,
51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId) {
52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callRefresh(std::move(display));
56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Refresh callback called with unknown display %" PRIu64,
58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
61651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
62651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void vsync_hook(hwc2_callback_data_t callbackData,
63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId, int64_t timestamp) {
64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
66651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
67651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callVsync(std::move(display), timestamp);
68651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
69651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Vsync callback called with unknown display %" PRIu64,
70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Fence;
765a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stozausing android::FloatRect;
77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer;
787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities;
79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect;
80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region;
81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp;
82aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Return;
83aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Void;
84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
87aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 = android::Hwc2;
88aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods
90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
91aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
92651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::Device(hwc2_device_t* device)
93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mHwcDevice(device),
94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCreateVirtualDisplay(nullptr),
95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDestroyVirtualDisplay(nullptr),
96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(nullptr),
97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetMaxVirtualDisplayCount(nullptr),
98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRegisterCallback(nullptr),
99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mAcceptDisplayChanges(nullptr),
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCreateLayer(nullptr),
101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDestroyLayer(nullptr),
102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetActiveConfig(nullptr),
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetChangedCompositionTypes(nullptr),
104076ac670262e448c531e6db7727cfade325866caDan Stoza    mGetColorModes(nullptr),
105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayAttribute(nullptr),
106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayConfigs(nullptr),
107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayName(nullptr),
108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayRequests(nullptr),
109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayType(nullptr),
110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDozeSupport(nullptr),
1117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    mGetHdrCapabilities(nullptr),
112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetReleaseFences(nullptr),
113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPresentDisplay(nullptr),
114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetActiveConfig(nullptr),
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetClientTarget(nullptr),
116076ac670262e448c531e6db7727cfade325866caDan Stoza    mSetColorMode(nullptr),
1175df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    mSetColorTransform(nullptr),
118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetOutputBuffer(nullptr),
119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetPowerMode(nullptr),
120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetVsyncEnabled(nullptr),
121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mValidateDisplay(nullptr),
122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetCursorPosition(nullptr),
123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerBuffer(nullptr),
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSurfaceDamage(nullptr),
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerBlendMode(nullptr),
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerColor(nullptr),
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerCompositionType(nullptr),
1285df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    mSetLayerDataspace(nullptr),
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerDisplayFrame(nullptr),
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerPlaneAlpha(nullptr),
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSidebandStream(nullptr),
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSourceCrop(nullptr),
133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerTransform(nullptr),
134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerVisibleRegion(nullptr),
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerZOrder(nullptr),
136aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
13787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarDevice::Device(bool useVrComposer)
13887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar  : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)),
139aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif // BYPASS_IHWC
140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCapabilities(),
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays(),
142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug(),
143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingHotplugs(),
144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh(),
145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingRefreshes(),
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync(),
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingVsyncs()
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadCapabilities();
150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadFunctionPointers();
151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallbacks();
152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
154651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::~Device()
155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
156aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mHwcDevice == nullptr) {
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
160aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto element : mDisplays) {
16338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto display = element.second.lock();
16438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        if (!display) {
16538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            ALOGE("~Device: Found a display (%" PRId64 " that has already been"
16638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                    " destroyed", element.first);
16738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            continue;
16838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        }
169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        DisplayType displayType = HWC2::DisplayType::Invalid;
171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto error = display->getType(&displayType);
172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (error != Error::None) {
173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("~Device: Failed to determine type of display %" PRIu64
174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    ": %s (%d)", display->getId(), to_string(error).c_str(),
175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<int32_t>(error));
176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            continue;
177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (displayType == HWC2::DisplayType::Physical) {
180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            error = display->setVsyncEnabled(HWC2::Vsync::Disable);
181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            if (error != Error::None) {
182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                ALOGE("~Device: Failed to disable vsync for display %" PRIu64
183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        ": %s (%d)", display->getId(), to_string(error).c_str(),
184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        static_cast<int32_t>(error));
185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
189aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_close(mHwcDevice);
191aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device
195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const
197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
198aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numBytes = 0;
200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(mHwcDevice, &numBytes, nullptr);
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<char> buffer(numBytes);
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(mHwcDevice, &numBytes, buffer.data());
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return std::string(buffer.data(), buffer.size());
206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
207aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->dumpDebugInfo();
208aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
213aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return mGetMaxVirtualDisplayCount(mHwcDevice);
215aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
216aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->getMaxVirtualDisplayCount();
217aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
220651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height,
2215cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza        android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay)
222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Creating virtual display");
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t displayId = 0;
226aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
2275cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    int32_t intFormat = static_cast<int32_t>(*format);
228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height,
2295cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza            &intFormat, &displayId);
230aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
231aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intFormat = static_cast<Hwc2::PixelFormat>(*format);
232aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mComposer->createVirtualDisplay(width, height,
23367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &intFormat, &displayId);
234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Created virtual display");
2415cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    *format = static_cast<android_pixel_format_t>(intFormat);
242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplay = getDisplayById(displayId);
24338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    if (!*outDisplay) {
24438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE("Failed to get display by id");
24538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return Error::BadDisplay;
24638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    }
247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    (*outDisplay)->setVirtual();
248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerHotplugCallback(HotplugCallback hotplug)
252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("registerHotplugCallback");
254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug = hotplug;
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingHotplugs) {
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto connected = pending.second;
258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("Sending pending hotplug(%" PRIu64 ", %s)", display->getId(),
259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(connected).c_str());
260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerRefreshCallback(RefreshCallback refresh)
265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh = refresh;
267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingRefreshes) {
268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(pending));
269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerVsyncCallback(VsyncCallback vsync)
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync = vsync;
275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingVsyncs) {
276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto timestamp = pending.second;
278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device callbacks
283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callHotplug(std::shared_ptr<Display> display, Connection connected)
285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (connected == Connection::Connected) {
287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (!display->isConnected()) {
288cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu#ifndef BYPASS_IHWC
289cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu            mComposer->setClientTargetSlotCount(display->getId());
290cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu#endif
291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->loadConfigs();
292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->setConnected(true);
293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->setConnected(false);
296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDisplays.erase(display->getId());
297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mHotplug) {
300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callHotplug called, but no valid callback registered, storing");
303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingHotplugs.emplace_back(std::move(display), connected);
304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callRefresh(std::shared_ptr<Display> display)
308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mRefresh) {
310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(display));
311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callRefresh called, but no valid callback registered, storing");
313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingRefreshes.emplace_back(std::move(display));
314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callVsync(std::shared_ptr<Display> display, nsecs_t timestamp)
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mVsync) {
320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
321651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callVsync called, but no valid callback registered, storing");
323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingVsyncs.emplace_back(std::move(display), timestamp);
324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods
328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Display> Device::getDisplayById(hwc2_display_t id) {
330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mDisplays.count(id) != 0) {
33138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto strongDisplay = mDisplays[id].lock();
33238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE_IF(!strongDisplay, "Display %" PRId64 " is in mDisplays but is no"
33338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                " longer alive", id);
33438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return strongDisplay;
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = std::make_shared<Display>(*this, id);
338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays.emplace(id, display);
339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return display;
340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods
343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities()
345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static_assert(sizeof(Capability) == sizeof(int32_t),
347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            "Capability size has changed");
348aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numCapabilities = 0;
350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, nullptr);
3519f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    std::vector<Capability> capabilities(numCapabilities);
3529f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    auto asInt = reinterpret_cast<int32_t*>(capabilities.data());
353651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, asInt);
3549f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    for (auto capability : capabilities) {
3559f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza        mCapabilities.emplace(capability);
3569f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    }
357aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
358aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto capabilities = mComposer->getCapabilities();
359aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto capability : capabilities) {
360aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        mCapabilities.emplace(static_cast<Capability>(capability));
361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
362aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
36509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stozabool Device::hasCapability(HWC2::Capability capability) const
36609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza{
36709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    return std::find(mCapabilities.cbegin(), mCapabilities.cend(),
36809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza            capability) != mCapabilities.cend();
36909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza}
37009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza
371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadFunctionPointers()
372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
373aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For all of these early returns, we log an error message inside
375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // loadFunctionPointer specifying which function failed to load
376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Display function pointers
3787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay,
379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mCreateVirtualDisplay)) return;
3807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay,
381651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDestroyVirtualDisplay)) return;
3827d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return;
3837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount,
384651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetMaxVirtualDisplayCount)) return;
3857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::RegisterCallback,
386651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mRegisterCallback)) return;
387651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
388651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Device function pointers
3897d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges,
390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mAcceptDisplayChanges)) return;
3917d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::CreateLayer,
392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mCreateLayer)) return;
3937d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::DestroyLayer,
394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDestroyLayer)) return;
3957d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetActiveConfig,
396651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetActiveConfig)) return;
3977d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes,
398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetChangedCompositionTypes)) return;
399076ac670262e448c531e6db7727cfade325866caDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetColorModes,
400076ac670262e448c531e6db7727cfade325866caDan Stoza            mGetColorModes)) return;
4017d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute,
402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayAttribute)) return;
4037d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs,
404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayConfigs)) return;
4057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayName,
406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayName)) return;
4077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests,
408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayRequests)) return;
4097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayType,
410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayType)) return;
4117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDozeSupport,
412651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDozeSupport)) return;
4137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetHdrCapabilities,
4147d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            mGetHdrCapabilities)) return;
4157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetReleaseFences,
416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetReleaseFences)) return;
4177d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::PresentDisplay,
418651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mPresentDisplay)) return;
4197d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetActiveConfig,
420651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetActiveConfig)) return;
4217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget,
422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetClientTarget)) return;
423076ac670262e448c531e6db7727cfade325866caDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetColorMode,
424076ac670262e448c531e6db7727cfade325866caDan Stoza            mSetColorMode)) return;
4255df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetColorTransform,
4265df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mSetColorTransform)) return;
4277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer,
428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetOutputBuffer)) return;
4297d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode,
430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetPowerMode)) return;
4317d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled,
432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetVsyncEnabled)) return;
4337d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::ValidateDisplay,
434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mValidateDisplay)) return;
435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Layer function pointers
4377d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetCursorPosition,
438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetCursorPosition)) return;
4397d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer,
440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerBuffer)) return;
4417d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage,
442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerSurfaceDamage)) return;
4437d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode,
444651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerBlendMode)) return;
4457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerColor,
446651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerColor)) return;
4477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType,
448651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerCompositionType)) return;
4495df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerDataspace,
4505df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mSetLayerDataspace)) return;
4517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame,
452651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerDisplayFrame)) return;
4537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha,
454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerPlaneAlpha)) return;
45509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    if (hasCapability(Capability::SidebandStream)) {
45609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        if (!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream,
45709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                mSetLayerSidebandStream)) return;
45809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
4597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop,
460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerSourceCrop)) return;
4617d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerTransform,
462651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerTransform)) return;
4637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion,
464651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerVisibleRegion)) return;
4657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder,
466651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerZOrder)) return;
467aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif // BYPASS_IHWC
468651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
469651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
470aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace {
471aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuclass ComposerCallback : public Hwc2::IComposerCallback {
472aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wupublic:
473aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    ComposerCallback(Device* device) : mDevice(device) {}
474aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
475aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onHotplug(Hwc2::Display display,
476aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            Connection connected) override
477aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
478aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        hotplug_hook(mDevice, display, static_cast<int32_t>(connected));
479aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
480aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
481aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
482aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onRefresh(Hwc2::Display display) override
483aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
484aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        refresh_hook(mDevice, display);
485aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
486aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
487aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
488aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override
489aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
490aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        vsync_hook(mDevice, display, timestamp);
491aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
492aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
493aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
494aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuprivate:
495aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Device* mDevice;
496aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu};
497aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace anonymous
498aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
499651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerCallbacks()
500651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
501aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_HOTPLUG>(Callback::Hotplug, hotplug_hook);
503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_REFRESH>(Callback::Refresh, refresh_hook);
504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_VSYNC>(Callback::Vsync, vsync_hook);
505aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
506aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    sp<ComposerCallback> callback = new ComposerCallback(this);
507aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    mComposer->registerCallback(callback);
508aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
510651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
511651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
512651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Display
513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::destroyVirtualDisplay(hwc2_display_t display)
515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Destroying virtual display");
517aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDestroyVirtualDisplay(mHwcDevice, display);
519aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
520aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mComposer->destroyVirtualDisplay(display);
521aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
523651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 ") failed:"
524651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " %s (%d)", display, to_string(error).c_str(), intError);
52538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    mDisplays.erase(display);
526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods
529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
530651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Display(Device& device, hwc2_display_t id)
531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDevice(device),
532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mIsConnected(false),
534016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    mIsVirtual(false),
535016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    mType(DisplayType::Invalid)
536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created display %" PRIu64, id);
538016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes
539016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#ifdef BYPASS_IHWC
540016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    int32_t intError = mDevice.mGetDisplayType(mDevice.mHwcDevice, mId,
541016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes            reinterpret_cast<int32_t *>(&mType));
542016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#else
543016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    auto intError = mDevice.mComposer->getDisplayType(mId,
544016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes            reinterpret_cast<Hwc2::IComposerClient::DisplayType *>(&mType));
545016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#endif
546016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    auto error = static_cast<Error>(intError);
547016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    if (error != Error::None) {
548016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes        ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d)",
549016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes              id, to_string(error).c_str(), intError);
550016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    }
551651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
552651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
553651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::~Display()
554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Destroyed display %" PRIu64, mId);
556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mIsVirtual) {
557651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDevice.destroyVirtualDisplay(mId);
558651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
559651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
560651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
561651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id)
562651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
563651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
564651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mWidth(-1),
565651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHeight(-1),
566651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsyncPeriod(-1),
567651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiX(-1),
568651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiY(-1) {}
569651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
570651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id)
571651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mConfig(new Config(display, id)) {}
572651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() {
574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Default density is based on TVs: 1080p displays get XHIGH density, lower-
575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // resolution displays get TV density. Maybe eventually we'll need to update
576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // it for 4k displays, though hopefully those will just report accurate DPI
577651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // information to begin with. This is also used for virtual displays and
578651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // older HWC implementations, so be careful about orientation.
579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight);
581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (longDimension >= 1080) {
582651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_XHIGH;
583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
584651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_TV;
585651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
586651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
587651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
588651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display
589651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
590651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges()
591651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
592aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
593651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mAcceptDisplayChanges(mDevice.mHwcDevice, mId);
594aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
595aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->acceptDisplayChanges(mId);
596aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
597651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
598651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
599651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
600651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::createLayer(std::shared_ptr<Layer>* outLayer)
601651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
602651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t layerId = 0;
603aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
604651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mCreateLayer(mDevice.mHwcDevice, mId, &layerId);
605aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
60667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->createLayer(mId, &layerId);
607aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
611651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
612651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
613651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = std::make_shared<Layer>(shared_from_this(), layerId);
614651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.emplace(layerId, layer);
615651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outLayer = std::move(layer);
616651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
617651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
618651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
619651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig(
620651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::shared_ptr<const Display::Config>* outConfig) const
621651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
622651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] getActiveConfig", mId);
623651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_config_t configId = 0;
624aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
625651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetActiveConfig(mDevice.mHwcDevice, mId,
626651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &configId);
627aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
62867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getActiveConfig(mId, &configId);
629aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
630651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
631651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
632651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
633b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        ALOGE("Unable to get active config for mId:[%" PRIu64 "]", mId);
634b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        *outConfig = nullptr;
635651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
636651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
637651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
638651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mConfigs.count(configId) != 0) {
639651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = mConfigs.at(configId);
640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId,
642651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId);
643651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // Return no error, but the caller needs to check for a null pointer to
644651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // detect this case
645651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = nullptr;
646651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
647651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
648651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
649651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
651651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes(
652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes)
653651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
654aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
655651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice,
657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, &numElements, nullptr, nullptr);
658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> types(numElements);
665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, mId,
666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numElements, layerIds.data(), types.data());
667aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
668aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
669cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Composition> types;
670aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getChangedCompositionTypes(mId,
67167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &layerIds, &types);
672aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
673aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
674aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
678651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->clear();
681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->reserve(numElements);
682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
684651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
685651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto type = static_cast<Composition>(types[element]);
686651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s",
687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    layer->getId(), to_string(type).c_str());
688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outTypes->emplace(layer, type);
689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found"
691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " on display %" PRIu64, layerIds[element], mId);
692651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
69828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::getColorModes(std::vector<android_color_mode_t>* outModes) const
699076ac670262e448c531e6db7727cfade325866caDan Stoza{
700aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
701076ac670262e448c531e6db7727cfade325866caDan Stoza    uint32_t numModes = 0;
702076ac670262e448c531e6db7727cfade325866caDan Stoza    int32_t intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId,
703076ac670262e448c531e6db7727cfade325866caDan Stoza            &numModes, nullptr);
704076ac670262e448c531e6db7727cfade325866caDan Stoza    auto error = static_cast<Error>(intError);
705076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None)  {
706076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
707076ac670262e448c531e6db7727cfade325866caDan Stoza    }
708076ac670262e448c531e6db7727cfade325866caDan Stoza
709076ac670262e448c531e6db7727cfade325866caDan Stoza    std::vector<int32_t> modes(numModes);
710076ac670262e448c531e6db7727cfade325866caDan Stoza    intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, &numModes,
711076ac670262e448c531e6db7727cfade325866caDan Stoza            modes.data());
712076ac670262e448c531e6db7727cfade325866caDan Stoza    error = static_cast<Error>(intError);
713aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
714aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::ColorMode> modes;
71567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getColorModes(mId, &modes);
716aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numModes = modes.size();
717aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
718aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
719076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None) {
720076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
721076ac670262e448c531e6db7727cfade325866caDan Stoza    }
722076ac670262e448c531e6db7727cfade325866caDan Stoza
72328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    outModes->resize(numModes);
72428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    for (size_t i = 0; i < numModes; i++) {
72528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        (*outModes)[i] = static_cast<android_color_mode_t>(modes[i]);
72628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
727076ac670262e448c531e6db7727cfade325866caDan Stoza    return Error::None;
728076ac670262e448c531e6db7727cfade325866caDan Stoza}
729076ac670262e448c531e6db7727cfade325866caDan Stoza
730651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const
731651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
732651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> configs;
733651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (const auto& element : mConfigs) {
734651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        configs.emplace_back(element.second);
735651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
736651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return configs;
737651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
738651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
739651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const
740651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
741aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
742651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t size;
743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size,
744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            nullptr);
745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
746651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
750651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<char> rawName(size);
751651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size,
752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            rawName.data());
753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
755651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outName = std::string(rawName.cbegin(), rawName.cend());
759651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
760aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
76167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayName(mId, outName);
762aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return static_cast<Error>(intError);
763aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
766651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
767651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, LayerRequest>*
768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                outLayerRequests)
769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
770aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
771651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intDisplayRequests = 0;
772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
773651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId,
774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intDisplayRequests, &numElements, nullptr, nullptr);
775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
779651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
781651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> layerRequests(numElements);
782651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId,
783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intDisplayRequests, &numElements, layerIds.data(),
784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            layerRequests.data());
785651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
786aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
787aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t intDisplayRequests;
788aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
789aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<uint32_t> layerRequests;
790aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getDisplayRequests(mId,
79167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &intDisplayRequests, &layerIds, &layerRequests);
792aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
793aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
794aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
795651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
796651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
797651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
798651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests);
800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->clear();
801651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->reserve(numElements);
802651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
803651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
804651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
805651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto layerRequest =
806651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<LayerRequest>(layerRequests[element]);
807651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outLayerRequests->emplace(layer, layerRequest);
808651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
809651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getRequests: invalid layer %" PRIu64 " found on display %"
810651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    PRIu64, layerIds[element], mId);
811651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
812651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
813651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
814651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
815651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
816651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
817651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const
818651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
819016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    *outType = mType;
820651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
821651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
822651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
823651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const
824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
825aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
826651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intSupport = 0;
827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDozeSupport(mDevice.mHwcDevice, mId,
828651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intSupport);
829aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
830aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    bool intSupport = false;
83167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDozeSupport(mId, &intSupport);
832aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
833651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
837651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outSupport = static_cast<bool>(intSupport);
838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
839651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
840651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
8417d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities(
8427d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        std::unique_ptr<HdrCapabilities>* outCapabilities) const
8437d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{
8447d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    uint32_t numTypes = 0;
8457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxLuminance = -1.0f;
8467d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxAverageLuminance = -1.0f;
8477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float minLuminance = -1.0f;
848aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
8497d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    int32_t intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId,
8507d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            &numTypes, nullptr, &maxLuminance, &maxAverageLuminance,
8517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            &minLuminance);
8527d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    auto error = static_cast<HWC2::Error>(intError);
8537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
8547d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
8557d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
8567d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
8577d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    std::vector<int32_t> types(numTypes);
8587d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, &numTypes,
8597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            types.data(), &maxLuminance, &maxAverageLuminance, &minLuminance);
8607d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    error = static_cast<HWC2::Error>(intError);
861aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
862aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Hdr> intTypes;
86367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getHdrCapabilities(mId, &intTypes,
86467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &maxLuminance, &maxAverageLuminance, &minLuminance);
865aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<HWC2::Error>(intError);
866aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
867aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int32_t> types;
868aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto type : intTypes) {
869aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        types.push_back(static_cast<int32_t>(type));
870aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
871aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    numTypes = types.size();
872aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
8737d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
8747d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
8757d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
8767d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
8777d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types),
8787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            maxLuminance, maxAverageLuminance, minLuminance);
8797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    return Error::None;
8807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza}
8817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
882651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences(
883651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const
884651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
885aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
886651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
887651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId,
888651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numElements, nullptr, nullptr);
889651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
890651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
891651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
892651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
893651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
894651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
895651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> fenceFds(numElements);
896651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, &numElements,
897651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            layerIds.data(), fenceFds.data());
898651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
899aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
900aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
901aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int> fenceFds;
902aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getReleaseFences(mId,
90367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &layerIds, &fenceFds);
904aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
905aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
906aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
907651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
908651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
909651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
910651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
911651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<std::shared_ptr<Layer>, sp<Fence>> releaseFences;
912651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    releaseFences.reserve(numElements);
913651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
914651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
915651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
916651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            sp<Fence> fence(new Fence(fenceFds[element]));
917651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            releaseFences.emplace(std::move(layer), fence);
918651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
919651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getReleaseFences: invalid layer %" PRIu64
920651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " found on display %" PRIu64, layerIds[element], mId);
921651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return Error::BadLayer;
922651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
923651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
924651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
925651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outFences = std::move(releaseFences);
926651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
927651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
928651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
92911d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien SanglardError Display::present(sp<Fence>* outPresentFence)
930651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
931847650b5d89a1667f78fa0fa67429377cd3bf37aNaseer Ahmed    int32_t presentFenceFd = -1;
932aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
933651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mPresentDisplay(mDevice.mHwcDevice, mId,
93411d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard            &presentFenceFd);
935aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
93667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->presentDisplay(mId, &presentFenceFd);
937aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
938651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
939651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
940651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
941651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
942651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
94311d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard    *outPresentFence = new Fence(presentFenceFd);
944651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
945651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
946651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
947651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config)
948651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
949651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (config->getDisplayId() != mId) {
950651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("setActiveConfig received config %u for the wrong display %"
951651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                PRIu64 " (expected %" PRIu64 ")", config->getId(),
952651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                config->getDisplayId(), mId);
953651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return Error::BadConfig;
954651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
955aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
956651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetActiveConfig(mDevice.mHwcDevice, mId,
957651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            config->getId());
958aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
959aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setActiveConfig(mId, config->getId());
960aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
961651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
962651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
963651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
96406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Display::setClientTarget(uint32_t slot, buffer_handle_t target,
965651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence, android_dataspace_t dataspace)
966651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
9675cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    // TODO: Properly encode client target surface damage
968651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
969aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
97006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    (void) slot;
971651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target,
9725cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza            fenceFd, static_cast<int32_t>(dataspace), {0, nullptr});
973aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
97406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    auto intError = mDevice.mComposer->setClientTarget(mId, slot, target,
97506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            fenceFd, static_cast<Hwc2::Dataspace>(dataspace),
976cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu            std::vector<Hwc2::IComposerClient::Rect>());
977aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
978651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
979651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
980651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
98128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::setColorMode(android_color_mode_t mode)
982076ac670262e448c531e6db7727cfade325866caDan Stoza{
983aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
984076ac670262e448c531e6db7727cfade325866caDan Stoza    int32_t intError = mDevice.mSetColorMode(mDevice.mHwcDevice, mId, mode);
985aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
986aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setColorMode(mId,
987aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            static_cast<Hwc2::ColorMode>(mode));
988aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
989076ac670262e448c531e6db7727cfade325866caDan Stoza    return static_cast<Error>(intError);
990076ac670262e448c531e6db7727cfade325866caDan Stoza}
991076ac670262e448c531e6db7727cfade325866caDan Stoza
9925df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix,
9935df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza        android_color_transform_t hint)
9945df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
995aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
9965df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    int32_t intError = mDevice.mSetColorTransform(mDevice.mHwcDevice, mId,
9975df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            matrix.asArray(), static_cast<int32_t>(hint));
998aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
999aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setColorTransform(mId,
1000aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            matrix.asArray(), static_cast<Hwc2::ColorTransform>(hint));
1001aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
10025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
10035df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
10045df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
1005651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer,
1006651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& releaseFence)
1007651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1008651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = releaseFence->dup();
1009651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto handle = buffer->getNativeBuffer()->handle;
1010aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1011651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetOutputBuffer(mDevice.mHwcDevice, mId, handle,
1012651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            fenceFd);
1013aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1014aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setOutputBuffer(mId, handle, fenceFd);
1015aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
101638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    close(fenceFd);
1017651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1018651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1019651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1020651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode)
1021651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1022aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1023651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intMode = static_cast<int32_t>(mode);
1024651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetPowerMode(mDevice.mHwcDevice, mId, intMode);
1025aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1026cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode);
1027aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setPowerMode(mId, intMode);
1028aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1029651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1030651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1031651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1032651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled)
1033651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1034aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1035651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intEnabled = static_cast<int32_t>(enabled);
1036651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetVsyncEnabled(mDevice.mHwcDevice, mId,
1037651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            intEnabled);
1038aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1039cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intEnabled = static_cast<Hwc2::IComposerClient::Vsync>(enabled);
1040aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setVsyncEnabled(mId, intEnabled);
1041aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1042651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1043651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1044651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1045651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests)
1046651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1047651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numTypes = 0;
1048651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numRequests = 0;
1049aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1050651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mValidateDisplay(mDevice.mHwcDevice, mId,
1051651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numTypes, &numRequests);
1052aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1053aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->validateDisplay(mId,
105467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &numTypes, &numRequests);
1055aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1056651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
1057651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None && error != Error::HasChanges) {
1058651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
1059651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1060651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1061651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumTypes = numTypes;
1062651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumRequests = numRequests;
1063651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return error;
1064651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1065651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1066651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device
1067651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1068651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute)
1069651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1070651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t value = 0;
1071aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1072651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayAttribute(mDevice.mHwcDevice, mId,
1073651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            configId, static_cast<int32_t>(attribute), &value);
1074aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
107567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayAttribute(mId, configId,
107667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            static_cast<Hwc2::IComposerClient::Attribute>(attribute),
107767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &value);
1078aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1079651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
1080651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
1081651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId,
1082651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId, to_string(attribute).c_str(),
1083651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
1084651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return -1;
1085651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1086651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return value;
1087651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1088651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1089651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId)
1090651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1091651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId);
1092651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1093651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto config = Config::Builder(*this, configId)
1094651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setWidth(getAttribute(configId, Attribute::Width))
1095651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setHeight(getAttribute(configId, Attribute::Height))
1096651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod))
1097651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiX(getAttribute(configId, Attribute::DpiX))
1098651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiY(getAttribute(configId, Attribute::DpiY))
1099651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .build();
1100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mConfigs.emplace(configId, std::move(config));
1101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs()
1104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfigs", mId);
1106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1107aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numConfigs = 0;
1109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId,
1110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numConfigs, nullptr);
1111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
1112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
1113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [1] failed: %s (%d)", mId,
1114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
1115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
1116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_config_t> configIds(numConfigs);
1119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, &numConfigs,
1120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            configIds.data());
1121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
1122aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1123aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Config> configIds;
112467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayConfigs(mId, &configIds);
1125aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
1126aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
1128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId,
1129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
1130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
1131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto configId : configIds) {
1134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        loadConfig(configId);
1135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Layer
1139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::destroyLayer(hwc2_layer_t layerId)
1141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1142aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mDestroyLayer(mDevice.mHwcDevice, mId, layerId);
1144aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1145aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError =mDevice.mComposer->destroyLayer(mId, layerId);
1146aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
1148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
1149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " failed: %s (%d)", mId, layerId, to_string(error).c_str(),
1150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            intError);
1151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.erase(layerId);
1152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods
1155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Layer> Display::getLayerById(hwc2_layer_t id) const
1157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mLayers.count(id) == 0) {
1159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return nullptr;
1160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = mLayers.at(id).lock();
1163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return layer;
1164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods
1167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1168651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id)
1169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
1170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplayId(display->getId()),
1171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDevice(display->getDevice()),
1172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id)
1173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created layer %" PRIu64 " on display %" PRIu64, id,
1175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->getId());
1176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1178651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer()
1179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = mDisplay.lock();
1181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (display) {
1182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->destroyLayer(mId);
1183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1186651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y)
1187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1188aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetCursorPosition(mDevice.mHwcDevice,
1190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, x, y);
1191aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1192aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setCursorPosition(mDisplayId,
1193aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, x, y);
1194aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
119806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Layer::setBuffer(uint32_t slot, buffer_handle_t buffer,
1199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence)
1200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
1202aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
120306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    (void) slot;
1204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerBuffer(mDevice.mHwcDevice, mDisplayId,
1205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, buffer, fenceFd);
1206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1207aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerBuffer(mDisplayId,
120806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            mId, slot, buffer, fenceFd);
1209aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1213651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage)
1214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // We encode default full-screen damage as INVALID_RECT upstream, but as 0
1216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // rects for HWC
1217aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = 0;
1219aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Hwc2::Error intError = Hwc2::Error::NONE;
1221aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) {
1223aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice,
1225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mDisplayId, mId, {0, nullptr});
1226aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1227aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId,
1228cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu                mId, std::vector<Hwc2::IComposerClient::Rect>());
1229aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
1231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        size_t rectCount = 0;
1232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto rectArray = damage.getArray(&rectCount);
1233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::vector<hwc_rect_t> hwcRects;
1236aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1237cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu        std::vector<Hwc2::IComposerClient::Rect> hwcRects;
1238aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        for (size_t rect = 0; rect < rectCount; ++rect) {
1240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
1241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    rectArray[rect].right, rectArray[rect].bottom});
1242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
1243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1244aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc_region_t hwcRegion = {};
1246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRegion.numRects = rectCount;
1247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRegion.rects = hwcRects.data();
1248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice,
1250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mDisplayId, mId, hwcRegion);
1251aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1252aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId,
1253aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu                mId, hwcRects);
1254aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1260651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode)
1261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1262aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intMode = static_cast<int32_t>(mode);
1264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerBlendMode(mDevice.mHwcDevice,
1265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intMode);
1266aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1267cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::BlendMode>(mode);
1268aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerBlendMode(mDisplayId,
1269aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intMode);
1270aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1274651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color)
1275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1276aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerColor(mDevice.mHwcDevice, mDisplayId,
1278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, color);
1279aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1280cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Color hwcColor{color.r, color.g, color.b, color.a};
1281aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerColor(mDisplayId,
1282aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcColor);
1283aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1287651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type)
1288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1289aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intType = static_cast<int32_t>(type);
1291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerCompositionType(mDevice.mHwcDevice,
1292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intType);
1293aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1294cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intType = static_cast<Hwc2::IComposerClient::Composition>(type);
1295aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerCompositionType(mDisplayId,
1296aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intType);
1297aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
13015df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace)
13025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
1303aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
13045df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    auto intDataspace = static_cast<int32_t>(dataspace);
13055df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    int32_t intError = mDevice.mSetLayerDataspace(mDevice.mHwcDevice,
13065df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mDisplayId, mId, intDataspace);
1307aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1308aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intDataspace = static_cast<Hwc2::Dataspace>(dataspace);
1309aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerDataspace(mDisplayId,
1310aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intDataspace);
1311aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
13125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
13135df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
13145df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
1315651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame)
1316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1317aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_rect_t hwcRect{frame.left, frame.top, frame.right, frame.bottom};
1319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerDisplayFrame(mDevice.mHwcDevice,
1320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRect);
1321aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1322cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Rect hwcRect{frame.left, frame.top,
1323aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        frame.right, frame.bottom};
1324aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerDisplayFrame(mDisplayId,
1325aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRect);
1326aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1330651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha)
1331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1332aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerPlaneAlpha(mDevice.mHwcDevice,
1334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, alpha);
1335aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1336aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerPlaneAlpha(mDisplayId,
1337aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, alpha);
1338aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1342651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream)
1343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
134409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    if (!mDevice.hasCapability(Capability::SidebandStream)) {
134509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        ALOGE("Attempted to call setSidebandStream without checking that the "
134609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                "device supports sideband streams");
134709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        return Error::Unsupported;
134809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
1349aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerSidebandStream(mDevice.mHwcDevice,
1351651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, stream);
1352aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1353aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerSidebandStream(mDisplayId,
1354aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, stream);
1355aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1359651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop)
1360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_frect_t hwcRect{crop.left, crop.top, crop.right, crop.bottom};
1363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerSourceCrop(mDevice.mHwcDevice,
1364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRect);
1365aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1366cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::FRect hwcRect{
1367aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        crop.left, crop.top, crop.right, crop.bottom};
1368aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerSourceCrop(mDisplayId,
1369aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRect);
1370aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1374651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform)
1375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1376aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intTransform = static_cast<int32_t>(transform);
1378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerTransform(mDevice.mHwcDevice,
1379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intTransform);
1380aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1381aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intTransform = static_cast<Hwc2::Transform>(transform);
1382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerTransform(mDisplayId,
1383aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intTransform);
1384aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1385651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1386651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1387651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1388651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region)
1389651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    size_t rectCount = 0;
1391651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto rectArray = region.getArray(&rectCount);
1392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1393aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc_rect_t> hwcRects;
1395aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1396cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Rect> hwcRects;
1397aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (size_t rect = 0; rect < rectCount; ++rect) {
1399651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
1400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                rectArray[rect].right, rectArray[rect].bottom});
1401651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1403aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_region_t hwcRegion = {};
1405651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwcRegion.numRects = rectCount;
1406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwcRegion.rects = hwcRects.data();
1407651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerVisibleRegion(mDevice.mHwcDevice,
1409651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRegion);
1410aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1411aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerVisibleRegion(mDisplayId,
1412aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRects);
1413aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1415651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1417651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z)
1418651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1419aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC
1420651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerZOrder(mDevice.mHwcDevice, mDisplayId,
1421651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, z);
1422aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else
1423aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerZOrder(mDisplayId, mId, z);
1424aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif
1425651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1427651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
14282f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Layer::setInfo(uint32_t type, uint32_t appId)
14292f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{
14302f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#ifdef BYPASS_IHWC
14312f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  (void)type;
14322f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  (void)appId;
14332f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  int32_t intError = 0;
14342f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#else
14352f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  auto intError = mDevice.mComposer->setLayerInfo(mDisplayId, mId, type, appId);
14362f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#endif
14372f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  return static_cast<Error>(intError);
14382f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
14392f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
1440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
1441