这是一篇关于在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。
如果有兴趣想尝试一下,可按如下方法搭建环境。
首先说下我的环境。
~> 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,后续会学习一下这方面的知识。当然,我的主要目的不是维护自己的版权,而是不希望乱用了别人的版权,以引起其他不必要的误会。
所以后面还有很多的事要做,当然我也不知道最终能做到怎样的一个程度。
祝我好运吧!
- 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 ...
- 如何在Raspberry Pi 3B中安装RASPBIAN
RASPBIAN简介 RASPBIAN是树莓派官方支持的基于Debian的Linux系统.RASPBIAN预装了很多常用的组件,使用起来十分方便. 官方有RASPBIAN STRETCH WITH D ...
- 如何在Raspberry Pi 3B中安装Windows 10 IoT Core
Windows 10 IoT Core简介 Windows 10 IoT是微软专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT 操作系统的核心版本 ...
- [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 ...
- 树莓派(1)- Raspberry Pi 3B 安装系统并联网
一.背景 昨天到手淘宝买的3B,既然买了就不能让它吃灰,动起来. 二.物料 名称 说明 硬件 树莓派3B 主体 树莓派电源 5V 2A sd卡 4G低速(推荐是16G class10),我手头只有这 ...
- Kali v2.1.2 for Raspberry Pi 3B
最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...
- 人脸识别准备 -- 基于raspberry pi 3b + movidius
最近准备系统地学习一下深度学习和TensorFlow,就以人脸识别作为目的. 十年前我做过一些图像处理相关的项目和研究,涉及到图像检索.记得当时使用的是SIFT特征提取,该特征算子能很好地抵抗图像旋转 ...
- 无外接键盘安装 raspberry pi 3B+ 安装系统
从官网介绍看,当前raspbian和以前大家的记录略有不同,老的博客资料基本都是介绍下载raspbian,但现在raspbian已经不再维护镜像, raspbian系统开始由官方 pi foundat ...
- 树莓派:raspberry pi 3b - NOOBS
NOOBS - 多操作系统安装器,可以将不同支持树莓派的流行操作系统安装在一张SD卡中并提供一个启动管理工具,安装的不同操作系统相互独立,互不影响,是一种比较有意思的玩法. 从版本1.3.1开始到1. ...
随机推荐
- java 泛型学习随笔
对于java 泛型 编译时处理,运行时擦除的特点理解 对于编译时处理 在使用泛型相关的类或方法时,如果声明时的类型和具体使用时的类型不一致则直接会编译不通过 对于运行时擦除 当在运行时对两个相同类型但 ...
- pwnable.kr-shellshock-witeup
思路是:发现文件执行没什么好反馈显示结果的,于是看文件和权限,通过bash文件猜测可能存在破壳漏洞(CVE-2014-6271)漏洞,于是利用它并结合文件权限成功获得flag. 通过scp下载文件至本 ...
- pwnable.kr-mistake-witeup
阅读代码后思路: 实践: 1111111111 其异或值:0000000000 欧克,愉快的结束. 需要经常多看代码,对代码的书写习惯有了解,比如这一块17行一般人书写时都会习惯性加括号的.
- SQL Server 子查询遇到的坑
这两天改 Bug 时使用 Sql Server 的子查询遇到了一些问题,特此记录一下,之前用 MySQL 比较多,按照 MySQL 的语法其实是没有问题的. 以下面这张表为例: 执行以下 SQL: s ...
- Python练习题 046:Project Euler 019:每月1日是星期天
本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...
- helm部署的服务如何修改配置
关于helm部署服务 在Kubernetes上进行容器化部署时,使用helm可以简化操作,以部署Jenkins为例,只需要以下命令即可完成部署: helm install --namespace he ...
- Power Designer建模之餐饮在线点评系统——需求模型实例
总览 一级需求 二级需求 管理门户 会员门户 三级需求 系统管理 企业中心 会员中心 统计分析 四级需求
- P3419 [POI2005]SAM-Toy Cars / SP688 SAM - Toy Cars
一道很妙的贪心题 题面 我们考虑当我们插入时会面临的两种情况 当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了. 当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置. 这就 ...
- 安装haproxy
安装依赖 yum install -y gcc pcre pcre-devel openssl openssl-devel 创建依赖账号,并禁止账号登录 useradd -M -s /sbin/nol ...
- JS原生练习
1.输出1-10000之间的数 <script> for(i=1;i<=10000;i++) { document.write(i + "<br>") ...