这是一篇关于在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. 使用vue-cli(vue脚手架)快速搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目.这篇文章将会从实操的角度,介绍整个搭建的过程. 1. 避坑前言 其实这次使用vue-cli的 ...

  2. java面试题(一)

    1.面向对象的特征有哪些方面? - 1 - 2.访问修饰符public,private,protected,以及不写(默认)时的区别? - 1 - 3.String 是最基本的数据类型吗? - 1 - ...

  3. 6.Kafka消息流处理

  4. Java List 常用集合 ArrayList、LinkedList、Vector

    Java 中的 List 是非常常用的数据类型.List 是有序的 Collection,Java List 一共有三个实现类,分别是:ArrayList.Vector.LinkedList 本文分析 ...

  5. B树【Balanced-Tree】

    一.引言 B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~ 二.二叉树 定义:二叉树即二叉平衡树 意义:通过二分法来进行元素查找,时 ...

  6. VUE开发(一)Spring Boot整合Vue并实现前后端贯穿调用

    文章更新时间:2020/03/14 一.前言 作为一个后端程序员,前端知识多少还是要了解一些的,vue能很好的实现前后端分离,且更便于我们日常中的调试,还具备了轻量.低侵入性的特点,所以我觉得是很有必 ...

  7. Varnish 6.2.2 的介绍与安装

    一.简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 Squid 相比,Varnish 具有性能更高.速度更快 ...

  8. Python+Appium自动化测试(5)-appium元素定位常用方法

    对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor.之前已经介绍过了weditor的使用,这里我将 ...

  9. ubuntu19.10如何设置固定ip

    $ip a 看见系统中有两块网卡 lo: ...... ens33: ...... #cd /etc/netplan$ls目录下面有文件01-network-manager-all.yaml $sud ...

  10. Redis 客户端 Jedis、lettuce 和 Redisson 对比

    Redis 支持多种语言的客户端,下面列举了部分 Redis 支持的客户端语言,大家可以通过官网查看 Redis 支持的客户端详情. C语言 C++ C# Java Python Node.js PH ...