只需自由软件,马里G31芯片现在就可以运行GNOME甚至更多

2020-06-08 18:48:20

在我们针对Panfrost的最新博客更新中,我们宣布初步支持BiFrost架构。Panfrost是现代马里GPU的免费开源图形驱动程序。自那以后,我们已经将这种支持扩展到OpenGL ES 2.0的所有主要功能,甚至桌面OpenGL 2.1的一些功能。只需免费软件,马里的G31芯片现在就可以运行包括GNOME 3在内的零拷贝图形的Wayland合成器。我们可以在glmark2-es2中运行每个场景,还可以玩像Neverball这样的3D游戏。此外,我们还可以支持硬件加速的视频播放器MPV和KODI。上面的屏幕截图来自运行潘弗罗斯特的马里G31电路板。

以上所有功能都包含在上游MESA中,不需要树外补丁,即将推出的BiFrost支持通过PAN_MESA_DEBUG=BiFrost环境变量启用。

提出这些新的应用程序需要实现许多新的浮点算术操作码,包括比较、选择和额外的类型转换。此外,我还添加了对整数算术和按位运算的初始支持,用于直接实现整数类型和布尔值。虽然需要大量算术逻辑单元(ALU)操作码,但对于使用常规指令编码的体系结构来说,这不是障碍。

不幸的是,BiFrost不是常规架构,为了节省空间,它有几十种截然不同的指令编码。向编译器添加操作码仍然是例行公事,但需要添加相当多的代码。此外,复制可能容易出错,因此只要我添加一个新操作码,我就会添加针对真实硬件的全面测试,通过不同的操作数大小和修饰符组合迭代,以练习所有打包特殊情况。

其结果是,测试覆盖消除了容易困扰新驱动程序的整类编译器错误,允许我们的开源BiFrost驱动程序在如此古怪的架构下蓬勃发展。

除了新的ALU操作码之外,我还扩展了纹理支持以启用顶点着色器的简单纹理操作,顶点着色器是glmark2的地形场景中出现的一种模式。马里GPU对碎片和顶点纹理操作使用略有不同的编码,因为碎片着色器可以根据相邻碎片自动计算细节级别参数,而顶点着色器中没有相邻碎片的概念。

最后,我添加了对if/Else语句和循环的初始控制流支持(分支)。由于BiFrost是单指令、多线程(SIMT)体系结构,在该体系结构中多个线程以锁步方式运行同一着色器,因此如果线程不同,则分支是一件复杂的事情。大部分复杂性是在硬件中处理的,但只要足够多,分支实现就会比Midgard稍微复杂一点。不过,对于glmark2的循环场景来说,它已经足够了,而且总是有改进的空间。

当然,比弗罗斯特的进步并不妨碍我们提高米德加德的支持率。受到之前博客中设计Bifrost中级代表的经验教训的启发,我也重新审视了我们的Midgard中级代表。重点放在两个方面:

为此,我实现了用于推断指令修饰符(如饱和度)的通用帮助器。考虑这样一个着色器,该着色器将变量平方并使其饱和到范围[0, 1]。

在近红外(MESA在驱动程序中使用的通用中间表示法)中,此行可能如下所示,使用近红外的fsat操作码钳制为[0, 1]:

我们的硬件本身就支持饱和浮点指令的结果。有几种方法可以利用这一点。一种是使用NIR的内置饱和处理,就像Midgard的编译器过去使用的那样。NIR通道可以将fsat指令融合到乘法中,从而产生NIR:

然后,我们的后端编译器可以直接使用.sat标志。虽然这是一种简单的方法,但它是不灵活的,因为硬件可能能够使用NIR不表达的修饰符。例如,马里GPU有一个.CLAMP_PRODUCT操作,它免费对结果执行max(x, 0.0)。如果我们编写X=max(X*X,0.0),则NIR可以使用专用的fCLAMP_PRIVATION指令给出代码:

但是,如果不对公共代码进行重大更改,它就无法融合修饰符。第二种方法是将其编译为IR中的两条指令,并在后端IR上使用第二个传播通道将其融合在一起。

然而,还有第三种选择统一了这两种情况并简化了编译器:在将NIR转换为我们的后端IR时,一般地推断修饰符。这使我们能够使用特定于体系结构的修饰符,如.pos,同时仍然可以使用原始的NIR进行有效处理。这种方法使我们能够替换数百行浮点修饰符和按位反转的优化,同时优化原始设计无法实现的新模式,有望降低代码复杂性并提高性能。因为它是通用的,所以我们不仅可以优化Midgard程序,而且很快还可以优化BiFrost修饰符。

使用更简单的编译器,我可以向Midgard编译器添加16位支持,以减少寄存器压力,并由于体系结构的寄存器共享机制提高线程数量(占用率)。正如之前的博客所述,我们的BiFrost编译器从第一天起就支持这一点,通过在那里学到的经验教训,我能够将改进移植到Midgard。

为了做好准备,我将类型添加到IR中,以避免需要类型推断的编译器遍历,这是一种复杂且容易出错的追求。在干净地保留了字体大小之后,我向Midgard编译器的打包例程添加了额外的支持,以处理16位指令的一些突出细节。Midgard的打包比Bifrost简单得多;BiFrost上的16位和32位指令涉及操作码和格式截然不同的单独指令,而Midgard有一种最适合的方法,尽管其固有的限制令人耳目一新。整个编译器需要进行各种修复;然而,简化的IR符合其设计,并且现在能够支持16位操作。

FP16所需的大量代码现在已登陆上游MESA,但默认情况下处于禁用状态,等待进一步测试。不过,对于喜欢冒险的人来说,可以在最新的master版本上设置PAN_MESA_DEBUG=FP16。当心:龙来了。

不再使用编译器,一个有趣的改进是取消了颜色掩蔽的绘图新处理。OpenGL中不使用混合或颜色蒙版的典型绘图可能如下所示:

由于混合被禁用,并且所有颜色通道(RGBA)被同时写入,因此该绘制不需要从颜色缓冲区(标题缓冲区)读取。但是,如果抽签没有写入任何颜色通道怎么办?

天真的是,GPU需要读取之前的颜色并立即将其写回-但这是浪费。相反,我们可以检测没有写入颜色的情况,并取消对颜色缓冲区的所有访问,跳过读取和写入。

我们能完全跳过抽签吗?如果没有副作用,我们可以,但是应用程序通常屏蔽颜色,同时取消屏蔽深度缓冲区,这与颜色计算无关。米德加德有一个解决方案。

即使需要深度/模具更新,只要着色器只计算没有副作用的颜色,就没有理由运行着色器。虽然BiFrost看起来不像,但Midgard允许驱动程序指定不带着色器的绘制,这不仅节省了颜色缓冲区的读/写,还节省了着色器的执行。

除了我们在Midgard性能方面的工作之外,社区Panfrost黑客Icecream95一直在不停地改进Midgard堆栈。

自从我们上一篇博客文章以来,他们为处理丢弃指令贡献了一个重要的错误修复。对于背景,OpenGL概念性地首先为屏幕上的每个像素运行片段着色器,然后执行深度测试。在实践中,现代硬件尝试在运行着色器之前执行深度测试,称为“早期z”测试,以避免不必要地执行遮挡像素的着色器。

但是,游戏使用Discard,这是一个OpenGL指令,允许着色器消除碎片,这可能会干扰诸如Early-z之类的优化。驱动程序负责检测这些情况,禁用这些优化,并启用符合标准的后备路径,包括“late-z”测试。在Icecream95调查了Panfrost在存在丢弃指令的情况下处理深度测试的问题后,他们能够修复许多游戏中的渲染错误,包括SuperTuxKart、OpenMW和RVGL。

在性能方面,在过去,他们显著优化了Panfrost的平铺例程和Mesa的最小/最大索引计算,并添加了对ASTC和ETC压缩纹理的支持。

我们一直致力于的最后一个领域是向Panfrost中的用户空间公开马里的性能计数器,使我们能够识别驱动程序和其他开发人员中的瓶颈,从而识别他们在Panfrost上运行的应用程序中的瓶颈。在大约一年的时间里,我们已经获得了从内核空间传递原始计数器的实验支持。合作人员Antonio Caggiano和Rohan Garg与Icecream95和其他贡献者一起,一直致力于将这些计数器与Perfetto集成,以使优雅的自由软件用户能够进行高级分析。

自从我们开始BiFrost的工作以来,在过去的3个月里,我和同事Tomeu Vizoso已经从3月份完成新的编译器和命令流到5月份运行真正的程序。在与自由软件社区合作的逆向工程努力的推动下,我们有信心对抗专有的斑点和下游黑客,开放源码软件将会占上风。

展望未来,我们计划扩大BiFrost对OpenGL ES 2.0的覆盖范围,以支持更多的3D游戏,因为基本的加速桌面正在运行。我们还计划提高BiFrost编译器的性能,以便接近专有堆栈的性能,就像我们对Midgard所做的那样。最重要的是,我们希望围绕驱动程序建立一个社区,以软件自由和开放优先的方式为核心价值。

它适用于弗里德雷诺、埃特纳维夫和利马。这对米德加德岛的潘弗罗斯特很管用。我相信它会在比弗罗斯特再次奏效。

祝贺您和所有为这项工作做出贡献的人!问:有没有计划将潘弗罗斯特的日程安排程序改进为最先进的?由于调度既是一门艺术,也是一门科学,有没有一种方法可以使调度体系结构可插拔,或者至少可以很容易地替换,以便可以尝试不同的方法?

MESA中的指令调度器和内核中的作业调度器都是优化的主要候选者,我们一直在寻求改进。感谢您的阅读!

艾丽莎,你和其他队员干得很出色。谢谢!我有一个问题,但我不是这方面的专家,所以答案可能是显而易见的。我看过一些使用ARM芯片(例如rk3399)运行Linux的视频,视频播放能力相当差。PanFrost是否支持硬件加速/视频编解码?

祝贺你!。感谢您为自由开放源码社区做出如此巨大的贡献。

进步很大!您要在哪台计算机上测试/运行此功能?华硕C101/C201?有没有规格更好的产品(笔记本电脑或平板电脑)?

请勾选此框以确认您已阅读并接受我们关于收集/存储和使用您的个人数据的隐私声明条款:*