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