• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_device_impl.h"
17 #include "hdi_log.h"
18 #include <cstddef>
19 #include <cstdlib>
20 #include <mutex>
21 #include <scoped_bytrace.h>
22 #include <valarray>
23 #include <securec.h>
24 #include "v1_1/include/idisplay_composer_interface.h"
25 
26 #define CHECK_FUNC(composerSptr)                                     \
27     do {                                                             \
28         if ((composerSptr) == nullptr) {                             \
29             HLOGD("[%{public}s]composerSptr is nullptr.", __func__); \
30             return GRAPHIC_DISPLAY_NULL_PTR;                         \
31         }                                                            \
32     } while (0)
33 
34 namespace OHOS {
35 namespace Rosen {
36 namespace {
37 using namespace OHOS::HDI::Display::Composer::V1_0;
38 using IDisplayComposerInterfaceSptr = sptr<OHOS::HDI::Display::Composer::V1_1::IDisplayComposerInterface>;
39 static IDisplayComposerInterfaceSptr g_composer;
40 }
41 
42 class HwcDeathRecipient : public IRemoteObject::DeathRecipient {
43 public:
HwcDeathRecipient(OnHwcDeadCallback callback=nullptr,void * data=nullptr)44     explicit HwcDeathRecipient(OnHwcDeadCallback callback = nullptr, void *data = nullptr)
45         : deathCbFunc_(callback), data_(data) {}
OnRemoteDied(const wptr<IRemoteObject> & object)46     void OnRemoteDied(const wptr<IRemoteObject> &object) override
47     {
48         if (deathCbFunc_ != nullptr) {
49             HLOGI("%{public}s: notify the death event of composer to RS", __func__);
50             deathCbFunc_(data_);
51         }
52     }
53 private:
54     OnHwcDeadCallback deathCbFunc_;
55     void *data_;
56 };
57 
HdiDeviceImpl()58 HdiDeviceImpl::HdiDeviceImpl()
59 {
60 }
61 
~HdiDeviceImpl()62 HdiDeviceImpl::~HdiDeviceImpl()
63 {
64     Destroy();
65 }
66 
Init()67 RosenError HdiDeviceImpl::Init()
68 {
69     if (g_composer == nullptr) {
70         g_composer = OHOS::HDI::Display::Composer::V1_1::IDisplayComposerInterface::Get();
71         if (g_composer == nullptr) {
72             HLOGE("IDisplayComposerInterface::Get return nullptr.");
73             return ROSEN_ERROR_NOT_INIT;
74         }
75     }
76     return ROSEN_ERROR_OK;
77 }
78 
Destroy()79 void HdiDeviceImpl::Destroy()
80 {
81     g_composer = nullptr;
82 }
83 
84 /* set & get device screen info begin */
RegHotPlugCallback(HotPlugCallback callback,void * data)85 int32_t HdiDeviceImpl::RegHotPlugCallback(HotPlugCallback callback, void *data)
86 {
87     CHECK_FUNC(g_composer);
88     return g_composer->RegHotPlugCallback(callback, data);
89 }
90 
RegHwcDeadCallback(OnHwcDeadCallback callback,void * data)91 bool HdiDeviceImpl::RegHwcDeadCallback(OnHwcDeadCallback callback, void *data)
92 {
93     CHECK_FUNC(g_composer);
94     sptr<HwcDeathRecipient> recipient = new HwcDeathRecipient(callback, data);
95     return g_composer->AddDeathRecipient(recipient);
96 }
97 
RegScreenVBlankCallback(uint32_t screenId,VBlankCallback callback,void * data)98 int32_t HdiDeviceImpl::RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data)
99 {
100     CHECK_FUNC(g_composer);
101     return g_composer->RegDisplayVBlankCallback(screenId, callback, data);
102 }
103 
SetScreenVsyncEnabled(uint32_t screenId,bool enabled)104 int32_t HdiDeviceImpl::SetScreenVsyncEnabled(uint32_t screenId, bool enabled)
105 {
106     CHECK_FUNC(g_composer);
107     return g_composer->SetDisplayVsyncEnabled(screenId, enabled);
108 }
109 
GetScreenCapability(uint32_t screenId,GraphicDisplayCapability & info)110 int32_t HdiDeviceImpl::GetScreenCapability(uint32_t screenId, GraphicDisplayCapability &info)
111 {
112     CHECK_FUNC(g_composer);
113     DisplayCapability hdiInfo;
114     int32_t ret = g_composer->GetDisplayCapability(screenId, hdiInfo);
115     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
116         info.name = hdiInfo.name;
117         info.type = static_cast<GraphicInterfaceType>(hdiInfo.type);
118         info.phyWidth = hdiInfo.phyWidth;
119         info.phyHeight = hdiInfo.phyHeight;
120         info.supportLayers = hdiInfo.supportLayers;
121         info.virtualDispCount = hdiInfo.virtualDispCount;
122         info.supportWriteBack = hdiInfo.supportWriteBack;
123         info.propertyCount = hdiInfo.propertyCount;
124         info.props.clear();
125         info.props.reserve(hdiInfo.propertyCount);
126         for (uint32_t i = 0; i < hdiInfo.propertyCount; i++) {
127             GraphicPropertyObject graphicProperty = {
128                 .name = hdiInfo.props[i].name,
129                 .propId = hdiInfo.props[i].propId,
130                 .value = hdiInfo.props[i].value,
131             };
132             info.props.emplace_back(graphicProperty);
133         }
134     }
135     return ret;
136 }
137 
GetScreenSupportedModes(uint32_t screenId,std::vector<GraphicDisplayModeInfo> & modes)138 int32_t HdiDeviceImpl::GetScreenSupportedModes(uint32_t screenId, std::vector<GraphicDisplayModeInfo> &modes)
139 {
140     CHECK_FUNC(g_composer);
141     std::vector<DisplayModeInfo> hdiModes;
142     int32_t ret = g_composer->GetDisplaySupportedModes(screenId, hdiModes);
143     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
144         HLOGE("Get screen supported modes failed, ret is %{public}d.", ret);
145         return ret;
146     }
147 
148     modes.clear();
149     modes.reserve(hdiModes.size());
150     for (auto iter = hdiModes.begin(); iter != hdiModes.end(); iter++) {
151         GraphicDisplayModeInfo tempMode = {
152             .width = iter->width,
153             .height = iter->height,
154             .freshRate = iter->freshRate,
155             .id = iter->id,
156         };
157         modes.emplace_back(tempMode);
158     }
159     return ret;
160 }
161 
GetScreenMode(uint32_t screenId,uint32_t & modeId)162 int32_t HdiDeviceImpl::GetScreenMode(uint32_t screenId, uint32_t &modeId)
163 {
164     CHECK_FUNC(g_composer);
165     return g_composer->GetDisplayMode(screenId, modeId);
166 }
167 
SetScreenMode(uint32_t screenId,uint32_t modeId)168 int32_t HdiDeviceImpl::SetScreenMode(uint32_t screenId, uint32_t modeId)
169 {
170     CHECK_FUNC(g_composer);
171     return g_composer->SetDisplayMode(screenId, modeId);
172 }
173 
GetScreenPowerStatus(uint32_t screenId,GraphicDispPowerStatus & status)174 int32_t HdiDeviceImpl::GetScreenPowerStatus(uint32_t screenId, GraphicDispPowerStatus &status)
175 {
176     CHECK_FUNC(g_composer);
177     DispPowerStatus hdiStatus;
178     int32_t ret = g_composer->GetDisplayPowerStatus(screenId, hdiStatus);
179     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
180         status = static_cast<GraphicDispPowerStatus>(hdiStatus);
181     }
182     return ret;
183 }
184 
SetScreenPowerStatus(uint32_t screenId,GraphicDispPowerStatus status)185 int32_t HdiDeviceImpl::SetScreenPowerStatus(uint32_t screenId, GraphicDispPowerStatus status)
186 {
187     CHECK_FUNC(g_composer);
188     return g_composer->SetDisplayPowerStatus(screenId, static_cast<DispPowerStatus>(status));
189 }
190 
GetScreenBacklight(uint32_t screenId,uint32_t & level)191 int32_t HdiDeviceImpl::GetScreenBacklight(uint32_t screenId, uint32_t &level)
192 {
193     CHECK_FUNC(g_composer);
194     return g_composer->GetDisplayBacklight(screenId, level);
195 }
196 
SetScreenBacklight(uint32_t screenId,uint32_t level)197 int32_t HdiDeviceImpl::SetScreenBacklight(uint32_t screenId, uint32_t level)
198 {
199     CHECK_FUNC(g_composer);
200     return g_composer->SetDisplayBacklight(screenId, level);
201 }
202 
PrepareScreenLayers(uint32_t screenId,bool & needFlush)203 int32_t HdiDeviceImpl::PrepareScreenLayers(uint32_t screenId, bool &needFlush)
204 {
205     CHECK_FUNC(g_composer);
206     return g_composer->PrepareDisplayLayers(screenId, needFlush);
207 }
208 
GetScreenCompChange(uint32_t screenId,std::vector<uint32_t> & layersId,std::vector<int32_t> & types)209 int32_t HdiDeviceImpl::GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
210                                            std::vector<int32_t> &types)
211 {
212     CHECK_FUNC(g_composer);
213     int32_t ret = g_composer->GetDisplayCompChange(screenId, layersId, types);
214     return ret;
215 }
216 
SetScreenClientBuffer(uint32_t screenId,const BufferHandle * buffer,uint32_t cacheIndex,const sptr<SyncFence> & fence)217 int32_t HdiDeviceImpl::SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer, uint32_t cacheIndex,
218                                              const sptr<SyncFence> &fence)
219 {
220     CHECK_FUNC(g_composer);
221     if ((buffer == nullptr && cacheIndex == INVALID_BUFFER_CACHE_INDEX) || fence == nullptr) {
222         return GRAPHIC_DISPLAY_PARAM_ERR;
223     }
224 
225     int32_t fenceFd = fence->Get();
226     return g_composer->SetDisplayClientBuffer(screenId, buffer, cacheIndex, fenceFd);
227 }
228 
SetScreenClientBufferCacheCount(uint32_t screen,uint32_t count)229 int32_t HdiDeviceImpl::SetScreenClientBufferCacheCount(uint32_t screen, uint32_t count)
230 {
231     CHECK_FUNC(g_composer);
232     if (count == 0 || count > SURFACE_MAX_QUEUE_SIZE) {
233         return GRAPHIC_DISPLAY_PARAM_ERR;
234     }
235     return g_composer->SetClientBufferCacheCount(screen, count);
236 }
237 
SetScreenClientDamage(uint32_t screenId,const std::vector<GraphicIRect> & damageRect)238 int32_t HdiDeviceImpl::SetScreenClientDamage(uint32_t screenId, const std::vector<GraphicIRect> &damageRect)
239 {
240     CHECK_FUNC(g_composer);
241     std::vector<IRect> hdiDamageRect;
242     for (auto iter = damageRect.begin(); iter != damageRect.end(); iter++) {
243         IRect tempDamageRect = {
244             .x = iter->x,
245             .y = iter->y,
246             .w = iter->w,
247             .h = iter->h,
248         };
249         hdiDamageRect.emplace_back(tempDamageRect);
250     }
251     return g_composer->SetDisplayClientDamage(screenId, hdiDamageRect);
252 }
253 
GetScreenReleaseFence(uint32_t screenId,std::vector<uint32_t> & layers,std::vector<sptr<SyncFence>> & fences)254 int32_t HdiDeviceImpl::GetScreenReleaseFence(uint32_t screenId, std::vector<uint32_t> &layers,
255                                              std::vector<sptr<SyncFence>> &fences)
256 {
257     CHECK_FUNC(g_composer);
258     std::vector<int32_t> fenceFds;
259     int32_t ret = g_composer->GetDisplayReleaseFence(screenId, layers, fenceFds);
260     if (ret != GRAPHIC_DISPLAY_SUCCESS || fenceFds.size() == 0) {
261         return ret;
262     }
263 
264     size_t fencesNum = fenceFds.size();
265     fences.resize(fencesNum);
266     for (size_t i = 0; i < fencesNum; i++) {
267         if (fenceFds[i] >= 0) {
268             fences[i] = new SyncFence(fenceFds[i]);
269         } else {
270             fences[i] = new SyncFence(-1);
271         }
272     }
273 
274     return ret;
275 }
276 
GetScreenSupportedColorGamuts(uint32_t screenId,std::vector<GraphicColorGamut> & gamuts)277 int32_t HdiDeviceImpl::GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts)
278 {
279     CHECK_FUNC(g_composer);
280     std::vector<ColorGamut> hdiGamuts;
281     int32_t ret = g_composer->GetDisplaySupportedColorGamuts(screenId, hdiGamuts);
282     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
283         return ret;
284     }
285 
286     gamuts.clear();
287     gamuts.reserve(hdiGamuts.size());
288     for (auto iter = hdiGamuts.begin(); iter != hdiGamuts.end(); iter++) {
289         GraphicColorGamut tempGamut = static_cast<GraphicColorGamut>(*iter);
290         gamuts.emplace_back(tempGamut);
291     }
292     return ret;
293 }
294 
SetScreenColorGamut(uint32_t screenId,GraphicColorGamut gamut)295 int32_t HdiDeviceImpl::SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut)
296 {
297     CHECK_FUNC(g_composer);
298     return g_composer->SetDisplayColorGamut(screenId, static_cast<ColorGamut>(gamut));
299 }
300 
GetScreenColorGamut(uint32_t screenId,GraphicColorGamut & gamut)301 int32_t HdiDeviceImpl::GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut)
302 {
303     CHECK_FUNC(g_composer);
304     ColorGamut hdiGamut;
305     int32_t ret = g_composer->GetDisplayColorGamut(screenId, hdiGamut);
306     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
307         gamut = static_cast<GraphicColorGamut>(hdiGamut);
308     }
309     return ret;
310 }
311 
SetScreenGamutMap(uint32_t screenId,GraphicGamutMap gamutMap)312 int32_t HdiDeviceImpl::SetScreenGamutMap(uint32_t screenId, GraphicGamutMap gamutMap)
313 {
314     CHECK_FUNC(g_composer);
315     return g_composer->SetDisplayGamutMap(screenId, static_cast<GamutMap>(gamutMap));
316 }
317 
GetScreenGamutMap(uint32_t screenId,GraphicGamutMap & gamutMap)318 int32_t HdiDeviceImpl::GetScreenGamutMap(uint32_t screenId, GraphicGamutMap &gamutMap)
319 {
320     CHECK_FUNC(g_composer);
321     GamutMap hdiGamutMap;
322     int32_t ret = g_composer->GetDisplayGamutMap(screenId, hdiGamutMap);
323     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
324         gamutMap = static_cast<GraphicGamutMap>(hdiGamutMap);
325     }
326     return ret;
327 }
328 
SetScreenColorTransform(uint32_t screenId,const std::vector<float> & matrix)329 int32_t HdiDeviceImpl::SetScreenColorTransform(uint32_t screenId, const std::vector<float> &matrix)
330 {
331     CHECK_FUNC(g_composer);
332     return g_composer->SetDisplayColorTransform(screenId, matrix);
333 }
334 
GetHDRCapabilityInfos(uint32_t screenId,GraphicHDRCapability & info)335 int32_t HdiDeviceImpl::GetHDRCapabilityInfos(uint32_t screenId, GraphicHDRCapability &info)
336 {
337     CHECK_FUNC(g_composer);
338     HDRCapability hdiInfo;
339     int32_t ret = g_composer->GetHDRCapabilityInfos(screenId, hdiInfo);
340     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
341         return ret;
342     }
343     uint32_t formatCount = hdiInfo.formatCount;
344     info.formats.clear();
345     info.formats.reserve(formatCount);
346     for (uint32_t i = 0; i < formatCount; i++) {
347         GraphicHDRFormat format = static_cast<GraphicHDRFormat>(hdiInfo.formats[i]);
348         info.formats.emplace_back(format);
349     }
350     info.maxLum = hdiInfo.maxLum;
351     info.maxAverageLum = hdiInfo.maxAverageLum;
352     info.minLum = hdiInfo.minLum;
353     return ret;
354 }
355 
GetSupportedMetaDataKey(uint32_t screenId,std::vector<GraphicHDRMetadataKey> & keys)356 int32_t HdiDeviceImpl::GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys)
357 {
358     CHECK_FUNC(g_composer);
359     std::vector<HDRMetadataKey> hdiKeys;
360     int32_t ret = g_composer->GetSupportedMetadataKey(screenId, hdiKeys);
361     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
362         return ret;
363     }
364     keys.clear();
365     keys.reserve(hdiKeys.size());
366     for (auto iter = hdiKeys.begin(); iter != hdiKeys.end(); iter++) {
367         GraphicHDRMetadataKey tempKey = static_cast<GraphicHDRMetadataKey>(*iter);
368         keys.emplace_back(tempKey);
369     }
370     return ret;
371 }
372 
Commit(uint32_t screenId,sptr<SyncFence> & fence)373 int32_t HdiDeviceImpl::Commit(uint32_t screenId, sptr<SyncFence> &fence)
374 {
375     ScopedBytrace bytrace(__func__);
376     CHECK_FUNC(g_composer);
377     int32_t fenceFd = -1;
378     int32_t ret = g_composer->Commit(screenId, fenceFd);
379 
380     if (fenceFd >= 0) {
381         fence = new SyncFence(fenceFd);
382     } else {
383         fence = new SyncFence(-1);
384     }
385 
386     return ret;
387 }
388 /* set & get device screen info end */
389 
390 /* set & get device layer info begin */
SetLayerAlpha(uint32_t screenId,uint32_t layerId,const GraphicLayerAlpha & alpha)391 int32_t HdiDeviceImpl::SetLayerAlpha(uint32_t screenId, uint32_t layerId, const GraphicLayerAlpha &alpha)
392 {
393     CHECK_FUNC(g_composer);
394     LayerAlpha hdiLayerAlpha = {
395         .enGlobalAlpha = alpha.enGlobalAlpha,
396         .enPixelAlpha = alpha.enPixelAlpha,
397         .alpha0 = alpha.alpha0,
398         .alpha1 = alpha.alpha1,
399         .gAlpha = alpha.gAlpha,
400     };
401     return g_composer->SetLayerAlpha(screenId, layerId, hdiLayerAlpha);
402 }
403 
SetLayerSize(uint32_t screenId,uint32_t layerId,const GraphicIRect & layerRect)404 int32_t HdiDeviceImpl::SetLayerSize(uint32_t screenId, uint32_t layerId, const GraphicIRect &layerRect)
405 {
406     CHECK_FUNC(g_composer);
407     IRect hdiLayerRect = {
408         .x = layerRect.x,
409         .y = layerRect.y,
410         .w = layerRect.w,
411         .h = layerRect.h,
412     };
413     return g_composer->SetLayerRegion(screenId, layerId, hdiLayerRect);
414 }
415 
SetTransformMode(uint32_t screenId,uint32_t layerId,GraphicTransformType type)416 int32_t HdiDeviceImpl::SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type)
417 {
418     CHECK_FUNC(g_composer);
419     TransformType hdiType = static_cast<TransformType>(type);
420     return g_composer->SetLayerTransformMode(screenId, layerId, hdiType);
421 }
422 
SetLayerVisibleRegion(uint32_t screenId,uint32_t layerId,const std::vector<GraphicIRect> & visible)423 int32_t HdiDeviceImpl::SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId,
424                                              const std::vector<GraphicIRect> &visible)
425 {
426     CHECK_FUNC(g_composer);
427     std::vector<IRect> hdiVisibleRects;
428     for (auto iter = visible.begin(); iter != visible.end(); iter++) {
429         IRect tempVisibleRect = {
430             .x = iter->x,
431             .y = iter->y,
432             .w = iter->w,
433             .h = iter->h,
434         };
435         hdiVisibleRects.emplace_back(tempVisibleRect);
436     }
437     return g_composer->SetLayerVisibleRegion(screenId, layerId, hdiVisibleRects);
438 }
439 
SetLayerDirtyRegion(uint32_t screenId,uint32_t layerId,const std::vector<GraphicIRect> & dirtyRegions)440 int32_t HdiDeviceImpl::SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId,
441                                            const std::vector<GraphicIRect> &dirtyRegions)
442 {
443     CHECK_FUNC(g_composer);
444     std::vector<IRect> hdiDirtyRegions;
445     for (auto iter = dirtyRegions.begin(); iter != dirtyRegions.end(); iter++) {
446         IRect hdiDirtyRect = {
447             .x = iter->x,
448             .y = iter->y,
449             .w = iter->w,
450             .h = iter->h,
451         };
452         hdiDirtyRegions.emplace_back(hdiDirtyRect);
453     }
454     return g_composer->SetLayerDirtyRegion(screenId, layerId, hdiDirtyRegions);
455 }
456 
SetLayerBuffer(uint32_t screenId,uint32_t layerId,const GraphicLayerBuffer & layerBuffer)457 int32_t HdiDeviceImpl::SetLayerBuffer(uint32_t screenId, uint32_t layerId, const GraphicLayerBuffer &layerBuffer)
458 {
459     CHECK_FUNC(g_composer);
460     if ((layerBuffer.handle == nullptr && layerBuffer.cacheIndex == INVALID_BUFFER_CACHE_INDEX) ||
461         layerBuffer.acquireFence == nullptr) {
462         return GRAPHIC_DISPLAY_PARAM_ERR;
463     }
464     int32_t fenceFd = (layerBuffer.acquireFence)->Get();
465     return g_composer->SetLayerBuffer(screenId, layerId, layerBuffer.handle, layerBuffer.cacheIndex,
466                                       fenceFd, layerBuffer.deletingList);
467 }
468 
SetLayerCompositionType(uint32_t screenId,uint32_t layerId,GraphicCompositionType type)469 int32_t HdiDeviceImpl::SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type)
470 {
471     CHECK_FUNC(g_composer);
472     CompositionType hdiType = static_cast<CompositionType>(type);
473     return g_composer->SetLayerCompositionType(screenId, layerId, hdiType);
474 }
475 
SetLayerBlendType(uint32_t screenId,uint32_t layerId,GraphicBlendType type)476 int32_t HdiDeviceImpl::SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type)
477 {
478     CHECK_FUNC(g_composer);
479     BlendType hdiBlendType = static_cast<BlendType>(type);
480     return g_composer->SetLayerBlendType(screenId, layerId, hdiBlendType);
481 }
482 
SetLayerCrop(uint32_t screenId,uint32_t layerId,const GraphicIRect & crop)483 int32_t HdiDeviceImpl::SetLayerCrop(uint32_t screenId, uint32_t layerId, const GraphicIRect &crop)
484 {
485     CHECK_FUNC(g_composer);
486     IRect hdiCropRect = {
487         .x = crop.x,
488         .y = crop.y,
489         .w = crop.w,
490         .h = crop.h,
491     };
492     return g_composer->SetLayerCrop(screenId, layerId, hdiCropRect);
493 }
494 
SetLayerZorder(uint32_t screenId,uint32_t layerId,uint32_t zorder)495 int32_t HdiDeviceImpl::SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder)
496 {
497     CHECK_FUNC(g_composer);
498     return g_composer->SetLayerZorder(screenId, layerId, zorder);
499 }
500 
SetLayerPreMulti(uint32_t screenId,uint32_t layerId,bool isPreMulti)501 int32_t HdiDeviceImpl::SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti)
502 {
503     CHECK_FUNC(g_composer);
504     return g_composer->SetLayerPreMulti(screenId, layerId, isPreMulti);
505 }
506 
SetLayerColor(uint32_t screenId,uint32_t layerId,GraphicLayerColor layerColor)507 int32_t HdiDeviceImpl::SetLayerColor(uint32_t screenId, uint32_t layerId, GraphicLayerColor layerColor)
508 {
509     CHECK_FUNC(g_composer);
510     LayerColor color = {
511         .r = layerColor.r,
512         .g = layerColor.g,
513         .b = layerColor.b,
514         .a = layerColor.a
515     };
516 
517     HLOGD("SetLayerColor screenId:%{public}u, layerId:%{public}u", screenId, layerId);
518 
519     return g_composer->SetLayerColor(screenId, layerId, color);
520 }
521 
SetLayerColorTransform(uint32_t screenId,uint32_t layerId,const std::vector<float> & matrix)522 int32_t HdiDeviceImpl::SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const std::vector<float> &matrix)
523 {
524     CHECK_FUNC(g_composer);
525     return g_composer->SetLayerColorTransform(screenId, layerId, matrix);
526 }
527 
SetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace colorSpace)528 int32_t HdiDeviceImpl::SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace)
529 {
530     CHECK_FUNC(g_composer);
531     ColorDataSpace hdiColorDataSpace = static_cast<ColorDataSpace>(colorSpace);
532     return g_composer->SetLayerColorDataSpace(screenId, layerId, hdiColorDataSpace);
533 }
534 
GetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace & colorSpace)535 int32_t HdiDeviceImpl::GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace)
536 {
537     CHECK_FUNC(g_composer);
538     ColorDataSpace hdiColorDataSpace = COLOR_DATA_SPACE_UNKNOWN;
539     int32_t ret = g_composer->GetLayerColorDataSpace(screenId, layerId, hdiColorDataSpace);
540     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
541         colorSpace = static_cast<GraphicColorDataSpace>(hdiColorDataSpace);
542     }
543     return ret;
544 }
545 
SetLayerMetaData(uint32_t screenId,uint32_t layerId,const std::vector<GraphicHDRMetaData> & metaData)546 int32_t HdiDeviceImpl::SetLayerMetaData(uint32_t screenId, uint32_t layerId,
547                                         const std::vector<GraphicHDRMetaData> &metaData)
548 {
549     CHECK_FUNC(g_composer);
550     std::vector<HDRMetaData> hdiMetaDatas;
551     std::size_t metaDataSize = metaData.size();
552     for (std::size_t i = 0; i < metaDataSize; i++) {
553         HDRMetaData hdiMetaData = {
554             .key = static_cast<HDRMetadataKey>(metaData[i].key),
555             .value = metaData[i].value,
556         };
557         hdiMetaDatas.emplace_back(hdiMetaData);
558     }
559     return g_composer->SetLayerMetaData(screenId, layerId, hdiMetaDatas);
560 }
561 
SetLayerMetaDataSet(uint32_t screenId,uint32_t layerId,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)562 int32_t HdiDeviceImpl::SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
563                                            const std::vector<uint8_t> &metaData)
564 {
565     CHECK_FUNC(g_composer);
566     HDRMetadataKey hdiKey = static_cast<HDRMetadataKey>(key);
567     return g_composer->SetLayerMetaDataSet(screenId, layerId, hdiKey, metaData);
568 }
569 
SetLayerTunnelHandle(uint32_t screenId,uint32_t layerId,GraphicExtDataHandle * handle)570 int32_t HdiDeviceImpl::SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle)
571 {
572     CHECK_FUNC(g_composer);
573     return g_composer->SetLayerTunnelHandle(screenId, layerId, (*(reinterpret_cast<ExtDataHandle *>(handle))));
574 }
575 
GetSupportedPresentTimestampType(uint32_t screenId,uint32_t layerId,GraphicPresentTimestampType & type)576 int32_t HdiDeviceImpl::GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
577                                                         GraphicPresentTimestampType &type)
578 {
579     CHECK_FUNC(g_composer);
580     PresentTimestampType hdiType = PresentTimestampType::HARDWARE_DISPLAY_PTS_UNSUPPORTED;
581     int32_t ret = g_composer->GetSupportedPresentTimestamp(screenId, layerId, hdiType);
582     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
583         type = static_cast<GraphicPresentTimestampType>(hdiType);
584     }
585     return ret;
586 }
587 
GetPresentTimestamp(uint32_t screenId,uint32_t layerId,GraphicPresentTimestamp & timestamp)588 int32_t HdiDeviceImpl::GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp &timestamp)
589 {
590     CHECK_FUNC(g_composer);
591     PresentTimestamp hdiTimestamp = {HARDWARE_DISPLAY_PTS_UNSUPPORTED, 0};
592     int32_t ret = g_composer->GetHwPresentTimestamp(screenId, layerId, hdiTimestamp);
593     if (ret == GRAPHIC_DISPLAY_SUCCESS) {
594         timestamp.time = hdiTimestamp.time;
595         timestamp.type = static_cast<GraphicPresentTimestampType>(hdiTimestamp.type);
596     }
597     return ret;
598 }
599 
SetLayerMaskInfo(uint32_t screenId,uint32_t layerId,uint32_t maskInfo)600 int32_t HdiDeviceImpl::SetLayerMaskInfo(uint32_t screenId, uint32_t layerId, uint32_t maskInfo)
601 {
602     CHECK_FUNC(g_composer);
603     MaskInfo info = static_cast<MaskInfo>(maskInfo);
604     return g_composer->SetLayerMaskInfo(screenId, layerId, info);
605 }
606 
607 /* set & get device layer info end */
CreateLayer(uint32_t screenId,const GraphicLayerInfo & layerInfo,uint32_t cacheCount,uint32_t & layerId)608 int32_t HdiDeviceImpl::CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t cacheCount,
609                                    uint32_t &layerId)
610 {
611     CHECK_FUNC(g_composer);
612     LayerInfo hdiLayerInfo = {
613         .width = layerInfo.width,
614         .height = layerInfo.height,
615         .type = static_cast<LayerType>(layerInfo.type),
616         .pixFormat = static_cast<PixelFormat>(layerInfo.pixFormat),
617     };
618     return g_composer->CreateLayer(screenId, hdiLayerInfo, cacheCount, layerId);
619 }
620 
CloseLayer(uint32_t screenId,uint32_t layerId)621 int32_t HdiDeviceImpl::CloseLayer(uint32_t screenId, uint32_t layerId)
622 {
623     CHECK_FUNC(g_composer);
624     return g_composer->DestroyLayer(screenId, layerId);
625 }
626 
627 } // namespace Rosen
628 } // namespace OHOS
629