mesa LLVMpipe ORCJIT 上游化:一场历时两年的后端合并马拉松,幕后英雄竟是 TA!

内容来源:deepin(深度)社区


近日,mesa 开源图形驱动合并了 llvmpipe 的 ORCJIT 后端的 Merge Request (MR),并实现了对 riscv64 架构的支持。

LLVMpipe 是什么?

LLVMpipe 是 mesa 驱动中的一种软件渲染器,它不使用 GPU 硬件,而是利用 LLVM 中的 JIT 编译器,动态地将待渲染的图形相关代码转译为栅格化的数据用于显示,相对于 softpipe 而言性能更优。

饱受诟病的闭源驱动从始至终都是阻碍 riscv64 架构桌面生态的一大原罪,导致大部分 riscv64 架构的开发板的内置 GPU 完全或部分不可用,桌面发行版只能使用软件渲染作为替代方案。

然而,在很长一段时间,mesa 的 LLVMpipe 使用的 JIT 后端是老旧的、缺乏架构支持的 MCJIT,而非更新的、架构支持更加广泛的 ORCJIT。由于前者已经明确由后者替代接续,不再接受新的架构更新,这使得 mesa 在 riscv64 等架构上使用软件渲染时只能使用性能更加低下的 softpipe,最终导致桌面环境几乎无法使用,使得桌面生态遭受毁灭性的打击。

正因如此,开源社区急切地渴望在 riscv64 架构上拥有一个更快的软件渲染器。

ORCJIT 的首次尝试

时间推进到了 2022 年 7 月。一位 Alex Fan (@alexfanqi) 的开发者提交了 MR 17801,为 mesa 引入了新的 ORCJIT 后端,同时还为其加上了 riscv64 支持,这使得在 riscv64 上使用 LLVMpipe 软件渲染成为了可能。

这个 MR 并没有第一时间被合并,因为有开发者指出它没有一个开关用以在编译时切换后端、代码不够简洁需要优化、缺少着色器缓存等问题,还需要进一步优化。

从此开始,长达两年的 LLVMpipe ORCJIT 后端合并的长跑开始了。

2022 年 7 月,openEuler 社区的 RISC-V SIG 发现了这个 PR 并将其并集成,发布了一篇文章介绍了它的性能提升效果。

然而,就在 riscv64 平台的开源桌面生态即将迎来曙光的时候,世事难料,随着 mesa 开发分支的高速推进,原来的 Merge Request 缺乏维护,与主线的差异和冲突越来越大,渐渐的被淹没在冗长的 MR 列表中,逐渐被人淡忘。

社区的接力:开源软件不灭的火种

2023 年 11 月,一位名为 Yukari Chiba (@YukariChiba) 的开发者在维护自己的发行版时,遇到了同样的问题。她受够了大部分主线发行版在遇到这个问题时切换到 softpipe 的忍让态度,决定着手解决这个问题。

被尘封在 MR 列表中的 patch,再一次化作荧幕上的光芒。

11 月 1 日,@YukariChiba 在某个群组里发布了一张在飞腾派上以开启了 ORCJIT 的主线 mesa 使用 LLVMpipe 运行 glxinfo 的截图,并在次日发布了一张在 PineTab-V 上使用 LLVMpipe 运行 glmark 的截图。

11 月 8 日,@YukariChiba 以相同的 ID,在 mesa 主线中重新提交了 MR 26018,旨在为主线版本 mesa 提供参考 patch 的同时,推进 mesa 主线的合并。

很快,deepin、ArchLinux RISC-V、AOSC OS 等发行版也先后使用了这一版 MR 的补丁,RISC-V 主线化的桌面体验再一次达到了可用的状态。

2024 年 4 月,Icenowy Zheng (@icenowy) 在 ORCJIT MR 的基础上增加了着色器缓存和 loongarch 架构的支持,这意味着 ORCJIT 后端一旦合入,所有的主流桌面架构都能实现性能优异的 LLVMpipe 支持。

众人拾柴火焰高,长风破浪会有时,LLVMpipe ORCJIT 这一突破性进展受到越来越多开发者的关注,合并进入主线逐渐被提上了日程。

MR 的接力冲刺和最终合并

6 月 19 日,有开发者评论:

Is there anything outstanding that is preventing this from being merged into the main mesa branch?

而这打破了 MR 评论区的宁静。在后续的 1 个月里,社区贡献者们对该 MR 提出了数十条修改意见;Dave Airlie (@airlied) 为帮助 ORCJIT 最终落地提交了数个前序修改和代码结构优化;MR 提交者 @YukariChiba 根据修改意见对 MR 提交内容修改了数十个版本,并最终在 6 月 28 日提交了最终版本。

最终,7 月 16 日,Merge Request 26018 完成了合并前 CI 检查,被 mesa 主线合入,标志这这一场由全球无数开发者参与、持续两年的开源马拉松圆满落幕。

deepin的持续跟踪与维护:幕后故事

在 mesa 提交 MR 的这位 ID 称作 @YukariChiba 的开发者还有另外的身份:deepin(深度)开源社区的研发工程师,deepin-ports SIG 开发者,deepin RISC-V port 的维护者之一。

deepin-ports SIG 在 2023 年成功将 RISC-V 的支持合并到了主线,同时也对主流的开发板进行了适配。与其它开源社区一样,deepin 也饱受无法主线化、依赖闭源驱动组件的 GPU 图形驱动的困扰,mesa 的 ORCJIT 后端支持此时无异于雪中送炭。

deepin 在 2023 年 12 月 6 日便对这一份更新的 patch 做了内部的打包验证,并在 VisionFive2、LicheePi4A、SG2042 EVB 等开发板上做了实机验证和性能测试。

次日,deepin 合并了此 MR 的 patch 到 mesa 主线仓库,为 riscv64 架构默认打开了 ORCJIT 支持,并在后续所有的 riscv64 设备镜像中启用。

从 2023 年 11 月的初版补丁,直到 2024 年 7 月 16 日的最终合并,deepin 的 mesa 版本也相应的从 23.1.2 一路升级到了 24.1.0。在这过程中,deepin-ports SIG 积极适配新版 mesa 并刷新补丁,做到了在版本迭代的过程中补丁持续有效,助力了此特性的测试和维护,客观上为 mesa 上游的最终合并提供了社区支持。

在此期间,deepin 同时也超前引入了尚未合并、基于 ORCJIT 提交的 loongarch 支持补丁和着色器缓存补丁,为 deepin-ports 两大架构 riscv64 和 loong64 提供了更高性能的软件渲染,完善了 deepin 的桌面生态。

未来,deepin 还将继续跟进 mesa 等开源软件的上游更新和后续的性能优化,为完善 amd64/arm64/riscv64/loong64 四大架构的开源桌面体验而不懈努力。

附录:

(1)deepin 全版本镜像(含 deepin V15): https://distrowatch.com/index.php?distribution=deepin

(2)deepin RISC-V 架构镜像(LicheePi 4A、VisionFive 等): 最新版本 -- 深度科技社区

相关推荐
HBryce243 分钟前
缓存-基础概念
java·缓存
一只爱打拳的程序猿17 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧19 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
颇有几分姿色20 分钟前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
minDuck21 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
白子寰25 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT37 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。39 分钟前
c++多线程
java·开发语言
小政爱学习!41 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
daqinzl1 小时前
java获取机器ip、mac
java·mac·ip