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