1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hdi_device_impl.h"
17 #include "hdi_log.h"
18 #include <cstddef>
19 #include <cstdlib>
20 #include <mutex>
21 #include <scoped_bytrace.h>
22 #include <securec.h>
23 #include "v1_2/include/idisplay_composer_interface.h"
24
25 #define CHECK_FUNC(composerSptr) \
26 do { \
27 if ((composerSptr) == nullptr) { \
28 HLOGD("[%{public}s]composerSptr is nullptr.", __func__); \
29 return GRAPHIC_DISPLAY_NULL_PTR; \
30 } \
31 } while (0)
32
33 namespace OHOS {
34 namespace Rosen {
35 namespace {
36 using namespace OHOS::HDI::Display::Composer::V1_0;
37 using namespace OHOS::HDI::Display::Composer::V1_1;
38 using namespace OHOS::HDI::Display::Composer::V1_2;
39 using IDisplayComposerInterfaceSptr = sptr<Composer::V1_2::IDisplayComposerInterface>;
40 static IDisplayComposerInterfaceSptr g_composer;
41 }
42
43 class HwcDeathRecipient : public IRemoteObject::DeathRecipient {
44 public:
HwcDeathRecipient(OnHwcDeadCallback callback=nullptr,void * data=nullptr)45 explicit HwcDeathRecipient(OnHwcDeadCallback callback = nullptr, void *data = nullptr)
46 : deathCbFunc_(callback), data_(data) {}
OnRemoteDied(const wptr<IRemoteObject> & object)47 void OnRemoteDied(const wptr<IRemoteObject> &object) override
48 {
49 if (deathCbFunc_ != nullptr) {
50 HLOGI("%{public}s: notify the death event of composer to RS", __func__);
51 deathCbFunc_(data_);
52 }
53 }
54 private:
55 OnHwcDeadCallback deathCbFunc_;
56 void *data_;
57 };
58
HdiDeviceImpl()59 HdiDeviceImpl::HdiDeviceImpl()
60 {
61 }
62
~HdiDeviceImpl()63 HdiDeviceImpl::~HdiDeviceImpl()
64 {
65 Destroy();
66 }
67
Init()68 bool HdiDeviceImpl::Init()
69 {
70 if (g_composer == nullptr) {
71 g_composer = Composer::V1_2::IDisplayComposerInterface::Get();
72 if (g_composer == nullptr) {
73 HLOGE("IDisplayComposerInterface::Get return nullptr.");
74 return false;
75 }
76 }
77 return true;
78 }
79
Destroy()80 void HdiDeviceImpl::Destroy()
81 {
82 g_composer = nullptr;
83 }
84
85 /* set & get device screen info begin */
RegHotPlugCallback(HotPlugCallback callback,void * data)86 int32_t HdiDeviceImpl::RegHotPlugCallback(HotPlugCallback callback, void *data)
87 {
88 CHECK_FUNC(g_composer);
89 return g_composer->RegHotPlugCallback(callback, data);
90 }
91
RegHwcDeadCallback(OnHwcDeadCallback callback,void * data)92 bool HdiDeviceImpl::RegHwcDeadCallback(OnHwcDeadCallback callback, void *data)
93 {
94 CHECK_FUNC(g_composer);
95 sptr<HwcDeathRecipient> recipient = new HwcDeathRecipient(callback, data);
96 return g_composer->AddDeathRecipient(recipient);
97 }
98
RegRefreshCallback(RefreshCallback callback,void * data)99 int32_t HdiDeviceImpl::RegRefreshCallback(RefreshCallback callback, void *data)
100 {
101 CHECK_FUNC(g_composer);
102 return g_composer->RegRefreshCallback(callback, data);
103 }
104
RegScreenVBlankCallback(uint32_t screenId,VBlankCallback callback,void * data)105 int32_t HdiDeviceImpl::RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data)
106 {
107 CHECK_FUNC(g_composer);
108 return g_composer->RegDisplayVBlankCallback(screenId, callback, data);
109 }
110
RegScreenVBlankIdleCallback(OnVBlankIdleCallback callback,void * data)111 int32_t HdiDeviceImpl::RegScreenVBlankIdleCallback(OnVBlankIdleCallback callback, void *data)
112 {
113 CHECK_FUNC(g_composer);
114 return g_composer->RegDisplayVBlankIdleCallback(callback, data);
115 }
116
SetScreenConstraint(uint32_t screenId,uint64_t frameId,uint64_t timestamp,uint32_t type)117 int32_t HdiDeviceImpl::SetScreenConstraint(uint32_t screenId, uint64_t frameId, uint64_t timestamp, uint32_t type)
118 {
119 CHECK_FUNC(g_composer);
120 return g_composer->SetDisplayConstraint(screenId, frameId, timestamp, type);
121 }
122
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
SetScreenOverlayResolution(uint32_t screenId,uint32_t width,uint32_t height)206 int32_t HdiDeviceImpl::SetScreenOverlayResolution(uint32_t screenId, uint32_t width, uint32_t height)
207 {
208 CHECK_FUNC(g_composer);
209 return g_composer->SetDisplayOverlayResolution(screenId, width, height);
210 }
211
GetScreenPowerStatus(uint32_t screenId,GraphicDispPowerStatus & status)212 int32_t HdiDeviceImpl::GetScreenPowerStatus(uint32_t screenId, GraphicDispPowerStatus &status)
213 {
214 CHECK_FUNC(g_composer);
215 Composer::V1_0::DispPowerStatus hdiStatus;
216 int32_t ret = g_composer->GetDisplayPowerStatus(screenId, hdiStatus);
217 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
218 status = static_cast<GraphicDispPowerStatus>(hdiStatus);
219 }
220 return ret;
221 }
222
SetScreenPowerStatus(uint32_t screenId,GraphicDispPowerStatus status)223 int32_t HdiDeviceImpl::SetScreenPowerStatus(uint32_t screenId, GraphicDispPowerStatus status)
224 {
225 CHECK_FUNC(g_composer);
226 return g_composer->SetDisplayPowerStatus(screenId, static_cast<Composer::V1_0::DispPowerStatus>(status));
227 }
228
GetScreenBacklight(uint32_t screenId,uint32_t & level)229 int32_t HdiDeviceImpl::GetScreenBacklight(uint32_t screenId, uint32_t &level)
230 {
231 CHECK_FUNC(g_composer);
232 return g_composer->GetDisplayBacklight(screenId, level);
233 }
234
SetScreenBacklight(uint32_t screenId,uint32_t level)235 int32_t HdiDeviceImpl::SetScreenBacklight(uint32_t screenId, uint32_t level)
236 {
237 CHECK_FUNC(g_composer);
238 return g_composer->SetDisplayBacklight(screenId, level);
239 }
240
PrepareScreenLayers(uint32_t screenId,bool & needFlush)241 int32_t HdiDeviceImpl::PrepareScreenLayers(uint32_t screenId, bool &needFlush)
242 {
243 CHECK_FUNC(g_composer);
244 return g_composer->PrepareDisplayLayers(screenId, needFlush);
245 }
246
GetScreenCompChange(uint32_t screenId,std::vector<uint32_t> & layersId,std::vector<int32_t> & types)247 int32_t HdiDeviceImpl::GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
248 std::vector<int32_t> &types)
249 {
250 CHECK_FUNC(g_composer);
251 return g_composer->GetDisplayCompChange(screenId, layersId, types);
252 }
253
SetScreenClientBuffer(uint32_t screenId,const BufferHandle * buffer,uint32_t cacheIndex,const sptr<SyncFence> & fence)254 int32_t HdiDeviceImpl::SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer, uint32_t cacheIndex,
255 const sptr<SyncFence> &fence)
256 {
257 CHECK_FUNC(g_composer);
258 if ((buffer == nullptr && cacheIndex == INVALID_BUFFER_CACHE_INDEX) || fence == nullptr) {
259 return GRAPHIC_DISPLAY_PARAM_ERR;
260 }
261
262 return g_composer->SetDisplayClientBuffer(screenId, buffer, cacheIndex, fence->Get());
263 }
264
SetScreenClientBufferCacheCount(uint32_t screen,uint32_t count)265 int32_t HdiDeviceImpl::SetScreenClientBufferCacheCount(uint32_t screen, uint32_t count)
266 {
267 CHECK_FUNC(g_composer);
268 if (count == 0 || count > SURFACE_MAX_QUEUE_SIZE) {
269 return GRAPHIC_DISPLAY_PARAM_ERR;
270 }
271 return g_composer->SetClientBufferCacheCount(screen, count);
272 }
273
SetScreenClientDamage(uint32_t screenId,const std::vector<GraphicIRect> & damageRect)274 int32_t HdiDeviceImpl::SetScreenClientDamage(uint32_t screenId, const std::vector<GraphicIRect> &damageRect)
275 {
276 CHECK_FUNC(g_composer);
277 std::vector<IRect> hdiDamageRect;
278 for (auto iter = damageRect.begin(); iter != damageRect.end(); iter++) {
279 IRect tempDamageRect = {
280 .x = iter->x,
281 .y = iter->y,
282 .w = iter->w,
283 .h = iter->h,
284 };
285 hdiDamageRect.emplace_back(tempDamageRect);
286 }
287 return g_composer->SetDisplayClientDamage(screenId, hdiDamageRect);
288 }
289
GetScreenSupportedColorGamuts(uint32_t screenId,std::vector<GraphicColorGamut> & gamuts)290 int32_t HdiDeviceImpl::GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts)
291 {
292 CHECK_FUNC(g_composer);
293 std::vector<ColorGamut> hdiGamuts;
294 int32_t ret = g_composer->GetDisplaySupportedColorGamuts(screenId, hdiGamuts);
295 if (ret != GRAPHIC_DISPLAY_SUCCESS) {
296 return ret;
297 }
298
299 gamuts.clear();
300 gamuts.reserve(hdiGamuts.size());
301 for (auto iter = hdiGamuts.begin(); iter != hdiGamuts.end(); iter++) {
302 GraphicColorGamut tempGamut = static_cast<GraphicColorGamut>(*iter);
303 gamuts.emplace_back(tempGamut);
304 }
305 return ret;
306 }
307
SetScreenColorGamut(uint32_t screenId,GraphicColorGamut gamut)308 int32_t HdiDeviceImpl::SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut)
309 {
310 CHECK_FUNC(g_composer);
311 return g_composer->SetDisplayColorGamut(screenId, static_cast<ColorGamut>(gamut));
312 }
313
GetScreenColorGamut(uint32_t screenId,GraphicColorGamut & gamut)314 int32_t HdiDeviceImpl::GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut)
315 {
316 CHECK_FUNC(g_composer);
317 ColorGamut hdiGamut;
318 int32_t ret = g_composer->GetDisplayColorGamut(screenId, hdiGamut);
319 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
320 gamut = static_cast<GraphicColorGamut>(hdiGamut);
321 }
322 return ret;
323 }
324
SetScreenGamutMap(uint32_t screenId,GraphicGamutMap gamutMap)325 int32_t HdiDeviceImpl::SetScreenGamutMap(uint32_t screenId, GraphicGamutMap gamutMap)
326 {
327 CHECK_FUNC(g_composer);
328 return g_composer->SetDisplayGamutMap(screenId, static_cast<GamutMap>(gamutMap));
329 }
330
GetScreenGamutMap(uint32_t screenId,GraphicGamutMap & gamutMap)331 int32_t HdiDeviceImpl::GetScreenGamutMap(uint32_t screenId, GraphicGamutMap &gamutMap)
332 {
333 CHECK_FUNC(g_composer);
334 GamutMap hdiGamutMap;
335 int32_t ret = g_composer->GetDisplayGamutMap(screenId, hdiGamutMap);
336 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
337 gamutMap = static_cast<GraphicGamutMap>(hdiGamutMap);
338 }
339 return ret;
340 }
341
SetScreenColorTransform(uint32_t screenId,const std::vector<float> & matrix)342 int32_t HdiDeviceImpl::SetScreenColorTransform(uint32_t screenId, const std::vector<float> &matrix)
343 {
344 CHECK_FUNC(g_composer);
345 return g_composer->SetDisplayColorTransform(screenId, matrix);
346 }
347
GetHDRCapabilityInfos(uint32_t screenId,GraphicHDRCapability & info)348 int32_t HdiDeviceImpl::GetHDRCapabilityInfos(uint32_t screenId, GraphicHDRCapability &info)
349 {
350 CHECK_FUNC(g_composer);
351 HDRCapability hdiInfo;
352 int32_t ret = g_composer->GetHDRCapabilityInfos(screenId, hdiInfo);
353 if (ret != GRAPHIC_DISPLAY_SUCCESS) {
354 return ret;
355 }
356 uint32_t formatCount = hdiInfo.formatCount;
357 info.formats.clear();
358 info.formats.reserve(formatCount);
359 for (uint32_t i = 0; i < formatCount; i++) {
360 info.formats.emplace_back(static_cast<GraphicHDRFormat>(hdiInfo.formats[i]));
361 }
362 info.maxLum = hdiInfo.maxLum;
363 info.maxAverageLum = hdiInfo.maxAverageLum;
364 info.minLum = hdiInfo.minLum;
365 return ret;
366 }
367
GetSupportedMetaDataKey(uint32_t screenId,std::vector<GraphicHDRMetadataKey> & keys)368 int32_t HdiDeviceImpl::GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys)
369 {
370 CHECK_FUNC(g_composer);
371 std::vector<HDRMetadataKey> hdiKeys;
372 int32_t ret = g_composer->GetSupportedMetadataKey(screenId, hdiKeys);
373 if (ret != GRAPHIC_DISPLAY_SUCCESS) {
374 return ret;
375 }
376 keys.clear();
377 keys.reserve(hdiKeys.size());
378 for (auto iter = hdiKeys.begin(); iter != hdiKeys.end(); iter++) {
379 keys.emplace_back(static_cast<GraphicHDRMetadataKey>(*iter));
380 }
381 return ret;
382 }
383
Commit(uint32_t screenId,sptr<SyncFence> & fence)384 int32_t HdiDeviceImpl::Commit(uint32_t screenId, sptr<SyncFence> &fence)
385 {
386 ScopedBytrace bytrace(__func__);
387 CHECK_FUNC(g_composer);
388 int32_t fenceFd = -1;
389 int32_t ret = g_composer->Commit(screenId, fenceFd);
390
391 if (fenceFd >= 0) {
392 fence = new SyncFence(fenceFd);
393 } else {
394 fence = new SyncFence(-1);
395 }
396
397 return ret;
398 }
399
CommitAndGetReleaseFence(uint32_t screenId,sptr<SyncFence> & fence,int32_t & skipState,bool & needFlush,std::vector<uint32_t> & layers,std::vector<sptr<SyncFence>> & fences,bool isValidated)400 int32_t HdiDeviceImpl::CommitAndGetReleaseFence(uint32_t screenId, sptr<SyncFence> &fence, int32_t &skipState,
401 bool &needFlush, std::vector<uint32_t> &layers, std::vector<sptr<SyncFence>> &fences, bool isValidated)
402 {
403 ScopedBytrace bytrace(__func__);
404 CHECK_FUNC(g_composer);
405 int32_t fenceFd = -1;
406 std::vector<int32_t> fenceFds;
407
408 int32_t ret = g_composer->CommitAndGetReleaseFence(
409 screenId, fenceFd, skipState, needFlush, layers, fenceFds, isValidated);
410
411 if (skipState == 0 || fenceFd >= 0) {
412 fence = new SyncFence(fenceFd);
413 } else {
414 fence = new SyncFence(-1);
415 }
416
417 size_t fencesNum = fenceFds.size();
418 fences.resize(fencesNum);
419 for (size_t i = 0; i < fencesNum; i++) {
420 if (fenceFds[i] >= 0) {
421 fences[i] = new SyncFence(fenceFds[i]);
422 } else {
423 fences[i] = new SyncFence(-1);
424 }
425 }
426 return ret;
427 }
428 /* set & get device screen info end */
429
430 /* set & get device layer info begin */
SetLayerAlpha(uint32_t screenId,uint32_t layerId,const GraphicLayerAlpha & alpha)431 int32_t HdiDeviceImpl::SetLayerAlpha(uint32_t screenId, uint32_t layerId, const GraphicLayerAlpha &alpha)
432 {
433 CHECK_FUNC(g_composer);
434 LayerAlpha hdiLayerAlpha = {
435 .enGlobalAlpha = alpha.enGlobalAlpha,
436 .enPixelAlpha = alpha.enPixelAlpha,
437 .alpha0 = alpha.alpha0,
438 .alpha1 = alpha.alpha1,
439 .gAlpha = alpha.gAlpha,
440 };
441 return g_composer->SetLayerAlpha(screenId, layerId, hdiLayerAlpha);
442 }
443
SetLayerSize(uint32_t screenId,uint32_t layerId,const GraphicIRect & layerRect)444 int32_t HdiDeviceImpl::SetLayerSize(uint32_t screenId, uint32_t layerId, const GraphicIRect &layerRect)
445 {
446 CHECK_FUNC(g_composer);
447 IRect hdiLayerRect = {
448 .x = layerRect.x,
449 .y = layerRect.y,
450 .w = layerRect.w,
451 .h = layerRect.h,
452 };
453 return g_composer->SetLayerRegion(screenId, layerId, hdiLayerRect);
454 }
455
SetTransformMode(uint32_t screenId,uint32_t layerId,GraphicTransformType type)456 int32_t HdiDeviceImpl::SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type)
457 {
458 CHECK_FUNC(g_composer);
459 TransformType hdiType = static_cast<TransformType>(type);
460 return g_composer->SetLayerTransformMode(screenId, layerId, hdiType);
461 }
462
SetLayerVisibleRegion(uint32_t screenId,uint32_t layerId,const std::vector<GraphicIRect> & visible)463 int32_t HdiDeviceImpl::SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId,
464 const std::vector<GraphicIRect> &visible)
465 {
466 CHECK_FUNC(g_composer);
467 std::vector<IRect> hdiVisibleRects;
468 for (auto iter = visible.begin(); iter != visible.end(); iter++) {
469 IRect tempVisibleRect = {
470 .x = iter->x,
471 .y = iter->y,
472 .w = iter->w,
473 .h = iter->h,
474 };
475 hdiVisibleRects.emplace_back(tempVisibleRect);
476 }
477 return g_composer->SetLayerVisibleRegion(screenId, layerId, hdiVisibleRects);
478 }
479
SetLayerDirtyRegion(uint32_t screenId,uint32_t layerId,const std::vector<GraphicIRect> & dirtyRegions)480 int32_t HdiDeviceImpl::SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId,
481 const std::vector<GraphicIRect> &dirtyRegions)
482 {
483 CHECK_FUNC(g_composer);
484 std::vector<IRect> hdiDirtyRegions;
485 for (auto iter = dirtyRegions.begin(); iter != dirtyRegions.end(); iter++) {
486 IRect hdiDirtyRect = {
487 .x = iter->x,
488 .y = iter->y,
489 .w = iter->w,
490 .h = iter->h,
491 };
492 hdiDirtyRegions.emplace_back(hdiDirtyRect);
493 }
494 return g_composer->SetLayerDirtyRegion(screenId, layerId, hdiDirtyRegions);
495 }
496
SetLayerBuffer(uint32_t screenId,uint32_t layerId,const GraphicLayerBuffer & layerBuffer)497 int32_t HdiDeviceImpl::SetLayerBuffer(uint32_t screenId, uint32_t layerId, const GraphicLayerBuffer &layerBuffer)
498 {
499 CHECK_FUNC(g_composer);
500 if ((layerBuffer.handle == nullptr && layerBuffer.cacheIndex == INVALID_BUFFER_CACHE_INDEX) ||
501 layerBuffer.acquireFence == nullptr) {
502 return GRAPHIC_DISPLAY_PARAM_ERR;
503 }
504 int32_t fenceFd = (layerBuffer.acquireFence)->Get();
505 return g_composer->SetLayerBuffer(screenId, layerId, layerBuffer.handle, layerBuffer.cacheIndex,
506 fenceFd, layerBuffer.deletingList);
507 }
508
SetLayerCompositionType(uint32_t screenId,uint32_t layerId,GraphicCompositionType type)509 int32_t HdiDeviceImpl::SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type)
510 {
511 CHECK_FUNC(g_composer);
512 Composer::V1_0::CompositionType hdiType = static_cast<Composer::V1_0::CompositionType>(type);
513 return g_composer->SetLayerCompositionType(screenId, layerId, hdiType);
514 }
515
SetLayerBlendType(uint32_t screenId,uint32_t layerId,GraphicBlendType type)516 int32_t HdiDeviceImpl::SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type)
517 {
518 CHECK_FUNC(g_composer);
519 BlendType hdiBlendType = static_cast<BlendType>(type);
520 return g_composer->SetLayerBlendType(screenId, layerId, hdiBlendType);
521 }
522
SetLayerCrop(uint32_t screenId,uint32_t layerId,const GraphicIRect & crop)523 int32_t HdiDeviceImpl::SetLayerCrop(uint32_t screenId, uint32_t layerId, const GraphicIRect &crop)
524 {
525 CHECK_FUNC(g_composer);
526 IRect hdiCropRect = {
527 .x = crop.x,
528 .y = crop.y,
529 .w = crop.w,
530 .h = crop.h,
531 };
532 return g_composer->SetLayerCrop(screenId, layerId, hdiCropRect);
533 }
534
SetLayerZorder(uint32_t screenId,uint32_t layerId,uint32_t zorder)535 int32_t HdiDeviceImpl::SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder)
536 {
537 CHECK_FUNC(g_composer);
538 return g_composer->SetLayerZorder(screenId, layerId, zorder);
539 }
540
SetLayerPreMulti(uint32_t screenId,uint32_t layerId,bool isPreMulti)541 int32_t HdiDeviceImpl::SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti)
542 {
543 CHECK_FUNC(g_composer);
544 return g_composer->SetLayerPreMulti(screenId, layerId, isPreMulti);
545 }
546
SetLayerColor(uint32_t screenId,uint32_t layerId,GraphicLayerColor layerColor)547 int32_t HdiDeviceImpl::SetLayerColor(uint32_t screenId, uint32_t layerId, GraphicLayerColor layerColor)
548 {
549 CHECK_FUNC(g_composer);
550 LayerColor color = {
551 .r = layerColor.r,
552 .g = layerColor.g,
553 .b = layerColor.b,
554 .a = layerColor.a
555 };
556
557 HLOGD("SetLayerColor screenId:%{public}u, layerId:%{public}u", screenId, layerId);
558
559 return g_composer->SetLayerColor(screenId, layerId, color);
560 }
561
SetLayerColorTransform(uint32_t screenId,uint32_t layerId,const std::vector<float> & matrix)562 int32_t HdiDeviceImpl::SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const std::vector<float> &matrix)
563 {
564 CHECK_FUNC(g_composer);
565 return g_composer->SetLayerColorTransform(screenId, layerId, matrix);
566 }
567
SetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace colorSpace)568 int32_t HdiDeviceImpl::SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace)
569 {
570 CHECK_FUNC(g_composer);
571 ColorDataSpace hdiColorDataSpace = static_cast<ColorDataSpace>(colorSpace);
572 return g_composer->SetLayerColorDataSpace(screenId, layerId, hdiColorDataSpace);
573 }
574
GetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace & colorSpace)575 int32_t HdiDeviceImpl::GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace)
576 {
577 CHECK_FUNC(g_composer);
578 ColorDataSpace hdiColorDataSpace = COLOR_DATA_SPACE_UNKNOWN;
579 int32_t ret = g_composer->GetLayerColorDataSpace(screenId, layerId, hdiColorDataSpace);
580 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
581 colorSpace = static_cast<GraphicColorDataSpace>(hdiColorDataSpace);
582 }
583 return ret;
584 }
585
SetLayerMetaData(uint32_t screenId,uint32_t layerId,const std::vector<GraphicHDRMetaData> & metaData)586 int32_t HdiDeviceImpl::SetLayerMetaData(uint32_t screenId, uint32_t layerId,
587 const std::vector<GraphicHDRMetaData> &metaData)
588 {
589 CHECK_FUNC(g_composer);
590 std::vector<HDRMetaData> hdiMetaDatas;
591 std::size_t metaDataSize = metaData.size();
592 for (std::size_t i = 0; i < metaDataSize; i++) {
593 HDRMetaData hdiMetaData = {
594 .key = static_cast<HDRMetadataKey>(metaData[i].key),
595 .value = metaData[i].value,
596 };
597 hdiMetaDatas.emplace_back(hdiMetaData);
598 }
599 return g_composer->SetLayerMetaData(screenId, layerId, hdiMetaDatas);
600 }
601
SetLayerMetaDataSet(uint32_t screenId,uint32_t layerId,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)602 int32_t HdiDeviceImpl::SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
603 const std::vector<uint8_t> &metaData)
604 {
605 CHECK_FUNC(g_composer);
606 HDRMetadataKey hdiKey = static_cast<HDRMetadataKey>(key);
607 return g_composer->SetLayerMetaDataSet(screenId, layerId, hdiKey, metaData);
608 }
609
GetSupportedLayerPerFrameParameterKey()610 std::vector<std::string>& HdiDeviceImpl::GetSupportedLayerPerFrameParameterKey()
611 {
612 std::call_once(layerPerFrameParameterKeyCreateFlag_, [this]() {
613 CHECK_FUNC(g_composer);
614 if (g_composer->GetSupportedLayerPerFrameParameterKey(layerPerFrameParameterKeys_) != 0) {
615 HLOGW("get supported layer perframe parameter key failed!");
616 }
617
618 return GRAPHIC_DISPLAY_SUCCESS;
619 });
620
621 return layerPerFrameParameterKeys_;
622 }
623
SetLayerPerFrameParameter(uint32_t devId,uint32_t layerId,const std::string & key,const std::vector<int8_t> & value)624 int32_t HdiDeviceImpl::SetLayerPerFrameParameter(uint32_t devId, uint32_t layerId, const std::string& key,
625 const std::vector<int8_t>& value)
626 {
627 CHECK_FUNC(g_composer);
628 return g_composer->SetLayerPerFrameParameter(devId, layerId, key, value);
629 }
630
SetLayerTunnelHandle(uint32_t screenId,uint32_t layerId,GraphicExtDataHandle * handle)631 int32_t HdiDeviceImpl::SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle)
632 {
633 CHECK_FUNC(g_composer);
634 return g_composer->SetLayerTunnelHandle(screenId, layerId, (*(reinterpret_cast<ExtDataHandle *>(handle))));
635 }
636
GetSupportedPresentTimestampType(uint32_t screenId,uint32_t layerId,GraphicPresentTimestampType & type)637 int32_t HdiDeviceImpl::GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
638 GraphicPresentTimestampType &type)
639 {
640 CHECK_FUNC(g_composer);
641 PresentTimestampType hdiType = PresentTimestampType::HARDWARE_DISPLAY_PTS_UNSUPPORTED;
642 int32_t ret = g_composer->GetSupportedPresentTimestamp(screenId, layerId, hdiType);
643 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
644 type = static_cast<GraphicPresentTimestampType>(hdiType);
645 }
646 return ret;
647 }
648
GetPresentTimestamp(uint32_t screenId,uint32_t layerId,GraphicPresentTimestamp & timestamp)649 int32_t HdiDeviceImpl::GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp ×tamp)
650 {
651 CHECK_FUNC(g_composer);
652 PresentTimestamp hdiTimestamp = {HARDWARE_DISPLAY_PTS_UNSUPPORTED, 0};
653 int32_t ret = g_composer->GetHwPresentTimestamp(screenId, layerId, hdiTimestamp);
654 if (ret == GRAPHIC_DISPLAY_SUCCESS) {
655 timestamp.time = hdiTimestamp.time;
656 timestamp.type = static_cast<GraphicPresentTimestampType>(hdiTimestamp.type);
657 }
658 return ret;
659 }
660
SetLayerMaskInfo(uint32_t screenId,uint32_t layerId,uint32_t maskInfo)661 int32_t HdiDeviceImpl::SetLayerMaskInfo(uint32_t screenId, uint32_t layerId, uint32_t maskInfo)
662 {
663 CHECK_FUNC(g_composer);
664 MaskInfo info = static_cast<MaskInfo>(maskInfo);
665 return g_composer->SetLayerMaskInfo(screenId, layerId, info);
666 }
667
668 /* set & get device layer info end */
CreateLayer(uint32_t screenId,const GraphicLayerInfo & layerInfo,uint32_t cacheCount,uint32_t & layerId)669 int32_t HdiDeviceImpl::CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t cacheCount,
670 uint32_t &layerId)
671 {
672 CHECK_FUNC(g_composer);
673 LayerInfo hdiLayerInfo = {
674 .width = layerInfo.width,
675 .height = layerInfo.height,
676 .type = static_cast<LayerType>(layerInfo.type),
677 .pixFormat = static_cast<Composer::V1_0::PixelFormat>(layerInfo.pixFormat),
678 };
679 return g_composer->CreateLayer(screenId, hdiLayerInfo, cacheCount, layerId);
680 }
681
CloseLayer(uint32_t screenId,uint32_t layerId)682 int32_t HdiDeviceImpl::CloseLayer(uint32_t screenId, uint32_t layerId)
683 {
684 CHECK_FUNC(g_composer);
685 return g_composer->DestroyLayer(screenId, layerId);
686 }
687
ClearLayerBuffer(uint32_t screenId,uint32_t layerId)688 int32_t HdiDeviceImpl::ClearLayerBuffer(uint32_t screenId, uint32_t layerId)
689 {
690 CHECK_FUNC(g_composer);
691 return g_composer->ClearLayerBuffer(screenId, layerId);
692 }
693
ClearClientBuffer(uint32_t screenId)694 int32_t HdiDeviceImpl::ClearClientBuffer(uint32_t screenId)
695 {
696 CHECK_FUNC(g_composer);
697 return g_composer->ClearClientBuffer(screenId);
698 }
699
700 } // namespace Rosen
701 } // namespace OHOS
702