作者:
Yaong
出處: https://www.cnblogs.com/yaongtime/p/13875596.html
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
出處: https://www.cnblogs.com/yaongtime/p/13875596.html
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
這是一篇關於在raspberry Pi 3b上移植實現vulkan 驅動的文章。
經過一段時間的代碼搬運,終於實現了零的突破,可以在樹莓派3B上運行Vulkan triangle/texture。當然目前的情況是,僅僅能運行這兩個demo,很多API都未實現,實現了的API也還有一大堆bug,總之這只是一個開始。
之所以會在選擇raspberry pi 3b是移植vulkan driver,是因為近段時間在學習GPU drivers(Mesa + DRM/KMS ),加之樹莓派的GPU驅動是開源的,GPU硬件數據手冊也是開源的,這有利於新手學習相關知識。
這份移植的Vulkan驅動代碼目前只涉及到Mesa部分,kernel驅動代碼沒有改動,所以后面提到的代碼均是在Mesa中。
這份Vulkan驅動代碼99.9%都是從v3dv、 tunip、vc4、lavapipe中復制粘貼過來的。v3dv是raspberry pi 4的vulkan驅動,目前還沒有合並到Mesa的upstream中(現在已經合並進去了)。tunip是對高通GPU的反向編譯后實現的開源vulkan的開源驅動。vc4就是raspberry pi 3b的OpenGL ES 2.0實現。lavapipe是Mesa中vulkan的軟實現。
Raspberry pi 3b上的GPU VC4只支持OpenGL ES 2.0,硬件上是不能完全支持vulkan的。所以不少vulkan的特性在Raspberry pi 3b是實現不了的。
在我開始做這件事之前,已經有外國牛人實現了Raspberry pi 3b的vulkan驅動,做這件事也是受到他的啟發,請參考:
https://github.com/Yours3lf/rpi-vk-driver。在看到相關報道前,我是沿着OpenGL ES 2這條路在分析vc4的代碼。許多代碼經過反復琢磨后也確實能看懂,但是終究缺乏動手的過程,再加上被其他事情稍微耽誤一下,就忘了,比如寄存器分配的算法,現在就忘得的差不多了。所以在看到有人在Raspberry pi 3b上實現vulkan驅動,讓我也萌生了動動手的想法。而且我發現老外的實現上少了glsl的編譯,說明是可以有事做的,不用又只能分析別人的代碼。
在這之前完全沒有接觸過vulkan,所以一切從零開始。還好隨着學習vulkan知識后,發現vulkan和OpenGL很多東西是相通的,所以之前的學的OpenGL知識幫了很大的忙,vulkan的API學得也還比較順利。但是像memory barrer、subpass一些vulkan獨有的概念還是花了不少時間去理解。
回到代碼部分。
如前文所說,絕大部分代碼是復制粘貼過來的,所以代碼里不出意外的話應該潛藏了不少的bug,以及很多查詢類API會返回不符合硬件屬性的值。目前能運行的demo是來之SaschaWillems在發布在GitHub上的測試代碼https://github.com/SaschaWillems/Vulkan。
如果有興趣想嘗試一下,可按如下方法搭建環境。
首先說下我的環境。
我當前的這個系統環境已經使用了很久了,所以已經記不得裝過那些編譯工具和依賴庫,這里給一個ARCH LINUX上的依賴列表:
https://www.archlinux.org/packages/staging/x86_64/mesa/。后續有時間,可以從頭走一遍,把需要的依賴編譯工具和依賴庫記錄下來。所以下面給出的搭建步驟很可能是不完整的,現在偷個懶,后續有時間再補上。
我在raspberry pi 3B 上安裝的是arch-linux來之Arch Linux ARM 社區,可以通過這里獲取
:https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3#installation
~> uname -a
Linux alarm 5.8.9-2-ARCH #1 SMP Tue Sep 15 00:48:59 UTC 2020 aarch64 GNU/Linux
代碼下載:
git clone https://gitlab.freedesktop.org/Yaong/mesa-vc4-vulkan.git
我所使用的編譯mesa腳本:
#! /bin/bash
GALLIUM="v3d,vc4,freedreno"
meson . _build \
-D prefix=
path/to/install \
-D buildtype=debug \
-D b_lto=false \
-D b_ndebug=false \
-D platforms= \
-D gallium-drivers= \
-D dri3=disabled \
-D egl=disabled \
-D gallium-extra-hud=false \
-D gallium-nine=false \
-D gallium-omx=disabled \
-D gallium-opencl=disabled \
-D gallium-va=disabled \
-D gallium-vdpau=disabled \
-D gallium-xa=disabled \
-D gallium-xvmc=disabled \
-D gbm=disabled \
-D gles1=disabled \
-D gles2=disabled \
-D glvnd=false \
-D glx=disabled \
-D libunwind=disabled \
-D llvm=disabled \
-D lmsensors=disabled \
-D shared-glapi=enabled \
-D valgrind=disabled \
-D glx-direct=false \
-D opengl=false \
-D prefer-iris=false \
-D shared-swr=false \
-D swr-arches= \
-D vulkan-drivers=vc4,broadcom
ninja -j 8 -C _build && ninja -j 4 -C _build install
Vulakn demo編譯:
Download:
git clone --recursive https://github.com/SaschaWillems/Vulkan.git
git submodule init
git submodule update
python download_assets.py
Depends:
pacman -Sy vulkan-icd-loader
Build:
cd Vulkan
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_D2D_WSI=ON ..
cmake --build . --target all -j 6
Test:
export VK_ICD_FILENAMES=
path/to/install/rpi-vk-driver.json
sudo ./bin/texture
or
sudo ./bin/triangle
運行效果:

因為這是第一次嘗試寫開源軟件,雖然絕大部分代碼不是我寫的,相關的代碼也有版權申明,但是我自己增加的少數代碼,我目前還不知道該怎樣正確的申明版權,所以我自己增加的文件,就隨便復制了一段Copyright,后續會學習一下這方面的知識。當然,我的主要目的不是維護自己的版權,而是不希望亂用了別人的版權,以引起其他不必要的誤會。
所以后面還有很多的事要做,當然我也不知道最終能做到怎樣的一個程度。
祝我好運吧!