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