• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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_BACKEND_HDI_DEVICE_H
17 #define HDI_BACKEND_HDI_DEVICE_H
18 
19 #include <vector>
20 #include <refbase.h>
21 #include <unordered_map>
22 
23 #include <sync_fence.h>
24 #include "surface_type.h"
25 #include "hdi_log.h"
26 #include "display_device.h"
27 #include "display_layer.h"
28 
29 namespace OHOS {
30 namespace Rosen {
31 namespace Base {
32 class HdiDevice {
33 public:
34     HdiDevice() = default;
35     virtual ~HdiDevice() = default;
36 
37     /* set & get device screen info begin */
38     virtual int32_t RegHotPlugCallback(HotPlugCallback callback, void *data) = 0;
39     virtual int32_t RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data) = 0;
40     virtual int32_t GetScreenCapability(uint32_t screenId, DisplayCapability &info) = 0;
41     virtual int32_t GetScreenSupportedModes(uint32_t screenId, std::vector<DisplayModeInfo> &modes) = 0;
42     virtual int32_t GetScreenMode(uint32_t screenId, uint32_t &modeId) = 0;
43     virtual int32_t SetScreenMode(uint32_t screenId, uint32_t modeId) = 0;
44     virtual int32_t GetScreenPowerStatus(uint32_t screenId, DispPowerStatus &status) = 0;
45     virtual int32_t SetScreenPowerStatus(uint32_t screenId, DispPowerStatus status) = 0;
46     virtual int32_t GetScreenBacklight(uint32_t screenId, uint32_t &level) = 0;
47     virtual int32_t SetScreenBacklight(uint32_t screenId, uint32_t level) = 0;
48     virtual int32_t PrepareScreenLayers(uint32_t screenId, bool &needFlushFb) = 0;
49     virtual int32_t GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
50                                 std::vector<int32_t> &types) = 0;
51     virtual int32_t SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer,
52                                   const sptr<SyncFence> &fence) = 0;
53     virtual int32_t SetScreenClientDamage(uint32_t screenId, uint32_t num, IRect &damageRect) = 0;
54     virtual int32_t SetScreenVsyncEnabled(uint32_t screenId, bool enabled) = 0;
55     virtual int32_t GetScreenReleaseFence(uint32_t screenId, std::vector<uint32_t> &layersId,
56                                   std::vector<sptr<SyncFence>> &fences) = 0;
57     virtual int32_t GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts) = 0;
58     virtual int32_t SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut) = 0;
59     virtual int32_t GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut) = 0;
60     virtual int32_t SetScreenGamutMap(uint32_t screenId, GamutMap gamutMap) = 0;
61     virtual int32_t GetScreenGamutMap(uint32_t screenId, GamutMap &gamutMap) = 0;
62     virtual int32_t SetScreenColorTransform(uint32_t screenId, const float *matrix) = 0;
63     virtual int32_t GetHDRCapabilityInfos(uint32_t screenId, HDRCapability &info) = 0;
64     virtual int32_t GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys) = 0;
65     virtual int32_t Commit(uint32_t screenId, sptr<SyncFence> &fence) = 0;
66     /* set & get device screen info end */
67 
68     /* set & get device layer info begin */
69     virtual int32_t SetLayerAlpha(uint32_t screenId, uint32_t layerId, GraphicLayerAlpha &alpha) = 0;
70     virtual int32_t SetLayerSize(uint32_t screenId, uint32_t layerId, IRect &layerRect) = 0;
71     virtual int32_t SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type) = 0;
72     virtual int32_t SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId, uint32_t num, IRect &visible) = 0;
73     virtual int32_t SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId, IRect &dirty) = 0;
74     virtual int32_t SetLayerBuffer(uint32_t screenId, uint32_t layerId, const BufferHandle *handle,
75                            const sptr<SyncFence> &acquireFence) = 0;
76     virtual int32_t SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type) = 0;
77     virtual int32_t SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type) = 0;
78     virtual int32_t SetLayerCrop(uint32_t screenId, uint32_t layerId, IRect &crop) = 0;
79     virtual int32_t SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder) = 0;
80     virtual int32_t SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti) = 0;
81     virtual int32_t SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const float *matrix) = 0;
82     virtual int32_t SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace) = 0;
83     virtual int32_t GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace) = 0;
84     virtual int32_t SetLayerMetaData(uint32_t screenId, uint32_t layerId,
85                                      const std::vector<GraphicHDRMetaData> &metaData) = 0;
86     virtual int32_t SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
87                                         const std::vector<uint8_t> &metaData) = 0;
88     virtual int32_t SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle) = 0;
89     virtual int32_t GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
90                                                      GraphicPresentTimestampType &type) = 0;
91     virtual int32_t GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp &timestamp) = 0;
92     /* set & get device layer info end */
93 
94     virtual int32_t CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t &layerId) = 0;
95     virtual int32_t CloseLayer(uint32_t screenId, uint32_t layerId) = 0;
96 
97 private:
98     HdiDevice(const HdiDevice& rhs) = delete;
99     HdiDevice& operator=(const HdiDevice& rhs) = delete;
100     HdiDevice(HdiDevice&& rhs) = delete;
101     HdiDevice& operator=(HdiDevice&& rhs) = delete;
102 };
103 } // namespace Base
104 
105 class HdiDevice : public Base::HdiDevice {
106 public:
107     HdiDevice();
108     virtual ~HdiDevice();
109 
110     static HdiDevice* GetInstance();
111 
112     /* set & get device screen info begin */
113     int32_t RegHotPlugCallback(HotPlugCallback callback, void *data) override;
114     int32_t RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data) override;
115     int32_t GetScreenCapability(uint32_t screenId, DisplayCapability &info) override;
116     int32_t GetScreenSupportedModes(uint32_t screenId, std::vector<DisplayModeInfo> &modes) override;
117     int32_t GetScreenMode(uint32_t screenId, uint32_t &modeId) override;
118     int32_t SetScreenMode(uint32_t screenId, uint32_t modeId) override;
119     int32_t GetScreenPowerStatus(uint32_t screenId, DispPowerStatus &status) override;
120     int32_t SetScreenPowerStatus(uint32_t screenId, DispPowerStatus status) override;
121     int32_t GetScreenBacklight(uint32_t screenId, uint32_t &level) override;
122     int32_t SetScreenBacklight(uint32_t screenId, uint32_t level) override;
123     int32_t PrepareScreenLayers(uint32_t screenId, bool &needFlushFb) override;
124     int32_t GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
125                                 std::vector<int32_t> &types) override;
126     int32_t SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer,
127                                   const sptr<SyncFence> &fence) override;
128     int32_t SetScreenClientDamage(uint32_t screenId, uint32_t num, IRect &damageRect) override;
129     int32_t SetScreenVsyncEnabled(uint32_t screenId, bool enabled) override;
130     int32_t GetScreenReleaseFence(uint32_t screenId, std::vector<uint32_t> &layersId,
131                                   std::vector<sptr<SyncFence>> &fences) override;
132     int32_t GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts) override;
133     int32_t SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut) override;
134     int32_t GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut) override;
135     int32_t SetScreenGamutMap(uint32_t screenId, GamutMap gamutMap) override;
136     int32_t GetScreenGamutMap(uint32_t screenId, GamutMap &gamutMap) override;
137     int32_t SetScreenColorTransform(uint32_t screenId, const float *matrix) override;
138     int32_t GetHDRCapabilityInfos(uint32_t screenId, HDRCapability &info) override;
139     int32_t GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys) override;
140     int32_t Commit(uint32_t screenId, sptr<SyncFence> &fence) override;
141     /* set & get device screen info end */
142 
143     /* set & get device layer info begin */
144     int32_t SetLayerAlpha(uint32_t screenId, uint32_t layerId, GraphicLayerAlpha &alpha) override;
145     int32_t SetLayerSize(uint32_t screenId, uint32_t layerId, IRect &layerRect) override;
146     int32_t SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type) override;
147     int32_t SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId, uint32_t num, IRect &visible) override;
148     int32_t SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId, IRect &dirty) override;
149     int32_t SetLayerBuffer(uint32_t screenId, uint32_t layerId, const BufferHandle *handle,
150                            const sptr<SyncFence> &acquireFence) override;
151     int32_t SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type) override;
152     int32_t SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type) override;
153     int32_t SetLayerCrop(uint32_t screenId, uint32_t layerId, IRect &crop) override;
154     int32_t SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder) override;
155     int32_t SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti) override;
156     int32_t SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const float *matrix) override;
157     int32_t SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace) override;
158     int32_t GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace) override;
159     int32_t SetLayerMetaData(uint32_t screenId, uint32_t layerId,
160                              const std::vector<GraphicHDRMetaData> &metaData) override;
161     int32_t SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
162                                 const std::vector<uint8_t> &metaData) override;
163     int32_t SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle) override;
164     int32_t GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
165                                              GraphicPresentTimestampType &type) override;
166     int32_t GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp &timestamp) override;
167     /* set & get device layer info end */
168 
169     int32_t CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t &layerId) override;
170     int32_t CloseLayer(uint32_t screenId, uint32_t layerId) override;
171     // this is only used in hdidevice_test in unittest
172     void ResetHdiFuncs();
173 
174 private:
175     class CheckPtr {
176     public:
177         template <typename Ptr>
operator()178         bool operator()(const Ptr ptr, const std::string& ptrName)
179         {
180             if (ptrNameCache_.find(ptrName) == ptrNameCache_.end()) {
181                 bool ptrNotNull = (ptr != nullptr);
182                 if (!ptrNotNull) {
183                     HLOGD("can not find hdi func: %{public}s", ptrName.c_str());
184                 }
185                 ptrNameCache_[ptrName] = ptrNotNull;
186             }
187             return ptrNameCache_[ptrName];
188         }
189     private:
190         std::unordered_map<std::string, bool> ptrNameCache_;
191     };
192 
193     HdiDevice(const HdiDevice& rhs) = delete;
194     HdiDevice& operator=(const HdiDevice& rhs) = delete;
195     HdiDevice(HdiDevice&& rhs) = delete;
196     HdiDevice& operator=(HdiDevice&& rhs) = delete;
197 
198     DeviceFuncs *deviceFuncs_ = nullptr;
199     LayerFuncs *layerFuncs_ = nullptr;
200 
201     RosenError Init();
202     void Destroy();
203     CheckPtr checkPtr;
204 };
205 
206 } // namespace Rosen
207 } // namespace OHOS
208 
209 #endif // HDI_BACKEND_HDI_DEVICE_H