HWC2.cpp revision 0c6ce4608fc022608537162dd919e7f729b9cb77
1651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza/*
2651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Copyright 2015 The Android Open Source Project
3651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
4651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
5651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * you may not use this file except in compliance with the License.
6651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * You may obtain a copy of the License at
7651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
8651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
9651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *
10651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Unless required by applicable law or agreed to in writing, software
11651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
12651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * See the License for the specific language governing permissions and
14651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * limitations under the License.
15651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza */
16651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
17651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// #define LOG_NDEBUG 0
18651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
19651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef LOG_TAG
20651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define LOG_TAG "HWC2"
21651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define ATRACE_TAG ATRACE_TAG_GRAPHICS
22651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
23651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include "HWC2.h"
24aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include "ComposerHal.h"
25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
26651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Fence.h>
275a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza#include <ui/FloatRect.h>
28651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/GraphicBuffer.h>
29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Region.h>
30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <android/configuration.h>
32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
3309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza#include <algorithm>
34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <inttypes.h>
35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
36651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaextern "C" {
37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void hotplug_hook(hwc2_callback_data_t callbackData,
38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId, int32_t intConnected) {
39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto connected = static_cast<HWC2::Connection>(intConnected);
43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callHotplug(std::move(display), connected);
44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Hotplug callback called with unknown display %" PRIu64,
46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
48651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void refresh_hook(hwc2_callback_data_t callbackData,
51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId) {
52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callRefresh(std::move(display));
56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Refresh callback called with unknown display %" PRIu64,
58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
61651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
62651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static void vsync_hook(hwc2_callback_data_t callbackData,
63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwc2_display_t displayId, int64_t timestamp) {
64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto device = static_cast<HWC2::Device*>(callbackData);
65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto display = device->getDisplayById(displayId);
66651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (display) {
67651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            device->callVsync(std::move(display), timestamp);
68651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
69651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Vsync callback called with unknown display %" PRIu64,
70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    displayId);
71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Fence;
765a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stozausing android::FloatRect;
77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer;
787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities;
79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect;
80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region;
81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp;
82aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Return;
83aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Void;
84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
87aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 = android::Hwc2;
88aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods
90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
9187670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarDevice::Device(bool useVrComposer)
9287670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar  : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)),
93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCapabilities(),
94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays(),
95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug(),
96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingHotplugs(),
97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh(),
98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingRefreshes(),
99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync(),
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mPendingVsyncs()
101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadCapabilities();
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    registerCallbacks();
104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
106651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::~Device()
107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto element : mDisplays) {
10938628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto display = element.second.lock();
11038628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        if (!display) {
11138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            ALOGE("~Device: Found a display (%" PRId64 " that has already been"
11238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                    " destroyed", element.first);
11338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza            continue;
11438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        }
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        DisplayType displayType = HWC2::DisplayType::Invalid;
117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto error = display->getType(&displayType);
118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (error != Error::None) {
119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("~Device: Failed to determine type of display %" PRIu64
120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    ": %s (%d)", display->getId(), to_string(error).c_str(),
121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<int32_t>(error));
122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            continue;
123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (displayType == HWC2::DisplayType::Physical) {
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            error = display->setVsyncEnabled(HWC2::Vsync::Disable);
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            if (error != Error::None) {
128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                ALOGE("~Device: Failed to disable vsync for display %" PRIu64
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        ": %s (%d)", display->getId(), to_string(error).c_str(),
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        static_cast<int32_t>(error));
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device
137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const
139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
140aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->dumpDebugInfo();
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const
144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
145aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->getMaxVirtualDisplayCount();
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height,
1495cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza        android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay)
150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Creating virtual display");
152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t displayId = 0;
154aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intFormat = static_cast<Hwc2::PixelFormat>(*format);
155aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mComposer->createVirtualDisplay(width, height,
15667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &intFormat, &displayId);
157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Created virtual display");
1635cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    *format = static_cast<android_pixel_format_t>(intFormat);
164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplay = getDisplayById(displayId);
16538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    if (!*outDisplay) {
16638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE("Failed to get display by id");
16738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return Error::BadDisplay;
16838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    }
169ceb67d1f8f61e15e2c752d15c4077e5194118d1cChris Forbes    (*outDisplay)->setConnected(true);
170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerHotplugCallback(HotplugCallback hotplug)
174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("registerHotplugCallback");
176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHotplug = hotplug;
177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingHotplugs) {
178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto connected = pending.second;
180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("Sending pending hotplug(%" PRIu64 ", %s)", display->getId(),
181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(connected).c_str());
182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerRefreshCallback(RefreshCallback refresh)
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mRefresh = refresh;
189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingRefreshes) {
190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(pending));
191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerVsyncCallback(VsyncCallback vsync)
195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsync = vsync;
197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto& pending : mPendingVsyncs) {
198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto& display = pending.first;
199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto timestamp = pending.second;
200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device callbacks
205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callHotplug(std::shared_ptr<Display> display, Connection connected)
207651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (connected == Connection::Connected) {
209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (!display->isConnected()) {
210cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu            mComposer->setClientTargetSlotCount(display->getId());
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->loadConfigs();
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->setConnected(true);
213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->setConnected(false);
216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDisplays.erase(display->getId());
217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mHotplug) {
220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mHotplug(std::move(display), connected);
221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callHotplug called, but no valid callback registered, storing");
223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingHotplugs.emplace_back(std::move(display), connected);
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callRefresh(std::shared_ptr<Display> display)
228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mRefresh) {
230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRefresh(std::move(display));
231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callRefresh called, but no valid callback registered, storing");
233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingRefreshes.emplace_back(std::move(display));
234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callVsync(std::shared_ptr<Display> display, nsecs_t timestamp)
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mVsync) {
240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mVsync(std::move(display), timestamp);
241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGV("callVsync called, but no valid callback registered, storing");
243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mPendingVsyncs.emplace_back(std::move(display), timestamp);
244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods
248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Display> Device::getDisplayById(hwc2_display_t id) {
250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mDisplays.count(id) != 0) {
25138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        auto strongDisplay = mDisplays[id].lock();
25238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        ALOGE_IF(!strongDisplay, "Display %" PRId64 " is in mDisplays but is no"
25338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza                " longer alive", id);
25438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza        return strongDisplay;
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = std::make_shared<Display>(*this, id);
258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays.emplace(id, display);
259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return display;
260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods
263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities()
265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static_assert(sizeof(Capability) == sizeof(int32_t),
267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            "Capability size has changed");
268aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto capabilities = mComposer->getCapabilities();
269aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto capability : capabilities) {
270aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        mCapabilities.emplace(static_cast<Capability>(capability));
271aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
27409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stozabool Device::hasCapability(HWC2::Capability capability) const
27509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza{
27609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    return std::find(mCapabilities.cbegin(), mCapabilities.cend(),
27709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza            capability) != mCapabilities.cend();
27809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza}
27909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza
280aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace {
281aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuclass ComposerCallback : public Hwc2::IComposerCallback {
282aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wupublic:
283aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    ComposerCallback(Device* device) : mDevice(device) {}
284aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
285aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onHotplug(Hwc2::Display display,
286aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            Connection connected) override
287aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
288aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        hotplug_hook(mDevice, display, static_cast<int32_t>(connected));
289aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
290aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
291aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
292aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onRefresh(Hwc2::Display display) override
293aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
294aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        refresh_hook(mDevice, display);
295aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
296aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
297aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
298aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override
299aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    {
300aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        vsync_hook(mDevice, display, timestamp);
301aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        return Void();
302aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
303aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
304aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuprivate:
305aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Device* mDevice;
306aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu};
307aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace anonymous
308aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerCallbacks()
310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
311aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    sp<ComposerCallback> callback = new ComposerCallback(this);
312aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    mComposer->registerCallback(callback);
313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Display
317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::destroyVirtualDisplay(hwc2_display_t display)
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Destroying virtual display");
321aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mComposer->destroyVirtualDisplay(display);
322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 ") failed:"
324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " %s (%d)", display, to_string(error).c_str(), intError);
32538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    mDisplays.erase(display);
326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods
329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
330651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Display(Device& device, hwc2_display_t id)
331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDevice(device),
332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mIsConnected(false),
334016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    mType(DisplayType::Invalid)
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created display %" PRIu64, id);
337016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes
338016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    auto intError = mDevice.mComposer->getDisplayType(mId,
339016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes            reinterpret_cast<Hwc2::IComposerClient::DisplayType *>(&mType));
340016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    auto error = static_cast<Error>(intError);
341016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    if (error != Error::None) {
342016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes        ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d)",
343016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes              id, to_string(error).c_str(), intError);
344016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    }
345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
347651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::~Display()
348651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Destroyed display %" PRIu64, mId);
350ceb67d1f8f61e15e2c752d15c4077e5194118d1cChris Forbes    if (mType == DisplayType::Virtual) {
351651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mDevice.destroyVirtualDisplay(mId);
352651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
353651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
354651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
355651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id)
356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mWidth(-1),
359651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHeight(-1),
360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsyncPeriod(-1),
361651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiX(-1),
362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiY(-1) {}
363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
364651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id)
365651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mConfig(new Config(display, id)) {}
366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
367651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() {
368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Default density is based on TVs: 1080p displays get XHIGH density, lower-
369651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // resolution displays get TV density. Maybe eventually we'll need to update
370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // it for 4k displays, though hopefully those will just report accurate DPI
371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // information to begin with. This is also used for virtual displays and
372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // older HWC implementations, so be careful about orientation.
373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight);
375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (longDimension >= 1080) {
376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_XHIGH;
377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_TV;
379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
380651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
381651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
382651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display
383651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
384651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges()
385651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
386aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->acceptDisplayChanges(mId);
387651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
388651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
389651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
390651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::createLayer(std::shared_ptr<Layer>* outLayer)
391651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t layerId = 0;
39367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->createLayer(mId, &layerId);
394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
395651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
396651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
397651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
399651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = std::make_shared<Layer>(shared_from_this(), layerId);
400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.emplace(layerId, layer);
401651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outLayer = std::move(layer);
402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
403651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
405651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig(
406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::shared_ptr<const Display::Config>* outConfig) const
407651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] getActiveConfig", mId);
409651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_config_t configId = 0;
41067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getActiveConfig(mId, &configId);
411651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
412651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
413651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
414b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        ALOGE("Unable to get active config for mId:[%" PRIu64 "]", mId);
415b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        *outConfig = nullptr;
416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
417651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
418651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
419651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mConfigs.count(configId) != 0) {
420651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = mConfigs.at(configId);
421651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId,
423651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId);
424651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // Return no error, but the caller needs to check for a null pointer to
425651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // detect this case
426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = nullptr;
427651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
429651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
431651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
432651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes(
433651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes)
434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
435aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
436cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Composition> types;
437aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getChangedCompositionTypes(mId,
43867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &layerIds, &types);
439aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
440aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
441651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
443651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
444651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
445651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
446651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->clear();
447651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->reserve(numElements);
448651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
449651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
450651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
451651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto type = static_cast<Composition>(types[element]);
452651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s",
453651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    layer->getId(), to_string(type).c_str());
454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outTypes->emplace(layer, type);
455651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
456651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found"
457651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " on display %" PRIu64, layerIds[element], mId);
458651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
459651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
461651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
462651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
463651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
46428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::getColorModes(std::vector<android_color_mode_t>* outModes) const
465076ac670262e448c531e6db7727cfade325866caDan Stoza{
466aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::ColorMode> modes;
46767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getColorModes(mId, &modes);
468aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numModes = modes.size();
469aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
470076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None) {
471076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
472076ac670262e448c531e6db7727cfade325866caDan Stoza    }
473076ac670262e448c531e6db7727cfade325866caDan Stoza
47428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    outModes->resize(numModes);
47528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    for (size_t i = 0; i < numModes; i++) {
47628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        (*outModes)[i] = static_cast<android_color_mode_t>(modes[i]);
47728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
478076ac670262e448c531e6db7727cfade325866caDan Stoza    return Error::None;
479076ac670262e448c531e6db7727cfade325866caDan Stoza}
480076ac670262e448c531e6db7727cfade325866caDan Stoza
481651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const
482651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
483651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> configs;
484651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (const auto& element : mConfigs) {
485651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        configs.emplace_back(element.second);
486651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
487651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return configs;
488651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
489651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
490651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const
491651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
49267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayName(mId, outName);
493aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return static_cast<Error>(intError);
494651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
495651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
496651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
497651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, LayerRequest>*
498651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                outLayerRequests)
499651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
500aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t intDisplayRequests;
501aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
502aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<uint32_t> layerRequests;
503aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getDisplayRequests(mId,
50467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &intDisplayRequests, &layerIds, &layerRequests);
505aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
506aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
507651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
508651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
510651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
511651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests);
512651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->clear();
513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->reserve(numElements);
514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
517651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto layerRequest =
518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<LayerRequest>(layerRequests[element]);
519651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outLayerRequests->emplace(layer, layerRequest);
520651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
521651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getRequests: invalid layer %" PRIu64 " found on display %"
522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    PRIu64, layerIds[element], mId);
523651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
524651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
525651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
529651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const
530651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
531016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    *outType = mType;
532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
534651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
535651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const
536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
537aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    bool intSupport = false;
53867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDozeSupport(mId, &intSupport);
539651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
540651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
541651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
542651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
543651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outSupport = static_cast<bool>(intSupport);
544651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
545651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
546651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
5477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities(
5487d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        std::unique_ptr<HdrCapabilities>* outCapabilities) const
5497d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{
5507d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    uint32_t numTypes = 0;
5517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxLuminance = -1.0f;
5527d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxAverageLuminance = -1.0f;
5537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float minLuminance = -1.0f;
554aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Hdr> intTypes;
55567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getHdrCapabilities(mId, &intTypes,
55667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &maxLuminance, &maxAverageLuminance, &minLuminance);
557aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<HWC2::Error>(intError);
558aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
559aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int32_t> types;
560aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto type : intTypes) {
561aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        types.push_back(static_cast<int32_t>(type));
562aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
563aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    numTypes = types.size();
5647d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
5657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
5667d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
5677d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
5687d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types),
5697d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            maxLuminance, maxAverageLuminance, minLuminance);
5707d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    return Error::None;
5717d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza}
5727d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
573651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences(
574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const
575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
576aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
577aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int> fenceFds;
578aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->getReleaseFences(mId,
57967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &layerIds, &fenceFds);
580aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
581aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
582651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
584651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
585651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
586651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<std::shared_ptr<Layer>, sp<Fence>> releaseFences;
587651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    releaseFences.reserve(numElements);
588651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
589651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
590651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
591651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            sp<Fence> fence(new Fence(fenceFds[element]));
592651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            releaseFences.emplace(std::move(layer), fence);
593651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
594651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getReleaseFences: invalid layer %" PRIu64
595651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " found on display %" PRIu64, layerIds[element], mId);
5965e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu            for (; element < numElements; ++element) {
5975e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu                close(fenceFds[element]);
5985e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu            }
599651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return Error::BadLayer;
600651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
601651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
602651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
603651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outFences = std::move(releaseFences);
604651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
605651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
606651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
60711d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien SanglardError Display::present(sp<Fence>* outPresentFence)
608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
609847650b5d89a1667f78fa0fa67429377cd3bf37aNaseer Ahmed    int32_t presentFenceFd = -1;
61067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->presentDisplay(mId, &presentFenceFd);
611651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
612651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
613651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
614651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
615651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
61611d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard    *outPresentFence = new Fence(presentFenceFd);
617651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
618651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
619651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
620651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config)
621651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
622651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (config->getDisplayId() != mId) {
623651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("setActiveConfig received config %u for the wrong display %"
624651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                PRIu64 " (expected %" PRIu64 ")", config->getId(),
625651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                config->getDisplayId(), mId);
626651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return Error::BadConfig;
627651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
628aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setActiveConfig(mId, config->getId());
629651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
630651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
631651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
6321f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Display::setClientTarget(uint32_t slot, const sp<GraphicBuffer>& target,
633651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence, android_dataspace_t dataspace)
634651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
6355cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    // TODO: Properly encode client target surface damage
636651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
63706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    auto intError = mDevice.mComposer->setClientTarget(mId, slot, target,
63806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            fenceFd, static_cast<Hwc2::Dataspace>(dataspace),
639cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu            std::vector<Hwc2::IComposerClient::Rect>());
640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
642651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
64328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::setColorMode(android_color_mode_t mode)
644076ac670262e448c531e6db7727cfade325866caDan Stoza{
645aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setColorMode(mId,
646aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            static_cast<Hwc2::ColorMode>(mode));
647076ac670262e448c531e6db7727cfade325866caDan Stoza    return static_cast<Error>(intError);
648076ac670262e448c531e6db7727cfade325866caDan Stoza}
649076ac670262e448c531e6db7727cfade325866caDan Stoza
6505df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix,
6515df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza        android_color_transform_t hint)
6525df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
653aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setColorTransform(mId,
654aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            matrix.asArray(), static_cast<Hwc2::ColorTransform>(hint));
6555df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
6565df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
6575df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
658651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer,
659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& releaseFence)
660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = releaseFence->dup();
662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto handle = buffer->getNativeBuffer()->handle;
663aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setOutputBuffer(mId, handle, fenceFd);
66438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    close(fenceFd);
665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
667651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
668651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode)
669651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
670cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode);
671aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setPowerMode(mId, intMode);
672651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
673651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
674651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
675651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled)
676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
677cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intEnabled = static_cast<Hwc2::IComposerClient::Vsync>(enabled);
678aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setVsyncEnabled(mId, intEnabled);
679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
682651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests)
683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
684651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numTypes = 0;
685651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numRequests = 0;
686aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->validateDisplay(mId,
68767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &numTypes, &numRequests);
688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None && error != Error::HasChanges) {
690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
692651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumTypes = numTypes;
694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumRequests = numRequests;
695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return error;
696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
698249c0ae80a6e5690d091294c4447cb3facafbc37Fabien SanglardError Display::presentOrValidate(uint32_t* outNumTypes, uint32_t* outNumRequests,
699249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard                                 sp<android::Fence>* outPresentFence, uint32_t* state) {
700249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
701249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    uint32_t numTypes = 0;
702249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    uint32_t numRequests = 0;
703249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    int32_t presentFenceFd = -1;
704249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    auto intError = mDevice.mComposer->presentOrValidateDisplay(mId, &numTypes, &numRequests, &presentFenceFd, state);
705249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    auto error = static_cast<Error>(intError);
706249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (error != Error::None && error != Error::HasChanges) {
707249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        return error;
708249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
709249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
710249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (*state == 1) {
711249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outPresentFence = new Fence(presentFenceFd);
712249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
713249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
714249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (*state == 0) {
715249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outNumTypes = numTypes;
716249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outNumRequests = numRequests;
717249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
718249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    return error;
719249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard}
7200c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu
7210c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wuvoid Display::discardCommands()
7220c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu{
7230c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu    mDevice.mComposer->resetCommands();
7240c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu}
7250c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu
726651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device
727651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
728651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute)
729651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
730651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t value = 0;
73167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayAttribute(mId, configId,
73267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            static_cast<Hwc2::IComposerClient::Attribute>(attribute),
73367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &value);
734651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
735651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
736651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId,
737651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId, to_string(attribute).c_str(),
738651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
739651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return -1;
740651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
741651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return value;
742651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId)
745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
746651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId);
747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto config = Config::Builder(*this, configId)
749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setWidth(getAttribute(configId, Attribute::Width))
750651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setHeight(getAttribute(configId, Attribute::Height))
751651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod))
752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiX(getAttribute(configId, Attribute::DpiX))
753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiY(getAttribute(configId, Attribute::DpiY))
754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .build();
755651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mConfigs.emplace(configId, std::move(config));
756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs()
759651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
760651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfigs", mId);
761651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
762aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Config> configIds;
76367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu    auto intError = mDevice.mComposer->getDisplayConfigs(mId, &configIds);
764aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
766651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId,
767651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
770651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
771651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto configId : configIds) {
772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        loadConfig(configId);
773651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Layer
777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::destroyLayer(hwc2_layer_t layerId)
779651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
780aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError =mDevice.mComposer->destroyLayer(mId, layerId);
781651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
782651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            " failed: %s (%d)", mId, layerId, to_string(error).c_str(),
784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            intError);
785651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mLayers.erase(layerId);
786651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
787651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
788651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods
789651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
790651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Layer> Display::getLayerById(hwc2_layer_t id) const
791651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
792651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mLayers.count(id) == 0) {
793651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return nullptr;
794651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
795651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
796651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto layer = mLayers.at(id).lock();
797651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return layer;
798651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods
801651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
802651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id)
803651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
804651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplayId(display->getId()),
805651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDevice(display->getDevice()),
806651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id)
807651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
808651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created layer %" PRIu64 " on display %" PRIu64, id,
809651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            display->getId());
810651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
811651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
812651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer()
813651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
814651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto display = mDisplay.lock();
815651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (display) {
816651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        display->destroyLayer(mId);
817651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
818651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
819651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
820651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y)
821651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
822aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setCursorPosition(mDisplayId,
823aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, x, y);
824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
825651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
826651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
8271f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Layer::setBuffer(uint32_t slot, const sp<GraphicBuffer>& buffer,
828651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence)
829651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
830651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
831aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerBuffer(mDisplayId,
83206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            mId, slot, buffer, fenceFd);
833651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
836651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage)
837651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // We encode default full-screen damage as INVALID_RECT upstream, but as 0
839651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // rects for HWC
840aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Hwc2::Error intError = Hwc2::Error::NONE;
841651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) {
842aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId,
843cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu                mId, std::vector<Hwc2::IComposerClient::Rect>());
844651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
845651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        size_t rectCount = 0;
846651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto rectArray = damage.getArray(&rectCount);
847651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
848cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu        std::vector<Hwc2::IComposerClient::Rect> hwcRects;
849651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        for (size_t rect = 0; rect < rectCount; ++rect) {
850651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
851651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    rectArray[rect].right, rectArray[rect].bottom});
852651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
853651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
854aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId,
855aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu                mId, hwcRects);
856651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
857651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
858651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
859651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
860651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
861651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode)
862651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
863cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::BlendMode>(mode);
864aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerBlendMode(mDisplayId,
865aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intMode);
866651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
867651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
868651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
869651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color)
870651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
871cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Color hwcColor{color.r, color.g, color.b, color.a};
872aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerColor(mDisplayId,
873aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcColor);
874651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
875651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
876651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
877651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type)
878651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
879cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intType = static_cast<Hwc2::IComposerClient::Composition>(type);
880aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerCompositionType(mDisplayId,
881aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intType);
882651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
883651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
884651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
8855df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace)
8865df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
887aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intDataspace = static_cast<Hwc2::Dataspace>(dataspace);
888aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerDataspace(mDisplayId,
889aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intDataspace);
8905df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
8915df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
8925df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
893651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame)
894651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
895cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Rect hwcRect{frame.left, frame.top,
896aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        frame.right, frame.bottom};
897aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerDisplayFrame(mDisplayId,
898aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRect);
899651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
900651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
901651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
902651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha)
903651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
904aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerPlaneAlpha(mDisplayId,
905aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, alpha);
906651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
907651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
908651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
909651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream)
910651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
91109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    if (!mDevice.hasCapability(Capability::SidebandStream)) {
91209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        ALOGE("Attempted to call setSidebandStream without checking that the "
91309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                "device supports sideband streams");
91409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        return Error::Unsupported;
91509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
916aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerSidebandStream(mDisplayId,
917aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, stream);
918651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
919651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
920651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
921651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop)
922651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
923cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::FRect hwcRect{
924aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        crop.left, crop.top, crop.right, crop.bottom};
925aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerSourceCrop(mDisplayId,
926aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRect);
927651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
928651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
929651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
930651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform)
931651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
932aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intTransform = static_cast<Hwc2::Transform>(transform);
933aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerTransform(mDisplayId,
934aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, intTransform);
935651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
936651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
937651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
938651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region)
939651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
940651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    size_t rectCount = 0;
941651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto rectArray = region.getArray(&rectCount);
942651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
943cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Rect> hwcRects;
944651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (size_t rect = 0; rect < rectCount; ++rect) {
945651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
946651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                rectArray[rect].right, rectArray[rect].bottom});
947651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
948651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
949aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerVisibleRegion(mDisplayId,
950aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            mId, hwcRects);
951651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
952651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
953651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
954651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z)
955651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
956aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mDevice.mComposer->setLayerZOrder(mDisplayId, mId, z);
957651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
958651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
959651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
9602f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Layer::setInfo(uint32_t type, uint32_t appId)
9612f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{
9622f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  auto intError = mDevice.mComposer->setLayerInfo(mDisplayId, mId, type, appId);
9632f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  return static_cast<Error>(intError);
9642f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
9652f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
966651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
967