我们知道虽然瑞芯微(Rockchip)官方给出了显示驱动包(libmali), 但是在没有搭配任何说明文档而且各种驱动文件混杂的情况下, 实在难以搞清楚文件的版本, 结构和关系, 遑论正确安装, 配置和使用了.
好在有徐珂靖大牛首先对云芯一号的GPU驱动问题做了相关研究, 将最新的驱动安装过程进行了相关梳理和测试, 并成功运行了OpenCL. 但是不足的是图形驱动仍然没有很好地运行起来. 以致于依赖”GPU硬件加速”的网页浏览, 在线高清视频, 桌面环境实时动画以及3D图形性能(OpenGL ES)无法使用起来.
经过相关的调试和配置, 本文的方案主要实现了以下功能:
- 实时桌面动画渲染. 如此云芯一号的桌面环境可以媲美PC运行Linux桌面的流畅感.
- Chromium 浏览器 GPU 硬件加速支持, WebGL 以及 WebGL 2.0 支持. 浏览网页不再卡顿, 迟滞, 特别是观看1080P在线视频时(Youtube, Bilibili) 画面无卡顿, 拖影.
- PSP 3D游戏在 3倍 PSP 标准分辨率下 (4倍下稍有卡顿) 满帧运行. 动作行云流水, 打斗招招到位.
本文是云心一号的番外篇, 写作动机是为了找寻一种方案以解决之前在 <<云芯一号 云游戏服务器 贰>>中使用 PPSSPP 模拟 PSP 游戏时无法满帧 (哪怕在 1倍 PSP 分辨率下), 只能模拟到十几帧的问题.
前置要求
云芯一号固件更新的相关知识(参见宽心的文章)
方案的寻找过程
云芯一号采用的 rk3399 方案集成的是 Mali T860MP4
的GPU, 理论性能是足够流畅运行 3D PSP 游戏的. 但在之前的试验(参见)中不能满帧运行, 甚至观看1080P视频都非常卡顿.
然而经过调查发现, 有一块名为 ODroid XU4
的开发板, 虽然采取规格差很多的 SoC (2014年发布的三星猎户座 Exynos 5422
, 集成与云芯一号差两代的 Mali T628 MP6
), 却能满帧运行 3D PSP 游戏(参见). 让人不得不怀疑是因为我们的显示驱动拖了后腿.
我曾在系列第二篇文章中提到的, 有一名网友 MrFixit2001
在 PPSSPP 项目中提出了一个 rk3399 模拟 3D 游戏 满帧 的加速方案(参见)
): 在编译 PPSSPP 强制其只使用 rk3399 的两个 A72 大核心关闭所有小核心.
而我在写作第二篇文章时确实实测采用相同的方法进行编译 PPSSPP, 但性能却非升反降, 所以当时认为这位网友的方法不靠谱. (现在来看是因为当时我们并没有真正地将 GPU 驱动起来, 纯靠 CPU 进行软件渲染 OpenGL, 所以在关闭了小核心以后速度反而降低了.)
但是这位网友不仅言辞恳切而且列举了大量的代码和例证分析, 又让人感觉他所言属实. 怀着这个心态, 我就继续查询这位网友有关的资料. 我发现他不仅在Github 上有活跃度, 而且在 Pine64
论坛上有大量原创的且有相当深度的 rk3399 平台文章, 由此可以判断他是一名具有相当深度的 rk3399 平台的开发者.
进一步探寻他的 Github 项目以后终于发现了宝藏:
这位网友自行克隆瑞芯微官方内核以后做了相当大的修改和完善工作, 同时推出了一套针对 rk3399 平台的 驱动完备 Debian 9 桌面系统
(项目地址).
按照网友的项目说明, 这套系统使用 Mate 桌面环境, 并完美适配了 rk3399 平台的的 Mali 显示驱动. 除此以外, 系统内置的 Chromium 浏览器
为网友自行编译, 适配了硬件加速以及 WebGL 和 WebGL 2.0支持
. 自行编译的MPV 视频播放器 支持 4K 视频播放
. 最后通过 GL4ES
支持了 OpenGL
的3D加速.
本文就是基于此系统映像所实现. 在该网友的工作基础之上, 本文进一步调优编译了 基于 OpenGLES 的 PPSSPP
, 从而使PSP游戏的模拟充分利用该网友所适配的 GPU 驱动, 以实现满帧运行.
不过需要注意的是这套完备的 Debian 9 系统仅仅针对 Pine64
出品的RockPro 64
平台和 PineBookPro 上网本
平台开发, 因此系统的内核部分我们无法使用, 如有感兴趣的同学想移植这套修改后的内核(版本4.4)可以参照其项目地址, 作者也克隆了主线(mainline)内核(5.x)并进行适配, 感兴趣移植的同学可以参见这里.
在云芯一号上的部署该方案
聊完探索之路以后让我们正式开始这套 驱动完备的 Debian 9 映像
的部署工作.
首先是下载 MrFixit2001 发布的映像文件, 这里提供他的 Github 地址:
https://github.com/mrfixit2001/debian_desktop/releases/
这里我们下载最新版本的适用于 rockpro64 平台的 release. 注意文件名为:
rockpro64-debian-desktop-mrfixit-191226.img.xz
解压这个 xz
压缩包我们得到一个 img
映像. 注意这个映像是包含 内核
和 rootfs
的, 而且内核是直接适配 RockPro64 这套板子的, 因此内核部分我们没法使用. 所以我们仅提取并使用他的系统部分, 也就是 rootfs
来刷入云芯一号板子.
我们可以任意使用常见的解压缩软件(如7z)来解压这个 img
映像, 解压后有两个文件 0.fat
和 1.img
.
这里的 1.img
就是我们要刷入的 rootfs
映像. 我们在这里参照宽心提供的方法进行刷入.
注意: 只刷入 rootfs 部分, 其他的不要碰. 如下图所示.
等待刷入完成, 新的驱动完备桌面环境就会自动启动.
初始的用户名和密码均为 rock
默认 root 密码为 root
这套映像使用的是 32位
系统 ( armhf
), 使用的桌面环境为 Mate, 并且为我们提供了常用的软件资源.
下面我们来测试使用 Chromium
播放 1080P 视频
的效果 (测试网站为 Youtube). 如下图所示(只截取了原图的左上角部分), 可以看到在已经播放的 680 帧中总共跳过了 0 帧, 效果媲美我们的 PC 播放 1080P 在线视频的性能.
此外由于此映像默认直接支持 HDMI 音频输出
, 不需要我们任何调整. 这就意味着云芯一号可以直接化身为一台多媒体服务器, 连接电视为我们提供流媒体点播服务.
编译 PPSSPP 开启 OpenGL ES 加速
有了完备的显示驱动支持, 我们的 PPSSPP 性能不再拉胯, 可以正式通过 OpenGL ES
来加速 3D 游戏. 总结来说, 3 倍的 PSP 分辨率下可以满速运行, 4 倍 PSP 分辨率下稍有卡顿.
这里我们仍然基于徐珂靖在其公众号上所提供的编译思路进行编译. 原文参见.
1 - 下载 PPSSPP 的源代码并进入项目目录
git clone --recurse-submodules https://github.com/hrydgard/ppsspp.git
cd ppsppp
2 - 安装依赖环境
这里只需要安装 libzip-dev
, 其他的库映像中都已经集成了.
sudo apt install libzip-dev
3 - 解决 glibc
版本过低的问题
这里算是一个坑, 由于 Debian 的保守更新策略(不同于 Ubuntu), Debian 9 中所能通过 apt
安装的 glibc
版本过低导致无法满足 PPSSPP 的最低要求.
这里我们只能 借助
Debian 10 的包库来更新我们 Debian 9 中的 glibc. 颇有 借本朝的剑斩前朝的官 的意思.
为此我们需要修改 /etc/apt/sources.list
文件, 找到其中的 stretch
(9代代号) 修改为 buster
(10代代号). 效果类似下图所示:
然后运行代码更新我们的仓库:
sudo apt update
注意千万 不要
用 upgrade
命令来更新已有的库\! 否则将导致严重的版本匹配问题.
之后我们来安装新版本的 glibc:
sudo apt install libc6
完成之后我们再将 sources.list
改回原配置.
4 - 配置 PPSSPP 编译文件以启用 OpenGL ES 支持
这里我们需要修改的是项目中的编译方案, 也就是 cmake 配置文件, 目的是:
- 让 PPSSPP 正确找到 GPU 驱动程序的文件所在路径.
- 让 PPSSPP 使用 armv8 处理器所具有的 vfpv4 硬件浮点数支持.
这里经过多次调试, 我找到了一个性能最优的编译方案. 我们只需要在 cmake/Toolchains
目录下创建一个 rk3399.armv7.cmake
文件并填充以下配置内容:
include_directories(SYSTEM
/usr/lib/arm-linux-gnueabihf
/usr/include
/usr/include/EGL
/usr/include/GL
/usr/include/CL
/usr/include/GLES
/usr/include/GLES2
/usr/include/GLES3
)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mtune=cortex-a72 -mfpu=neon-vfpv4 -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mtune=cortex-a72 -mfpu=neon-vfpv4 -mfloat-abi=hard")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=armv7-a -mtune=cortex-a72 -mfpu=neon-vfpv4 -mfloat-abi=hard")
set(CMAKE_EXE_LINKER_FLAGS "-L/usr/lib/arm-linux-gnueabihf" CACHE STRING "" FORCE)
set(OPENGL_LIBRARIES /usr/lib/arm-linux-gnueabihf/libGLESv2.so)
set(EGL_LIBRARIES /usr/lib/arm-linux-gnueabihf/libEGL.so)
set(USING_GLES2 ON)
set(USING_EGL ON)
set(USING_FBDEV ON)
set(FORCED_CPU armv7)
因为系统是 32位
系统, 所以我们里面会有 armv7
的字眼. 实际上 rk3399 是 armv8 处理器, 所以具有 vfpv4 硬件浮点数支持, 这里我们一并开启.
5 - 编译 PPSSPP
首先确保我们的 shell 当前在 PPSSPP 项目根目录之下. 然后运行如下指令:
cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/Toolchains/rk3399.armv7.cmake
make -j6
6 - 运行 PPSSPP
等待编译完毕以后, 我们就可以在项目根目录下找到 PPSSPPDL
可执行文件. 通过命令行 ./PPSSPPDL
启动它, 可以看到下面有 OpenGL ES
的字眼 (在之前系列文章尝试时中只有 OpenGL), 这就代表我们顺利启用了 GPU:
我们赶紧运行 3D 游戏进行测试, 发现效果出奇的好. 以至于我们能够在开启了 3倍 PSP 分辨率的情况下, 游戏仍然能够满帧满速运行\!
测试的在3倍 PSP原生分辨率 下运行 <<刺客信条>> 的实机截图如下, 可以发现右上角的 FPS 指示器
一直稳定在 30.
在 4倍 PSP原生分辨率 下云芯一号就会有些吃力, 帧数降为 24 帧左右, 玩起来有些许的顿挫感.
总结与展望
至此本文的工作正式结束, 总结来看, 我们首先实现了流畅播放在线 1080P 视频不卡顿, 配合原生支持的 HDMI 音频输出, 我们可以将云芯一号连接电视作为一台全功能多媒体服务器来使用.
其次, 桌面环境和 Chromium 浏览器的硬件加速支持使得我们的桌面和网页浏览体验如同 PC 一般.
最后, OpenGL ES 的支持使得我们的 PPSSPP 模拟器可以在 3倍 PSP分辨率的情况下满速满帧运行, 这是以前所不可想象的.
展望未来, 在有了完备的 OpenGL 支持下, 我们可以充分发挥 GPU 异构计算的实力, 为机器学习, 科学计算能提供加速支持, 以期充分发挥云芯一号的算力, 赋能云芯一号边缘计算的广阔未来.