Jay 是一个正在为 Intel 的开源 OpenGL 和 Vulkan Linux 驱动程序开发的全新开源着色器编译器。最终,这个 Jay 着色器编译器有望在现代 Intel 硬件上提升 Linux 图形性能。
去年,Alyssa Rosenzweig 加入了 Intel。她曾主导 Asahi Linux 项目中 AGX 图形驱动代码的开发工作,并且也曾作为承包商为 Valve 公司效力,专注于 Linux 图形栈的优化。多年来,Rosenzweig 对 Mesa 项目贡献良多,尤其是在着色器编译和 NIR(中间表示)方面投入了大量工作。因此,如今由她主导开发这款新的 Intel 着色器编译器,也并不令人意外。
尽管如此,看到 Jay 被独立开发仍有些出人意料。因为除了 Mesa 中长期被 Intel 驱动使用的“BRW”着色器编译器之外,Intel 还拥有另一个名为 Intel Graphics Compiler(IGC)的编译器——它被用于 Linux 上的 Compute Runtime(支持 OpenCL 和 Level Zero)。IGC 也在 Microsoft Windows 平台上使用,不仅用于计算任务,还充当图形着色器的编译器。几年前我曾被告知,Intel 正在考虑将 IGC 应用于其 Mesa 驱动中;但如今看来,他们转而选择开发一种全新的解决方案——即这个名为“Jay”的编译器。
在今天提交的 Mesa 合并请求(merge request)中,Alyssa 解释道:
“此合并请求引入了 Jay,一个面向 Intel GPU 的新型基于 SSA 的编译器。目前仍处于早期开发阶段。它尚未准备好发布,但我们希望将开发工作纳入主干树内,而不是每周都重新变基整个代码库。请暂时不要尝试测试——我们清楚当前状态,并正在积极改进!
Jay 的设计与其他现代 NIR 后端类似,特别是 ACO、NAK 和 AGX。它完全采用 SSA 形式,在寄存器分配(RA)之后才解构 PHI 节点。我们使用一种类似于 NAK 的 Colombet 寄存器分配器,这使我们能够以简单直接的方式处理 Intel 复杂的寄存器区域限制。逻辑寄存器的溢出(spilling)通过 Braun-Hack 方法实现也很直观……但如何将标准的 SSA 后端设计适配到 Intel 硬件上却并不简单。如果你感兴趣,可以阅读代码;不过我计划在 XDC 大会上‘吐露真相’……所以今年大会在多伦多举行,再合适不过了 :-)”
目前,Jay 编译器仅针对 Intel Xe2 硬件,但未来会逐步扩展支持范围。该编译器已能通过 OpenGL ES 3.0 和 OpenCL 3.0 的一致性测试(conformance testing),Vulkan 相关工作也在推进中。

截至目前,Jay 相较于现有的着色器编译器,性能表现非常出色:
“先透露一点……这里是一个极具挑战性的 CTS 测试(math_bruteforce sin),分别用旧编译器(brw)和新编译器(jay)进行编译:
- jay:6768 条指令(361:396 溢出:填充)– 耗时 7.00 秒
- brw:12980 条指令(578:1144 溢出:填充)– 耗时 19.91 秒
在更短时间内生成了优于当前编译器的代码……Intel 平台上的 Mesa 编译器前景光明 :-)”
Linuxeden开源社区