• 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 #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