HWC2.cpp revision 9f26a9c8be6f00f55cbc30b93adf4895c6a093aa
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"
24651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include "FloatRect.h"
26651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
27651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Fence.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;
76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::FloatRect;
77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer;
787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities;
79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect;
80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region;
81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp;
82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods
86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
87651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::Device(hwc2_device_t* device)
88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mHwcDevice(device),
89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCreateVirtualDisplay(nullptr),
90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDestroyVirtualDisplay(nullptr),
91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(nullptr),
92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetMaxVirtualDisplayCount(nullptr),
93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRegisterCallback(nullptr),
94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mAcceptDisplayChanges(nullptr),
95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCreateLayer(nullptr),
96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDestroyLayer(nullptr),
97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetActiveConfig(nullptr),
98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetChangedCompositionTypes(nullptr),
99076ac670262e448c531e6db7727cfade325866caDan Stoza    mGetColorModes(nullptr),
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayAttribute(nullptr),
101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayConfigs(nullptr),
102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayName(nullptr),
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayRequests(nullptr),
104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDisplayType(nullptr),
105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetDozeSupport(nullptr),
1067d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    mGetHdrCapabilities(nullptr),
107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mGetReleaseFences(nullptr),
108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPresentDisplay(nullptr),
109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetActiveConfig(nullptr),
110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetClientTarget(nullptr),
111076ac670262e448c531e6db7727cfade325866caDan Stoza    mSetColorMode(nullptr),
1125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    mSetColorTransform(nullptr),
113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetOutputBuffer(nullptr),
114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetPowerMode(nullptr),
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetVsyncEnabled(nullptr),
116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mValidateDisplay(nullptr),
117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetCursorPosition(nullptr),
118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerBuffer(nullptr),
119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSurfaceDamage(nullptr),
120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerBlendMode(nullptr),
121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerColor(nullptr),
122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerCompositionType(nullptr),
1235df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    mSetLayerDataspace(nullptr),
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerDisplayFrame(nullptr),
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerPlaneAlpha(nullptr),
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSidebandStream(nullptr),
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerSourceCrop(nullptr),
128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerTransform(nullptr),
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerVisibleRegion(nullptr),
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mSetLayerZOrder(nullptr),
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCapabilities(),
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays(),
133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug(),
134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingHotplugs(),
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh(),
136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingRefreshes(),
137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync(),
138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingVsyncs()
139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadCapabilities();
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadFunctionPointers();
142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallbacks();
143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
145651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::~Device()
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mHwcDevice == nullptr) {
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto element : mDisplays) {
15238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto display = element.second.lock();
15338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        if (!display) {
15438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            ALOGE("~Device: Found a display (%" PRId64 " that has already been"
15538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                    " destroyed", element.first);
15638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            continue;
15738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        }
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        DisplayType displayType = HWC2::DisplayType::Invalid;
160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto error = display->getType(&displayType);
161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (error != Error::None) {
162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("~Device: Failed to determine type of display %" PRIu64
163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    ": %s (%d)", display->getId(), to_string(error).c_str(),
164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<int32_t>(error));
165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            continue;
166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (displayType == HWC2::DisplayType::Physical) {
169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            error = display->setVsyncEnabled(HWC2::Vsync::Disable);
170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            if (error != Error::None) {
171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                ALOGE("~Device: Failed to disable vsync for display %" PRIu64
172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        ": %s (%d)", display->getId(), to_string(error).c_str(),
173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        static_cast<int32_t>(error));
174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_close(mHwcDevice);
179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device
182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const
184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numBytes = 0;
186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(mHwcDevice, &numBytes, nullptr);
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<char> buffer(numBytes);
189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDump(mHwcDevice, &numBytes, buffer.data());
190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return std::string(buffer.data(), buffer.size());
192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const
195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return mGetMaxVirtualDisplayCount(mHwcDevice);
197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
199651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height,
2005cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza        android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay)
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Creating virtual display");
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t displayId = 0;
2055cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    int32_t intFormat = static_cast<int32_t>(*format);
206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height,
2075cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza            &intFormat, &displayId);
208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Created virtual display");
2145cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    *format = static_cast<android_pixel_format_t>(intFormat);
215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplay = getDisplayById(displayId);
21638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    if (!*outDisplay) {
21738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE("Failed to get display by id");
21838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return Error::BadDisplay;
21938628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    }
220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    (*outDisplay)->setVirtual();
221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerHotplugCallback(HotplugCallback hotplug)
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("registerHotplugCallback");
227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug = hotplug;
228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingHotplugs) {
229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto connected = pending.second;
231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("Sending pending hotplug(%" PRIu64 ", %s)", display->getId(),
232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(connected).c_str());
233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerRefreshCallback(RefreshCallback refresh)
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh = refresh;
240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingRefreshes) {
241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(pending));
242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerVsyncCallback(VsyncCallback vsync)
246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync = vsync;
248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingVsyncs) {
249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto timestamp = pending.second;
251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device callbacks
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callHotplug(std::shared_ptr<Display> display, Connection connected)
258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (connected == Connection::Connected) {
260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (!display->isConnected()) {
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->loadConfigs();
262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->setConnected(true);
263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->setConnected(false);
266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDisplays.erase(display->getId());
267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mHotplug) {
270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callHotplug called, but no valid callback registered, storing");
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingHotplugs.emplace_back(std::move(display), connected);
274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callRefresh(std::shared_ptr<Display> display)
278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mRefresh) {
280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(display));
281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callRefresh called, but no valid callback registered, storing");
283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingRefreshes.emplace_back(std::move(display));
284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callVsync(std::shared_ptr<Display> display, nsecs_t timestamp)
288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mVsync) {
290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callVsync called, but no valid callback registered, storing");
293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingVsyncs.emplace_back(std::move(display), timestamp);
294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods
298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Display> Device::getDisplayById(hwc2_display_t id) {
300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mDisplays.count(id) != 0) {
30138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto strongDisplay = mDisplays[id].lock();
30238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE_IF(!strongDisplay, "Display %" PRId64 " is in mDisplays but is no"
30338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                " longer alive", id);
30438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return strongDisplay;
305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = std::make_shared<Display>(*this, id);
308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays.emplace(id, display);
309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return display;
310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods
313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities()
315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static_assert(sizeof(Capability) == sizeof(int32_t),
317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            "Capability size has changed");
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numCapabilities = 0;
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, nullptr);
3209f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    std::vector<Capability> capabilities(numCapabilities);
3219f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    auto asInt = reinterpret_cast<int32_t*>(capabilities.data());
322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, asInt);
3239f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    for (auto capability : capabilities) {
3249f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza        mCapabilities.emplace(capability);
3259f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    }
326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
32809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stozabool Device::hasCapability(HWC2::Capability capability) const
32909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza{
33009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    return std::find(mCapabilities.cbegin(), mCapabilities.cend(),
33109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza            capability) != mCapabilities.cend();
33209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza}
33309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza
334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadFunctionPointers()
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For all of these early returns, we log an error message inside
337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // loadFunctionPointer specifying which function failed to load
338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Display function pointers
3407d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay,
341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mCreateVirtualDisplay)) return;
3427d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay,
343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDestroyVirtualDisplay)) return;
3447d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return;
3457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount,
346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetMaxVirtualDisplayCount)) return;
3477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::RegisterCallback,
348651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mRegisterCallback)) return;
349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Device function pointers
3517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges,
352651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mAcceptDisplayChanges)) return;
3537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::CreateLayer,
354651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mCreateLayer)) return;
3557d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::DestroyLayer,
356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDestroyLayer)) return;
3577d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetActiveConfig,
358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetActiveConfig)) return;
3597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes,
360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetChangedCompositionTypes)) return;
361076ac670262e448c531e6db7727cfade325866caDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetColorModes,
362076ac670262e448c531e6db7727cfade325866caDan Stoza            mGetColorModes)) return;
3637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute,
364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayAttribute)) return;
3657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs,
366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayConfigs)) return;
3677d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayName,
368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayName)) return;
3697d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests,
370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayRequests)) return;
3717d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDisplayType,
372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDisplayType)) return;
3737d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetDozeSupport,
374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetDozeSupport)) return;
3757d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetHdrCapabilities,
3767d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            mGetHdrCapabilities)) return;
3777d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::GetReleaseFences,
378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mGetReleaseFences)) return;
3797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::PresentDisplay,
380651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mPresentDisplay)) return;
3817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetActiveConfig,
382651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetActiveConfig)) return;
3837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget,
384651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetClientTarget)) return;
385076ac670262e448c531e6db7727cfade325866caDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetColorMode,
386076ac670262e448c531e6db7727cfade325866caDan Stoza            mSetColorMode)) return;
3875df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetColorTransform,
3885df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mSetColorTransform)) return;
3897d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer,
390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetOutputBuffer)) return;
3917d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode,
392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetPowerMode)) return;
3937d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled,
394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetVsyncEnabled)) return;
3957d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::ValidateDisplay,
396651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mValidateDisplay)) return;
397651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Layer function pointers
3997d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetCursorPosition,
400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetCursorPosition)) return;
4017d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer,
402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerBuffer)) return;
4037d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage,
404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerSurfaceDamage)) return;
4057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode,
406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerBlendMode)) return;
4077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerColor,
408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerColor)) return;
4097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType,
410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerCompositionType)) return;
4115df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerDataspace,
4125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mSetLayerDataspace)) return;
4137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame,
414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerDisplayFrame)) return;
4157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha,
416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerPlaneAlpha)) return;
41709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    if (hasCapability(Capability::SidebandStream)) {
41809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        if (!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream,
41909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                mSetLayerSidebandStream)) return;
42009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
4217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop,
422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerSourceCrop)) return;
4237d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerTransform,
424651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerTransform)) return;
4257d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion,
426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerVisibleRegion)) return;
4277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder,
428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mSetLayerZOrder)) return;
429651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
431651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerCallbacks()
432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
433651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_HOTPLUG>(Callback::Hotplug, hotplug_hook);
434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_REFRESH>(Callback::Refresh, refresh_hook);
435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallback<HWC2_PFN_VSYNC>(Callback::Vsync, vsync_hook);
436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
437651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
439651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Display
440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
441651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::destroyVirtualDisplay(hwc2_display_t display)
442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
443651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Destroying virtual display");
444651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDestroyVirtualDisplay(mHwcDevice, display);
445651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
446651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 ") failed:"
447651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " %s (%d)", display, to_string(error).c_str(), intError);
44838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    mDisplays.erase(display);
449651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
450651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
451651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods
452651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
453651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Display(Device& device, hwc2_display_t id)
454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDevice(device),
455651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
456651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mIsConnected(false),
457651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mIsVirtual(false)
458651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
459651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created display %" PRIu64, id);
460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
461651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
462651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::~Display()
463651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
464651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Destroyed display %" PRIu64, mId);
465651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mIsVirtual) {
466651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDevice.destroyVirtualDisplay(mId);
467651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
468651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
469651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
470651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id)
471651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
472651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
473651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mWidth(-1),
474651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHeight(-1),
475651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsyncPeriod(-1),
476651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiX(-1),
477651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiY(-1) {}
478651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
479651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id)
480651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mConfig(new Config(display, id)) {}
481651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
482651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() {
483651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Default density is based on TVs: 1080p displays get XHIGH density, lower-
484651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // resolution displays get TV density. Maybe eventually we'll need to update
485651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // it for 4k displays, though hopefully those will just report accurate DPI
486651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // information to begin with. This is also used for virtual displays and
487651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // older HWC implementations, so be careful about orientation.
488651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
489651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight);
490651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (longDimension >= 1080) {
491651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_XHIGH;
492651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
493651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_TV;
494651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
495651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
496651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
497651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display
498651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
499651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges()
500651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
501651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mAcceptDisplayChanges(mDevice.mHwcDevice, mId);
502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
505651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::createLayer(std::shared_ptr<Layer>* outLayer)
506651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
507651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t layerId = 0;
508651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mCreateLayer(mDevice.mHwcDevice, mId, &layerId);
509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
510651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
511651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
512651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = std::make_shared<Layer>(shared_from_this(), layerId);
515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.emplace(layerId, layer);
516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outLayer = std::move(layer);
517651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
519651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
520651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig(
521651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::shared_ptr<const Display::Config>* outConfig) const
522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
523651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] getActiveConfig", mId);
524651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_config_t configId = 0;
525651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetActiveConfig(mDevice.mHwcDevice, mId,
526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &configId);
527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
530651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mConfigs.count(configId) != 0) {
534651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = mConfigs.at(configId);
535651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId,
537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId);
538651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // Return no error, but the caller needs to check for a null pointer to
539651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // detect this case
540651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = nullptr;
541651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
542651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
543651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
544651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
545651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
546651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes(
547651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes)
548651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
549651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
550651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice,
551651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, &numElements, nullptr, nullptr);
552651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
553651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
557651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
558651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> types(numElements);
559651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, mId,
560651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numElements, layerIds.data(), types.data());
561651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
562651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
563651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
564651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
565651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
566651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->clear();
567651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->reserve(numElements);
568651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
569651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
570651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
571651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto type = static_cast<Composition>(types[element]);
572651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s",
573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    layer->getId(), to_string(type).c_str());
574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outTypes->emplace(layer, type);
575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found"
577651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " on display %" PRIu64, layerIds[element], mId);
578651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
582651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
584076ac670262e448c531e6db7727cfade325866caDan StozaError Display::getColorModes(std::vector<int32_t>* outModes) const
585076ac670262e448c531e6db7727cfade325866caDan Stoza{
586076ac670262e448c531e6db7727cfade325866caDan Stoza    uint32_t numModes = 0;
587076ac670262e448c531e6db7727cfade325866caDan Stoza    int32_t intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId,
588076ac670262e448c531e6db7727cfade325866caDan Stoza            &numModes, nullptr);
589076ac670262e448c531e6db7727cfade325866caDan Stoza    auto error = static_cast<Error>(intError);
590076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None)  {
591076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
592076ac670262e448c531e6db7727cfade325866caDan Stoza    }
593076ac670262e448c531e6db7727cfade325866caDan Stoza
594076ac670262e448c531e6db7727cfade325866caDan Stoza    std::vector<int32_t> modes(numModes);
595076ac670262e448c531e6db7727cfade325866caDan Stoza    intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, &numModes,
596076ac670262e448c531e6db7727cfade325866caDan Stoza            modes.data());
597076ac670262e448c531e6db7727cfade325866caDan Stoza    error = static_cast<Error>(intError);
598076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None) {
599076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
600076ac670262e448c531e6db7727cfade325866caDan Stoza    }
601076ac670262e448c531e6db7727cfade325866caDan Stoza
602076ac670262e448c531e6db7727cfade325866caDan Stoza    std::swap(*outModes, modes);
603076ac670262e448c531e6db7727cfade325866caDan Stoza    return Error::None;
604076ac670262e448c531e6db7727cfade325866caDan Stoza}
605076ac670262e448c531e6db7727cfade325866caDan Stoza
606651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const
607651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> configs;
609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (const auto& element : mConfigs) {
610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        configs.emplace_back(element.second);
611651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
612651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return configs;
613651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
614651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
615651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const
616651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
617651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t size;
618651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size,
619651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            nullptr);
620651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
621651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
622651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
623651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
624651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
625651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<char> rawName(size);
626651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size,
627651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            rawName.data());
628651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
629651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
630651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
631651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
632651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
633651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outName = std::string(rawName.cbegin(), rawName.cend());
634651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
635651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
636651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
637651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
638651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, LayerRequest>*
639651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                outLayerRequests)
640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intDisplayRequests = 0;
642651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
643651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId,
644651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intDisplayRequests, &numElements, nullptr, nullptr);
645651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
646651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
647651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
648651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
649651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
651651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> layerRequests(numElements);
652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId,
653651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intDisplayRequests, &numElements, layerIds.data(),
654651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            layerRequests.data());
655651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests);
661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->clear();
662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->reserve(numElements);
663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto layerRequest =
667651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<LayerRequest>(layerRequests[element]);
668651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outLayerRequests->emplace(layer, layerRequest);
669651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
670651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getRequests: invalid layer %" PRIu64 " found on display %"
671651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    PRIu64, layerIds[element], mId);
672651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
673651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
674651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
678651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const
679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intType = 0;
681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayType(mDevice.mHwcDevice, mId,
682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intType);
683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
684651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
685651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
686651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outType = static_cast<DisplayType>(intType);
689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
692651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const
693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intSupport = 0;
695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDozeSupport(mDevice.mHwcDevice, mId,
696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &intSupport);
697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
698651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
699651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
700651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
701651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outSupport = static_cast<bool>(intSupport);
702651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
703651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
704651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
7057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities(
7067d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        std::unique_ptr<HdrCapabilities>* outCapabilities) const
7077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{
7087d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    uint32_t numTypes = 0;
7097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxLuminance = -1.0f;
7107d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxAverageLuminance = -1.0f;
7117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float minLuminance = -1.0f;
7127d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    int32_t intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId,
7137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            &numTypes, nullptr, &maxLuminance, &maxAverageLuminance,
7147d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            &minLuminance);
7157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    auto error = static_cast<HWC2::Error>(intError);
7167d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
7177d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
7187d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
7197d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
7207d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    std::vector<int32_t> types(numTypes);
7217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, &numTypes,
7227d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            types.data(), &maxLuminance, &maxAverageLuminance, &minLuminance);
7237d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    error = static_cast<HWC2::Error>(intError);
7247d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
7257d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
7267d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
7277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
7287d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types),
7297d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            maxLuminance, maxAverageLuminance, minLuminance);
7307d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    return Error::None;
7317d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza}
7327d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
733651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences(
734651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const
735651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
736651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numElements = 0;
737651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId,
738651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numElements, nullptr, nullptr);
739651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
740651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
741651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
742651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_layer_t> layerIds(numElements);
745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<int32_t> fenceFds(numElements);
746651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, &numElements,
747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            layerIds.data(), fenceFds.data());
748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
750651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
751651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<std::shared_ptr<Layer>, sp<Fence>> releaseFences;
754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    releaseFences.reserve(numElements);
755651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            sp<Fence> fence(new Fence(fenceFds[element]));
759651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            releaseFences.emplace(std::move(layer), fence);
760651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
761651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getReleaseFences: invalid layer %" PRIu64
762651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " found on display %" PRIu64, layerIds[element], mId);
763651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return Error::BadLayer;
764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
766651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
767651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outFences = std::move(releaseFences);
768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
770651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
771651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::present(sp<Fence>* outRetireFence)
772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
773651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t retireFenceFd = 0;
774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mPresentDisplay(mDevice.mHwcDevice, mId,
775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &retireFenceFd);
776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
779651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
781651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outRetireFence = new Fence(retireFenceFd);
782651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
785651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config)
786651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
787651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (config->getDisplayId() != mId) {
788651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("setActiveConfig received config %u for the wrong display %"
789651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                PRIu64 " (expected %" PRIu64 ")", config->getId(),
790651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                config->getDisplayId(), mId);
791651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return Error::BadConfig;
792651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
793651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetActiveConfig(mDevice.mHwcDevice, mId,
794651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            config->getId());
795651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
796651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
797651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
798651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setClientTarget(buffer_handle_t target,
799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence, android_dataspace_t dataspace)
800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
8015cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    // TODO: Properly encode client target surface damage
802651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
803651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target,
8045cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza            fenceFd, static_cast<int32_t>(dataspace), {0, nullptr});
805651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
806651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
807651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
808076ac670262e448c531e6db7727cfade325866caDan StozaError Display::setColorMode(int32_t mode)
809076ac670262e448c531e6db7727cfade325866caDan Stoza{
810076ac670262e448c531e6db7727cfade325866caDan Stoza    int32_t intError = mDevice.mSetColorMode(mDevice.mHwcDevice, mId, mode);
811076ac670262e448c531e6db7727cfade325866caDan Stoza    return static_cast<Error>(intError);
812076ac670262e448c531e6db7727cfade325866caDan Stoza}
813076ac670262e448c531e6db7727cfade325866caDan Stoza
8145df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix,
8155df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza        android_color_transform_t hint)
8165df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
8175df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    int32_t intError = mDevice.mSetColorTransform(mDevice.mHwcDevice, mId,
8185df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            matrix.asArray(), static_cast<int32_t>(hint));
8195df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
8205df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
8215df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
822651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer,
823651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& releaseFence)
824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
825651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = releaseFence->dup();
826651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto handle = buffer->getNativeBuffer()->handle;
827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetOutputBuffer(mDevice.mHwcDevice, mId, handle,
828651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            fenceFd);
82938628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    close(fenceFd);
830651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
831651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
832651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
833651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode)
834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intMode = static_cast<int32_t>(mode);
836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetPowerMode(mDevice.mHwcDevice, mId, intMode);
837651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
839651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
840651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled)
841651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
842651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intEnabled = static_cast<int32_t>(enabled);
843651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetVsyncEnabled(mDevice.mHwcDevice, mId,
844651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            intEnabled);
845651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
846651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
847651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
848651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests)
849651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
850651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numTypes = 0;
851651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numRequests = 0;
852651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mValidateDisplay(mDevice.mHwcDevice, mId,
853651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numTypes, &numRequests);
854651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
855651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None && error != Error::HasChanges) {
856651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
857651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
858651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
859651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumTypes = numTypes;
860651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumRequests = numRequests;
861651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return error;
862651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
863651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
864651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device
865651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
866651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute)
867651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
868651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t value = 0;
869651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayAttribute(mDevice.mHwcDevice, mId,
870651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            configId, static_cast<int32_t>(attribute), &value);
871651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
872651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
873651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId,
874651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId, to_string(attribute).c_str(),
875651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
876651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return -1;
877651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
878651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return value;
879651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
880651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
881651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId)
882651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
883651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId);
884651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
885651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto config = Config::Builder(*this, configId)
886651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setWidth(getAttribute(configId, Attribute::Width))
887651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setHeight(getAttribute(configId, Attribute::Height))
888651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod))
889651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiX(getAttribute(configId, Attribute::DpiX))
890651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiY(getAttribute(configId, Attribute::DpiY))
891651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .build();
892651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mConfigs.emplace(configId, std::move(config));
893651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
894651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
895651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs()
896651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
897651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfigs", mId);
898651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
899651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numConfigs = 0;
900651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId,
901651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            &numConfigs, nullptr);
902651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
903651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
904651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [1] failed: %s (%d)", mId,
905651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
906651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
907651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
908651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
909651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc2_config_t> configIds(numConfigs);
910651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, &numConfigs,
911651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            configIds.data());
912651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
913651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
914651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId,
915651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
916651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
917651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
918651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
919651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto configId : configIds) {
920651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        loadConfig(configId);
921651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
922651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
923651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
924651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Layer
925651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
926651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::destroyLayer(hwc2_layer_t layerId)
927651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
928651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mDestroyLayer(mDevice.mHwcDevice, mId, layerId);
929651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
930651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
931651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " failed: %s (%d)", mId, layerId, to_string(error).c_str(),
932651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            intError);
933651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.erase(layerId);
934651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
935651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
936651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods
937651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
938651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Layer> Display::getLayerById(hwc2_layer_t id) const
939651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
940651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mLayers.count(id) == 0) {
941651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return nullptr;
942651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
943651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
944651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = mLayers.at(id).lock();
945651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return layer;
946651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
947651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
948651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods
949651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
950651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id)
951651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
952651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplayId(display->getId()),
953651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDevice(display->getDevice()),
954651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id)
955651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
956651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created layer %" PRIu64 " on display %" PRIu64, id,
957651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->getId());
958651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
959651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
960651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer()
961651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
962651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = mDisplay.lock();
963651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (display) {
964651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->destroyLayer(mId);
965651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
966651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
967651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
968651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y)
969651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
970651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetCursorPosition(mDevice.mHwcDevice,
971651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, x, y);
972651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
973651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
974651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
975651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBuffer(buffer_handle_t buffer,
976651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence)
977651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
978651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
979651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerBuffer(mDevice.mHwcDevice, mDisplayId,
980651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, buffer, fenceFd);
981651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
982651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
983651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
984651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage)
985651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
986651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // We encode default full-screen damage as INVALID_RECT upstream, but as 0
987651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // rects for HWC
988651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = 0;
989651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) {
990651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice,
991651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mDisplayId, mId, {0, nullptr});
992651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
993651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        size_t rectCount = 0;
994651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto rectArray = damage.getArray(&rectCount);
995651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
996651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::vector<hwc_rect_t> hwcRects;
997651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        for (size_t rect = 0; rect < rectCount; ++rect) {
998651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
999651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    rectArray[rect].right, rectArray[rect].bottom});
1000651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
1001651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1002651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc_region_t hwcRegion = {};
1003651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRegion.numRects = rectCount;
1004651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRegion.rects = hwcRects.data();
1005651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1006651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice,
1007651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mDisplayId, mId, hwcRegion);
1008651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1009651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1010651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1011651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1012651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1013651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode)
1014651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1015651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intMode = static_cast<int32_t>(mode);
1016651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerBlendMode(mDevice.mHwcDevice,
1017651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intMode);
1018651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1019651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1020651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1021651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color)
1022651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1023651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerColor(mDevice.mHwcDevice, mDisplayId,
1024651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, color);
1025651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1026651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1027651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1028651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type)
1029651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1030651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intType = static_cast<int32_t>(type);
1031651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerCompositionType(mDevice.mHwcDevice,
1032651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intType);
1033651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1034651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1035651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
10365df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace)
10375df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
10385df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    auto intDataspace = static_cast<int32_t>(dataspace);
10395df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    int32_t intError = mDevice.mSetLayerDataspace(mDevice.mHwcDevice,
10405df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            mDisplayId, mId, intDataspace);
10415df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
10425df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
10435df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
1044651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame)
1045651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1046651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_rect_t hwcRect{frame.left, frame.top, frame.right, frame.bottom};
1047651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerDisplayFrame(mDevice.mHwcDevice,
1048651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRect);
1049651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1050651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1051651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1052651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha)
1053651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1054651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerPlaneAlpha(mDevice.mHwcDevice,
1055651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, alpha);
1056651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1057651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1058651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1059651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream)
1060651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
106109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    if (!mDevice.hasCapability(Capability::SidebandStream)) {
106209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        ALOGE("Attempted to call setSidebandStream without checking that the "
106309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                "device supports sideband streams");
106409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        return Error::Unsupported;
106509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
1066651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerSidebandStream(mDevice.mHwcDevice,
1067651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, stream);
1068651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1069651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1070651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1071651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop)
1072651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1073651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_frect_t hwcRect{crop.left, crop.top, crop.right, crop.bottom};
1074651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerSourceCrop(mDevice.mHwcDevice,
1075651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRect);
1076651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1077651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1078651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1079651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform)
1080651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1081651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto intTransform = static_cast<int32_t>(transform);
1082651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerTransform(mDevice.mHwcDevice,
1083651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, intTransform);
1084651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1085651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1086651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1087651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region)
1088651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1089651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    size_t rectCount = 0;
1090651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto rectArray = region.getArray(&rectCount);
1091651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1092651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<hwc_rect_t> hwcRects;
1093651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (size_t rect = 0; rect < rectCount; ++rect) {
1094651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
1095651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                rectArray[rect].right, rectArray[rect].bottom});
1096651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
1097651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1098651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc_region_t hwcRegion = {};
1099651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwcRegion.numRects = rectCount;
1100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwcRegion.rects = hwcRects.data();
1101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerVisibleRegion(mDevice.mHwcDevice,
1103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mDisplayId, mId, hwcRegion);
1104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1107651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z)
1108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
1109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t intError = mDevice.mSetLayerZOrder(mDevice.mHwcDevice, mDisplayId,
1110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mId, z);
1111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
1112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
1113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
1115