HWC2.h revision 7d7ae7345abfb91be55c4aed6c9be9d09a144e4c
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>
277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza
28651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Log.h>
29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/StrongPointer.h>
30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Timers.h>
31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <functional>
33651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <string>
34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <unordered_map>
35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <vector>
36651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace android {
38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Fence;
39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class FloatRect;
40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class GraphicBuffer;
41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Rect;
42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Region;
43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}
44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 {
46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display;
48651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer;
49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, Connection)>
51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        HotplugCallback;
52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>)> RefreshCallback;
53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, nsecs_t)> VsyncCallback;
54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Device
56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device(hwc2_device_t* device);
59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Device();
60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
61651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Display;
62651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Layer;
63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Required by HWC2
65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
66651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::string dump() const;
67651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
68651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    const std::vector<Capability>& getCapabilities() const {
69651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        return mCapabilities;
70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    };
71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    uint32_t getMaxVirtualDisplayCount() const;
73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Error createVirtualDisplay(uint32_t width, uint32_t height,
74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Display>* outDisplay);
75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerHotplugCallback(HotplugCallback hotplug);
77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerRefreshCallback(RefreshCallback refresh);
78651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerVsyncCallback(VsyncCallback vsync);
79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by callbacks
81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callHotplug(std::shared_ptr<Display> display, Connection connected);
83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callRefresh(std::shared_ptr<Display> display);
84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void callVsync(std::shared_ptr<Display> display, nsecs_t timestamp);
85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Other Device methods
87651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // This will create a Display if one is not found, but it will not be marked
89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // as connected
90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::shared_ptr<Display> getDisplayById(hwc2_display_t id);
91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Initialization methods
94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    template <typename PFN>
96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] bool loadFunctionPointer(
97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            FunctionDescriptor desc, PFN& outPFN) {
98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto intDesc = static_cast<int32_t>(desc);
99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto pfn = mHwcDevice->getFunction(mHwcDevice, intDesc);
100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        if (pfn != nullptr) {
101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            outPFN = reinterpret_cast<PFN>(pfn);
102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return true;
103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        } else {
104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            ALOGE("Failed to load function %s", to_string(desc).c_str());
105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            return false;
106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        }
107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    template <typename PFN, typename HOOK>
110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerCallback(Callback callback, HOOK hook) {
111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        static_assert(std::is_same<PFN, HOOK>::value,
112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                "Incompatible function pointer");
113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto intCallback = static_cast<int32_t>(callback);
114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto callbackData = static_cast<hwc2_callback_data_t>(this);
115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        auto pfn = reinterpret_cast<hwc2_function_pointer_t>(hook);
116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mRegisterCallback(mHwcDevice, intCallback, callbackData, pfn);
117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadCapabilities();
120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadFunctionPointers();
121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void registerCallbacks();
122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Display
124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void destroyVirtualDisplay(hwc2_display_t display);
126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Member variables
128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_device_t* mHwcDevice;
130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Device function pointers
132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_CREATE_VIRTUAL_DISPLAY mCreateVirtualDisplay;
133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_DESTROY_VIRTUAL_DISPLAY mDestroyVirtualDisplay;
134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_DUMP mDump;
135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT mGetMaxVirtualDisplayCount;
136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_REGISTER_CALLBACK mRegisterCallback;
137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Display function pointers
139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_ACCEPT_DISPLAY_CHANGES mAcceptDisplayChanges;
140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_CREATE_LAYER mCreateLayer;
141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_DESTROY_LAYER mDestroyLayer;
142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_ACTIVE_CONFIG mGetActiveConfig;
143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES mGetChangedCompositionTypes;
144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DISPLAY_ATTRIBUTE mGetDisplayAttribute;
145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DISPLAY_CONFIGS mGetDisplayConfigs;
146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DISPLAY_NAME mGetDisplayName;
147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DISPLAY_REQUESTS mGetDisplayRequests;
148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DISPLAY_TYPE mGetDisplayType;
149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_DOZE_SUPPORT mGetDozeSupport;
1507d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    HWC2_PFN_GET_HDR_CAPABILITIES mGetHdrCapabilities;
151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_GET_RELEASE_FENCES mGetReleaseFences;
152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_PRESENT_DISPLAY mPresentDisplay;
153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_ACTIVE_CONFIG mSetActiveConfig;
154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_CLIENT_TARGET mSetClientTarget;
155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_OUTPUT_BUFFER mSetOutputBuffer;
156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_POWER_MODE mSetPowerMode;
157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_VSYNC_ENABLED mSetVsyncEnabled;
158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_VALIDATE_DISPLAY mValidateDisplay;
159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Layer function pointers
161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_CURSOR_POSITION mSetCursorPosition;
162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_BUFFER mSetLayerBuffer;
163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_SURFACE_DAMAGE mSetLayerSurfaceDamage;
164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_BLEND_MODE mSetLayerBlendMode;
165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_COLOR mSetLayerColor;
166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_COMPOSITION_TYPE mSetLayerCompositionType;
167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_DISPLAY_FRAME mSetLayerDisplayFrame;
168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_PLANE_ALPHA mSetLayerPlaneAlpha;
169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_SIDEBAND_STREAM mSetLayerSidebandStream;
170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_SOURCE_CROP mSetLayerSourceCrop;
171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_TRANSFORM mSetLayerTransform;
172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_VISIBLE_REGION mSetLayerVisibleRegion;
173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HWC2_PFN_SET_LAYER_Z_ORDER mSetLayerZOrder;
174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<Capability> mCapabilities;
176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<hwc2_display_t, std::shared_ptr<Display>> mDisplays;
177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    HotplugCallback mHotplug;
179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::pair<std::shared_ptr<Display>, Connection>>
180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            mPendingHotplugs;
181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    RefreshCallback mRefresh;
182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<Display>> mPendingRefreshes;
183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    VsyncCallback mVsync;
184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::pair<std::shared_ptr<Display>, nsecs_t>> mPendingVsyncs;
185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display : public std::enable_shared_from_this<Display>
188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Display(Device& device, hwc2_display_t id);
191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Display();
192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Device;
194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    friend class HWC2::Layer;
195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    class Config
197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    {
198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    public:
199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        class Builder
200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        {
201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        public:
202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder(Display& display, hwc2_config_t id);
203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<const Config> build() {
205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return std::const_pointer_cast<const Config>(
206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                        std::move(mConfig));
207651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setWidth(int32_t width) {
210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mWidth = width;
211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setHeight(int32_t height) {
214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mHeight = height;
215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setVsyncPeriod(int32_t vsyncPeriod) {
218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                mConfig->mVsyncPeriod = vsyncPeriod;
219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setDpiX(int32_t dpiX) {
222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                if (dpiX == -1) {
223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiX = getDefaultDensity();
224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                } else {
225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiX = dpiX / 1000.0f;
226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                }
227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            Builder& setDpiY(int32_t dpiY) {
230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                if (dpiY == -1) {
231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiY = getDefaultDensity();
232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                } else {
233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    mConfig->mDpiY = dpiY / 1000.0f;
234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                }
235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                return *this;
236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            }
237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        private:
239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            float getDefaultDensity();
240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Config> mConfig;
241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        };
242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_display_t getDisplayId() const { return mDisplay.getId(); }
244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_config_t getId() const { return mId; }
245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t getWidth() const { return mWidth; }
247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t getHeight() const { return mHeight; }
248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        nsecs_t getVsyncPeriod() const { return mVsyncPeriod; }
249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float getDpiX() const { return mDpiX; }
250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float getDpiY() const { return mDpiY; }
251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    private:
253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        Config(Display& display, hwc2_config_t id);
254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        Display& mDisplay;
256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        hwc2_config_t mId;
257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t mWidth;
259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        int32_t mHeight;
260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        nsecs_t mVsyncPeriod;
261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float mDpiX;
262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        float mDpiY;
263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    };
264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Required by HWC2
266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error acceptChanges();
268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error createLayer(
269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<Layer>* outLayer);
270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getActiveConfig(
271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::shared_ptr<const Config>* outConfig) const;
272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getChangedCompositionTypes(
273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes);
274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Doesn't call into the HWC2 device, so no errors are possible
276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::vector<std::shared_ptr<const Config>> getConfigs() const;
277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getName(std::string* outName) const;
279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getRequests(
280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            DisplayRequest* outDisplayRequests,
281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>, LayerRequest>*
282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    outLayerRequests);
283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getType(DisplayType* outType) const;
284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error supportsDoze(bool* outSupport) const;
2857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza    [[clang::warn_unused_result]] Error getHdrCapabilities(
2867d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza            std::unique_ptr<android::HdrCapabilities>* outCapabilities) const;
287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error getReleaseFences(
288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            std::unordered_map<std::shared_ptr<Layer>,
289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza                    android::sp<android::Fence>>* outFences) const;
290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error present(
291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            android::sp<android::Fence>* outRetireFence);
292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setActiveConfig(
293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const std::shared_ptr<const Config>& config);
294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setClientTarget(
295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            buffer_handle_t target,
296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& acquireFence,
297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            android_dataspace_t dataspace);
298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setOutputBuffer(
299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::GraphicBuffer>& buffer,
300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& releaseFence);
301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setPowerMode(PowerMode mode);
302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setVsyncEnabled(Vsync enabled);
303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error validate(uint32_t* outNumTypes,
304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            uint32_t* outNumRequests);
305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Other Display methods
307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& getDevice() const { return mDevice; }
309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t getId() const { return mId; }
310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool isConnected() const { return mIsConnected; }
311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Device
314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Virtual displays are always connected
316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void setVirtual() {
317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mIsVirtual = true;
318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza        mIsConnected = true;
319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    }
320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
321651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void setConnected(bool connected) { mIsConnected = connected; }
322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    int32_t getAttribute(hwc2_config_t configId, Attribute attribute);
323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadConfig(hwc2_config_t configId);
324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void loadConfigs();
325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // For use by Layer
327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    void destroyLayer(hwc2_layer_t layerId);
328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // This may fail (and return a null pointer) if no layer with this ID exists
330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // on this display
331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::shared_ptr<Layer> getLayerById(hwc2_layer_t id) const;
332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    // Member variables
334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& mDevice;
336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t mId;
337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool mIsConnected;
338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool mIsVirtual;
339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<hwc2_layer_t, std::weak_ptr<Layer>> mLayers;
340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::unordered_map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs;
341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer
344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{
345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic:
346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id);
347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    ~Layer();
348651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    bool isAbandoned() const { return mDisplay.expired(); }
350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t getId() const { return mId; }
351651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
352651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setCursorPosition(int32_t x, int32_t y);
353651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setBuffer(buffer_handle_t buffer,
354651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::sp<android::Fence>& acquireFence);
355651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSurfaceDamage(
356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Region& damage);
357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setBlendMode(BlendMode mode);
359651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setColor(hwc_color_t color);
360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setCompositionType(Composition type);
361651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setDisplayFrame(
362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Rect& frame);
363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setPlaneAlpha(float alpha);
364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSidebandStream(
365651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const native_handle_t* stream);
366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setSourceCrop(
367651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::FloatRect& crop);
368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setTransform(Transform transform);
369651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setVisibleRegion(
370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza            const android::Region& region);
371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    [[clang::warn_unused_result]] Error setZOrder(uint32_t z);
372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate:
374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    std::weak_ptr<Display> mDisplay;
375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_display_t mDisplayId;
376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    Device& mDevice;
377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza    hwc2_layer_t mId;
378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza};
379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
380651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2
381651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza
382651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#endif // ANDROID_SF_HWC2_H
383