当前位置:   article > 正文

OpenHarmony—4.0图形HDI基础适配及点屏差异分析_graphic_2d_feature_rs_enable_eglimage

graphic_2d_feature_rs_enable_eglimage

一、进程调用关系变化

1.1 进程数量变化

新增加两个uhdf进程。allocator_host进程及composer_host进程。

删除了disp_gralloc_host 进程,并使用allocator_host替换。

uhdf添加进程配置如下:

hdf_config/uhdf/device_info.hcs

  1. display_composer :: host {
  2. hostName = "composer_host";
  3. priority = 40;
  4. processPriority = -8;
  5. threadPriority = 1;
  6. caps = ["SYS_NICE"];
  7. uid = ["composer_host"];
  8. gid = ["composer_host", "graphics", "vendor_mpp_driver"];
  9. composer_device :: device {
  10. device0 :: deviceNode {
  11. policy = 2;
  12. priority = 160;
  13. moduleName = "libdisplay_composer_driver_1.0.z.so";
  14. serviceName = "display_composer_service";
  15. }
  16. }
  17. }
  18. allocator :: host {
  19. hostName = "allocator_host";
  20. priority = 40;
  21. allocator_device :: device {
  22. device0 :: deviceNode {
  23. policy = 2;
  24. priority = 160;
  25. moduleName = "liballocator_driver_1.0.z.so";
  26. serviceName = "allocator_service";
  27. }
  28. }
  29. }

1.2 拉起关系变化

  • composer

以前版本composer由render_service通过单例拉起,现在通过composer service拉起接口实现层libdisplay_composer_vdi_impl.z.so,对外提供标准的IPC服务.

  • allocator

进程名字由disp_gralloc_host变更成allocator_host。通过allocator_service拉起接口实现层libdisplay_buffer_vdi_impl.z.so,对外提供标准的IPC服务。

二、接口协议更新

2.1 接口更新

结构体定义由原来的.h变为接口描述语言IDL代替,在协议升级过程中,会遇到大量结构体命名空间不一样的冲突,总体解决思路就是去掉原有的.h头文件依赖,增加新的接口头文件即可。

  • allocator_host

头文件更新:由display_type.h 更新成v1_0/display_buffer_type.h。由DisplayBufferType.idl生成在out下

接口协议更新:

由原来的display_gralloc.cpp中提供的接口更换成OHOS::HDI::Display::Buffer::V1_0::IDisplayBufferVdi,并新建接口实现文件:

display_buffer_vdi_impl.cpp/.h。

参考drivers/peripheral/display/hal/default_standard/src/display_gralloc/display_buffer_vdi_impl.cpp中的接口,并按自己的实际情况完成实现。

  • composer_host

头文件更新:由display_type.h 更新成v1_0/display_composer_type.h。由DisplayComposerType.idl生成在out下

由原来的hdi_session.cpp中提供的接口更换成OHOS::HDI::Display::Composer::V1_0::IDisplayComposerVdi,并新建接口实现文件:

display_composer_vdi_impl.cpp/.h

参考drivers/peripheral/display/hal/default_standard/src/display_device/display_composer_vdi_impl.cpp中的接口,并按自己的实际情况完成实现。

2.2 其它头文件更新

  • BufferHandle

新结构体去掉了key,如果代码中有用到,需要让以下定义保持一致:

  1. drivers/hdf_core/interfaces/inner_api/hdi/base/buffer_handle.h
  2. drivers/peripheral/base/buffer_handle.h
  3. foundation/graphic/graphic_2d/frameworks/surface/include/buffer_handle.h
  • 其它头文件:

drivers/peripheral/display/interfaces/include下的头文件与device_type.h有关联。要解耦,不要使用。

三、开机动画

在4.0中,开机动画默认使用的是播放视频,对点屏不友好,建议修改成原图片播放方式,修改方法如下:

frameworks/bootanimation/include/boot_animationconfig.h

  1. @@ -33,7 +33,7 @@ public:
  2. bool IsBootVideoEnabled();
  3. private:
  4. BootCustomConfig custConfig_;
  5. - bool bootVideoEnabled_ = true;
  6. + bool bootVideoEnabled_ = false; //不使用视频开机动画模式
  7. };
  8. } // namespace OHOS

四、hello_composer编译报错

合入如下修改解决:

五、CPU渲染

当前4.0切换成CPU渲染是会报错的,提示一些gl.h/egl.h等文件找不到,与GPU文件解耦不足,通过合入以下修改解决:

  1. diff --git a/graphic_config.gni b/graphic_config.gni
  2. index f7b7b3bdb..635197e80 100644
  3. --- a/graphic_config.gni
  4. +++ b/graphic_config.gni
  5. @@ -13,9 +13,9 @@
  6. declare_args() {
  7. graphic_2d_feature_bootanimation_enable = true
  8. - graphic_2d_feature_ace_enable_gpu = true
  9. + graphic_2d_feature_ace_enable_gpu = false
  10. graphic_2d_feature_color_gamut_enable = false
  11. - graphic_2d_feature_rs_enable_eglimage = false
  12. + graphic_2d_feature_rs_enable_eglimage = true
  13. graphic_2d_feature_rs_enable_uni_render = false
  14. graphic_2d_feature_wuji_enable = false
  15. graphic_2d_feature_enable_afbc = false
  16. diff --git a/rosen/modules/effect/skia_effectChain/BUILD.gn b/rosen/modules/effect/skia_effectChain/BUILD.gn
  17. index b4a23f6ca..7e29b369b 100644
  18. --- a/rosen/modules/effect/skia_effectChain/BUILD.gn
  19. +++ b/rosen/modules/effect/skia_effectChain/BUILD.gn
  20. @@ -37,6 +37,7 @@ config("effect_SKeffectChian_public_config") {
  21. "//foundation/multimedia/image_framework/interfaces/innerkits/include",
  22. "$graphic_2d_root/utils/log",
  23. "include",
  24. + "//third_party/openGLES/api",
  25. ]
  26. }
  27. @@ -44,6 +45,8 @@ ohos_shared_library("skeffectchain") {
  28. public_deps = [
  29. "$graphic_2d_root:libsurface",
  30. "$graphic_2d_root/rosen/modules/effect/egl:libegl_effect",
  31. + "//third_party/EGL:libEGL",
  32. + "//third_party/openGLES:libGLES",
  33. ]
  34. if (ace_enable_gpu) {
  35. @@ -51,6 +54,7 @@ ohos_shared_library("skeffectchain") {
  36. public_deps += [ "$graphic_2d_root:libgl" ]
  37. }
  38. + public_deps += [ "$graphic_2d_root:libgl" ]
  39. if (defined(use_new_skia) && use_new_skia) {
  40. public_deps += [ "//third_party/skia:skia_ohos" ]
  41. } else {
  42. diff --git a/rosen/modules/render_service/BUILD.gn b/rosen/modules/render_service/BUILD.gn
  43. index 77b26ea2f..b27faca7c 100644
  44. --- a/rosen/modules/render_service/BUILD.gn
  45. +++ b/rosen/modules/render_service/BUILD.gn
  46. @@ -183,6 +183,13 @@ ohos_shared_library("librender_service") {
  47. defines += accessibility_defines
  48. }
  49. + cflags = [
  50. + "-Wall",
  51. + "-Wno-unused-const-variable",
  52. + ]
  53. +
  54. + cflags_cc = [ "-Wno-unused-const-variable" ]
  55. +
  56. part_name = "graphic_2d"
  57. subsystem_name = "graphic"
  58. }
  59. diff --git a/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp b/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp
  60. index c7418e0fb..fac0a162d 100644
  61. --- a/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp
  62. +++ b/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp
  63. @@ -85,6 +85,7 @@ void RSBaseRenderEngine::Init()
  64. bool RSBaseRenderEngine::NeedForceCPU(const std::vector<LayerInfoPtr>& layers)
  65. {
  66. +#ifdef RS_ENABLE_GL
  67. bool forceCPU = false;
  68. for (const auto& layer: layers) {
  69. if (layer == nullptr) {
  70. @@ -113,6 +114,9 @@ bool RSBaseRenderEngine::NeedForceCPU(const std::vector<LayerInfoPtr>& layers)
  71. }
  72. return forceCPU;
  73. +#else
  74. + return true;
  75. +#endif
  76. }
  77. #ifndef USE_ROSEN_DRAWING
  78. diff --git a/rosen/modules/render_service_base/src/platform/ohos/BUILD.gn b/rosen/modules/render_service_base/src/platform/ohos/BUILD.gn
  79. index e1bf2eb3b..cfa6676f1 100644
  80. --- a/rosen/modules/render_service_base/src/platform/ohos/BUILD.gn
  81. +++ b/rosen/modules/render_service_base/src/platform/ohos/BUILD.gn
  82. @@ -109,6 +109,7 @@ ohos_source_set("rosen_ohos_sources") {
  83. "//drivers/peripheral/display/interfaces/include/",
  84. "$graphic_2d_root/rosen/modules/render_service_client/core",
  85. "$graphic_2d_root/utils/log",
  86. + "//third_party/openGLES/api",
  87. ]
  88. public_deps = [
  89. @@ -116,6 +117,8 @@ ohos_source_set("rosen_ohos_sources") {
  90. "$graphic_2d_root/rosen/modules/2d_graphics:2d_graphics",
  91. "$graphic_2d_root/rosen/modules/composer/vsync:libvsync",
  92. "$graphic_2d_root/utils:sync_fence",
  93. + "//third_party/EGL:libEGL",
  94. + "//third_party/openGLES:libGLES",
  95. ]
  96. if (defined(use_new_skia) && use_new_skia) {
  97. public_deps += [ "//third_party/skia:skia_ohos" ]

五、实战经验分享

本次实战主要是把产品从3.2.3-Release升级到4.0-Release。中间看到这些变化,心里有点慌,从而记录下来,并提供给大家参考。框架上遇到的一些问题,前面几节已经给大家说明了,以下是一些升级的步骤及建议。

1、添加接口协议文件、gn编译、hcs配置。

​ 为composer添加display_composer_vdi_impl.cpp/.h

​ 为gralloc添加display_buffer_vdi_impl.cpp/.h。

​ 在gn中添加目标libdisplay_composer_vdi_impl和libdisplay_buffer_vdi_impl。

​ 在device_info.hcs中添加进程配置。

2、编译修改。

​ 这个是工作量比较大的地方。原则上就是去掉drivers/peripheral/display/interfaces/include下的头文件依赖,并添加

​ #include "v1_0/display_composer_type.h"

 #include "v1_0/display_buffer_type.h"

以及命名空间:

​ using namespace OHOS::HDI::Display::Composer::V1_0;

​ using namespace OHOS::HDI::Display::Buffer::V1_0;

​ 当然gn中也要添加相应的依赖。

3、调试。

​ 主要使用hello_composer调试,关注hdi_backend.cpp中Repaint函数执行流程,并在hilog中搜索关键命令字:REQUEST_CMD,一个完整的流程必须包含以下命令:

  1. REQUEST_CMD_PREPARE_DISPAY_LATERS
  2. REQUEST_CMD_SET_DISPLAY_CLIENT_DAMAGE
  3. REQUEST_CMD_SET_DISPLAY_CLENT_BUFFER
  4. REQUEST_CMD_COMMIT

如果so没有正常加载,也可以在以下文件中添加打印:

  1. drivers/peripheral/display/buffer/hdi_service/src/allocator_service.cpp
  2. drivers/peripheral/display/composer/hdi_service/src/display_composer_service.cpp

可以为dlopen添加详细错误信息,默认没有添加:

  1. if (libHandle_ == NULL) {
  2. error = dlerror();
  3. DISPLAY_LOGE("composer load path%{public}s, dlopen err=%{public}s", DISPLAY_COMPOSER_VDI_LIBRARY, error);
  4. return HDF_FAILURE;
  5. }

本文主要介绍OpenHarmony 4.0图形HDI基础适配及点屏差异。适用于版本升级,新特性了解及问题分析。

想学习更多华为鸿蒙HarmonyOS开发知识,在这里我为大家准备了华为鸿蒙HarmonyOS开发者资料大全,大家可以自行点击链接领取:《做鸿蒙应用开发到底学习些啥?

其次就是考虑到市场上还没有系统性的学习资料,同时我也整理了一份《鸿蒙 (Harmony OS)开发学习手册》特意整理成PDF文档方式,分享给大家参考学习,大家可以根据自身情况进行获取:《鸿蒙开发学习指南

《鸿蒙 (Harmony OS)开发学习手册》

一、入门必看

1. 应用开发导读(ArkTS)

2. 应用开发导读(Java)

3.......

二、HarmonyOS 概念

1. 系统定义

2. 技术架构

3. 技术特性

4. 系统安全

5......

三、如何快速入门?《鸿蒙基础入门开发宝典!

1. 基本概念

2. 构建第一个ArkTS应用

3. 构建第一个JS应用

4. ……

四、开发基础知识

1. 应用基础知识

2. 配置文件

3. 应用数据管理

4. 应用安全管理

5. 应用隐私保护

6. 三方应用调用管控机制

7. 资源分类与访问

8. 学习ArkTS语言

9. ……

五、基于ArkTS 开发

1. Ability开发

2. UI开发

3. 公共事件与通知

4. 窗口管理

5. 媒体

6. 安全

7. 网络与链接

8. 电话服务

9. 数据管理

10. 后台任务(Background Task)管理

11. 设备管理

12. 设备使用信息统计

13. DFX

14. 国际化开发

15. 折叠屏系列

16. ……

更多了解更多鸿蒙开发的相关知识可以参考:鸿蒙开发学习指南

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/179874
推荐阅读
相关标签
  

闽ICP备14008679号