> 文档中心 > Openharmony之GPU Mesa3D移植二(render 新框架)

Openharmony之GPU Mesa3D移植二(render 新框架)

目录

1、下载源码

2、编译mesa 3D库

3、修改内核配置

1)修改内核dtb

2)修改device/hihope/rk3568/kernel/build_kernel.sh

3)修改内核config

4、修改openharmony代码

1)修改base/startup/init_lite/ueventd/etc/ueventd.config

2)修改device/hihope/hardware/display/src/display_gralloc/display_gralloc_gbm.c

3)修改foundation/ace/ace_engine/adapter/ohos/build/product_config.gni

4)修改 foundation/graphic/standard/graphic_config.gni

5)修改 foundation/graphic/standard/BUILD.gn

6)修改device/hihope/hardware/gpu/BUILD.gn

7)修改device/hihope/rk3568/BUILD.gn

5、编译

6、刷机

7、问题

1)编译mesa库的时候报错ld.lld: error: unable to find library -lexpat

2)编译mesa库的时候报错如下:

3)编译mesa库的时候报错如下:

4)编译问题

5)刷机后,能进系统,但是图形起不来

本文主要介绍在OpenHarmony上,基于RK3568移植开源GPU Mesa3D图形驱动,使用openharmony v3.1-Release 版本,该版本使用了新框架,内核使用了kernel 5.10.79版本,并使用render_service替换了Weston。

1、下载源码

创建编译openharmony的docker,安装依赖,下载源码

创建docker:

mkdir oh31re
cd oh31re/

podman run --name hm-31re -it -v  ./:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.9 /bin/bash

git config --global user.name "test"

git config --global user.email "test@com.cn"

git config --global credential.helper store

安装依赖:

curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo

chmod a+x /usr/local/bin/repo

apt-get update && apt-get install -y binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby libssl-dev 

pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

下载源码,并编译:

repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v3.1-Release --no-repo-verify

repo sync -c 

repo forall -c 'git lfs pull'

bash build/prebuilts_download.sh

 ./build.sh --ccache --product-name rk3568   

编译成功,刷机后,能进入系统,也能进入图形,当前版本使用的是闭源GPU驱动,所以使用起来也是很流畅的。

2、编译mesa 3D库

进入容器:

podman exec -it hm-31re bash

下载源码:

git clone https://gitee.com/openharmony-sig/third_party_mesa3d.git

安装依赖:

apt-get install -y meson cmake llvm
python3 -m pip install meson==0.62.0
python -m pip install --upgrade pip
pip install mako atomic  markupsafe

编译依赖库expat:

./build.sh --ccache --product-name rk3568 --build-target expat

编译mesa 3D:
cd third_party_mesa3d/

python ohos/build_ohos.py /home/openharmony/ rk3568 /home/openharmony/third_party_mesa3d/

拷贝库文件到device/hihope/hardware/gpu

cp build-ohos/src/egl/libEGL.so.1.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libGLESv1_CM.so.1.1.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libGLESv2.so.2.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libgbm.so.1.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libglapi.so.0.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/src/gallium/targets/dri/libgallium_dri.so ../device/hihope/hardware/gpu/

cp build-ohos/install/lib/dri/panfrost_dri.so ../device/hihope/hardware/gpu/

注意,使用编译mesa库需要把third_party_mesa3d放到openharmony源码中。
 

3、修改内核配置

1)修改内核dtb

修改out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi适配开源panfrost,如下:

--- arch/arm64/boot/dts/rockchip/rk3568.dtsi-bak        2022-02-15 01:39:52.169152789 +0000                                                                                         +++ arch/arm64/boot/dts/rockchip/rk3568.dtsi    2022-02-15 02:02:42.096047298 +0000  @@ -1169,36 +1169,23 @@                                        };                              gpu: gpu@fde60000 {  -               compatible = "arm,mali-bifrost";  -               reg = ;  +               compatible = "rockchip, rk3568-mali", "arm,mali-bifrost";  +               reg = ;      -               interrupts = ,  +               interrupts = ,                               ,  -                            ;  -               interrupt-names = "GPU", "MMU", "JOB";  -  -               upthreshold = ;  -               downdifferential = ;  -  +                            ;  +               interrupt-names = "job", "mmu", "gpu";                  clocks = , ;  -               clock-names = "clk_mali", "clk_gpu";  -               power-domains = ;  -               #cooling-cells = ;  +               clock-names = "core", "bus";                  operating-points-v2 = ;      +               #cooling-cells = ;  +               power-domains = ;                  status = "disabled";  -               gpu_power_model: power-model {  -                       compatible = "simple-power-model";  -                       leakage-range= ;  -                       ls = ;  -                       static-coefficient = ;  -                       dynamic-coefficient = ;  -                       ts = ;  -                       thermal-zone = "gpu-thermal";  -               };          };      -       gpu_opp_table: opp-table2 {  +       gpu_opp_table: gpu-opp-table {                  compatible = "operating-points-v2";                      mbist-vmin = ;  @@ -1227,7 +1214,7 @@                  };                  opp-800000000 {                          opp-hz = /bits/ 64 ;  -                       opp-microvolt = ;  +                       opp-microvolt = ;                  };          };

并拷贝到device/hihope/rk3568/目录下:

cp out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi device/hihope/rk3568/rk3568.dtsi

2)修改device/hihope/rk3568/kernel/build_kernel.sh

--- build_kernel-bak.sh 2022-04-18 15:53:50.467219678 +0800+++ build_kernel.sh     2022-04-18 15:56:05.243998200 +0800@@ -43,6 +43,8 @@ #config cp -rf ${KERNEL_CONFIG_FILE} ${KERNEL_SRC_TMP_PATH}/arch/arm64/configs/rockchip_linux_defconfig                                                                                  +cp -rf ${3}/rk3568.dtsi ${KERNEL_SRC_TMP_PATH}/arch/arm64/boot/dts/rockchip/+ # if [ "enable_ramdisk" == "${6}" ]; then        ./make-ohos.sh TB-RK3568X0 enable_ramdisk

3)修改内核config

修改kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig

diff --git a/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig b/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig                                         index ac005b8..55475c5 100644--- a/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig+++ b/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig@@ -3579,7 +3579,7 @@ CONFIG_DVB_SP2=m # # CONFIG_VGA_ARB is not set CONFIG_DRM=y-CONFIG_DRM_IGNORE_IOTCL_PERMIT=y+# CONFIG_DRM_IGNORE_IOTCL_PERMIT is not set CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set@@ -3593,6 +3593,8 @@ CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_CMA_HELPER=y+CONFIG_DRM_GEM_SHMEM_HELPER=y+CONFIG_DRM_SCHED=y # # I2C encoder or helper chips@@ -3750,7 +3752,7 @@ CONFIG_DRM_DW_MIPI_DSI=y # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set-# CONFIG_DRM_PANFROST is not set+CONFIG_DRM_PANFROST=y # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y

4、修改openharmony代码

1)修改base/startup/init_lite/ueventd/etc/ueventd.config

增加card1和rendD129的权限,在该文件中加上:

/dev/dri/card1 0666 0 1003/dev/dri/renderD129 0666 0 1003

2)修改device/hihope/hardware/display/src/display_gralloc/display_gralloc_gbm.c

diff --git a/hardware/display/src/display_gralloc/display_gralloc_gbm.c b/hardware/display/src/display_gralloc/display_gralloc_gbm.c                              index 2dad8c1..1445819 100644--- a/hardware/display/src/display_gralloc/display_gralloc_gbm.c+++ b/hardware/display/src/display_gralloc/display_gralloc_gbm.c@@ -34,7 +34,7 @@ #include "display_gralloc_private.h" #include "display_common.h"-const char *g_drmFileNode = "/dev/dri/renderD128";+const char *g_drmFileNode = "/dev/dri/card0"; static GrallocManager *g_grallocManager = NULL; static pthread_mutex_t g_lock;

3)修改foundation/ace/ace_engine/adapter/ohos/build/product_config.gni

diff --git a/adapter/ohos/build/product_config.gni b/adapter/ohos/build/product_config.gni  index 3d29a14c..c5d095aa 100644--- a/adapter/ohos/build/product_config.gni+++ b/adapter/ohos/build/product_config.gni@@ -14,3 +14,5 @@ enable_accessibility_product_list = [ "rk3568" ] enable_web_product_list = [ "rk3568", "m40" ]++gpu_block_product_list = [ "rk3568" ]

4)修改 foundation/graphic/standard/graphic_config.gni

diff --git a/graphic_config.gni b/graphic_config.gniindex 1e4f66c..178bfe3 100644--- a/graphic_config.gni+++ b/graphic_config.gni@@ -20,7 +20,8 @@ if ("${product_name}" == "watchos" || "${product_name}" == "Hi3516DV300" || } else if ("${product_name}" == "rk3566" || "${product_name}" == "rk3568") {   gpu_defines = [ "ACE_ENABLE_GL" ]   ace_enable_gpu = true-  libgl = [ "//device/hihope/hardware/gpu:mali-bifrost-g52-g2p0-ohos" ]+  #libgl = [ "//device/hihope/hardware/gpu:mali-bifrost-g52-g2p0-ohos" ]+  libgl = [ "//device/hihope/hardware/gpu:mesa-gpu-libs" ] } else {   gpu_defines = [ "ACE_ENABLE_GL" ]   ace_enable_gpu = true

5)修改 foundation/graphic/standard/BUILD.gn

diff --git a/BUILD.gn b/BUILD.gnindex 1af1af9..36c22ac 100755--- a/BUILD.gn+++ b/BUILD.gn@@ -69,7 +69,7 @@ wmlayout_scss("default.scss") { group("libsurface") {   public_deps = [ "frameworks/surface:surface" ]   if (ace_enable_gpu) {-    public_deps += [ "frameworks/surfaceimage:libsurfaceimage" ]+    #public_deps += [ "frameworks/surfaceimage:libsurfaceimage" ]   } }

6)修改device/hihope/hardware/gpu/BUILD.gn

diff --git a/hardware/gpu/BUILD.gn b/hardware/gpu/BUILD.gnindex 7ffc13d..6a5aa20 100755--- a/hardware/gpu/BUILD.gn+++ b/hardware/gpu/BUILD.gn@@ -14,33 +14,84 @@ import("//build/ohos.gni") import("//build/ohos/ndk/ndk.gni")-config("libmali-bifrost-g52-g2p0-ohos") {-  include_dirs = [ "include" ]-  cflags = [-    "-Wno-incompatible-pointer-types",-    "-Werror",-    "-Wimplicit-function-declaration",-    "-Wno-error=unused-variable",-  ]-  cflags = []-}-ohos_prebuilt_shared_library("mali-bifrost-g52-g2p0-ohos") {-  if (target_cpu == "arm") {-    source = "lib/libmali-bifrost-g52-g2p0-ohos.so"-  } else if (target_cpu == "arm64") {-    source = "lib64/libmali-bifrost-g52-g2p0-wayland.so"-  }-  install_images = [ system_base_dir ]+ohos_prebuilt_shared_library("mesa_gbm") {+  source = "libgbm.so.1.0.0"+  install_enable = true   subsystem_name = "hdf"   part_name = "display_device_driver"+  symlink_target_name = [+    "libgbm.so.1",+    "libgbm.so",+  ]+}+ohos_prebuilt_shared_library("mesa_egl") {+  source = "libEGL.so.1.0.0"   install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"   symlink_target_name = [+    "libEGL.so.1",     "libEGL.so",-    "libGLESv1.so",+  ]+}+ohos_prebuilt_shared_library("mesa_glapi") {+  source = "libglapi.so.0.0.0"+  install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"+  symlink_target_name = [+    "libglapi.so.0",+    "libglapi.so",+  ]+}+ohos_prebuilt_shared_library("mesa_glesv1") {+  source = "libGLESv1_CM.so.1.1.0"+  install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"+  symlink_target_name = [+    "libGLESv1_CM.so.1",+    "libGLESv1_CM.so",+  ]+}+ohos_prebuilt_shared_library("mesa_glesv2") {+  source = "libGLESv2.so.2.0.0"+  install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"+  symlink_target_name = [+    "libGLESv2.so.2",     "libGLESv2.so",-    "libGLESv3.so",-    "libmali.so.0",-    "libmali.so.1",+  ]+}+ohos_prebuilt_shared_library("libgallium_dri") {+  source = "libgallium_dri.so"+  install_images = [ chipset_base_dir ]+  install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"+  symlink_target_name = [+    "libgallium_dri.so",+    #"rockchip_dri.so",+  ]+}+ohos_prebuilt_shared_library("panfrost_dri") {+  source = "panfrost_dri.so"+  install_enable = true+  subsystem_name = "hdf"+  part_name = "display_device_driver"+  symlink_target_name = [+    "rockchip_dri.so",+  ]+}+group("mesa-gpu-libs") {+  public_deps = [+    ":mesa_gbm",+    ":mesa_egl",+    ":mesa_glapi",+    ":mesa_glesv1",+    ":mesa_glesv2",+    ":panfrost_dri",   ] }

7)修改device/hihope/rk3568/BUILD.gn

diff --git a/rk3568/BUILD.gn b/rk3568/BUILD.gnindex f7a3770..00f760d 100755--- a/rk3568/BUILD.gn+++ b/rk3568/BUILD.gn@@ -20,6 +20,7 @@ group("rk3568_group") {     "build/rootfs:init_configs",     "distributedhardware:distributedhardware",     "kernel:kernel",-    "system_hap:hap"+    "system_hap:hap",+    "//device/hihope/hardware/gpu:libgallium_dri"   ] }

5、编译

 ./build.sh --ccache --product-name rk3568  

6、刷机

 

  刷机后,render_service正常起来了,图形也正常启动,panfrost驱动也正常,点击界面,流畅不卡顿。

7、问题

1)编译mesa库的时候报错ld.lld: error: unable to find library -lexpat

解决办法:

该问题是缺少依赖expat,需要编译expat

./build.sh --ccache --product-name rk3568 --build-target expat

2)编译mesa库的时候报错如下:

解决办法:

该问题是meson版本过低导致,升级该版本解决问题

python3 -m pip install meson==0.62.0

3)编译mesa库的时候报错如下:

 解决办法:

该问题是缺少mako依赖,安装该包即可,具体如下:

python -m pip install --upgrade pip

pip install markupsafe

pip install mako

4)编译问题

移植完mesa驱动后,编译报错如下:

 解决办法:

该问题原因主要是mesa3d库的软连接导致的,需要修改gn让软连接实体so,并且添加上so的软连接,具体参考第4节中6)修改device/hihope/hardware/gpu/BUILD.gn。

5)刷机后,能进系统,但是图形起不来

解决办法:

ps命令查看发现render_service 服务没有起来,判断是该服务导致的,

该问题是mesa3d库有问题,可能是使用的mesa3d库是ohos/build_wayland_and_gbm.py编译出来的,即使用老框架支持的,在新框架中需要使用ohos/build_ohos.py编译的mesa3d库,具体编译方法请参考第2节编译mesa 3D库。

参考文献:

OpenHarmony适配开源图形驱动(新框架)---RK3568