• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "render_frame_trace.h"
17 #include "hdi_device.h"
18 #include "platform/common/rs_system_properties.h"
19 
20 #include <cstddef>
21 #include <cstdint>
22 #include <mutex>
23 
24 #include <scoped_bytrace.h>
25 #include <vector>
26 using namespace FRAME_TRACE;
27 static const std::string RS_INTERVAL_NAME = "renderservice";
28 
29 #define CHECK_FUNC(device, deviceFunc)              \
30     do {                                            \
31         if (!checkPtr(device, #device)) {           \
32             return DISPLAY_NULL_PTR;                \
33         }                                           \
34         if (!checkPtr(deviceFunc, __FUNCTION__)) {  \
35             return DISPLAY_NULL_PTR;                \
36         }                                           \
37     } while(0)
38 
39 namespace OHOS {
40 namespace Rosen {
GetInstance()41 HdiDevice* HdiDevice::GetInstance()
42 {
43     static HdiDevice instance;
44 
45     static std::mutex mutex;
46     std::lock_guard<std::mutex> lock(mutex);
47     {
48         if (instance.Init() != ROSEN_ERROR_OK) {
49             return nullptr;
50         }
51     }
52 
53     return &instance;
54 }
55 
HdiDevice()56 HdiDevice::HdiDevice()
57 {
58 }
59 
~HdiDevice()60 HdiDevice::~HdiDevice()
61 {
62     Destroy();
63 }
64 
Init()65 RosenError HdiDevice::Init()
66 {
67     if (deviceFuncs_ == nullptr) {
68         int32_t ret = DeviceInitialize(&deviceFuncs_);
69         if (ret != DISPLAY_SUCCESS || deviceFuncs_ == nullptr) {
70             HLOGE("DeviceInitialize failed, ret is %{public}d", ret);
71             return ROSEN_ERROR_NOT_INIT;
72         }
73     }
74 
75     if (layerFuncs_ == nullptr) {
76         int32_t ret = LayerInitialize(&layerFuncs_);
77         if (ret != DISPLAY_SUCCESS || layerFuncs_ == nullptr) {
78             Destroy();
79             HLOGE("LayerInitialize failed, ret is %{public}d", ret);
80             return ROSEN_ERROR_NOT_INIT;
81         }
82     }
83 
84     return ROSEN_ERROR_OK;
85 }
86 
Destroy()87 void HdiDevice::Destroy()
88 {
89     if (deviceFuncs_ != nullptr) {
90         int32_t ret = DeviceUninitialize(deviceFuncs_);
91         if (ret != DISPLAY_SUCCESS) {
92             HLOGE("DeviceUninitialize failed, ret is %{public}d", ret);
93         }
94         deviceFuncs_ = nullptr;
95     }
96 
97     if (layerFuncs_ != nullptr) {
98         int32_t ret = LayerUninitialize(layerFuncs_);
99         if (ret != DISPLAY_SUCCESS) {
100             HLOGE("LayerUninitialize failed, ret is %{public}d", ret);
101         }
102         layerFuncs_ = nullptr;
103     }
104 }
105 
106 /* set & get device screen info begin */
RegHotPlugCallback(HotPlugCallback callback,void * data)107 int32_t HdiDevice::RegHotPlugCallback(HotPlugCallback callback, void *data)
108 {
109     CHECK_FUNC(deviceFuncs_, deviceFuncs_->RegHotPlugCallback);
110     return deviceFuncs_->RegHotPlugCallback(callback, data);
111 }
112 
RegScreenVBlankCallback(uint32_t screenId,VBlankCallback callback,void * data)113 int32_t HdiDevice::RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data)
114 {
115     CHECK_FUNC(deviceFuncs_, deviceFuncs_->RegDisplayVBlankCallback);
116     return deviceFuncs_->RegDisplayVBlankCallback(screenId, callback, data);
117 }
118 
SetScreenVsyncEnabled(uint32_t screenId,bool enabled)119 int32_t HdiDevice::SetScreenVsyncEnabled(uint32_t screenId, bool enabled)
120 {
121     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayVsyncEnabled);
122     return deviceFuncs_->SetDisplayVsyncEnabled(screenId, enabled);
123 }
124 
GetScreenCapability(uint32_t screenId,DisplayCapability & info)125 int32_t HdiDevice::GetScreenCapability(uint32_t screenId, DisplayCapability &info)
126 {
127     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayCapability);
128     return deviceFuncs_->GetDisplayCapability(screenId, &info);
129 }
130 
GetScreenSupportedModes(uint32_t screenId,std::vector<DisplayModeInfo> & modes)131 int32_t HdiDevice::GetScreenSupportedModes(uint32_t screenId, std::vector<DisplayModeInfo> &modes)
132 {
133     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplaySupportedModes);
134 
135     uint32_t num = 0;
136     int32_t ret = deviceFuncs_->GetDisplaySupportedModes(screenId, &num, nullptr);
137     if (ret != DISPLAY_SUCCESS) {
138         return ret;
139     }
140 
141     if (num > 0) {
142         modes.resize(static_cast<uint32_t>(num));
143         return deviceFuncs_->GetDisplaySupportedModes(screenId, &num, modes.data());
144     }
145 
146     return ret;
147 }
148 
GetScreenMode(uint32_t screenId,uint32_t & modeId)149 int32_t HdiDevice::GetScreenMode(uint32_t screenId, uint32_t &modeId)
150 {
151     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayMode);
152     return deviceFuncs_->GetDisplayMode(screenId, &modeId);
153 }
154 
SetScreenMode(uint32_t screenId,uint32_t modeId)155 int32_t HdiDevice::SetScreenMode(uint32_t screenId, uint32_t modeId)
156 {
157     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayMode);
158     return deviceFuncs_->SetDisplayMode(screenId, modeId);
159 }
160 
GetScreenPowerStatus(uint32_t screenId,DispPowerStatus & status)161 int32_t HdiDevice::GetScreenPowerStatus(uint32_t screenId, DispPowerStatus &status)
162 {
163     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayPowerStatus);
164     return deviceFuncs_->GetDisplayPowerStatus(screenId, &status);
165 }
166 
SetScreenPowerStatus(uint32_t screenId,DispPowerStatus status)167 int32_t HdiDevice::SetScreenPowerStatus(uint32_t screenId, DispPowerStatus status)
168 {
169     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayPowerStatus);
170     return deviceFuncs_->SetDisplayPowerStatus(screenId, status);
171 }
172 
GetScreenBacklight(uint32_t screenId,uint32_t & level)173 int32_t HdiDevice::GetScreenBacklight(uint32_t screenId, uint32_t &level)
174 {
175     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayBacklight);
176     return deviceFuncs_->GetDisplayBacklight(screenId, &level);
177 }
178 
SetScreenBacklight(uint32_t screenId,uint32_t level)179 int32_t HdiDevice::SetScreenBacklight(uint32_t screenId, uint32_t level)
180 {
181     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayBacklight);
182     return deviceFuncs_->SetDisplayBacklight(screenId, level);
183 }
184 
PrepareScreenLayers(uint32_t screenId,bool & needFlush)185 int32_t HdiDevice::PrepareScreenLayers(uint32_t screenId, bool &needFlush)
186 {
187     CHECK_FUNC(deviceFuncs_, deviceFuncs_->PrepareDisplayLayers);
188     return deviceFuncs_->PrepareDisplayLayers(screenId, &needFlush);
189 }
190 
GetScreenCompChange(uint32_t screenId,std::vector<uint32_t> & layersId,std::vector<int32_t> & types)191 int32_t HdiDevice::GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
192                                        std::vector<int32_t> &types)
193 {
194     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayCompChange);
195 
196     uint32_t layerNum = 0;
197     int32_t ret = deviceFuncs_->GetDisplayCompChange(screenId, &layerNum, nullptr, nullptr);
198     if (ret != DISPLAY_SUCCESS) {
199         return ret;
200     }
201 
202     if (layerNum > 0) {
203         layersId.resize(layerNum);
204         types.resize(layerNum);
205         ret = deviceFuncs_->GetDisplayCompChange(screenId, &layerNum, layersId.data(), types.data());
206     }
207 
208     return ret;
209 }
210 
SetScreenClientBuffer(uint32_t screenId,const BufferHandle * buffer,const sptr<SyncFence> & fence)211 int32_t HdiDevice::SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer,
212                                          const sptr<SyncFence> &fence)
213 {
214     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayClientBuffer);
215 
216     if (fence == nullptr) {
217         return DISPLAY_NULL_PTR;
218     }
219 
220     int32_t fenceFd = fence->Get();
221     return deviceFuncs_->SetDisplayClientBuffer(screenId, buffer, fenceFd);
222 }
223 
SetScreenClientDamage(uint32_t screenId,uint32_t num,IRect & damageRect)224 int32_t HdiDevice::SetScreenClientDamage(uint32_t screenId, uint32_t num, IRect &damageRect)
225 {
226     if (num != 1) {
227         return DISPLAY_NOT_SUPPORT;
228     }
229     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayClientDamage);
230     return deviceFuncs_->SetDisplayClientDamage(screenId, num, &damageRect);
231 }
232 
GetScreenReleaseFence(uint32_t screenId,std::vector<uint32_t> & layers,std::vector<sptr<SyncFence>> & fences)233 int32_t HdiDevice::GetScreenReleaseFence(uint32_t screenId, std::vector<uint32_t> &layers,
234                                          std::vector<sptr<SyncFence>> &fences)
235 {
236     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayReleaseFence);
237 
238     uint32_t layerNum = 0;
239     int32_t ret = deviceFuncs_->GetDisplayReleaseFence(screenId, &layerNum, nullptr, nullptr);
240     if (ret != DISPLAY_SUCCESS) {
241         return ret;
242     }
243 
244     if (layerNum > 0) {
245         layers.resize(layerNum);
246         fences.resize(layerNum);
247         std::vector<int32_t> fenceFds;
248         fenceFds.resize(layerNum);
249 
250         ret = deviceFuncs_->GetDisplayReleaseFence(screenId, &layerNum,
251                                                    layers.data(), fenceFds.data());
252 
253         for (uint32_t i = 0; i < fenceFds.size(); i++) {
254             if (fenceFds[i] >= 0) {
255                 fences[i] = new SyncFence(fenceFds[i]);
256             } else {
257                 fences[i] = new SyncFence(-1);
258             }
259         }
260     }
261 
262     return ret;
263 }
264 
GetScreenSupportedColorGamuts(uint32_t screenId,std::vector<GraphicColorGamut> & gamuts)265 int32_t HdiDevice::GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts)
266 {
267     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplaySupportedColorGamuts);
268     uint32_t num = 0;
269     int32_t ret = deviceFuncs_->GetDisplaySupportedColorGamuts(screenId, &num, nullptr);
270     if (ret != DISPLAY_SUCCESS) {
271         return ret;
272     }
273     if (num > 0) {
274         std::vector<ColorGamut> hdiGamuts;
275         hdiGamuts.resize(num);
276         ret = deviceFuncs_->GetDisplaySupportedColorGamuts(screenId, &num, hdiGamuts.data());
277         gamuts.resize(num);
278         for (uint32_t i = 0; i < num; i++) {
279             gamuts[i] = static_cast<GraphicColorGamut>(hdiGamuts[i]);
280         }
281         return ret;
282     }
283     return ret;
284 }
285 
SetScreenColorGamut(uint32_t screenId,GraphicColorGamut gamut)286 int32_t HdiDevice::SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut)
287 {
288     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayColorGamut);
289     return deviceFuncs_->SetDisplayColorGamut(screenId, static_cast<ColorGamut>(gamut));
290 }
291 
GetScreenColorGamut(uint32_t screenId,GraphicColorGamut & gamut)292 int32_t HdiDevice::GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut)
293 {
294     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayColorGamut);
295     ColorGamut hdiGamut;
296     int32_t ret = deviceFuncs_->GetDisplayColorGamut(screenId, &hdiGamut);
297     if (ret == DISPLAY_SUCCESS) {
298         gamut = static_cast<GraphicColorGamut>(hdiGamut);
299     }
300     return ret;
301 }
302 
SetScreenGamutMap(uint32_t screenId,GamutMap gamutMap)303 int32_t HdiDevice::SetScreenGamutMap(uint32_t screenId, GamutMap gamutMap)
304 {
305     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayGamutMap);
306     return deviceFuncs_->SetDisplayGamutMap(screenId, gamutMap);
307 }
308 
GetScreenGamutMap(uint32_t screenId,GamutMap & gamutMap)309 int32_t HdiDevice::GetScreenGamutMap(uint32_t screenId, GamutMap &gamutMap)
310 {
311     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayGamutMap);
312     return deviceFuncs_->GetDisplayGamutMap(screenId, &gamutMap);
313 }
314 
SetScreenColorTransform(uint32_t screenId,const float * matrix)315 int32_t HdiDevice::SetScreenColorTransform(uint32_t screenId, const float *matrix)
316 {
317     CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayColorTransform);
318     return deviceFuncs_->SetDisplayColorTransform(screenId, matrix);
319 }
320 
GetHDRCapabilityInfos(uint32_t screenId,HDRCapability & info)321 int32_t HdiDevice::GetHDRCapabilityInfos(uint32_t screenId, HDRCapability &info)
322 {
323     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetHDRCapabilityInfos);
324     return deviceFuncs_->GetHDRCapabilityInfos(screenId, &info);
325 }
326 
GetSupportedMetaDataKey(uint32_t screenId,std::vector<GraphicHDRMetadataKey> & keys)327 int32_t HdiDevice::GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys)
328 {
329     CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetSupportedMetadataKey);
330     uint32_t num = 0;
331     int32_t ret = deviceFuncs_->GetSupportedMetadataKey(screenId, &num, nullptr);
332     if (ret != DISPLAY_SUCCESS) {
333         return ret;
334     }
335     if (num > 0) {
336         std::vector<HDRMetadataKey> hdiKeys;
337         hdiKeys.resize(num);
338         ret = deviceFuncs_->GetSupportedMetadataKey(screenId, &num, hdiKeys.data());
339         keys.resize(num);
340         for (uint32_t i = 0; i < num; i++) {
341             keys[i] = static_cast<GraphicHDRMetadataKey>(hdiKeys[i]);
342         }
343         return ret;
344     }
345     return ret;
346 }
347 
Commit(uint32_t screenId,sptr<SyncFence> & fence)348 int32_t HdiDevice::Commit(uint32_t screenId, sptr<SyncFence> &fence)
349 {
350     RenderFrameTrace::GetInstance().RenderEndFrameTrace(RS_INTERVAL_NAME);
351     ScopedBytrace bytrace(__func__);
352     CHECK_FUNC(deviceFuncs_, deviceFuncs_->Commit);
353 
354     int32_t fenceFd = -1;
355     int32_t ret = deviceFuncs_->Commit(screenId, &fenceFd);
356 
357     if (fenceFd >= 0) {
358         fence = new SyncFence(fenceFd);
359     } else {
360         fence = new SyncFence(-1);
361     }
362 
363     return ret;
364 }
365 /* set & get device screen info end */
366 
367 /* set & get device layer info begin */
SetLayerAlpha(uint32_t screenId,uint32_t layerId,GraphicLayerAlpha & alpha)368 int32_t HdiDevice::SetLayerAlpha(uint32_t screenId, uint32_t layerId, GraphicLayerAlpha &alpha)
369 {
370     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerAlpha);
371     LayerAlpha hdiAlpha = {
372         .enGlobalAlpha = alpha.enGlobalAlpha,
373         .enPixelAlpha = alpha.enPixelAlpha,
374         .alpha0 = alpha.alpha0,
375         .alpha1 = alpha.alpha1,
376         .gAlpha = alpha.gAlpha,
377     };
378     return layerFuncs_->SetLayerAlpha(screenId, layerId, &hdiAlpha);
379 }
380 
SetLayerSize(uint32_t screenId,uint32_t layerId,IRect & layerRect)381 int32_t HdiDevice::SetLayerSize(uint32_t screenId, uint32_t layerId, IRect &layerRect)
382 {
383     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerSize);
384     return layerFuncs_->SetLayerSize(screenId, layerId, &layerRect);
385 }
386 
SetTransformMode(uint32_t screenId,uint32_t layerId,GraphicTransformType type)387 int32_t HdiDevice::SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type)
388 {
389     CHECK_FUNC(layerFuncs_, layerFuncs_->SetTransformMode);
390     TransformType hdiType = static_cast<TransformType>(type);
391     return layerFuncs_->SetTransformMode(screenId, layerId, hdiType);
392 }
393 
SetLayerVisibleRegion(uint32_t screenId,uint32_t layerId,uint32_t num,IRect & visible)394 int32_t HdiDevice::SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId,
395                                          uint32_t num, IRect &visible)
396 {
397     if (num != 1) {
398         return DISPLAY_NOT_SUPPORT;
399     }
400     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerVisibleRegion);
401     return layerFuncs_->SetLayerVisibleRegion(screenId, layerId, num, &visible);
402 }
403 
SetLayerDirtyRegion(uint32_t screenId,uint32_t layerId,IRect & dirty)404 int32_t HdiDevice::SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId, IRect &dirty)
405 {
406     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerDirtyRegion);
407     return layerFuncs_->SetLayerDirtyRegion(screenId, layerId, &dirty);
408 }
409 
SetLayerBuffer(uint32_t screenId,uint32_t layerId,const BufferHandle * handle,const sptr<SyncFence> & acquireFence)410 int32_t HdiDevice::SetLayerBuffer(uint32_t screenId, uint32_t layerId, const BufferHandle *handle,
411                                   const sptr<SyncFence> &acquireFence)
412 {
413     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerBuffer);
414 
415     if (acquireFence == nullptr) {
416         return DISPLAY_NULL_PTR;
417     }
418 
419     int32_t fenceFd = acquireFence->Get();
420     return layerFuncs_->SetLayerBuffer(screenId, layerId, handle, fenceFd);
421 }
422 
SetLayerCompositionType(uint32_t screenId,uint32_t layerId,GraphicCompositionType type)423 int32_t HdiDevice::SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type)
424 {
425     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerCompositionType);
426     return layerFuncs_->SetLayerCompositionType(screenId, layerId, static_cast<CompositionType>(type));
427 }
428 
SetLayerBlendType(uint32_t screenId,uint32_t layerId,GraphicBlendType type)429 int32_t HdiDevice::SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type)
430 {
431     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerBlendType);
432     return layerFuncs_->SetLayerBlendType(screenId, layerId, static_cast<BlendType>(type));
433 }
434 
SetLayerCrop(uint32_t screenId,uint32_t layerId,IRect & crop)435 int32_t HdiDevice::SetLayerCrop(uint32_t screenId, uint32_t layerId, IRect &crop)
436 {
437     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerCrop);
438     return layerFuncs_->SetLayerCrop(screenId, layerId, &crop);
439 }
440 
SetLayerZorder(uint32_t screenId,uint32_t layerId,uint32_t zorder)441 int32_t HdiDevice::SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder)
442 {
443     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerZorder);
444     return layerFuncs_->SetLayerZorder(screenId, layerId, zorder);
445 }
446 
SetLayerPreMulti(uint32_t screenId,uint32_t layerId,bool isPreMulti)447 int32_t HdiDevice::SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti)
448 {
449     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerPreMulti);
450     return layerFuncs_->SetLayerPreMulti(screenId, layerId, isPreMulti);
451 }
452 
SetLayerColorTransform(uint32_t screenId,uint32_t layerId,const float * matrix)453 int32_t HdiDevice::SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const float *matrix)
454 {
455     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerColorTransform);
456     return layerFuncs_->SetLayerColorTransform(screenId, layerId, matrix);
457 }
458 
SetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace colorSpace)459 int32_t HdiDevice::SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace)
460 {
461     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerColorDataSpace);
462     ColorDataSpace hdiColorSpace = static_cast<ColorDataSpace>(colorSpace);
463     return layerFuncs_->SetLayerColorDataSpace(screenId, layerId, hdiColorSpace);
464 }
465 
GetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace & colorSpace)466 int32_t HdiDevice::GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace)
467 {
468     CHECK_FUNC(layerFuncs_, layerFuncs_->GetLayerColorDataSpace);
469     ColorDataSpace hdiColorSpace;
470     int32_t ret = layerFuncs_->GetLayerColorDataSpace(screenId, layerId, &hdiColorSpace);
471     colorSpace = static_cast<GraphicColorDataSpace>(hdiColorSpace);
472     return ret;
473 }
474 
SetLayerMetaData(uint32_t screenId,uint32_t layerId,const std::vector<GraphicHDRMetaData> & metaData)475 int32_t HdiDevice::SetLayerMetaData(uint32_t screenId, uint32_t layerId,
476                                     const std::vector<GraphicHDRMetaData> &metaData)
477 {
478     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerMetaData);
479     size_t num = metaData.size();
480     std::vector<HDRMetaData> hdiMetaData;
481     hdiMetaData.resize(num);
482     for (size_t i = 0; i < num; i++) {
483         hdiMetaData[i].key = static_cast<HDRMetadataKey>(metaData[i].key);
484         hdiMetaData[i].value = metaData[i].value;
485     }
486     return layerFuncs_->SetLayerMetaData(screenId, layerId, hdiMetaData.size(), hdiMetaData.data());
487 }
488 
SetLayerMetaDataSet(uint32_t screenId,uint32_t layerId,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)489 int32_t HdiDevice::SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
490                                        const std::vector<uint8_t> &metaData)
491 {
492     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerMetaDataSet);
493     return layerFuncs_->SetLayerMetaDataSet(screenId, layerId, static_cast<HDRMetadataKey>(key), metaData.size(),
494                                             metaData.data());
495 }
496 
SetLayerTunnelHandle(uint32_t screenId,uint32_t layerId,GraphicExtDataHandle * handle)497 int32_t HdiDevice::SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle)
498 {
499     CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerTunnelHandle);
500     return layerFuncs_->SetLayerTunnelHandle(screenId, layerId, reinterpret_cast<ExtDataHandle *>(handle));
501 }
502 
GetSupportedPresentTimestampType(uint32_t screenId,uint32_t layerId,GraphicPresentTimestampType & type)503 int32_t HdiDevice::GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
504                                                     GraphicPresentTimestampType &type)
505 {
506     CHECK_FUNC(layerFuncs_, layerFuncs_->GetSupportedPresentTimestamp);
507     PresentTimestampType hdiType;
508     int32_t ret = layerFuncs_->GetSupportedPresentTimestamp(screenId, layerId, &hdiType);
509     type = static_cast<GraphicPresentTimestampType>(hdiType);
510     return ret;
511 }
512 
GetPresentTimestamp(uint32_t screenId,uint32_t layerId,GraphicPresentTimestamp & timestamp)513 int32_t HdiDevice::GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp &timestamp)
514 {
515     CHECK_FUNC(layerFuncs_, layerFuncs_->GetHwPresentTimestamp);
516     PresentTimestamp hdiTimestamp;
517     int32_t ret = layerFuncs_->GetHwPresentTimestamp(screenId, layerId, &hdiTimestamp);
518     timestamp.type = static_cast<GraphicPresentTimestampType>(hdiTimestamp.type);
519     timestamp.time = hdiTimestamp.time;
520     return ret;
521 }
522 
523 /* set & get device layer info end */
524 
CreateLayer(uint32_t screenId,const GraphicLayerInfo & layerInfo,uint32_t & layerId)525 int32_t HdiDevice::CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t &layerId)
526 {
527     CHECK_FUNC(layerFuncs_, layerFuncs_->CreateLayer);
528     LayerInfo hdiLayerInfo = {
529         .width = layerInfo.width,
530         .height = layerInfo.height,
531         .type = static_cast<LayerType>(layerInfo.type),
532         .bpp = layerInfo.bpp,
533         .pixFormat = static_cast<PixelFormat>(layerInfo.pixFormat),
534     };
535     return layerFuncs_->CreateLayer(screenId, &hdiLayerInfo, &layerId);
536 }
537 
CloseLayer(uint32_t screenId,uint32_t layerId)538 int32_t HdiDevice::CloseLayer(uint32_t screenId, uint32_t layerId)
539 {
540     CHECK_FUNC(layerFuncs_, layerFuncs_->CloseLayer);
541     return layerFuncs_->CloseLayer(screenId, layerId);
542 }
543 
544 // this is only used in hdidevice_test in unittest
ResetHdiFuncs()545 void HdiDevice::ResetHdiFuncs()
546 {
547     HLOGD("%{public}s: start", __func__);
548     deviceFuncs_ = nullptr;
549     layerFuncs_ = nullptr;
550     HLOGD("%{public}s: end", __func__);
551 }
552 
553 } // namespace Rosen
554 } // namespace OHOS
555