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