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