当前位置:   article > 正文

RK3568开发板上应用Mesa 3D_rk3568 panfrost

rk3568 panfrost

前言

本次采用的开发板为扬帆“竞”开发板,扬帆“竞”采用瑞芯微RK3568(Cortex-A55)四核64位超强CPU,搭载OpenHarmony最新操作系统,主频最高达2.0GHz。采用 Mali-G52 GPU,支持4K、H.265/H.264视频解码。
OpenHarmony最新版本的L2标准版图形子系统相比之前版本有着非常大的改动,使用了全新设计的框架,并使用Render Service替换了原来的Weston。图形栈整体上分为三层,从上到下依次为接口层、框架层和引擎层。设计上更加清晰,可以更加的灵活的适配不同的底层图形库和不同的显示硬件,最大限度的发挥硬件性能而不用影响到整体图形栈。


框架层的整体功能如下表,框架层的核心就是Render Service渲染服务。

模块能力描述
Render Servicel (渲染服务)提供UI框架的绘制能力,其核心职责是将ArkUI的控件描述转换成绘制树信息,根据对应的渲染策略,进行最佳路径渲染。同时,负责多窗口流畅和空间态下UI共享的核心底层机制。
Drawing (绘制)提供图形子系统内部的标准化接口,主要完成2D渲染、3D渲染和渲染引擎的管理等基本功能。
Animation (动画)提供动画引擎的相关能力。
Effect (效果)主要完成图片效果、渲染特效等效果处理的能力,包括:多效果的串联、并联处理,在布局时加入渲染特效、控件交互特效等相关能力。
显示与内存管理此模块是图形栈与硬件解耦的主要模块,主要定义了OpenHarmony 显示与内存管理的能力,其定义的南向HDI 接口需要让不同的OEM厂商完成对OpenHarmony图形栈的适配。

新的Render Service图形框架默认提供了对OpenGL的支持,并使用API HOOK技术,实现了OpenGL接口和实现的分离,大幅度降低了OpenGL库的适配难度。
扬帆“竞”开发板默认使用的是闭源的libmali-bifrost-g52-g2p0-ohos库,也可以使用开源的Mesa 3D库,实现对OpenGL的支持,在高级图形应用的开发和调试方面非常方便。

使用Mesa库

编译Mesa库

OpenHarmony已经在三方库中集成Mesa库。下载OpenHarmony全量代码,Mesa库在third_party/mesa3d。
进入third_party/mesa3d/目录,OpenHarmony已经提供了编译脚本。其中ohos/build_ohos.py就是针对新图形框架的编译脚本,参考README_zh.md文档,先进行一次全量编译,然后执行。

#python ohos/build_ohos.py </path/to/openharmony> yangfan-j </path/to/openharmony>/third_party/mesa3d

 

命令编译出mesa库。

生成Mesa组件

1.在device/soc/rockchip/rk3568/hardware/gpu/目录下新建lib-mesa目录,用于存放Mesa 3D库文件。

#mkdir …/device/soc/rockchip/rk3568/hardware/gpu/lib-mesa

2.将编译生成的Mesa 3D库文件拷贝到lib-mesa目录:

  1. #cp build-ohos/install/lib/libgbm.so.1.0.0 ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  2. #cp build-ohos/install/lib/libglapi.so.0.0.0 ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  3. #cp build-ohos/src/egl/libEGL.so.1.0.0 ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  4. #cp build-ohos/install/lib/libGLESv1_CM.so.1.1.0 ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  5. #cp build-ohos/install/lib/libGLESv2.so.2.0.0 ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  6. #cp build-ohos/src/gallium/targets/dri/libgallium_dri.so ../ device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/
  7. #cp build-ohos/install/lib/dri/panfrost_dri.so ../device/soc/rockchip/rk3568/hardware/gpu/lib-mesa/

3.修改device/soc/rockchip/rk3568/hardware/gpu/BUILD.gn

  1. index 7d269ac..690a69d 100644
  2. --- a/rk3568/hardware/gpu/BUILD.gn
  3. +++ b/rk3568/hardware/gpu/BUILD.gn
  4. @@ -47,3 +47,108 @@ ohos_prebuilt_shared_library("mali-bifrost-g52-g2p0-ohos") {
  5. "libmali.so.1",
  6. ]
  7. }
  8. +
  9. +ohos_prebuilt_shared_library("mesa_gbm") {
  10. + source = "lib-mesa/libgbm.so.1.0.0"
  11. + install_enable = true
  12. + install_images = [ chipset_base_dir ]
  13. + relative_install_dir = "chipsetsdk"
  14. + subsystem_name = "rockchip_products"
  15. + part_name = "rockchip_products"
  16. + symlink_target_name = [
  17. + "libgbm.so.1",
  18. + "libgbm.so",
  19. + ]
  20. +}
  21. +
  22. +ohos_prebuilt_shared_library("mesa_egl") {
  23. + source = "lib-mesa/libEGL.so.1.0.0"
  24. + install_enable = true
  25. + install_images = [ chipset_base_dir ]
  26. + relative_install_dir = "chipsetsdk"
  27. + subsystem_name = "rockchip_products"
  28. + part_name = "rockchip_products"
  29. + symlink_target_name = [
  30. + "libEGL.so.1",
  31. + "libEGL.so",
  32. + "libGLESv1.so",
  33. + "libEGL_impl.so",
  34. + ]
  35. +}
  36. +
  37. +ohos_prebuilt_shared_library("mesa_glapi") {
  38. + source = "lib-mesa/libglapi.so.0.0.0"
  39. + install_enable = true
  40. + install_images = [ chipset_base_dir ]
  41. + relative_install_dir = "chipsetsdk"
  42. + subsystem_name = "rockchip_products"
  43. + part_name = "rockchip_products"
  44. + symlink_target_name = [
  45. + "libglapi.so.0",
  46. + "libglapi.so",
  47. + ]
  48. +}
  49. +
  50. +ohos_prebuilt_shared_library("mesa_glesv1") {
  51. + source = "lib-mesa/libGLESv1_CM.so.1.1.0"
  52. + install_enable = true
  53. + install_images = [ chipset_base_dir ]
  54. + relative_install_dir = "chipsetsdk"
  55. + subsystem_name = "rockchip_products"
  56. + part_name = "rockchip_products"
  57. + symlink_target_name = [
  58. + "libGLESv1_CM.so.1",
  59. + "libGLESv1_CM.so",
  60. + "libGLESv1_impl.so",
  61. + ]
  62. +}
  63. +
  64. +ohos_prebuilt_shared_library("mesa_glesv2") {
  65. + source = "lib-mesa/libGLESv2.so.2.0.0"
  66. + install_enable = true
  67. + install_images = [ chipset_base_dir ]
  68. + relative_install_dir = "chipsetsdk"
  69. + subsystem_name = "rockchip_products"
  70. + part_name = "rockchip_products"
  71. + symlink_target_name = [
  72. + "libGLESv2.so.2",
  73. + "libGLESv2.so",
  74. + "libGLESv2_impl.so",
  75. + "libGLESv3_impl.so",
  76. + ]
  77. +}
  78. +
  79. +ohos_prebuilt_shared_library("libgallium_dri") {
  80. + source = "lib-mesa/libgallium_dri.so"
  81. + install_enable = true
  82. + install_images = [ chipset_base_dir ]
  83. + relative_install_dir = "chipsetsdk"
  84. + subsystem_name = "rockchip_products"
  85. + part_name = "rockchip_products"
  86. + symlink_target_name = [ "libgallium_dri.so" ]
  87. +}
  88. +
  89. +ohos_prebuilt_shared_library("panfrost_dri") {
  90. + source = "lib-mesa/panfrost_dri.so"
  91. + install_enable = true
  92. + install_images = [ "system" ]
  93. + subsystem_name = "rockchip_products"
  94. + part_name = "rockchip_products"
  95. + symlink_target_name = [
  96. + "rockchip_dri.so",
  97. + "libmali.so.0",
  98. + "libmali.so.1",
  99. + ]
  100. +}
  101. +
  102. +group("mesa-gpu") {
  103. + public_deps = [
  104. + ":mesa_egl",
  105. + ":mesa_gbm",
  106. + ":mesa_glapi",
  107. + ":mesa_glesv1",
  108. + ":mesa_glesv2",
  109. + ":libgallium_dri",
  110. + ":panfrost_dri",
  111. + ]
  112. +}

4.修改device/soc/rockchip/rk3568/hardware/BUILD.gn,使用Mesa 3D库

  1. index 479847d..e778fb0 100644
  2. --- a/rk3568/hardware/BUILD.gn
  3. +++ b/rk3568/hardware/BUILD.gn
  4. @@ -15,7 +15,8 @@ import("//build/ohos.gni")
  5. group("hardware_group") {
  6. deps = [
  7. - "//device/soc/rockchip/rk3568/hardware/gpu:mali-bifrost-g52-g2p0-ohos",
  8. + #"//device/soc/rockchip/rk3568/hardware/gpu:mali-bifrost-g52-g2p0-ohos",
  9. + "//device/soc/rockchip/rk3568/hardware/gpu:mesa-gpu",
  10. "//device/soc/rockchip/rk3568/hardware/isp:isp",
  11. "//device/soc/rockchip/rk3568/hardware/mpp:mpp",
  12. "//device/soc/rockchip/rk3568/hardware/wifi:ap6xxx",

修改内核的配置文件

修改内核配置文件,启用panforst驱动。

  1. index 9a9501c..52b3232 100644
  2. --- a/linux-5.10/arch/arm64/configs/yangfan-j_standard_defconfig
  3. +++ b/linux-5.10/arch/arm64/configs/yangfan-j_standard_defconfig
  4. @@ -3622,7 +3622,7 @@ CONFIG_DVB_SP2=m
  5. #
  6. # CONFIG_VGA_ARB is not set
  7. CONFIG_DRM=y
  8. -CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
  9. +# CONFIG_DRM_IGNORE_IOTCL_PERMIT is not set
  10. CONFIG_DRM_MIPI_DSI=y
  11. # CONFIG_DRM_DP_AUX_CHARDEV is not set
  12. # CONFIG_DRM_DEBUG_MM is not set
  13. @@ -3636,6 +3636,8 @@ CONFIG_DRM_FBDEV_OVERALLOC=100
  14. CONFIG_DRM_LOAD_EDID_FIRMWARE=y
  15. # CONFIG_DRM_DP_CEC is not set
  16. CONFIG_DRM_GEM_CMA_HELPER=y
  17. +CONFIG_DRM_GEM_SHMEM_HELPER=y
  18. +CONFIG_DRM_SCHED=y
  19. #
  20. # I2C encoder or helper chips
  21. @@ -3793,7 +3795,7 @@ CONFIG_DRM_DW_MIPI_DSI=y
  22. # CONFIG_TINYDRM_ST7735R is not set
  23. # CONFIG_DRM_PL111 is not set
  24. # CONFIG_DRM_LIMA is not set
  25. -# CONFIG_DRM_PANFROST is not set
  26. +CONFIG_DRM_PANFROST=y
  27. # CONFIG_DRM_TIDSS is not set
  28. # CONFIG_DRM_LEGACY is not set
  29. CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y

修改扬帆“竞”内核补丁

内核补丁需要在Linux系统上使用vim编辑器修改,Windows编辑器修改可能导致编译错误。

  1. index 41a7df5..1a5e5a3 100644
  2. --- a/linux-5.10/yangfan-j_patch/kernel.patch
  3. +++ b/linux-5.10/yangfan-j_patch/kernel.patch
  4. @@ -100948,36 +100948,36 @@ index 000000000..372617fee
  5. + };
  6. +
  7. + gpu: gpu@fde60000 {
  8. -+ compatible = "arm,mali-bifrost";
  9. -+ reg = <0x0 0xfde60000 0x0 0x4000>;
  10. ++ compatible = "rockchip, rk3568-mali","arm,mali-bifrost";
  11. ++ reg = <0x0 0xfde60000 0x0 0x20000>;
  12. +
  13. -+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
  14. ++ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
  15. + <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
  16. -+ <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
  17. -+ interrupt-names = "GPU", "MMU", "JOB";
  18. ++ <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
  19. ++ interrupt-names = "job", "mmu", "gpu";
  20. +
  21. -+ upthreshold = <40>;
  22. -+ downdifferential = <10>;
  23. ++ /* upthreshold = <40>; */
  24. ++ /* downdifferential = <10>; */
  25. +
  26. + clocks = <&scmi_clk 1>, <&cru CLK_GPU>;
  27. -+ clock-names = "clk_mali", "clk_gpu";
  28. ++ clock-names = "core", "bus";
  29. + power-domains = <&power RK3568_PD_GPU>;
  30. + #cooling-cells = <2>;
  31. + operating-points-v2 = <&gpu_opp_table>;
  32. +
  33. + status = "disabled";
  34. -+ gpu_power_model: power-model {
  35. -+ compatible = "simple-power-model";
  36. -+ leakage-range= <5 15>;
  37. -+ ls = <(-24002) 22823 0>;
  38. -+ static-coefficient = <100000>;
  39. -+ dynamic-coefficient = <953>;
  40. -+ ts = <(-108890) 63610 (-1355) 20>;
  41. -+ thermal-zone = "gpu-thermal";
  42. -+ };
  43. -+ };
  44. -+
  45. -+ gpu_opp_table: opp-table2 {
  46. ++ /* gpu_power_model: power-model { */
  47. ++ /* compatible = "simple-power-model"; */
  48. ++ /* leakage-range= <5 15>; */
  49. ++ /* ls = <(-24002) 22823 0>; */
  50. ++ /* static-coefficient = <100000>; */
  51. ++ /* dynamic-coefficient = <953>; */
  52. ++ /* ts = <(-108890) 63610 (-1355) 20>; */
  53. ++ /* thermal-zone = "gpu-thermal"; */
  54. ++ /* }; */
  55. ++ };
  56. ++
  57. ++ gpu_opp_table: gpu-opp-table {
  58. + compatible = "operating-points-v2";
  59. +
  60. + mbist-vmin = <825000 900000 950000>;

测试和验证

1.查看GPU中断,panforst驱动已经正常工作。桌面显示和操作正常

2.游戏效果


测试表明,扬帆“竞”开发板的图形界面使用正常且流畅,基础应用都可以正常运行,体验与使用libmali-g52库基本一致。

 

 

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

闽ICP备14008679号