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