1 /*
2 * Copyright (c) 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 "display_composer_vdi_impl.h"
17 #include <hdf_base.h>
18 #include "display_log.h"
19 #include "hdf_log.h"
20
21 namespace OHOS {
22 namespace HDI {
23 namespace DISPLAY {
DisplayComposerVdiImpl()24 DisplayComposerVdiImpl::DisplayComposerVdiImpl()
25 {
26 }
27
~DisplayComposerVdiImpl()28 DisplayComposerVdiImpl::~DisplayComposerVdiImpl()
29 {
30 }
31
RegHotPlugCallback(HotPlugCallback cb,void * data)32 int32_t DisplayComposerVdiImpl::RegHotPlugCallback(HotPlugCallback cb, void* data)
33 {
34 HdiSession::GetInstance().RegHotPlugCallback(cb, data);
35 return HDF_SUCCESS;
36 }
37
GetDisplayCapability(uint32_t devId,DisplayCapability & info)38 int32_t DisplayComposerVdiImpl::GetDisplayCapability(uint32_t devId, DisplayCapability& info)
39 {
40 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCapability, &info);
41 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
42 return HDF_SUCCESS;
43 }
44
GetDisplaySupportedModes(uint32_t devId,std::vector<DisplayModeInfo> & modes)45 int32_t DisplayComposerVdiImpl::GetDisplaySupportedModes(uint32_t devId, std::vector<DisplayModeInfo>& modes)
46 {
47 DisplayModeInfo* placeHoler = nullptr;
48 uint32_t num = 0;
49 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplaySupportedModes,
50 &num, placeHoler);
51 if (ec != DISPLAY_SUCCESS) {
52 DISPLAY_LOGE("failed, ec=%{public}d", ec);
53 return HDF_FAILURE;
54 }
55 if (num != 0) {
56 modes.resize(num);
57 ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplaySupportedModes, &num,
58 modes.data());
59 }
60 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
61 return HDF_SUCCESS;
62 }
63
GetDisplayMode(uint32_t devId,uint32_t & modeId)64 int32_t DisplayComposerVdiImpl::GetDisplayMode(uint32_t devId, uint32_t& modeId)
65 {
66 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayMode, &modeId);
67 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
68 return HDF_SUCCESS;
69 }
70
SetDisplayMode(uint32_t devId,uint32_t modeId)71 int32_t DisplayComposerVdiImpl::SetDisplayMode(uint32_t devId, uint32_t modeId)
72 {
73 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayMode, modeId);
74 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
75 return HDF_SUCCESS;
76 }
77
GetDisplayPowerStatus(uint32_t devId,DispPowerStatus & status)78 int32_t DisplayComposerVdiImpl::GetDisplayPowerStatus(uint32_t devId, DispPowerStatus& status)
79 {
80 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayPowerStatus, &status);
81 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
82 return HDF_SUCCESS;
83 }
84
SetDisplayPowerStatus(uint32_t devId,DispPowerStatus status)85 int32_t DisplayComposerVdiImpl::SetDisplayPowerStatus(uint32_t devId, DispPowerStatus status)
86 {
87 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayPowerStatus, status);
88 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
89 return HDF_SUCCESS;
90 }
91
GetDisplayBacklight(uint32_t devId,uint32_t & level)92 int32_t DisplayComposerVdiImpl::GetDisplayBacklight(uint32_t devId, uint32_t& level)
93 {
94 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayBacklight, &level);
95 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
96 return HDF_SUCCESS;
97 }
98
SetDisplayBacklight(uint32_t devId,uint32_t level)99 int32_t DisplayComposerVdiImpl::SetDisplayBacklight(uint32_t devId, uint32_t level)
100 {
101 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayBacklight, level);
102 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
103 return HDF_SUCCESS;
104 }
105
GetDisplayProperty(uint32_t devId,uint32_t id,uint64_t & value)106 int32_t DisplayComposerVdiImpl::GetDisplayProperty(uint32_t devId, uint32_t id, uint64_t& value)
107 {
108 DISPLAY_LOGE("%s is not supported", __func__);
109 return HDF_ERR_NOT_SUPPORT;
110 }
111
GetDisplayCompChange(uint32_t devId,std::vector<uint32_t> & layers,std::vector<int32_t> & types)112 int32_t DisplayComposerVdiImpl::GetDisplayCompChange(uint32_t devId, std::vector<uint32_t>& layers,
113 std::vector<int32_t>& types)
114 {
115 uint32_t* layersHoler = nullptr;
116 int32_t* typesHoler = nullptr;
117 uint32_t num = 0;
118 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCompChange, &num,
119 layersHoler, typesHoler);
120 if (ec == HDF_SUCCESS && num != 0) {
121 layers.resize(num);
122 types.resize(num);
123 ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCompChange, &num,
124 layers.data(), types.data());
125 }
126 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
127 return HDF_SUCCESS;
128 }
129
SetDisplayClientCrop(uint32_t devId,const IRect & rect)130 int32_t DisplayComposerVdiImpl::SetDisplayClientCrop(uint32_t devId, const IRect& rect)
131 {
132 DISPLAY_LOGE("%s is not supported", __func__);
133 return HDF_ERR_NOT_SUPPORT;
134 }
135
SetDisplayClientBuffer(uint32_t devId,const BufferHandle & buffer,int32_t fence)136 int32_t DisplayComposerVdiImpl::SetDisplayClientBuffer(uint32_t devId, const BufferHandle& buffer, int32_t fence)
137 {
138 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayClientBuffer, &buffer,
139 fence);
140 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
141 return HDF_SUCCESS;
142 }
143
SetDisplayClientDamage(uint32_t devId,std::vector<IRect> & rects)144 int32_t DisplayComposerVdiImpl::SetDisplayClientDamage(uint32_t devId, std::vector<IRect>& rects)
145 {
146 DISPLAY_LOGE("%s is not supported", __func__);
147 return HDF_ERR_NOT_SUPPORT;
148 }
149
SetDisplayVsyncEnabled(uint32_t devId,bool enabled)150 int32_t DisplayComposerVdiImpl::SetDisplayVsyncEnabled(uint32_t devId, bool enabled)
151 {
152 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayVsyncEnabled, enabled);
153 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
154 return HDF_SUCCESS;
155 }
156
RegDisplayVBlankCallback(uint32_t devId,VBlankCallback cb,void * data)157 int32_t DisplayComposerVdiImpl::RegDisplayVBlankCallback(uint32_t devId, VBlankCallback cb, void* data)
158 {
159 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::RegDisplayVBlankCallback, cb, data);
160 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
161 return HDF_SUCCESS;
162 }
163
GetDisplayReleaseFence(uint32_t devId,std::vector<uint32_t> & layers,std::vector<int32_t> & fences)164 int32_t DisplayComposerVdiImpl::GetDisplayReleaseFence(uint32_t devId, std::vector<uint32_t>& layers,
165 std::vector<int32_t>& fences)
166 {
167 uint32_t* layersHoler = nullptr;
168 int32_t* typesHoler = nullptr;
169 uint32_t num = 0;
170 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayReleaseFence, &num,
171 layersHoler, typesHoler);
172 if (ec == HDF_SUCCESS && num != 0) {
173 layers.resize(num);
174 fences.resize(num);
175 ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayReleaseFence, &num,
176 layers.data(), fences.data());
177 }
178 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
179 return HDF_SUCCESS;
180 }
181
CreateVirtualDisplay(uint32_t width,uint32_t height,int32_t & format,uint32_t & devId)182 int32_t DisplayComposerVdiImpl::CreateVirtualDisplay(uint32_t width, uint32_t height, int32_t& format, uint32_t& devId)
183 {
184 DISPLAY_LOGE("%s is not supported", __func__);
185 return HDF_ERR_NOT_SUPPORT;
186 }
187
DestroyVirtualDisplay(uint32_t devId)188 int32_t DisplayComposerVdiImpl::DestroyVirtualDisplay(uint32_t devId)
189 {
190 DISPLAY_LOGE("%s is not supported", __func__);
191 return HDF_ERR_NOT_SUPPORT;
192 }
193
SetVirtualDisplayBuffer(uint32_t devId,const BufferHandle & buffer,const int32_t fence)194 int32_t DisplayComposerVdiImpl::SetVirtualDisplayBuffer(uint32_t devId, const BufferHandle& buffer, const int32_t fence)
195 {
196 DISPLAY_LOGE("%s is not supported", __func__);
197 return HDF_ERR_NOT_SUPPORT;
198 }
199
SetDisplayProperty(uint32_t devId,uint32_t id,uint64_t value)200 int32_t DisplayComposerVdiImpl::SetDisplayProperty(uint32_t devId, uint32_t id, uint64_t value)
201 {
202 DISPLAY_LOGE("%s is not supported", __func__);
203 return HDF_ERR_NOT_SUPPORT;
204 }
205
Commit(uint32_t devId,int32_t & fence)206 int32_t DisplayComposerVdiImpl::Commit(uint32_t devId, int32_t& fence)
207 {
208 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::Commit, &fence);
209 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
210 return HDF_SUCCESS;
211 }
212
CreateLayer(uint32_t devId,const LayerInfo & layerInfo,uint32_t & layerId)213 int32_t DisplayComposerVdiImpl::CreateLayer(uint32_t devId, const LayerInfo& layerInfo, uint32_t& layerId)
214 {
215 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::CreateLayer, &layerInfo, &layerId);
216 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
217 return HDF_SUCCESS;
218 }
219
DestroyLayer(uint32_t devId,uint32_t layerId)220 int32_t DisplayComposerVdiImpl::DestroyLayer(uint32_t devId, uint32_t layerId)
221 {
222 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::DestroyLayer, layerId);
223 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
224 return HDF_SUCCESS;
225 }
226
PrepareDisplayLayers(uint32_t devId,bool & needFlushFb)227 int32_t DisplayComposerVdiImpl::PrepareDisplayLayers(uint32_t devId, bool& needFlushFb)
228 {
229 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::PrepareDisplayLayers, &needFlushFb);
230 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
231 return HDF_SUCCESS;
232 }
233
SetLayerAlpha(uint32_t devId,uint32_t layerId,const LayerAlpha & alpha)234 int32_t DisplayComposerVdiImpl::SetLayerAlpha(uint32_t devId, uint32_t layerId, const LayerAlpha& alpha)
235 {
236 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerAlpha,
237 const_cast<LayerAlpha*>(&alpha));
238 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
239 return HDF_SUCCESS;
240 }
241
SetLayerRegion(uint32_t devId,uint32_t layerId,const IRect & rect)242 int32_t DisplayComposerVdiImpl::SetLayerRegion(uint32_t devId, uint32_t layerId, const IRect& rect)
243 {
244 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerRegion,
245 const_cast<IRect*>(&rect));
246 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
247 return HDF_SUCCESS;
248 }
249
SetLayerCrop(uint32_t devId,uint32_t layerId,const IRect & rect)250 int32_t DisplayComposerVdiImpl::SetLayerCrop(uint32_t devId, uint32_t layerId, const IRect& rect)
251 {
252 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCrop,
253 const_cast<IRect*>(&rect));
254 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
255 return HDF_SUCCESS;
256 }
257
SetLayerZorder(uint32_t devId,uint32_t layerId,uint32_t zorder)258 int32_t DisplayComposerVdiImpl::SetLayerZorder(uint32_t devId, uint32_t layerId, uint32_t zorder)
259 {
260 int32_t ec = HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetLayerZorder, layerId, zorder);
261 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
262 return HDF_SUCCESS;
263 }
264
SetLayerPreMulti(uint32_t devId,uint32_t layerId,bool preMul)265 int32_t DisplayComposerVdiImpl::SetLayerPreMulti(uint32_t devId, uint32_t layerId, bool preMul)
266 {
267 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerPreMulti, preMul);
268 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
269 return HDF_SUCCESS;
270 }
271
SetLayerTransformMode(uint32_t devId,uint32_t layerId,TransformType type)272 int32_t DisplayComposerVdiImpl::SetLayerTransformMode(uint32_t devId, uint32_t layerId, TransformType type)
273 {
274 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerTransformMode, type);
275 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
276 return HDF_SUCCESS;
277 }
278
SetLayerDirtyRegion(uint32_t devId,uint32_t layerId,const std::vector<IRect> & rects)279 int32_t DisplayComposerVdiImpl::SetLayerDirtyRegion(uint32_t devId, uint32_t layerId, const std::vector<IRect>& rects)
280 {
281 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerDirtyRegion,
282 const_cast<IRect*>(rects.data()));
283 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
284 return HDF_SUCCESS;
285 }
286
SetLayerVisibleRegion(uint32_t devId,uint32_t layerId,std::vector<IRect> & rects)287 int32_t DisplayComposerVdiImpl::SetLayerVisibleRegion(uint32_t devId, uint32_t layerId, std::vector<IRect>& rects)
288 {
289 DISPLAY_LOGE("%s is not supported", __func__);
290 return HDF_ERR_NOT_SUPPORT;
291 }
292
SetLayerBuffer(uint32_t devId,uint32_t layerId,const BufferHandle & buffer,int32_t fence)293 int32_t DisplayComposerVdiImpl::SetLayerBuffer(uint32_t devId, uint32_t layerId, const BufferHandle& buffer,
294 int32_t fence)
295 {
296 const BufferHandle* holder = &buffer;
297 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBuffer, holder, fence);
298 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
299 return HDF_SUCCESS;
300 }
301
SetLayerCompositionType(uint32_t devId,uint32_t layerId,CompositionType type)302 int32_t DisplayComposerVdiImpl::SetLayerCompositionType(uint32_t devId, uint32_t layerId, CompositionType type)
303 {
304 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCompositionType, type);
305 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
306 return HDF_SUCCESS;
307 }
308
SetLayerBlendType(uint32_t devId,uint32_t layerId,BlendType type)309 int32_t DisplayComposerVdiImpl::SetLayerBlendType(uint32_t devId, uint32_t layerId, BlendType type)
310 {
311 int32_t ec = HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBlendType, type);
312 DISPLAY_CHK_RETURN(ec != DISPLAY_SUCCESS, HDF_FAILURE, DISPLAY_LOGE("failed, ec=%{public}d", ec));
313 return HDF_SUCCESS;
314 }
315
SetLayerMaskInfo(uint32_t devId,uint32_t layerId,const MaskInfo maskInfo)316 int32_t DisplayComposerVdiImpl::SetLayerMaskInfo(uint32_t devId, uint32_t layerId, const MaskInfo maskInfo)
317 {
318 DISPLAY_LOGE("%s is not supported", __func__);
319 return HDF_ERR_NOT_SUPPORT;
320 }
321
SetLayerColor(uint32_t devId,uint32_t layerId,const LayerColor & layerColor)322 int32_t DisplayComposerVdiImpl::SetLayerColor(uint32_t devId, uint32_t layerId, const LayerColor& layerColor)
323 {
324 DISPLAY_LOGE("%s layerColor: r=%{public}d, g=%{public}d, b=%{public}d, a=%{public}d",
325 __func__, layerColor.r, layerColor.g, layerColor.b, layerColor.a);
326 DISPLAY_LOGE("%s is not supported", __func__);
327 return HDF_ERR_NOT_SUPPORT;
328 }
329
CreateComposerVdi()330 extern "C" IDisplayComposerVdi *CreateComposerVdi()
331 {
332 return new DisplayComposerVdiImpl();
333 }
334
DestroyComposerVdi(IDisplayComposerVdi * vdi)335 extern "C" void DestroyComposerVdi(IDisplayComposerVdi* vdi)
336 {
337 delete vdi;
338 }
339 } // DISPLAY
340 } // HDI
341 } // OHOS
342