作者: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
运行效果:
![](https://img2020.cnblogs.com/blog/991424/202010/991424-20201025224857745-1196793065.png)
因为这是第一次尝试写开源软件,虽然绝大部分代码不是我写的,相关的代码也有版权申明,但是我自己增加的少数代码,我目前还不知道该怎样正确的申明版权,所以我自己增加的文件,就随便复制了一段Copyright,后续会学习一下这方面的知识。当然,我的主要目的不是维护自己的版权,而是不希望乱用了别人的版权,以引起其他不必要的误会。
所以后面还有很多的事要做,当然我也不知道最终能做到怎样的一个程度。
祝我好运吧!