1 /*
2 * Copyright (c) 2021 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 "render_frame_trace.h"
17 #include "hdi_device.h"
18 #include "platform/common/rs_system_properties.h"
19
20 #include <cstddef>
21 #include <cstdint>
22 #include <mutex>
23
24 #include <scoped_bytrace.h>
25 #include <vector>
26 using namespace FRAME_TRACE;
27 static const std::string RS_INTERVAL_NAME = "renderservice";
28
29 #define CHECK_FUNC(device, deviceFunc) \
30 do { \
31 if (!checkPtr(device, #device)) { \
32 return DISPLAY_NULL_PTR; \
33 } \
34 if (!checkPtr(deviceFunc, __FUNCTION__)) { \
35 return DISPLAY_NULL_PTR; \
36 } \
37 } while(0)
38
39 namespace OHOS {
40 namespace Rosen {
GetInstance()41 HdiDevice* HdiDevice::GetInstance()
42 {
43 static HdiDevice instance;
44
45 static std::mutex mutex;
46 std::lock_guard<std::mutex> lock(mutex);
47 {
48 if (instance.Init() != ROSEN_ERROR_OK) {
49 return nullptr;
50 }
51 }
52
53 return &instance;
54 }
55
HdiDevice()56 HdiDevice::HdiDevice()
57 {
58 }
59
~HdiDevice()60 HdiDevice::~HdiDevice()
61 {
62 Destroy();
63 }
64
Init()65 RosenError HdiDevice::Init()
66 {
67 if (deviceFuncs_ == nullptr) {
68 int32_t ret = DeviceInitialize(&deviceFuncs_);
69 if (ret != DISPLAY_SUCCESS || deviceFuncs_ == nullptr) {
70 HLOGE("DeviceInitialize failed, ret is %{public}d", ret);
71 return ROSEN_ERROR_NOT_INIT;
72 }
73 }
74
75 if (layerFuncs_ == nullptr) {
76 int32_t ret = LayerInitialize(&layerFuncs_);
77 if (ret != DISPLAY_SUCCESS || layerFuncs_ == nullptr) {
78 Destroy();
79 HLOGE("LayerInitialize failed, ret is %{public}d", ret);
80 return ROSEN_ERROR_NOT_INIT;
81 }
82 }
83
84 return ROSEN_ERROR_OK;
85 }
86
Destroy()87 void HdiDevice::Destroy()
88 {
89 if (deviceFuncs_ != nullptr) {
90 int32_t ret = DeviceUninitialize(deviceFuncs_);
91 if (ret != DISPLAY_SUCCESS) {
92 HLOGE("DeviceUninitialize failed, ret is %{public}d", ret);
93 }
94 deviceFuncs_ = nullptr;
95 }
96
97 if (layerFuncs_ != nullptr) {
98 int32_t ret = LayerUninitialize(layerFuncs_);
99 if (ret != DISPLAY_SUCCESS) {
100 HLOGE("LayerUninitialize failed, ret is %{public}d", ret);
101 }
102 layerFuncs_ = nullptr;
103 }
104 }
105
106 /* set & get device screen info begin */
RegHotPlugCallback(HotPlugCallback callback,void * data)107 int32_t HdiDevice::RegHotPlugCallback(HotPlugCallback callback, void *data)
108 {
109 CHECK_FUNC(deviceFuncs_, deviceFuncs_->RegHotPlugCallback);
110 return deviceFuncs_->RegHotPlugCallback(callback, data);
111 }
112
RegScreenVBlankCallback(uint32_t screenId,VBlankCallback callback,void * data)113 int32_t HdiDevice::RegScreenVBlankCallback(uint32_t screenId, VBlankCallback callback, void *data)
114 {
115 CHECK_FUNC(deviceFuncs_, deviceFuncs_->RegDisplayVBlankCallback);
116 return deviceFuncs_->RegDisplayVBlankCallback(screenId, callback, data);
117 }
118
SetScreenVsyncEnabled(uint32_t screenId,bool enabled)119 int32_t HdiDevice::SetScreenVsyncEnabled(uint32_t screenId, bool enabled)
120 {
121 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayVsyncEnabled);
122 return deviceFuncs_->SetDisplayVsyncEnabled(screenId, enabled);
123 }
124
GetScreenCapability(uint32_t screenId,DisplayCapability & info)125 int32_t HdiDevice::GetScreenCapability(uint32_t screenId, DisplayCapability &info)
126 {
127 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayCapability);
128 return deviceFuncs_->GetDisplayCapability(screenId, &info);
129 }
130
GetScreenSupportedModes(uint32_t screenId,std::vector<DisplayModeInfo> & modes)131 int32_t HdiDevice::GetScreenSupportedModes(uint32_t screenId, std::vector<DisplayModeInfo> &modes)
132 {
133 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplaySupportedModes);
134
135 uint32_t num = 0;
136 int32_t ret = deviceFuncs_->GetDisplaySupportedModes(screenId, &num, nullptr);
137 if (ret != DISPLAY_SUCCESS) {
138 return ret;
139 }
140
141 if (num > 0) {
142 modes.resize(static_cast<uint32_t>(num));
143 return deviceFuncs_->GetDisplaySupportedModes(screenId, &num, modes.data());
144 }
145
146 return ret;
147 }
148
GetScreenMode(uint32_t screenId,uint32_t & modeId)149 int32_t HdiDevice::GetScreenMode(uint32_t screenId, uint32_t &modeId)
150 {
151 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayMode);
152 return deviceFuncs_->GetDisplayMode(screenId, &modeId);
153 }
154
SetScreenMode(uint32_t screenId,uint32_t modeId)155 int32_t HdiDevice::SetScreenMode(uint32_t screenId, uint32_t modeId)
156 {
157 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayMode);
158 return deviceFuncs_->SetDisplayMode(screenId, modeId);
159 }
160
GetScreenPowerStatus(uint32_t screenId,DispPowerStatus & status)161 int32_t HdiDevice::GetScreenPowerStatus(uint32_t screenId, DispPowerStatus &status)
162 {
163 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayPowerStatus);
164 return deviceFuncs_->GetDisplayPowerStatus(screenId, &status);
165 }
166
SetScreenPowerStatus(uint32_t screenId,DispPowerStatus status)167 int32_t HdiDevice::SetScreenPowerStatus(uint32_t screenId, DispPowerStatus status)
168 {
169 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayPowerStatus);
170 return deviceFuncs_->SetDisplayPowerStatus(screenId, status);
171 }
172
GetScreenBacklight(uint32_t screenId,uint32_t & level)173 int32_t HdiDevice::GetScreenBacklight(uint32_t screenId, uint32_t &level)
174 {
175 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayBacklight);
176 return deviceFuncs_->GetDisplayBacklight(screenId, &level);
177 }
178
SetScreenBacklight(uint32_t screenId,uint32_t level)179 int32_t HdiDevice::SetScreenBacklight(uint32_t screenId, uint32_t level)
180 {
181 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayBacklight);
182 return deviceFuncs_->SetDisplayBacklight(screenId, level);
183 }
184
PrepareScreenLayers(uint32_t screenId,bool & needFlush)185 int32_t HdiDevice::PrepareScreenLayers(uint32_t screenId, bool &needFlush)
186 {
187 CHECK_FUNC(deviceFuncs_, deviceFuncs_->PrepareDisplayLayers);
188 return deviceFuncs_->PrepareDisplayLayers(screenId, &needFlush);
189 }
190
GetScreenCompChange(uint32_t screenId,std::vector<uint32_t> & layersId,std::vector<int32_t> & types)191 int32_t HdiDevice::GetScreenCompChange(uint32_t screenId, std::vector<uint32_t> &layersId,
192 std::vector<int32_t> &types)
193 {
194 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayCompChange);
195
196 uint32_t layerNum = 0;
197 int32_t ret = deviceFuncs_->GetDisplayCompChange(screenId, &layerNum, nullptr, nullptr);
198 if (ret != DISPLAY_SUCCESS) {
199 return ret;
200 }
201
202 if (layerNum > 0) {
203 layersId.resize(layerNum);
204 types.resize(layerNum);
205 ret = deviceFuncs_->GetDisplayCompChange(screenId, &layerNum, layersId.data(), types.data());
206 }
207
208 return ret;
209 }
210
SetScreenClientBuffer(uint32_t screenId,const BufferHandle * buffer,const sptr<SyncFence> & fence)211 int32_t HdiDevice::SetScreenClientBuffer(uint32_t screenId, const BufferHandle *buffer,
212 const sptr<SyncFence> &fence)
213 {
214 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayClientBuffer);
215
216 if (fence == nullptr) {
217 return DISPLAY_NULL_PTR;
218 }
219
220 int32_t fenceFd = fence->Get();
221 return deviceFuncs_->SetDisplayClientBuffer(screenId, buffer, fenceFd);
222 }
223
SetScreenClientDamage(uint32_t screenId,uint32_t num,IRect & damageRect)224 int32_t HdiDevice::SetScreenClientDamage(uint32_t screenId, uint32_t num, IRect &damageRect)
225 {
226 if (num != 1) {
227 return DISPLAY_NOT_SUPPORT;
228 }
229 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayClientDamage);
230 return deviceFuncs_->SetDisplayClientDamage(screenId, num, &damageRect);
231 }
232
GetScreenReleaseFence(uint32_t screenId,std::vector<uint32_t> & layers,std::vector<sptr<SyncFence>> & fences)233 int32_t HdiDevice::GetScreenReleaseFence(uint32_t screenId, std::vector<uint32_t> &layers,
234 std::vector<sptr<SyncFence>> &fences)
235 {
236 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayReleaseFence);
237
238 uint32_t layerNum = 0;
239 int32_t ret = deviceFuncs_->GetDisplayReleaseFence(screenId, &layerNum, nullptr, nullptr);
240 if (ret != DISPLAY_SUCCESS) {
241 return ret;
242 }
243
244 if (layerNum > 0) {
245 layers.resize(layerNum);
246 fences.resize(layerNum);
247 std::vector<int32_t> fenceFds;
248 fenceFds.resize(layerNum);
249
250 ret = deviceFuncs_->GetDisplayReleaseFence(screenId, &layerNum,
251 layers.data(), fenceFds.data());
252
253 for (uint32_t i = 0; i < fenceFds.size(); i++) {
254 if (fenceFds[i] >= 0) {
255 fences[i] = new SyncFence(fenceFds[i]);
256 } else {
257 fences[i] = new SyncFence(-1);
258 }
259 }
260 }
261
262 return ret;
263 }
264
GetScreenSupportedColorGamuts(uint32_t screenId,std::vector<GraphicColorGamut> & gamuts)265 int32_t HdiDevice::GetScreenSupportedColorGamuts(uint32_t screenId, std::vector<GraphicColorGamut> &gamuts)
266 {
267 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplaySupportedColorGamuts);
268 uint32_t num = 0;
269 int32_t ret = deviceFuncs_->GetDisplaySupportedColorGamuts(screenId, &num, nullptr);
270 if (ret != DISPLAY_SUCCESS) {
271 return ret;
272 }
273 if (num > 0) {
274 std::vector<ColorGamut> hdiGamuts;
275 hdiGamuts.resize(num);
276 ret = deviceFuncs_->GetDisplaySupportedColorGamuts(screenId, &num, hdiGamuts.data());
277 gamuts.resize(num);
278 for (uint32_t i = 0; i < num; i++) {
279 gamuts[i] = static_cast<GraphicColorGamut>(hdiGamuts[i]);
280 }
281 return ret;
282 }
283 return ret;
284 }
285
SetScreenColorGamut(uint32_t screenId,GraphicColorGamut gamut)286 int32_t HdiDevice::SetScreenColorGamut(uint32_t screenId, GraphicColorGamut gamut)
287 {
288 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayColorGamut);
289 return deviceFuncs_->SetDisplayColorGamut(screenId, static_cast<ColorGamut>(gamut));
290 }
291
GetScreenColorGamut(uint32_t screenId,GraphicColorGamut & gamut)292 int32_t HdiDevice::GetScreenColorGamut(uint32_t screenId, GraphicColorGamut &gamut)
293 {
294 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayColorGamut);
295 ColorGamut hdiGamut;
296 int32_t ret = deviceFuncs_->GetDisplayColorGamut(screenId, &hdiGamut);
297 if (ret == DISPLAY_SUCCESS) {
298 gamut = static_cast<GraphicColorGamut>(hdiGamut);
299 }
300 return ret;
301 }
302
SetScreenGamutMap(uint32_t screenId,GamutMap gamutMap)303 int32_t HdiDevice::SetScreenGamutMap(uint32_t screenId, GamutMap gamutMap)
304 {
305 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayGamutMap);
306 return deviceFuncs_->SetDisplayGamutMap(screenId, gamutMap);
307 }
308
GetScreenGamutMap(uint32_t screenId,GamutMap & gamutMap)309 int32_t HdiDevice::GetScreenGamutMap(uint32_t screenId, GamutMap &gamutMap)
310 {
311 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetDisplayGamutMap);
312 return deviceFuncs_->GetDisplayGamutMap(screenId, &gamutMap);
313 }
314
SetScreenColorTransform(uint32_t screenId,const float * matrix)315 int32_t HdiDevice::SetScreenColorTransform(uint32_t screenId, const float *matrix)
316 {
317 CHECK_FUNC(deviceFuncs_, deviceFuncs_->SetDisplayColorTransform);
318 return deviceFuncs_->SetDisplayColorTransform(screenId, matrix);
319 }
320
GetHDRCapabilityInfos(uint32_t screenId,HDRCapability & info)321 int32_t HdiDevice::GetHDRCapabilityInfos(uint32_t screenId, HDRCapability &info)
322 {
323 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetHDRCapabilityInfos);
324 return deviceFuncs_->GetHDRCapabilityInfos(screenId, &info);
325 }
326
GetSupportedMetaDataKey(uint32_t screenId,std::vector<GraphicHDRMetadataKey> & keys)327 int32_t HdiDevice::GetSupportedMetaDataKey(uint32_t screenId, std::vector<GraphicHDRMetadataKey> &keys)
328 {
329 CHECK_FUNC(deviceFuncs_, deviceFuncs_->GetSupportedMetadataKey);
330 uint32_t num = 0;
331 int32_t ret = deviceFuncs_->GetSupportedMetadataKey(screenId, &num, nullptr);
332 if (ret != DISPLAY_SUCCESS) {
333 return ret;
334 }
335 if (num > 0) {
336 std::vector<HDRMetadataKey> hdiKeys;
337 hdiKeys.resize(num);
338 ret = deviceFuncs_->GetSupportedMetadataKey(screenId, &num, hdiKeys.data());
339 keys.resize(num);
340 for (uint32_t i = 0; i < num; i++) {
341 keys[i] = static_cast<GraphicHDRMetadataKey>(hdiKeys[i]);
342 }
343 return ret;
344 }
345 return ret;
346 }
347
Commit(uint32_t screenId,sptr<SyncFence> & fence)348 int32_t HdiDevice::Commit(uint32_t screenId, sptr<SyncFence> &fence)
349 {
350 RenderFrameTrace::GetInstance().RenderEndFrameTrace(RS_INTERVAL_NAME);
351 ScopedBytrace bytrace(__func__);
352 CHECK_FUNC(deviceFuncs_, deviceFuncs_->Commit);
353
354 int32_t fenceFd = -1;
355 int32_t ret = deviceFuncs_->Commit(screenId, &fenceFd);
356
357 if (fenceFd >= 0) {
358 fence = new SyncFence(fenceFd);
359 } else {
360 fence = new SyncFence(-1);
361 }
362
363 return ret;
364 }
365 /* set & get device screen info end */
366
367 /* set & get device layer info begin */
SetLayerAlpha(uint32_t screenId,uint32_t layerId,GraphicLayerAlpha & alpha)368 int32_t HdiDevice::SetLayerAlpha(uint32_t screenId, uint32_t layerId, GraphicLayerAlpha &alpha)
369 {
370 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerAlpha);
371 LayerAlpha hdiAlpha = {
372 .enGlobalAlpha = alpha.enGlobalAlpha,
373 .enPixelAlpha = alpha.enPixelAlpha,
374 .alpha0 = alpha.alpha0,
375 .alpha1 = alpha.alpha1,
376 .gAlpha = alpha.gAlpha,
377 };
378 return layerFuncs_->SetLayerAlpha(screenId, layerId, &hdiAlpha);
379 }
380
SetLayerSize(uint32_t screenId,uint32_t layerId,IRect & layerRect)381 int32_t HdiDevice::SetLayerSize(uint32_t screenId, uint32_t layerId, IRect &layerRect)
382 {
383 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerSize);
384 return layerFuncs_->SetLayerSize(screenId, layerId, &layerRect);
385 }
386
SetTransformMode(uint32_t screenId,uint32_t layerId,GraphicTransformType type)387 int32_t HdiDevice::SetTransformMode(uint32_t screenId, uint32_t layerId, GraphicTransformType type)
388 {
389 CHECK_FUNC(layerFuncs_, layerFuncs_->SetTransformMode);
390 TransformType hdiType = static_cast<TransformType>(type);
391 return layerFuncs_->SetTransformMode(screenId, layerId, hdiType);
392 }
393
SetLayerVisibleRegion(uint32_t screenId,uint32_t layerId,uint32_t num,IRect & visible)394 int32_t HdiDevice::SetLayerVisibleRegion(uint32_t screenId, uint32_t layerId,
395 uint32_t num, IRect &visible)
396 {
397 if (num != 1) {
398 return DISPLAY_NOT_SUPPORT;
399 }
400 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerVisibleRegion);
401 return layerFuncs_->SetLayerVisibleRegion(screenId, layerId, num, &visible);
402 }
403
SetLayerDirtyRegion(uint32_t screenId,uint32_t layerId,IRect & dirty)404 int32_t HdiDevice::SetLayerDirtyRegion(uint32_t screenId, uint32_t layerId, IRect &dirty)
405 {
406 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerDirtyRegion);
407 return layerFuncs_->SetLayerDirtyRegion(screenId, layerId, &dirty);
408 }
409
SetLayerBuffer(uint32_t screenId,uint32_t layerId,const BufferHandle * handle,const sptr<SyncFence> & acquireFence)410 int32_t HdiDevice::SetLayerBuffer(uint32_t screenId, uint32_t layerId, const BufferHandle *handle,
411 const sptr<SyncFence> &acquireFence)
412 {
413 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerBuffer);
414
415 if (acquireFence == nullptr) {
416 return DISPLAY_NULL_PTR;
417 }
418
419 int32_t fenceFd = acquireFence->Get();
420 return layerFuncs_->SetLayerBuffer(screenId, layerId, handle, fenceFd);
421 }
422
SetLayerCompositionType(uint32_t screenId,uint32_t layerId,GraphicCompositionType type)423 int32_t HdiDevice::SetLayerCompositionType(uint32_t screenId, uint32_t layerId, GraphicCompositionType type)
424 {
425 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerCompositionType);
426 return layerFuncs_->SetLayerCompositionType(screenId, layerId, static_cast<CompositionType>(type));
427 }
428
SetLayerBlendType(uint32_t screenId,uint32_t layerId,GraphicBlendType type)429 int32_t HdiDevice::SetLayerBlendType(uint32_t screenId, uint32_t layerId, GraphicBlendType type)
430 {
431 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerBlendType);
432 return layerFuncs_->SetLayerBlendType(screenId, layerId, static_cast<BlendType>(type));
433 }
434
SetLayerCrop(uint32_t screenId,uint32_t layerId,IRect & crop)435 int32_t HdiDevice::SetLayerCrop(uint32_t screenId, uint32_t layerId, IRect &crop)
436 {
437 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerCrop);
438 return layerFuncs_->SetLayerCrop(screenId, layerId, &crop);
439 }
440
SetLayerZorder(uint32_t screenId,uint32_t layerId,uint32_t zorder)441 int32_t HdiDevice::SetLayerZorder(uint32_t screenId, uint32_t layerId, uint32_t zorder)
442 {
443 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerZorder);
444 return layerFuncs_->SetLayerZorder(screenId, layerId, zorder);
445 }
446
SetLayerPreMulti(uint32_t screenId,uint32_t layerId,bool isPreMulti)447 int32_t HdiDevice::SetLayerPreMulti(uint32_t screenId, uint32_t layerId, bool isPreMulti)
448 {
449 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerPreMulti);
450 return layerFuncs_->SetLayerPreMulti(screenId, layerId, isPreMulti);
451 }
452
SetLayerColorTransform(uint32_t screenId,uint32_t layerId,const float * matrix)453 int32_t HdiDevice::SetLayerColorTransform(uint32_t screenId, uint32_t layerId, const float *matrix)
454 {
455 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerColorTransform);
456 return layerFuncs_->SetLayerColorTransform(screenId, layerId, matrix);
457 }
458
SetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace colorSpace)459 int32_t HdiDevice::SetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace colorSpace)
460 {
461 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerColorDataSpace);
462 ColorDataSpace hdiColorSpace = static_cast<ColorDataSpace>(colorSpace);
463 return layerFuncs_->SetLayerColorDataSpace(screenId, layerId, hdiColorSpace);
464 }
465
GetLayerColorDataSpace(uint32_t screenId,uint32_t layerId,GraphicColorDataSpace & colorSpace)466 int32_t HdiDevice::GetLayerColorDataSpace(uint32_t screenId, uint32_t layerId, GraphicColorDataSpace &colorSpace)
467 {
468 CHECK_FUNC(layerFuncs_, layerFuncs_->GetLayerColorDataSpace);
469 ColorDataSpace hdiColorSpace;
470 int32_t ret = layerFuncs_->GetLayerColorDataSpace(screenId, layerId, &hdiColorSpace);
471 colorSpace = static_cast<GraphicColorDataSpace>(hdiColorSpace);
472 return ret;
473 }
474
SetLayerMetaData(uint32_t screenId,uint32_t layerId,const std::vector<GraphicHDRMetaData> & metaData)475 int32_t HdiDevice::SetLayerMetaData(uint32_t screenId, uint32_t layerId,
476 const std::vector<GraphicHDRMetaData> &metaData)
477 {
478 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerMetaData);
479 size_t num = metaData.size();
480 std::vector<HDRMetaData> hdiMetaData;
481 hdiMetaData.resize(num);
482 for (size_t i = 0; i < num; i++) {
483 hdiMetaData[i].key = static_cast<HDRMetadataKey>(metaData[i].key);
484 hdiMetaData[i].value = metaData[i].value;
485 }
486 return layerFuncs_->SetLayerMetaData(screenId, layerId, hdiMetaData.size(), hdiMetaData.data());
487 }
488
SetLayerMetaDataSet(uint32_t screenId,uint32_t layerId,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)489 int32_t HdiDevice::SetLayerMetaDataSet(uint32_t screenId, uint32_t layerId, GraphicHDRMetadataKey key,
490 const std::vector<uint8_t> &metaData)
491 {
492 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerMetaDataSet);
493 return layerFuncs_->SetLayerMetaDataSet(screenId, layerId, static_cast<HDRMetadataKey>(key), metaData.size(),
494 metaData.data());
495 }
496
SetLayerTunnelHandle(uint32_t screenId,uint32_t layerId,GraphicExtDataHandle * handle)497 int32_t HdiDevice::SetLayerTunnelHandle(uint32_t screenId, uint32_t layerId, GraphicExtDataHandle *handle)
498 {
499 CHECK_FUNC(layerFuncs_, layerFuncs_->SetLayerTunnelHandle);
500 return layerFuncs_->SetLayerTunnelHandle(screenId, layerId, reinterpret_cast<ExtDataHandle *>(handle));
501 }
502
GetSupportedPresentTimestampType(uint32_t screenId,uint32_t layerId,GraphicPresentTimestampType & type)503 int32_t HdiDevice::GetSupportedPresentTimestampType(uint32_t screenId, uint32_t layerId,
504 GraphicPresentTimestampType &type)
505 {
506 CHECK_FUNC(layerFuncs_, layerFuncs_->GetSupportedPresentTimestamp);
507 PresentTimestampType hdiType;
508 int32_t ret = layerFuncs_->GetSupportedPresentTimestamp(screenId, layerId, &hdiType);
509 type = static_cast<GraphicPresentTimestampType>(hdiType);
510 return ret;
511 }
512
GetPresentTimestamp(uint32_t screenId,uint32_t layerId,GraphicPresentTimestamp & timestamp)513 int32_t HdiDevice::GetPresentTimestamp(uint32_t screenId, uint32_t layerId, GraphicPresentTimestamp ×tamp)
514 {
515 CHECK_FUNC(layerFuncs_, layerFuncs_->GetHwPresentTimestamp);
516 PresentTimestamp hdiTimestamp;
517 int32_t ret = layerFuncs_->GetHwPresentTimestamp(screenId, layerId, &hdiTimestamp);
518 timestamp.type = static_cast<GraphicPresentTimestampType>(hdiTimestamp.type);
519 timestamp.time = hdiTimestamp.time;
520 return ret;
521 }
522
523 /* set & get device layer info end */
524
CreateLayer(uint32_t screenId,const GraphicLayerInfo & layerInfo,uint32_t & layerId)525 int32_t HdiDevice::CreateLayer(uint32_t screenId, const GraphicLayerInfo &layerInfo, uint32_t &layerId)
526 {
527 CHECK_FUNC(layerFuncs_, layerFuncs_->CreateLayer);
528 LayerInfo hdiLayerInfo = {
529 .width = layerInfo.width,
530 .height = layerInfo.height,
531 .type = static_cast<LayerType>(layerInfo.type),
532 .bpp = layerInfo.bpp,
533 .pixFormat = static_cast<PixelFormat>(layerInfo.pixFormat),
534 };
535 return layerFuncs_->CreateLayer(screenId, &hdiLayerInfo, &layerId);
536 }
537
CloseLayer(uint32_t screenId,uint32_t layerId)538 int32_t HdiDevice::CloseLayer(uint32_t screenId, uint32_t layerId)
539 {
540 CHECK_FUNC(layerFuncs_, layerFuncs_->CloseLayer);
541 return layerFuncs_->CloseLayer(screenId, layerId);
542 }
543
544 // this is only used in hdidevice_test in unittest
ResetHdiFuncs()545 void HdiDevice::ResetHdiFuncs()
546 {
547 HLOGD("%{public}s: start", __func__);
548 deviceFuncs_ = nullptr;
549 layerFuncs_ = nullptr;
550 HLOGD("%{public}s: end", __func__);
551 }
552
553 } // namespace Rosen
554 } // namespace OHOS
555