这是一篇关于在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,后续会学习一下这方面的知识。当然,我的主要目的不是维护自己的版权,而是不希望乱用了别人的版权,以引起其他不必要的误会。
 
所以后面还有很多的事要做,当然我也不知道最终能做到怎样的一个程度。
祝我好运吧!

Vulkan Driver for VC4(Raspberry Pi 3b) base on mesa的更多相关文章

  1. A new comer playing with Raspberry Pi 3B

    there are some things to do for raspberry pi 3b for the first time: 1, connect pi with monitor/KB/mo ...

  2. 如何在Raspberry Pi 3B中安装RASPBIAN

    RASPBIAN简介 RASPBIAN是树莓派官方支持的基于Debian的Linux系统.RASPBIAN预装了很多常用的组件,使用起来十分方便. 官方有RASPBIAN STRETCH WITH D ...

  3. 如何在Raspberry Pi 3B中安装Windows 10 IoT Core

    Windows 10 IoT Core简介 Windows 10 IoT是微软专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT 操作系统的核心版本 ...

  4. [IOT] - Raspberry Pi 3B + Windows 10 IOT Core + .Net Core Web 部署

    硬件:Raspberry Pi 3B 系统:Windows 10 IOT Core 应用:.Net Core Web 部署流程 1. 系统安装 1.1 下载并安装 Windows 10 IoT Cor ...

  5. 树莓派(1)- Raspberry Pi 3B 安装系统并联网

    一.背景 昨天到手淘宝买的3B,既然买了就不能让它吃灰,动起来. 二.物料 名称 说明 硬件  树莓派3B 主体 树莓派电源 5V 2A sd卡 4G低速(推荐是16G class10),我手头只有这 ...

  6. Kali v2.1.2 for Raspberry Pi 3B

    最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...

  7. 人脸识别准备 -- 基于raspberry pi 3b + movidius

    最近准备系统地学习一下深度学习和TensorFlow,就以人脸识别作为目的. 十年前我做过一些图像处理相关的项目和研究,涉及到图像检索.记得当时使用的是SIFT特征提取,该特征算子能很好地抵抗图像旋转 ...

  8. 无外接键盘安装 raspberry pi 3B+ 安装系统

    从官网介绍看,当前raspbian和以前大家的记录略有不同,老的博客资料基本都是介绍下载raspbian,但现在raspbian已经不再维护镜像, raspbian系统开始由官方 pi foundat ...

  9. 树莓派:raspberry pi 3b - NOOBS

    NOOBS - 多操作系统安装器,可以将不同支持树莓派的流行操作系统安装在一张SD卡中并提供一个启动管理工具,安装的不同操作系统相互独立,互不影响,是一种比较有意思的玩法. 从版本1.3.1开始到1. ...

随机推荐

  1. profile对比std::regex与boost::regex的性能

    c++11标准库的regex比boost库的regex之间的性能差距接近5倍,这是为什么?stackflow上也找到一篇post<c++11 regex slower than python&g ...

  2. minium-微信小程序自动化框架-python,官方文档

    minium文档 个人将其部署到了自己的服务器上,如有需要可以访问共同学习这个minium 用python来实现小程序自动化测试... 文档地址 http://49.232.203.244:3000/ ...

  3. GitBook 3.2.3入门

    简介 GitBook 是一个基于 Node.js 的命令行工具,可使用 GitHub / Git.Markdown.AsciiDoc来制作精美的电子书.GitBook 可以将文档作为静态网站或电子书( ...

  4. 分页查询对象Page

    1 public class Page { 2 //当前页码 3 private Integer pageNo = 1; 4 //每页显示条数 5 private Integer pageSize = ...

  5. C#设计模式-适配器模式(Adapter Pattern)

    概念 把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作.适配器模式有类的适配器模式和对象的适配器模式两种形式.前者类之间的耦合度比后者高,且要求程 ...

  6. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  7. 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学

    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...

  8. Java知识系统回顾整理01基础04操作符07Scanner

    一.Scanner 需要用到从控制台输入数据时,使用Scanner类. 二.使用Scanner读取整数 注意: 使用Scanner类,需要在最前面加上 import java.util.Scanner ...

  9. sprintf_s() 、sprintf()和printf()区别和用法

    转载:https://blog.csdn.net/qq_35608277/article/details/80878802 int sprintf_s(char *buffer,size_t size ...

  10. JavaCV FFmpeg采集摄像头YUV数据

    前阵子使用利用树莓派搭建了一个视频监控平台(传送门),不过使用的是JavaCV封装好的OpenCVFrameGrabber和FFmpegFrameRecorder. 其实在javacpp项目集中有提供 ...