1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef HDI_DISPLAY_H
17 #define HDI_DISPLAY_H
18 #include <set>
19 #include <unordered_map>
20 #include <unordered_set>
21 #include <memory.h>
22 #include "hdi_composer.h"
23 #include "hdi_layer.h"
24 #include "v1_0/display_composer_type.h"
25 #include "v1_2/include/idisplay_composer_interface.h"
26 
27 namespace OHOS {
28 namespace HDI {
29 namespace DISPLAY {
30 const uint32_t INVALIDE_DISPLAY_ID = 0xffffffff;
31 const uint32_t DISPLAY_TYPE_DRM = (1 << 31);
32 
33 class VsyncCallBack {
34 public:
35     VsyncCallBack(VBlankCallback cb, void *data, uint32_t pipe);
36     virtual void Vsync(unsigned int sequence, uint64_t ns);
~VsyncCallBack()37     virtual ~VsyncCallBack() {}
GetPipe()38     uint32_t GetPipe()
39     {
40         return mPipe;
41     }
42 private:
43     VBlankCallback mVBlankCb;
44     void *mData;
45     uint32_t mPipe;
46 };
47 
48 
49 class HdiDisplay {
50 public:
GetId()51     uint32_t GetId() const
52     {
53         return mId;
54     }
55     virtual int32_t Init();
DeInit()56     virtual void DeInit() {}
HdiDisplay()57     HdiDisplay() {}
58     virtual ~HdiDisplay();
GetDisplayCapability(DisplayCapability * info)59     virtual int32_t GetDisplayCapability(DisplayCapability *info)
60     {
61         return DISPLAY_NOT_SUPPORT;
62     }
GetDisplaySupportedModes(uint32_t * num,DisplayModeInfo * modes)63     virtual int32_t GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes)
64     {
65         return DISPLAY_NOT_SUPPORT;
66     }
GetDisplayMode(uint32_t * modeId)67     virtual int32_t GetDisplayMode(uint32_t *modeId)
68     {
69         return DISPLAY_NOT_SUPPORT;
70     }
SetDisplayMode(uint32_t modeId)71     virtual int32_t SetDisplayMode(uint32_t modeId)
72     {
73         return DISPLAY_NOT_SUPPORT;
74     }
GetDisplayPowerStatus(DispPowerStatus * status)75     virtual int32_t GetDisplayPowerStatus(DispPowerStatus *status)
76     {
77         return DISPLAY_NOT_SUPPORT;
78     }
SetDisplayPowerStatus(DispPowerStatus status)79     virtual int32_t SetDisplayPowerStatus(DispPowerStatus status)
80     {
81         return DISPLAY_NOT_SUPPORT;
82     }
GetDisplayBacklight(uint32_t * value)83     virtual int32_t GetDisplayBacklight(uint32_t *value)
84     {
85         return DISPLAY_NOT_SUPPORT;
86     }
SetDisplayBacklight(uint32_t value)87     virtual int32_t SetDisplayBacklight(uint32_t value)
88     {
89         return DISPLAY_NOT_SUPPORT;
90     }
91     virtual int32_t CreateLayer(const LayerInfo *layerInfo, uint32_t *layerId);
92     virtual int32_t DestroyLayer(uint32_t layerId);
93     virtual int32_t PrepareDisplayLayers(bool *needFlushFb);
94     virtual int32_t Commit(int32_t *fence);
95     virtual int32_t GetDisplayCompChange(uint32_t *num, uint32_t *layers, int32_t *type);
96     virtual int32_t SetLayerZorder(uint32_t layerId, uint32_t zorder);
IsConnected()97     virtual bool IsConnected()
98     {
99         return false;
100     }
RegDisplayVBlankCallback(VBlankCallback cb,void * data)101     virtual int32_t RegDisplayVBlankCallback(VBlankCallback cb, void *data)
102     {
103         return DISPLAY_NOT_SUPPORT;
104     }
SetDisplayVsyncEnabled(bool enabled)105     virtual int32_t SetDisplayVsyncEnabled(bool enabled)
106     {
107         return DISPLAY_NOT_SUPPORT;
108     }
109     virtual int32_t GetDisplayReleaseFence(uint32_t *num, uint32_t *layers, int32_t *fences);
110     virtual int32_t SetDisplayClientBuffer(const BufferHandle *buffer, int32_t fence);
WaitForVBlank(uint64_t * ns)111     virtual int32_t WaitForVBlank(uint64_t *ns)
112     {
113         return DISPLAY_NOT_SUPPORT;
114     }
115     HdiLayer *GetHdiLayer(uint32_t id);
116 
117 protected:
118     virtual std::unique_ptr<HdiLayer> CreateHdiLayer(LayerType type);
119     std::unique_ptr<HdiComposer> mComposer;
120 
121     static uint32_t GetIdleId();
122     static uint32_t mIdleId;
123     static std::unordered_set<uint32_t> mIdSets;
124     uint32_t mId = INVALIDE_DISPLAY_ID;
125     std::unordered_map<uint32_t, std::unique_ptr<HdiLayer>> mLayersMap;
126     std::multiset<HdiLayer *, SortLayersByZ> mLayers;
127     std::unique_ptr<HdiLayer> mClientLayer;
128     std::vector<HdiLayer *> mChangeLayers;
129 };
130 } // namespace OHOS
131 } // namespace HDI
132 } // namespace DISPLAY
133 
134 #endif // HDI_DISPLAY_H
135