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