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#ifndef ANDROID_SF_HWC2_H
18651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define ANDROID_SF_HWC2_H
19651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
20651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define HWC2_INCLUDE_STRINGIFICATION
21651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define HWC2_USE_CPP11
22651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <hardware/hwcomposer2.h>
23651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef HWC2_INCLUDE_STRINGIFICATION
24651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef HWC2_USE_CPP11
25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
267d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza#include <ui/HdrCapabilities.h>
271d77b719d51a01cbd6954a048fb64e79d50a950eMathias Agopian#include <math/mat4.h>
287d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Log.h>
30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/StrongPointer.h>
31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Timers.h>
32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
33651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <functional>
34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <string>
35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <unordered_map>
369f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza#include <unordered_set>
37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <vector>
38c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan#include <map>
39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace android {
41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Fence;
425a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza    class FloatRect;
43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class GraphicBuffer;
44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Rect;
45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Region;
46aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    namespace Hwc2 {
47aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu        class Composer;
4871bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza    }
49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display;
54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer;
55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, Connection)>
57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        HotplugCallback;
58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>)> RefreshCallback;
59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, nsecs_t)> VsyncCallback;
60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
61339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// C++ Wrapper around hwc2_device_t. Load all functions pointers
62339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// and handle callback registration.
63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Device
64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
6687670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar    // useVrComposer is passed to the composer HAL. When true, the composer HAL
6787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar    // will use the vr composer service, otherwise it uses the real hardware
6887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar    // composer.
6987670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar    Device(bool useVrComposer);
70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Device();
71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Display;
73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Layer;
74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Required by HWC2
76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::string dump() const;
78651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
799f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    const std::unordered_set<Capability>& getCapabilities() const {
80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return mCapabilities;
81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    };
82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t getMaxVirtualDisplayCount() const;
84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Error createVirtualDisplay(uint32_t width, uint32_t height,
855cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza            android_pixel_format_t* format,
86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Display>* outDisplay);
87651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerHotplugCallback(HotplugCallback hotplug);
89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerRefreshCallback(RefreshCallback refresh);
90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerVsyncCallback(VsyncCallback vsync);
91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by callbacks
93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callHotplug(std::shared_ptr<Display> display, Connection connected);
95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callRefresh(std::shared_ptr<Display> display);
96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callVsync(std::shared_ptr<Display> display, nsecs_t timestamp);
97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Other Device methods
99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // This will create a Display if one is not found, but it will not be marked
10138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    // as connected. This Display may be null if the display has been torn down
10238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    // but has not been removed from the map yet.
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::shared_ptr<Display> getDisplayById(hwc2_display_t id);
104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
10509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza    bool hasCapability(HWC2::Capability capability) const;
10609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza
10787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar    android::Hwc2::Composer* getComposer() { return mComposer.get(); }
10887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar
109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Initialization methods
111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadCapabilities();
113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerCallbacks();
114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Display
116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void destroyVirtualDisplay(hwc2_display_t display);
118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Member variables
120aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu    std::unique_ptr<android::Hwc2::Composer> mComposer;
121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
1229f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza    std::unordered_set<Capability> mCapabilities;
12338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza    std::unordered_map<hwc2_display_t, std::weak_ptr<Display>> mDisplays;
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HotplugCallback mHotplug;
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::pair<std::shared_ptr<Display>, Connection>>
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mPendingHotplugs;
128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    RefreshCallback mRefresh;
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<Display>> mPendingRefreshes;
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    VsyncCallback mVsync;
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::pair<std::shared_ptr<Display>, nsecs_t>> mPendingVsyncs;
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
134339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// Convenience C++ class to access hwc2_device_t Display functions directly.
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display : public std::enable_shared_from_this<Display>
136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Display(Device& device, hwc2_display_t id);
139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Display();
140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Device;
142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Layer;
143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Config
145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    {
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    public:
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        class Builder
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        {
149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        public:
150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder(Display& display, hwc2_config_t id);
151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<const Config> build() {
153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return std::const_pointer_cast<const Config>(
154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        std::move(mConfig));
155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setWidth(int32_t width) {
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mWidth = width;
159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setHeight(int32_t height) {
162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mHeight = height;
163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setVsyncPeriod(int32_t vsyncPeriod) {
166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mVsyncPeriod = vsyncPeriod;
167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setDpiX(int32_t dpiX) {
170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                if (dpiX == -1) {
171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiX = getDefaultDensity();
172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                } else {
173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiX = dpiX / 1000.0f;
174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                }
175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setDpiY(int32_t dpiY) {
178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                if (dpiY == -1) {
179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiY = getDefaultDensity();
180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                } else {
181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiY = dpiY / 1000.0f;
182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                }
183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        private:
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            float getDefaultDensity();
188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Config> mConfig;
189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        };
190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_display_t getDisplayId() const { return mDisplay.getId(); }
192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_config_t getId() const { return mId; }
193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t getWidth() const { return mWidth; }
195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t getHeight() const { return mHeight; }
196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        nsecs_t getVsyncPeriod() const { return mVsyncPeriod; }
197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float getDpiX() const { return mDpiX; }
198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float getDpiY() const { return mDpiY; }
199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    private:
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        Config(Display& display, hwc2_config_t id);
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        Display& mDisplay;
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_config_t mId;
205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t mWidth;
207651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t mHeight;
208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        nsecs_t mVsyncPeriod;
209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float mDpiX;
210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float mDpiY;
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    };
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Required by HWC2
214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error acceptChanges();
216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error createLayer(
217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Layer>* outLayer);
218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getActiveConfig(
219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<const Config>* outConfig) const;
220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getChangedCompositionTypes(
221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes);
222076ac670262e448c531e6db7727cfade325866caDan Stoza    [[clang::warn_unused_result]] Error getColorModes(
22328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            std::vector<android_color_mode_t>* outModes) const;
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Doesn't call into the HWC2 device, so no errors are possible
226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> getConfigs() const;
227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getName(std::string* outName) const;
229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getRequests(
230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            DisplayRequest* outDisplayRequests,
231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>, LayerRequest>*
232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    outLayerRequests);
233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getType(DisplayType* outType) const;
234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error supportsDoze(bool* outSupport) const;
2357d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    [[clang::warn_unused_result]] Error getHdrCapabilities(
2367d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            std::unique_ptr<android::HdrCapabilities>* outCapabilities) const;
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getReleaseFences(
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>,
239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    android::sp<android::Fence>>* outFences) const;
240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error present(
24111d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard            android::sp<android::Fence>* outPresentFence);
242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setActiveConfig(
243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const std::shared_ptr<const Config>& config);
244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setClientTarget(
2451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            uint32_t slot, const android::sp<android::GraphicBuffer>& target,
246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& acquireFence,
247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            android_dataspace_t dataspace);
24828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    [[clang::warn_unused_result]] Error setColorMode(android_color_mode_t mode);
2495df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    [[clang::warn_unused_result]] Error setColorTransform(
2505df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            const android::mat4& matrix, android_color_transform_t hint);
251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setOutputBuffer(
252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::GraphicBuffer>& buffer,
253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& releaseFence);
254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setPowerMode(PowerMode mode);
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setVsyncEnabled(Vsync enabled);
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error validate(uint32_t* outNumTypes,
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            uint32_t* outNumRequests);
258249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard    [[clang::warn_unused_result]] Error presentOrValidate(uint32_t* outNumTypes,
259249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard                                                 uint32_t* outNumRequests,
260249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard                                                          android::sp<android::Fence>* outPresentFence, uint32_t* state);
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
262801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu    // Most methods in this class write a command to a command buffer.  The
263801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu    // command buffer is implicitly submitted in validate, present, and
264801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu    // presentOrValidate.  This method provides a way to discard the commands,
265801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu    // which can be used to discard stale commands.
266801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu    void discardCommands();
267801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu
268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Other Display methods
269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& getDevice() const { return mDevice; }
271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t getId() const { return mId; }
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool isConnected() const { return mIsConnected; }
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Device
276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void setConnected(bool connected) { mIsConnected = connected; }
278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t getAttribute(hwc2_config_t configId, Attribute attribute);
279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadConfig(hwc2_config_t configId);
280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadConfigs();
281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Layer
283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void destroyLayer(hwc2_layer_t layerId);
284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // This may fail (and return a null pointer) if no layer with this ID exists
286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // on this display
287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::shared_ptr<Layer> getLayerById(hwc2_layer_t id) const;
288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Member variables
290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& mDevice;
292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t mId;
293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool mIsConnected;
294016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes    DisplayType mType;
295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<hwc2_layer_t, std::weak_ptr<Layer>> mLayers;
296c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan    // The ordering in this map matters, for getConfigs(), when it is
297c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan    // converted to a vector
298c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan    std::map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs;
299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
301339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// Convenience C++ class to access hwc2_device_t Layer functions directly.
302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer
303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id);
306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Layer();
307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool isAbandoned() const { return mDisplay.expired(); }
309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t getId() const { return mId; }
310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setCursorPosition(int32_t x, int32_t y);
31206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu    [[clang::warn_unused_result]] Error setBuffer(uint32_t slot,
3131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara            const android::sp<android::GraphicBuffer>& buffer,
314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& acquireFence);
315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSurfaceDamage(
316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Region& damage);
317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setBlendMode(BlendMode mode);
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setColor(hwc_color_t color);
320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setCompositionType(Composition type);
3215df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza    [[clang::warn_unused_result]] Error setDataspace(
3225df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza            android_dataspace_t dataspace);
323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setDisplayFrame(
324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Rect& frame);
325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setPlaneAlpha(float alpha);
326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSidebandStream(
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const native_handle_t* stream);
328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSourceCrop(
3295a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza            const android::FloatRect& crop);
330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setTransform(Transform transform);
331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setVisibleRegion(
332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Region& region);
333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setZOrder(uint32_t z);
3342f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara    [[clang::warn_unused_result]] Error setInfo(uint32_t type, uint32_t appId);
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::weak_ptr<Display> mDisplay;
338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t mDisplayId;
339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& mDevice;
340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t mId;
341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#endif // ANDROID_SF_HWC2_H
346