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 Stozausing android::Fence;
375a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stozausing android::FloatRect;
38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer;
397d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities;
40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect;
41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region;
42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp;
43aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Return;
44aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Void;
45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
48aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 = android::Hwc2;
49aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
50d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasnamespace {
51d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
52d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasclass ComposerCallbackBridge : public Hwc2::IComposerCallback {
53d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomaspublic:
54d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ComposerCallbackBridge(ComposerCallback* callback, int32_t sequenceId)
55d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            : mCallback(callback), mSequenceId(sequenceId),
56d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas              mHasPrimaryDisplay(false) {}
57d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
58d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    Return<void> onHotplug(Hwc2::Display display,
59d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                           IComposerCallback::Connection conn) override
60d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    {
61d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        HWC2::Connection connection = static_cast<HWC2::Connection>(conn);
62d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        if (!mHasPrimaryDisplay) {
63d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            LOG_ALWAYS_FATAL_IF(connection != HWC2::Connection::Connected,
64d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    "Initial onHotplug callback should be "
65d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    "primary display connected");
66d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mHasPrimaryDisplay = true;
67d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mCallback->onHotplugReceived(mSequenceId, display,
68d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                                         connection, true);
69d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        } else {
70d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mCallback->onHotplugReceived(mSequenceId, display,
71d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                                         connection, false);
72d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        }
73d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return Void();
74d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
75d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
76d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    Return<void> onRefresh(Hwc2::Display display) override
77d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    {
78d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        mCallback->onRefreshReceived(mSequenceId, display);
79d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return Void();
80d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
81d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
82d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override
83d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    {
84d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        mCallback->onVsyncReceived(mSequenceId, display, timestamp);
85d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return Void();
86d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
87d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
88d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    bool HasPrimaryDisplay() { return mHasPrimaryDisplay; }
89d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
90d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasprivate:
91d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ComposerCallback* mCallback;
92d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    int32_t mSequenceId;
93d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    bool mHasPrimaryDisplay;
94d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas};
95d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
96d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} // namespace anonymous
97d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
98d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
10187670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarDevice::Device(bool useVrComposer)
10287670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar  : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)),
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mCapabilities(),
104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDisplays(),
105d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mRegisteredCallback(false)
106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    loadCapabilities();
108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
110d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::registerCallback(ComposerCallback* callback, int32_t sequenceId) {
111d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (mRegisteredCallback) {
112d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        ALOGW("Callback already registered. Ignored extra registration "
113d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                "attempt.");
114d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return;
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
116d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mRegisteredCallback = true;
117d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    sp<ComposerCallbackBridge> callbackBridge(
118d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            new ComposerCallbackBridge(callback, sequenceId));
119d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mComposer->registerCallback(callbackBridge);
120d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(!callbackBridge->HasPrimaryDisplay(),
121d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            "Registered composer callback but didn't get primary display");
122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
128aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->dumpDebugInfo();
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
133aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return mComposer->getMaxVirtualDisplayCount();
134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
136651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height,
137d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        android_pixel_format_t* format, Display** outDisplay)
138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGI("Creating virtual display");
140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t displayId = 0;
142aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intFormat = static_cast<Hwc2::PixelFormat>(*format);
143aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intError = mComposer->createVirtualDisplay(width, height,
14467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &intFormat, &displayId);
145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
150d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto display = std::make_unique<Display>(
151d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            *mComposer.get(), mCapabilities, displayId, DisplayType::Virtual);
152d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    *outDisplay = display.get();
1535cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    *format = static_cast<android_pixel_format_t>(intFormat);
154d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mDisplays.emplace(displayId, std::move(display));
155d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ALOGI("Created virtual display");
156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
159d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::destroyDisplay(hwc2_display_t displayId)
160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
161d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ALOGI("Destroying display %" PRIu64, displayId);
162d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mDisplays.erase(displayId);
163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
165d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::onHotplug(hwc2_display_t displayId, Connection connection) {
166d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (connection == Connection::Connected) {
167d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        auto display = getDisplayById(displayId);
168d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        if (display) {
169d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            if (display->isConnected()) {
170d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                ALOGW("Attempt to hotplug connect display %" PRIu64
171d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                        " , which is already connected.", displayId);
172d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            } else {
173d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                display->setConnected(true);
174d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            }
175d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        } else {
176d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            DisplayType displayType;
177d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            auto intError = mComposer->getDisplayType(displayId,
178d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    reinterpret_cast<Hwc2::IComposerClient::DisplayType *>(
179d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                            &displayType));
180d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            auto error = static_cast<Error>(intError);
181d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            if (error != Error::None) {
182d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d). "
183d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                        "Aborting hotplug attempt.",
184d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                        displayId, to_string(error).c_str(), intError);
185d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                return;
186d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            }
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
188d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            auto newDisplay = std::make_unique<Display>(
189d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    *mComposer.get(), mCapabilities, displayId, displayType);
190d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mDisplays.emplace(displayId, std::move(newDisplay));
191d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        }
192d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    } else if (connection == Connection::Disconnected) {
193d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        // The display will later be destroyed by a call to
194d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        // destroyDisplay(). For now we just mark it disconnected.
195d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        auto display = getDisplayById(displayId);
196d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        if (display) {
197d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            display->setConnected(false);
198d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        } else {
199d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            ALOGW("Attempted to disconnect unknown display %" PRIu64,
200d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                  displayId);
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods
206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
207d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay* Device::getDisplayById(hwc2_display_t id) {
208d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto iter = mDisplays.find(id);
209d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    return iter == mDisplays.end() ? nullptr : iter->second.get();
210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods
213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities()
215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    static_assert(sizeof(Capability) == sizeof(int32_t),
217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            "Capability size has changed");
218aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto capabilities = mComposer->getCapabilities();
219aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto capability : capabilities) {
220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        mCapabilities.emplace(static_cast<Capability>(capability));
221aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
226d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay::Display(android::Hwc2::Composer& composer,
227d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                 const std::unordered_set<Capability>& capabilities,
228d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                 hwc2_display_t id, DisplayType type)
229d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas  : mComposer(composer),
230d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mCapabilities(capabilities),
231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mIsConnected(false),
233d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mType(type)
234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("Created display %" PRIu64, id);
236d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    setConnected(true);
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
239d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay::~Display() {
240d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mLayers.clear();
241d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
242ceb67d1f8f61e15e2c752d15c4077e5194118d1cChris Forbes    if (mType == DisplayType::Virtual) {
243d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        ALOGV("Destroying virtual display");
244d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        auto intError = mComposer.destroyVirtualDisplay(mId);
245d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        auto error = static_cast<Error>(intError);
246d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64
247d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                ") failed: %s (%d)", mId, to_string(error).c_str(), intError);
248d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    } else if (mType == DisplayType::Physical) {
249d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        auto error = setVsyncEnabled(HWC2::Vsync::Disable);
250d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        if (error != Error::None) {
251d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            ALOGE("~Display: Failed to disable vsync for display %" PRIu64
252d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    ": %s (%d)", mId, to_string(error).c_str(),
253d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                    static_cast<int32_t>(error));
254d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        }
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
258651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id)
259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mDisplay(display),
260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mId(id),
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mWidth(-1),
262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mHeight(-1),
263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mVsyncPeriod(-1),
264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiX(-1),
265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mDpiY(-1) {}
266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
267651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id)
268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza  : mConfig(new Config(display, id)) {}
269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() {
271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Default density is based on TVs: 1080p displays get XHIGH density, lower-
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // resolution displays get TV density. Maybe eventually we'll need to update
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // it for 4k displays, though hopefully those will just report accurate DPI
274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // information to begin with. This is also used for virtual displays and
275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // older HWC implementations, so be careful about orientation.
276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight);
278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (longDimension >= 1080) {
279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_XHIGH;
280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return ACONFIGURATION_DENSITY_TV;
282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display
286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
287651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges()
288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
289d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.acceptDisplayChanges(mId);
290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
293d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasError Display::createLayer(Layer** outLayer)
294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
295d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (!outLayer) {
296d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return Error::BadParameter;
297d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t layerId = 0;
299d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.createLayer(mId, &layerId);
300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
305d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto layer = std::make_unique<Layer>(
306d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mComposer, mCapabilities, mId, layerId);
307d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    *outLayer = layer.get();
308d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mLayers.emplace(layerId, std::move(layer));
309d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    return Error::None;
310d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
311d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
312d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasError Display::destroyLayer(Layer* layer)
313d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas{
314d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (!layer) {
315d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        return Error::BadParameter;
316d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
317d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mLayers.erase(layer->getId());
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
321651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig(
322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        std::shared_ptr<const Display::Config>* outConfig) const
323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] getActiveConfig", mId);
325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_config_t configId = 0;
326d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getActiveConfig(mId, &configId);
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
330b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        ALOGE("Unable to get active config for mId:[%" PRIu64 "]", mId);
331b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard        *outConfig = nullptr;
332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mConfigs.count(configId) != 0) {
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = mConfigs.at(configId);
337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId,
339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId);
340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // Return no error, but the caller needs to check for a null pointer to
341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        // detect this case
342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        *outConfig = nullptr;
343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
348651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes(
349d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        std::unordered_map<Layer*, Composition>* outTypes)
350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
351aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
352cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Composition> types;
353d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getChangedCompositionTypes(
354d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mId, &layerIds, &types);
355aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
356aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    error = static_cast<Error>(intError);
358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
359651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
361651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->clear();
363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outTypes->reserve(numElements);
364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
365651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
367651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto type = static_cast<Composition>(types[element]);
368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s",
369651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    layer->getId(), to_string(type).c_str());
370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outTypes->emplace(layer, type);
371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found"
373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " on display %" PRIu64, layerIds[element], mId);
374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::getColorModes(std::vector<android_color_mode_t>* outModes) const
381076ac670262e448c531e6db7727cfade325866caDan Stoza{
382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::ColorMode> modes;
383d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getColorModes(mId, &modes);
384aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numModes = modes.size();
385aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
386076ac670262e448c531e6db7727cfade325866caDan Stoza    if (error != Error::None) {
387076ac670262e448c531e6db7727cfade325866caDan Stoza        return error;
388076ac670262e448c531e6db7727cfade325866caDan Stoza    }
389076ac670262e448c531e6db7727cfade325866caDan Stoza
39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    outModes->resize(numModes);
39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    for (size_t i = 0; i < numModes; i++) {
39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        (*outModes)[i] = static_cast<android_color_mode_t>(modes[i]);
39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
394076ac670262e448c531e6db7727cfade325866caDan Stoza    return Error::None;
395076ac670262e448c531e6db7727cfade325866caDan Stoza}
396076ac670262e448c531e6db7727cfade325866caDan Stoza
397651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const
398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
399651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> configs;
400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (const auto& element : mConfigs) {
401651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        configs.emplace_back(element.second);
402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
403651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return configs;
404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
405651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
406651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const
407651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
408d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getDisplayName(mId, outName);
409aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    return static_cast<Error>(intError);
410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
411651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
412651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
413d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        std::unordered_map<Layer*, LayerRequest>* outLayerRequests)
414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
415aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t intDisplayRequests;
416aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
417aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<uint32_t> layerRequests;
418d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getDisplayRequests(
419d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mId, &intDisplayRequests, &layerIds, &layerRequests);
420aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
421aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
423651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
424651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
425651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests);
427651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->clear();
428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    outLayerRequests->reserve(numElements);
429651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
431651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            auto layerRequest =
433651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    static_cast<LayerRequest>(layerRequests[element]);
434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outLayerRequests->emplace(layer, layerRequest);
435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getRequests: invalid layer %" PRIu64 " found on display %"
437651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    PRIu64, layerIds[element], mId);
438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
439651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
441651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
443651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
444651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const
445651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
446016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    *outType = mType;
447651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
448651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
449651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
450651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const
451651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
452aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    bool intSupport = false;
453d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getDozeSupport(mId, &intSupport);
454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
455651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
456651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
457651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
458651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outSupport = static_cast<bool>(intSupport);
459651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
461651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
4627d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities(
4637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        std::unique_ptr<HdrCapabilities>* outCapabilities) const
4647d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{
4657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    uint32_t numTypes = 0;
4667d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxLuminance = -1.0f;
4677d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float maxAverageLuminance = -1.0f;
4687d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    float minLuminance = -1.0f;
469aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Hdr> intTypes;
470d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getHdrCapabilities(mId, &intTypes,
47167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &maxLuminance, &maxAverageLuminance, &minLuminance);
472aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<HWC2::Error>(intError);
473aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu
474aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int32_t> types;
475aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    for (auto type : intTypes) {
476aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        types.push_back(static_cast<int32_t>(type));
477aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    }
478aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    numTypes = types.size();
4797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    if (error != Error::None) {
4807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza        return error;
4817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    }
4827d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
4837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types),
4847d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            maxLuminance, maxAverageLuminance, minLuminance);
4857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    return Error::None;
4867d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza}
4877d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
488651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences(
489d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        std::unordered_map<Layer*, sp<Fence>>* outFences) const
490651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
491aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Layer> layerIds;
492aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<int> fenceFds;
493d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getReleaseFences(mId, &layerIds, &fenceFds);
494aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
495aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    uint32_t numElements = layerIds.size();
496651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
497651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
498651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
499651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
500d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    std::unordered_map<Layer*, sp<Fence>> releaseFences;
501651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    releaseFences.reserve(numElements);
502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (uint32_t element = 0; element < numElements; ++element) {
503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto layer = getLayerById(layerIds[element]);
504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (layer) {
505651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            sp<Fence> fence(new Fence(fenceFds[element]));
506d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            releaseFences.emplace(layer, fence);
507651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
508651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("getReleaseFences: invalid layer %" PRIu64
509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    " found on display %" PRIu64, layerIds[element], mId);
5105e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu            for (; element < numElements; ++element) {
5115e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu                close(fenceFds[element]);
5125e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu            }
513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return Error::BadLayer;
514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
517651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outFences = std::move(releaseFences);
518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
519651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
520651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
52111d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien SanglardError Display::present(sp<Fence>* outPresentFence)
522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
523847650b5d89a1667f78fa0fa67429377cd3bf37aNaseer Ahmed    int32_t presentFenceFd = -1;
524d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.presentDisplay(mId, &presentFenceFd);
525651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
53011d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard    *outPresentFence = new Fence(presentFenceFd);
531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return Error::None;
532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
534651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config)
535651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (config->getDisplayId() != mId) {
537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("setActiveConfig received config %u for the wrong display %"
538651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                PRIu64 " (expected %" PRIu64 ")", config->getId(),
539651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                config->getDisplayId(), mId);
540651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return Error::BadConfig;
541651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
542d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setActiveConfig(mId, config->getId());
543651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
544651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
545651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
5461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Display::setClientTarget(uint32_t slot, const sp<GraphicBuffer>& target,
547651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence, android_dataspace_t dataspace)
548651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
5495cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza    // TODO: Properly encode client target surface damage
550651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
551d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setClientTarget(mId, slot, target,
55206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu            fenceFd, static_cast<Hwc2::Dataspace>(dataspace),
553cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu            std::vector<Hwc2::IComposerClient::Rect>());
554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
55728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::setColorMode(android_color_mode_t mode)
558076ac670262e448c531e6db7727cfade325866caDan Stoza{
559d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setColorMode(
560d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mId, static_cast<Hwc2::ColorMode>(mode));
561076ac670262e448c531e6db7727cfade325866caDan Stoza    return static_cast<Error>(intError);
562076ac670262e448c531e6db7727cfade325866caDan Stoza}
563076ac670262e448c531e6db7727cfade325866caDan Stoza
5645df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix,
5655df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza        android_color_transform_t hint)
5665df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
567d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setColorTransform(mId,
568aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu            matrix.asArray(), static_cast<Hwc2::ColorTransform>(hint));
5695df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
5705df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
5715df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
572651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer,
573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& releaseFence)
574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = releaseFence->dup();
576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto handle = buffer->getNativeBuffer()->handle;
577d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setOutputBuffer(mId, handle, fenceFd);
57838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    close(fenceFd);
579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
582651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode)
583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
584cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode);
585d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setPowerMode(mId, intMode);
586651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
587651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
588651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
589651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled)
590651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
591cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intEnabled = static_cast<Hwc2::IComposerClient::Vsync>(enabled);
592d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setVsyncEnabled(mId, intEnabled);
593651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
594651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
595651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
596651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests)
597651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
598651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numTypes = 0;
599651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t numRequests = 0;
600d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.validateDisplay(mId, &numTypes, &numRequests);
601651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
602651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None && error != Error::HasChanges) {
603651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return error;
604651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
605651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
606651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumTypes = numTypes;
607651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    *outNumRequests = numRequests;
608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return error;
609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
611249c0ae80a6e5690d091294c4447cb3facafbc37Fabien SanglardError Display::presentOrValidate(uint32_t* outNumTypes, uint32_t* outNumRequests,
612249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard                                 sp<android::Fence>* outPresentFence, uint32_t* state) {
613249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
614249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    uint32_t numTypes = 0;
615249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    uint32_t numRequests = 0;
616249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    int32_t presentFenceFd = -1;
617d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.presentOrValidateDisplay(
618d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mId, &numTypes, &numRequests, &presentFenceFd, state);
619249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    auto error = static_cast<Error>(intError);
620249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (error != Error::None && error != Error::HasChanges) {
621249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        return error;
622249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
623249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
624249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (*state == 1) {
625249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outPresentFence = new Fence(presentFenceFd);
626249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
627249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard
628249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    if (*state == 0) {
629249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outNumTypes = numTypes;
630249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard        *outNumRequests = numRequests;
631249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    }
632249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    return error;
633249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard}
6340c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu
6350c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wuvoid Display::discardCommands()
6360c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu{
637d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mComposer.resetCommands();
6380c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu}
6390c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu
640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device
641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
642d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Display::setConnected(bool connected) {
643d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (!mIsConnected && connected && mType == DisplayType::Physical) {
644d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        mComposer.setClientTargetSlotCount(mId);
645d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        loadConfigs();
646d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    }
647d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mIsConnected = connected;
648d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
649d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute)
651651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t value = 0;
653d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getDisplayAttribute(mId, configId,
65467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            static_cast<Hwc2::IComposerClient::Attribute>(attribute),
65567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu            &value);
656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto error = static_cast<Error>(intError);
657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId,
659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                configId, to_string(attribute).c_str(),
660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return -1;
662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return value;
664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId)
667651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
668651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId);
669651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
670651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto config = Config::Builder(*this, configId)
671651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setWidth(getAttribute(configId, Attribute::Width))
672651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setHeight(getAttribute(configId, Attribute::Height))
673651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod))
674651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiX(getAttribute(configId, Attribute::DpiX))
675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .setDpiY(getAttribute(configId, Attribute::DpiY))
676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            .build();
677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    mConfigs.emplace(configId, std::move(config));
678651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs()
681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ALOGV("[%" PRIu64 "] loadConfigs", mId);
683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
684aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::vector<Hwc2::Config> configIds;
685d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.getDisplayConfigs(mId, &configIds);
686aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto error = static_cast<Error>(intError);
687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (error != Error::None) {
688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId,
689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                to_string(error).c_str(), intError);
690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return;
691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
692651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (auto configId : configIds) {
694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        loadConfig(configId);
695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
698651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods
699651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
700d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasLayer* Display::getLayerById(hwc2_layer_t id) const
701651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
702651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (mLayers.count(id) == 0) {
703651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return nullptr;
704651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
705651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
706d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    return mLayers.at(id).get();
707651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
708651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
709651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods
710651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
711d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasLayer::Layer(android::Hwc2::Composer& composer,
712d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas             const std::unordered_set<Capability>& capabilities,
713d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas             hwc2_display_t displayId, hwc2_layer_t layerId)
714d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas  : mComposer(composer),
715d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mCapabilities(capabilities),
716d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mDisplayId(displayId),
717d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mId(layerId)
718651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
719d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ALOGV("Created layer %" PRIu64 " on display %" PRIu64, layerId, displayId);
720651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
721651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
722651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer()
723651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
724d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.destroyLayer(mDisplayId, mId);
725d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto error = static_cast<Error>(intError);
726d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
727d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            " failed: %s (%d)", mDisplayId, mId, to_string(error).c_str(),
728d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            intError);
729d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (mLayerDestroyedListener) {
730d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        mLayerDestroyedListener(this);
731651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
732651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
733651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
734d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Layer::setLayerDestroyedListener(std::function<void(Layer*)> listener) {
735d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    LOG_ALWAYS_FATAL_IF(mLayerDestroyedListener && listener,
736d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            "Attempt to set layer destroyed listener multiple times");
737d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    mLayerDestroyedListener = listener;
738d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}
739d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas
740651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y)
741651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
742d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setCursorPosition(mDisplayId, mId, x, y);
743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
7461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Layer::setBuffer(uint32_t slot, const sp<GraphicBuffer>& buffer,
747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        const sp<Fence>& acquireFence)
748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t fenceFd = acquireFence->dup();
750d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerBuffer(mDisplayId, mId, slot, buffer,
751d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas                                             fenceFd);
752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
755651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage)
756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // We encode default full-screen damage as INVALID_RECT upstream, but as 0
758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // rects for HWC
759aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    Hwc2::Error intError = Hwc2::Error::NONE;
760651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) {
761d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        intError = mComposer.setLayerSurfaceDamage(mDisplayId,
762cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu                mId, std::vector<Hwc2::IComposerClient::Rect>());
763651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    } else {
764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        size_t rectCount = 0;
765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto rectArray = damage.getArray(&rectCount);
766651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
767cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu        std::vector<Hwc2::IComposerClient::Rect> hwcRects;
768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        for (size_t rect = 0; rect < rectCount; ++rect) {
769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
770651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    rectArray[rect].right, rectArray[rect].bottom});
771651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
773d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas        intError = mComposer.setLayerSurfaceDamage(mDisplayId, mId, hwcRects);
774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
779651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode)
780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
781cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intMode = static_cast<Hwc2::IComposerClient::BlendMode>(mode);
782d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerBlendMode(mDisplayId, mId, intMode);
783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
785651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
786651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color)
787651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
788cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Color hwcColor{color.r, color.g, color.b, color.a};
789d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerColor(mDisplayId, mId, hwcColor);
790651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
791651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
792651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
793651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type)
794651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
795cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    auto intType = static_cast<Hwc2::IComposerClient::Composition>(type);
796d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerCompositionType(
797d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas            mDisplayId, mId, intType);
798651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
8015df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace)
8025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{
803c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter    if (dataspace == mDataSpace) {
804c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter        return Error::None;
805c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter    }
806c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter    mDataSpace = dataspace;
807aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intDataspace = static_cast<Hwc2::Dataspace>(dataspace);
808d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerDataspace(mDisplayId, mId, intDataspace);
8095df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    return static_cast<Error>(intError);
8105df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza}
8115df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza
812651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame)
813651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
814cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::Rect hwcRect{frame.left, frame.top,
815aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        frame.right, frame.bottom};
816d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerDisplayFrame(mDisplayId, mId, hwcRect);
817651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
818651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
819651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
820651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha)
821651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
822d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerPlaneAlpha(mDisplayId, mId, alpha);
823651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
825651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
826651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream)
827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
828d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    if (mCapabilities.count(Capability::SidebandStream) == 0) {
82909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        ALOGE("Attempted to call setSidebandStream without checking that the "
83009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza                "device supports sideband streams");
83109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza        return Error::Unsupported;
83209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    }
833d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerSidebandStream(mDisplayId, mId, stream);
834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
837651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop)
838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
839cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    Hwc2::IComposerClient::FRect hwcRect{
840aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        crop.left, crop.top, crop.right, crop.bottom};
841d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerSourceCrop(mDisplayId, mId, hwcRect);
842651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
843651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
844651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
845651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform)
846651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
847aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    auto intTransform = static_cast<Hwc2::Transform>(transform);
848d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerTransform(mDisplayId, mId, intTransform);
849651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
850651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
851651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
852651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region)
853651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
854651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    size_t rectCount = 0;
855651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    auto rectArray = region.getArray(&rectCount);
856651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
857cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu    std::vector<Hwc2::IComposerClient::Rect> hwcRects;
858651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    for (size_t rect = 0; rect < rectCount; ++rect) {
859651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwcRects.push_back({rectArray[rect].left, rectArray[rect].top,
860651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                rectArray[rect].right, rectArray[rect].bottom});
861651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
862651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
863d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerVisibleRegion(mDisplayId, mId, hwcRects);
864651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
865651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
866651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
867651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z)
868651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
869d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas    auto intError = mComposer.setLayerZOrder(mDisplayId, mId, z);
870651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    return static_cast<Error>(intError);
871651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
872651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
8732f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Layer::setInfo(uint32_t type, uint32_t appId)
8742f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{
875d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas  auto intError = mComposer.setLayerInfo(mDisplayId, mId, type, appId);
8762f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara  return static_cast<Error>(intError);
8772f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara}
8782f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara
879651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
880