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