成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony富設備移植指南—開源GPU驅動編譯

系統 OpenHarmony
這篇文章我打算分享一下我移植適配GPU的相關經驗,希望能幫到大家。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

在OpenHarmony的各部件適配中,GPU適配是公認的最難,首先原廠安卓的驅動是沒辦法用的,后來又因為OpenHarmony3.1開始啟用了自研的Rosen合成框架取代了Weston合成框架,原來能直接用的開源圖形驅動現在也不能直接用了,新版的OpenHarmony需要圖形驅動要額外對接OpenHarmony的接口,采用閉源驅動要得到原廠的支持,這個目前走不通,所以第三方設備要啟用GPU加速只能選擇采用開源的Mesa3d驅動,所幸OpenHarmony提供了一份mesa3d的參考實現,也能使OpenHarmony流暢絲滑了,這篇文章我打算分享一下我移植適配GPU的相關經驗,希望能幫到大家。

同時在此說明一下,這些知識基本都是我在網上自學得來,不是圖形專家,沒有深入學習過圖形方面的知識,對某些圖形的專業名詞或者某些概念可能會用詞不準確或者解釋錯誤,請大家諒解。

1、OpenHarmony圖形顯示移植適配思路

首先借用一張OpenHarmony圖形能力的視圖,我們可以了解到目前OpenHarmony當前以及未來支持的能力情況。

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

之前我們點亮屏幕采用的是CPU合成+CPU渲染的技術路徑,在【2022.3】的時候開始支持的,同時采用OpenGLES接口的GPU合成+GPU渲染也在3.2Beta4【2022.12】的時候實現了,基于這個版本才能實現完整的GPU加速,可以期待一下【2023.9】基于Vulkan接口的GPU加速。

經過上面簡單介紹,可能大家對GPU圖形適配還是毫無頭緒,因為這是在引申圖形適配的一些前置知識,在此我簡單總結一下適配OH圖形需要關注兩個大點:合成和渲染,下面是簡單的解釋。

1.合成:計算處理圖層疊加關系。

2.渲染:生成需要顯示的色彩數據(buffer)。

以上是我的個人總結,可能不準確,大致先這樣分,這樣后面好進行講解移植適配的思路。

下面進入正題,因為移植GPU比較復雜,不可能一部到位,在此我拆開進行逐步實現,以便出現問題時能快速定位問題點出現在哪一部分,拆分思路如下:

1.不啟用GPU功能,在CPU合成+CPU渲染的環境下,確認GPU驅動正常工作

2.啟用部分GPU功能,在CPU合成+GPU渲染的環境下,確認GPU能正確渲染

3.啟用GPU合成+GPU渲染,加速OpenHarmony圖形顯示

2、編譯開源GPU驅動Mesa3d

(1)編譯mesa3d

安裝依賴

首先安裝編譯需要的依賴:

sudo 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

版本變更失效路徑修正

OpenHarmony源碼中以及帶有適配過的mesa3d庫,但是因為長時間沒有維護,部分配置需要更新:

ohos/pkgconfig_template/gbm.pc。

libdir=${ohos_project_dir}/device/rockchip/hardware/gpu
includedir=${ohos_project_dir}/device/rockchip/hardware/gpu/include
Cflags: -I${ohos_project_dir}/device/rockchip/hardware/gpu/include

替換為:

libdir=${ohos_project_dir}/device/soc/qualcomm/msm8998/hardware/gpu
includedir=${ohos_project_dir}/device/soc/qualcomm/msm8998/hardware/gpu/include
Cflags: -I${ohos_project_dir}/device/soc/qualcomm/msm8998/hardware/gpu/include

ohos/pkgconfig_template/libdrm.pc。

libdir=${ohos_project_dir}/out/ohos-arm-release/graphic/graphic_standard/
修正為:
libdir=${ohos_project_dir}/out/ohos-arm-release/thirdparty/libdrm/

ohos/pkgconfig_template/libhilog.pc。

includedir=${ohos_project_dir}/foundation/graphic/standard/rosen/include/backstore/nativewindow
修正為:
includedir=${ohos_project_dir}/base/hiviewdfx/hilog/interfaces/native/innerkits/include

ohos/pkgconfig_template/libjpeg.pc。

libdir=${ohos_project_dir}/out/ohos-arm-release/obj/third_party/libjpeg/
includedir=${ohos_project_dir}/third_party/libjpeg
Libs: -L${libdir} -ljpeg_static

修正為:

libdir=${ohos_project_dir}/out/ohos-arm-release/obj/third_party/libjpeg-turbo/
includedir=${ohos_project_dir}/third_party/libjpeg-turbo
Libs: -L${libdir} -llibturbojpeg_static

ohos/pkgconfig_template/libpng.pc。

libdir=${ohos_project_dir}/out/ohos-arm-release/common/graphic_standard/
修正為:
libdir=${ohos_project_dir}/out/ohos-arm-release/thirdparty/libpng/

ohos/meson_cross_process.py。

'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/10.0.1/lib/arm-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x87_64/llvm/lib/arm-linux-ohos/c++',
修正為:
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/current/lib/arm-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/arm-linux-ohos/c++',

以上是因為版本變遷需要進行的修改,下面講解適配新的GPU需要做的修改。

驅動編譯腳本64位適配

因為我適配小米6采用的是64位系統,官方的mesa庫里面的腳本是32位的,這里我采用的方法是復制原版32位的兩個相關腳本,修改為64位編譯腳本。

復制ohos/build_ohos.py為ohos/build_ohos64.py。

復制ohos/meson_cross_process.py為ohos/meson_cross_process64.py。

修改gpu驅動名以及驅動搜索路徑。

ohos/build_ohos64.py。

run_cross_pross_cmd = 'python3 ' + script_dir + '/meson_cross_process.py ' + sys.argv[1] + ' ' + sys.argv[2]
...
run_build_cmd += '-Dplatforms=ohos -Degl-native-platform=ohos -Ddri-drivers= -Dgallium-drivers=panfrost \
-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools=panfrost -Ddri-search-path=/system/lib '

修改為:
run_cross_pross_cmd = 'python3 ' + script_dir + '/meson_cross_process64.py ' + sys.argv[1] + ' ' + sys.argv[2]
...
run_build_cmd += '-Dplatforms=ohos -Degl-native-platform=ohos -Ddri-drivers= -Dgallium-drivers=freedreno \
-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools= -Ddri-search-path=/vendor/lib/chipsetsdk '

這里簡單解釋編譯參數需要修改的三個地方

-Dgallium-drivers=panfrost  ->  freedreno

這里修改的是開源GPU驅動的名字,panfrost是arm mali gpu對應的開源驅動的名字,freedreno是高通gpu對應的開源驅動的名字。

-Dtools=

這個是加入編譯某些可以查看gpu負載的工具,我不需要,而且加入之后編譯報錯,解決比較麻煩,暫時去掉了。

 -Ddri-search-path=/system/lib ->  /vendor/lib/chipsetsdk

這個是驅動so庫放置的路徑,原配置是3.1版本還沒有soc分離思想,所以統一放置到system/lib下了,3.2采用了soc分離思想,soc驅動統一放置到vendor下了。

如果需要編譯32位GPU驅動,只需要參考修改gpu驅動名以及驅動搜索路徑即可。

meson_cross_process64.py

模板部分

修改【arm-linux-ohosmusl】為【aarch64-linux-ohosmusl】

去掉-march,-mtune等優化參數,最后修改為:

corss_file_content='''
[properties]
needs_exe_wrapper = true

c_args = [
'--target=aarch64-linux-ohosmusl',
'--sysroot=sysroot_stub',
'-fPIC']

cpp_args = [
'--target=aarch64-linux-ohosmusl',
'--sysroot=sysroot_stub',
'-fPIC']

c_link_args = [
'--target=aarch64-linux-ohosmusl',
'-fPIC',
'--sysroot=sysroot_stub',
'-Lsysroot_stub/usr/lib/aarch64-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/current/lib/aarch64-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/aarch64-linux-ohos/c++',
'--rtlib=compiler-rt',
]

cpp_link_args = [
'--target=aarch64-linux-ohosmusl',
'--sysroot=sysroot_stub',
'-Lsysroot_stub/usr/lib/aarch64-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/current/lib/aarch64-linux-ohos',
'-Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/aarch64-linux-ohos/c++',
'-fPIC',
'-Wl,--exclude-libs=libunwind_llvm.a',
'-Wl,--exclude-libs=libc++_static.a',
'-Wl,--exclude-libs=libvpx_assembly_arm.a',
'-Wl,--warn-shared-textrel',
'--rtlib=compiler-rt',
]

[binaries]
ar = 'project_stub/prebuilts/clang/ohos/linux-x86_64/llvm/bin/llvm-ar'
c = ['ccache', 'project_stub/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang']
cpp = ['ccache', 'project_stub/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang++']
c_ld= 'lld'
cpp_ld = 'lld'
strip = 'project_stub/prebuilts/clang/ohos/linux-x86_64/llvm/bin/llvm-strip'
pkgconfig = '/usr/bin/pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8'
endian = 'little'
'''

另外generate_pc_file函數中需要添加多一行,把pkgconfig_template中的【ohos-arm】替換為【ohos-arm64】

raw_content = raw_content.replace("ohos_project_directory_stub", project_dir)
raw_content = raw_content.replace("ohos-arm-release", product_name)
添加:
raw_content = raw_content.replace("ohos-arm", "ohos-arm64")

修改build_id獲取函數

因為OpenHarmony在elf文件里面的note信息添加了一個ohos特有的標識符,導致mesa3d獲取build_id的函數進行地址偏移計算的時候計算失誤,需要修正build_id獲取函數。

src/util/build_id.c。

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

mesa編譯

soc目錄下參照rockchip新建對應的qualcomm/msm8998/hardware/gpu目錄,include內的頭文件可復制rockchip下的文件。

修改完畢之后參照README_zh.md,在mesa3d目錄下執行py腳本進行編譯

python ohos/build_ohos64.py /home/diemit/ohos_beta5 sagit /home/diemit/ohos_beta5/third_party/mesa3d/

正常完成如下顯示。

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

3、OpenHarmony編譯框架適配

復制編譯出的lib到對應的soc/gpu目錄下

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

添加對應的BUILD.gn,復制對應的so文件到vendor下,并創建軟連接

import("http://build/ohos.gni")
import("http://build/ohos/ndk/ndk.gni")

ohos_prebuilt_shared_library("mesa_egl") {
source = "lib64/libEGL.so.1.0.0"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"libEGL.so",
"libEGL_impl.so",
]
}

ohos_prebuilt_shared_library("mesa_gbm") {
source = "lib64/libgbm.so.1.0.0"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"libgbm.so.1",
"libgbm.so",
]
}

ohos_prebuilt_shared_library("mesa_glapi") {
source = "lib64/libglapi.so.0.0.0"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"libglapi.so.0",
"libglapi.so",
]
}

ohos_prebuilt_shared_library("mesa_glesv1") {
source = "lib64/libGLESv1_CM.so.1.1.0"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"libGLESv1.so",
"libGLESv1_impl.so",
]
}

ohos_prebuilt_shared_library("mesa_glesv2") {
source = "lib64/libGLESv2.so.2.0.0"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"libGLESv2.so",
"libGLESv2_impl.so",
"libGLESv3.so",
"libGLESv3_impl.so",
]
}

ohos_prebuilt_shared_library("libgallium_dri") {
source = "lib64/libgallium_dri.so"
install_enable = true
part_name = "qualcomm_products"
install_images = [ chipset_base_dir ]
relative_install_dir = "chipsetsdk"
symlink_target_name = [
"msm_dri.so",
]
}

group("mesa3d-lib") {
deps = [
":mesa_egl",
":mesa_gbm",
":mesa_glapi",
":mesa_glesv1",
":mesa_glesv2",
":libgallium_dri",
]
}

上層BUILD.gn中添加gpu對應的lib信息。

import("http://build/ohos.gni")
group("hardware_group") {
deps = [
"gpu:mesa3d-lib",
]
}

這里可能會有的小伙伴會疑惑,為啥要復制build-ohos/src/gallium/targets/dri/libgallium_dri.so而不是build-ohos/install/lib/dri/msm_dri.so,這也是我之前遇到的問題,后來我發現dri下面那一大堆都是同一個文件,都是通過腳本從libgallium_dri.so復制過來重命名的而已,所以直接復制libgallium_dri.so即可,libgallium_dri.so可以軟連接成所有x_dri.so

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

另外為什么要軟連接成x_impl.so,是因為OH的代碼里面是用這個文件名進行lib的加載。

#創作者激勵#OpenHarmony富設備移植指南(6.1)開源GPU驅動編譯-開源基礎軟件社區

GPU適配這塊我是在樹莓派上首次驗證成功,細節印象還比較深刻,所以打算詳細講解,篇幅會比較長,第一篇先講解mesa編譯的坑與解決辦法,下篇講解編譯gpu測試程序,與gpu驅動程序的驗證,敬請期待。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-03-10 09:47:45

OpenGL渲染設備移植

2023-03-23 16:02:07

樹莓派4GPU調試

2023-02-07 15:52:50

2023-02-06 16:21:48

2023-04-06 09:10:13

設備移植鴻蒙

2023-02-28 15:40:16

鴻蒙CPU渲染

2023-02-14 17:06:31

設備移植打包刷機

2023-02-08 15:46:50

設備移植第三方內核適配

2023-05-05 16:05:26

設備內核移植鴻蒙

2023-05-16 14:49:25

鴻蒙內核移植

2022-03-17 15:55:19

播放數字音頻解碼鴻蒙

2021-12-16 15:14:54

鴻蒙HarmonyOS應用

2022-04-15 14:31:02

鴻蒙操作系統

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2024-07-26 16:39:33

鴻蒙系統開源構建系統

2021-09-08 15:23:51

鴻蒙HarmonyOS應用

2023-08-18 14:28:18

UART異步通信

2023-09-01 18:18:32

2022-10-24 14:54:29

LWIP協議鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91在线一区 | 国产精品1区2区3区 国产在线观看一区 | 欧美一区免费 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲在线免费观看 | 久久久久久国产 | 欧美成人一区二区三区 | 日韩在线一区二区 | 一区二区在线免费观看 | 欧美一区二区三区视频 | 97精品国产97久久久久久免费 | 中文字字幕在线中文乱码范文 | 中文字幕 在线观看 | 国产一级片在线播放 | 中国一级特黄毛片大片 | 99精品国产一区二区三区 | 91精品在线观看入口 | 久热国产在线 | 国产一区二区精品 | 亚洲精品一区二区三区蜜桃久 | 亚洲一区中文字幕 | 午夜影院视频 | 日日噜 | 欧美国产视频 | 欧美国产日韩精品 | 日日干夜夜操 | 九九久久这里只有精品 | 在线观看视频中文字幕 | 拍拍无遮挡人做人爱视频免费观看 | 99久久久99久久国产片鸭王 | 欧美一区二区三区 | 色av一区| 午夜网址| 欧美在线a | 亚洲九九精品 | 亚洲视频免费观看 | 99国产精品视频免费观看一公开 | a a毛片 | 亚洲精品第一页 | 亚洲视频在线观看免费 | 国产精品美女久久久久 |