mesa LLVMpipe ORCJIT 上游化的台前幕后
![mesa LLVMpipe ORCJIT 上游化的台前幕后](https://static001.geekbang.org/infoq/d5/d5065e52de060c14b2140dbc8fe75515.png)
内容来源: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 软件渲染成为了可能。
![](https://static001.geekbang.org/infoq/76/7678d37a06c3bdea46ecb93048e7f316.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
这个 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 的截图。
![](https://static001.geekbang.org/infoq/88/8871c0f1dffcc6f3b5fb323cc9484fa4.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
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 主线合入,标志这这一场由全球无数开发者参与、持续两年的开源马拉松圆满落幕。
![](https://static001.geekbang.org/infoq/24/2442cd9085a29eb897b4be18c60dd3c9.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
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 上游的最终合并提供了社区支持。
![](https://static001.geekbang.org/infoq/9c/9ce4b7bf2be73591d4677bff5ba2d1c9.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
在此期间,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 等):https://www.deepin.org/zh/download/
评论