• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <hdi_session.h>
17 #include <cerrno>
18 #include <mutex>
19 #include "common/include/display_common.h"
20 #include "display_log.h"
21 #include "v1_0/display_composer_type.h"
22 #include "hdf_trace.h"
23 #include "hdi_netlink_monitor.h"
24 
25 #define DISPLAY_TRACE HdfTrace trace(__func__, "HDI:DISP:")
26 
27 namespace OHOS {
28 namespace HDI {
29 namespace DISPLAY {
GetInstance()30 HdiSession &HdiSession::GetInstance()
31 {
32     static HdiSession instance;
33     static std::once_flag once;
34     std::call_once(once, [&]() { instance.Init(); });
35     return instance;
36 }
37 
Init()38 void HdiSession::Init()
39 {
40     DISPLAY_LOGD();
41     mHdiDevices = HdiDeviceInterface::DiscoveryDevice();
42     DISPLAY_LOGD("devices size %{public}zd", mHdiDevices.size());
43     mHdiDisplays.clear();
44     for (auto device : mHdiDevices) {
45         auto displays = device->DiscoveryDisplay();
46         /* Register the connectors instead of display device.
47          * There are several connectors in one display device
48          * in rockchip platform.
49          */
50         for (auto display : displays) {
51             mHdiDisplays[display.first] = display.second;
52         }
53     }
54     mNetLinkMonitor = std::make_shared<HdiNetLinkMonitor>();
55     mNetLinkMonitor->Init();
56 }
57 
HandleHotplug(bool plugIn)58 void HdiSession::HandleHotplug(bool plugIn)
59 {
60     for (auto device : mHdiDevices) {
61         for (auto displayMap : mHdiDisplays) {
62             auto display = displayMap.second;
63             auto isSuccess = device->HandleHotplug(display->GetId(), plugIn);
64             if (isSuccess == true) {
65                 DoHotPlugCallback(display->GetId(), plugIn);
66             }
67         }
68     }
69 }
70 
RegHotPlugCallback(HotPlugCallback callback,void * data)71 int32_t HdiSession::RegHotPlugCallback(HotPlugCallback callback, void *data)
72 {
73     DISPLAY_CHK_RETURN((callback == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("the callback is nullptr"));
74     mHotPlugCallBacks.emplace(callback, data);
75     for (auto displayMap : mHdiDisplays) {
76         auto display = displayMap.second;
77         if (display->IsConnected()) {
78             DoHotPlugCallback(display->GetId(), true);
79         }
80     }
81     return DISPLAY_SUCCESS;
82 }
83 
DoHotPlugCallback(uint32_t devId,bool connect)84 void HdiSession::DoHotPlugCallback(uint32_t devId, bool connect)
85 {
86     DISPLAY_LOGD();
87     for (const auto &callback : mHotPlugCallBacks) {
88         callback.first(devId, connect, callback.second);
89     }
90 }
91 } // OHOS
92 } // HDI
93 } // DISPLAY
94 
95 using namespace OHOS::HDI::DISPLAY;
RegHotPlugCallback(HotPlugCallback callback,void * data)96 static int32_t RegHotPlugCallback(HotPlugCallback callback, void *data)
97 {
98     DISPLAY_LOGD();
99     HdiSession::GetInstance().RegHotPlugCallback(callback, data);
100     return DISPLAY_SUCCESS;
101 }
102 
GetDisplayCapability(uint32_t devId,DisplayCapability * info)103 static int32_t GetDisplayCapability(uint32_t devId, DisplayCapability *info)
104 {
105     DISPLAY_LOGD();
106     DISPLAY_CHK_RETURN(info == nullptr, DISPLAY_NULL_PTR, DISPLAY_LOGE("info is nullptr"));
107     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCapability, info);
108 }
109 
GetDisplaySupportedModes(uint32_t devId,uint32_t * num,DisplayModeInfo * modes)110 static int32_t GetDisplaySupportedModes(uint32_t devId, uint32_t *num, DisplayModeInfo *modes)
111 {
112     DISPLAY_LOGD();
113     DISPLAY_CHK_RETURN(num == nullptr, DISPLAY_NULL_PTR, DISPLAY_LOGE("num is nullptr"));
114     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplaySupportedModes, num, modes);
115 }
116 
GetDisplayMode(uint32_t devId,uint32_t * mode)117 static int32_t GetDisplayMode(uint32_t devId, uint32_t *mode)
118 {
119     DISPLAY_LOGD();
120     DISPLAY_CHK_RETURN((mode == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("mode is nullptr"));
121     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayMode, mode);
122 }
123 
SetDisplayMode(uint32_t devId,uint32_t mode)124 static int32_t SetDisplayMode(uint32_t devId, uint32_t mode)
125 {
126     DISPLAY_LOGD();
127     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayMode, mode);
128 }
129 
GetDisplayPowerStatus(uint32_t devId,DispPowerStatus * status)130 static int32_t GetDisplayPowerStatus(uint32_t devId, DispPowerStatus *status)
131 {
132     DISPLAY_LOGD();
133     DISPLAY_CHK_RETURN((status == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("status is nullptr"));
134     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayPowerStatus, status);
135 }
136 
SetDisplayPowerStatus(uint32_t devId,DispPowerStatus status)137 static int32_t SetDisplayPowerStatus(uint32_t devId, DispPowerStatus status)
138 {
139     DISPLAY_LOGD();
140     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayPowerStatus, status);
141 }
142 
GetDisplayBacklight(uint32_t devId,uint32_t * value)143 static int32_t GetDisplayBacklight(uint32_t devId, uint32_t *value)
144 {
145     DISPLAY_LOGD();
146     DISPLAY_CHK_RETURN((value == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("value is nullptr"));
147     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayBacklight, value);
148 }
149 
SetDisplayBacklight(uint32_t devId,uint32_t value)150 static int32_t SetDisplayBacklight(uint32_t devId, uint32_t value)
151 {
152     DISPLAY_LOGD();
153     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayBacklight, value);
154 }
155 
GetDisplayProperty(uint32_t devId,uint32_t id,uint64_t * value)156 static int32_t GetDisplayProperty(uint32_t devId, uint32_t id, uint64_t *value)
157 {
158     DISPLAY_LOGD();
159     (void)id;
160     DISPLAY_CHK_RETURN((value == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("value is nullptr"));
161     return DISPLAY_NOT_SUPPORT;
162 }
163 
SetDisplayProperty(uint32_t devId,uint32_t id,uint64_t value)164 static int32_t SetDisplayProperty(uint32_t devId, uint32_t id, uint64_t value)
165 {
166     DISPLAY_LOGD();
167     (void)id;
168     return DISPLAY_NOT_SUPPORT;
169 }
170 
PrepareDisplayLayers(uint32_t devId,bool * needFlushFb)171 static int32_t PrepareDisplayLayers(uint32_t devId, bool *needFlushFb)
172 {
173     DISPLAY_LOGD();
174     DISPLAY_CHK_RETURN((needFlushFb == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("needFlushFb is nullptr"));
175     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::PrepareDisplayLayers, needFlushFb);
176 }
177 
GetDisplayCompChange(uint32_t devId,uint32_t * num,uint32_t * layers,int32_t * type)178 static int32_t GetDisplayCompChange(uint32_t devId, uint32_t *num, uint32_t *layers, int32_t *type)
179 {
180     DISPLAY_LOGD();
181     DISPLAY_CHK_RETURN((num == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("num is nullptr"));
182     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCompChange, num, layers, type);
183 }
184 
SetDisplayClientCrop(uint32_t devId,IRect * rect)185 static int32_t SetDisplayClientCrop(uint32_t devId, IRect *rect)
186 {
187     DISPLAY_LOGD();
188     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
189     return DISPLAY_NOT_SUPPORT;
190 }
191 
SetDisplayClientDestRect(uint32_t devId,IRect * rect)192 static int32_t SetDisplayClientDestRect(uint32_t devId, IRect *rect)
193 {
194     DISPLAY_LOGD();
195     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
196     return DISPLAY_NOT_SUPPORT;
197 }
198 
SetDisplayClientBuffer(uint32_t devId,const BufferHandle * buffer,int32_t fence)199 static int32_t SetDisplayClientBuffer(uint32_t devId, const BufferHandle *buffer, int32_t fence)
200 {
201     DISPLAY_LOGD();
202     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayClientBuffer, buffer, fence);
203 }
204 
SetDisplayClientDamage(uint32_t devId,uint32_t num,IRect * rect)205 static int32_t SetDisplayClientDamage(uint32_t devId, uint32_t num, IRect *rect)
206 {
207     DISPLAY_LOGD();
208     (void)num;
209     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
210     return DISPLAY_NOT_SUPPORT;
211 }
212 
SetDisplayVsyncEnabled(uint32_t devId,bool enabled)213 static int32_t SetDisplayVsyncEnabled(uint32_t devId, bool enabled)
214 {
215     DISPLAY_LOGD();
216     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayVsyncEnabled, enabled);
217 }
218 
RegDisplayVBlankCallback(uint32_t devId,VBlankCallback callback,void * data)219 static int32_t RegDisplayVBlankCallback(uint32_t devId, VBlankCallback callback, void *data)
220 {
221     DISPLAY_LOGD();
222     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::RegDisplayVBlankCallback, callback, data);
223 }
224 
GetDisplayReleaseFence(uint32_t devId,uint32_t * num,uint32_t * layers,int32_t * fences)225 static int32_t GetDisplayReleaseFence(uint32_t devId, uint32_t *num, uint32_t *layers, int32_t *fences)
226 {
227     DISPLAY_LOGD();
228     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayReleaseFence, num, layers,
229         fences);
230 }
231 
Commit(uint32_t devId,int32_t * fence)232 static int32_t Commit(uint32_t devId, int32_t *fence)
233 {
234     DISPLAY_LOGD();
235     DISPLAY_CHK_RETURN((fence == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("fence is nullptr"));
236     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::Commit, fence);
237 }
238 
CreateVirtualDisplay(uint32_t width,uint32_t height,int32_t * format,uint32_t * devId)239 static int32_t CreateVirtualDisplay(uint32_t width, uint32_t height, int32_t *format, uint32_t *devId)
240 {
241     DISPLAY_LOGD();
242     return DISPLAY_NOT_SUPPORT;
243 }
DestroyVirtualDisplay(uint32_t devId)244 static int32_t DestroyVirtualDisplay(uint32_t devId)
245 {
246     DISPLAY_LOGD();
247     return DISPLAY_NOT_SUPPORT;
248 }
SetVirtualDisplayBuffer(uint32_t devId,BufferHandle * buffer,int32_t releaseFence)249 static int32_t SetVirtualDisplayBuffer(uint32_t devId, BufferHandle *buffer, int32_t releaseFence)
250 {
251     DISPLAY_LOGD();
252     return DISPLAY_NOT_SUPPORT;
253 }
254 
255 
256 // Layer function
CreateLayer(uint32_t devId,const LayerInfo * layerInfo,uint32_t * layerId)257 static int32_t CreateLayer(uint32_t devId, const LayerInfo *layerInfo, uint32_t *layerId)
258 {
259     DISPLAY_LOGD();
260     DISPLAY_CHK_RETURN((layerId == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("layerId is nullptr"));
261     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::CreateLayer, layerInfo, layerId);
262 }
263 
DestroyLayer(uint32_t devId,uint32_t layerId)264 static int32_t DestroyLayer(uint32_t devId, uint32_t layerId)
265 {
266     DISPLAY_LOGD();
267     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::DestroyLayer, layerId);
268 }
269 
SetLayerRegion(uint32_t devId,uint32_t layerId,IRect * rect)270 static int32_t SetLayerRegion(uint32_t devId, uint32_t layerId, IRect *rect)
271 {
272     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
273     DISPLAY_LOGD();
274     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerRegion, rect);
275 }
276 
SetLayerCrop(uint32_t devId,uint32_t layerId,IRect * rect)277 static int32_t SetLayerCrop(uint32_t devId, uint32_t layerId, IRect *rect)
278 {
279     DISPLAY_LOGD();
280     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
281     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCrop, rect);
282 }
283 
SetLayerZorder(uint32_t devId,uint32_t layerId,uint32_t zorder)284 static int32_t SetLayerZorder(uint32_t devId, uint32_t layerId, uint32_t zorder)
285 {
286     DISPLAY_LOGD();
287     return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetLayerZorder, layerId, zorder);
288 }
289 
SetLayerPreMulti(uint32_t devId,uint32_t layerId,bool preMul)290 static int32_t SetLayerPreMulti(uint32_t devId, uint32_t layerId, bool preMul)
291 {
292     DISPLAY_LOGD();
293     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerPreMulti, preMul);
294 }
295 
SetLayerAlpha(uint32_t devId,uint32_t layerId,LayerAlpha * alpha)296 static int32_t SetLayerAlpha(uint32_t devId, uint32_t layerId, LayerAlpha *alpha)
297 {
298     DISPLAY_LOGD();
299     DISPLAY_CHK_RETURN((alpha == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("alpha is nullptr"));
300     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerAlpha, alpha);
301 }
302 
SetLayerTransformMode(uint32_t devId,uint32_t layerId,TransformType type)303 static int32_t SetLayerTransformMode(uint32_t devId, uint32_t layerId, TransformType type)
304 {
305     DISPLAY_LOGD();
306     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerTransformMode, type);
307 }
308 
SetLayerDirtyRegion(uint32_t devId,uint32_t layerId,IRect * region)309 static int32_t SetLayerDirtyRegion(uint32_t devId, uint32_t layerId, IRect *region)
310 {
311     DISPLAY_LOGD();
312     DISPLAY_CHK_RETURN((region == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("region is nullptr"));
313     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerDirtyRegion, region);
314 }
315 
SetLayerVisibleRegion(uint32_t devId,uint32_t layerId,uint32_t num,IRect * rect)316 static int32_t SetLayerVisibleRegion(uint32_t devId, uint32_t layerId, uint32_t num, IRect *rect)
317 {
318     DISPLAY_LOGD();
319     DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr"));
320     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerVisibleRegion, num, rect);
321 }
322 
SetLayerBuffer(uint32_t devId,uint32_t layerId,const BufferHandle * buffer,int32_t fence)323 static int32_t SetLayerBuffer(uint32_t devId, uint32_t layerId, const BufferHandle *buffer, int32_t fence)
324 {
325     DISPLAY_LOGD();
326     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBuffer, buffer, fence);
327 }
328 
SetLayerCompositionType(uint32_t devId,uint32_t layerId,CompositionType type)329 static int32_t SetLayerCompositionType(uint32_t devId, uint32_t layerId, CompositionType type)
330 {
331     DISPLAY_LOGD();
332     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCompositionType, type);
333 }
334 
SetLayerBlendType(uint32_t devId,uint32_t layerId,BlendType type)335 static int32_t SetLayerBlendType(uint32_t devId, uint32_t layerId, BlendType type)
336 {
337     DISPLAY_LOGD();
338     return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBlendType, type);
339 }
340 
341