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