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