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