图形卸载再探

我们最早在去年秋天引入了对 dmabuf 和 图形卸载 的支持,它包含在 GTK 4.14 中。此后,发生了一些改进,所以现在是时候进行更新了。

堆栈下方的改进

GStreamer 1.24 版本 改进了对显式修饰符的支持,并且 GTK 中的 GStreamer 媒体后端已更新为从 GStreamer 请求 dmabuf。

GStreamer 端发生的另一件事是 dmabuf 有时会带有填充:在这种情况下,GStreamer 将为我们提供一个带有视口的缓冲区,并期望我们只显示缓冲区的那部分。这有时是必要的,以适应硬件解码器的步幅和大小要求。

GTK 4.14 在卸载时支持这一点,并且只显示 dmabuf 中视口指示的部分。

GTK 内部的改进

我们为 GTK 4.14 合并了新的 GSK 渲染器。新的渲染器以与旧的 gl 渲染器相同的方式支持 dmabuf。此外,新的 Vulkan 渲染器在渲染到纹理时会生成 dmabuf。

在 GTK 4.16 中,GtkGLArea 小部件如果可以,也将提供 dmabuf 纹理,因此您可以将其放入 GtkGraphicsOffload 小部件中,以将其输出直接发送到合成器。

您可以在 git main 中的 gtk4-demo 中的 shadertoy 演示中看到这一点。

Shadertoy 演示,卸载的图形周围带有金色轮廓

改进的合成器交互

图形卸载的一个好处是,合成器可能能够将 dmabuf 传递到内核的 KMS API,而无需任何额外的复制或合成。这被称为直接扫描输出,它有助于降低功耗,因为 GPU 的大部分部件都不会被使用。

只有当 dmabuf 附加到全屏表面并且具有完全覆盖它的正确尺寸时,合成器才能执行此操作。如果它没有完全覆盖它,合成器需要一些保证,即可以将外部部分保留为黑色。

客户端提供这种保证的一种方法是将一个特别构造的黑色缓冲区附加到具有 dmabuf 附加的表面下方。如果 GSK 在渲染节点树中找到黑色颜色节点,并且您设置了“black-background”属性,GtkGraphicsOffload 小部件会将该颜色放在那里,GSK 现在会这样做。这应该会大大增加您在播放全屏视频时享受直接扫描输出好处的机会。

Developer trying to make sense of graphics offload
带有全屏黑色背景的卸载内容

在为 GTK 4.16 实现此功能时,我们发现 mutter 对单像素缓冲区的支持存在一些问题,但这些问题已得到快速修复。

要查看 GTK4 视频播放器中的图形卸载和直接扫描输出,您可以尝试Light Video Player

如果您想了解图形卸载是否在您的系统上工作,或者调试它为什么不工作,Benjamin 最近的这篇文章非常有用。

总结

GTK 4 继续改进以实现高效的视频播放,并推动这一领域的改进上下发展。

非常感谢 Robert Mader 推动所有这一切向前发展。❤️