Vulkan Driver for VC4(Raspberry Pi 3b) base on mesa

这是一篇关于在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,后续会学习一下这方面的知识。当然,我的主要目的不是维护自己的版权,而是不希望乱用了别人的版权,以引起其他不必要的误会。

 

所以后面还有很多的事要做,当然我也不知道最终能做到怎样的一个程度。

祝我好运吧!

分类: LINUX DRM

标签: vulkanmesavc4OPENGL ESGPUraspberry piDRM/KMSlinux

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值