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