GTK4 博客最新一篇文章表示,在去年首次引入了对 dmabufs 和图形卸载的支持,并将其包含在 GTK 4.14 中。从那时起,GTK4做了一些改进,现在更新了部分功能。
堆栈的改进
GStreamer 1.24 版本改进了对显式修饰符的支持,GTK 中的 GStreamer 媒体后端也已更新,可以从 GStreamer 请求 dmabufs。
在 GStreamer 方面发生的另一件事是,dmabufs 有时会带有填充:在这种情况下,GStreamer 会给我们一个带有视口的缓冲区,并希望我们只显示缓冲区的这一部分。为了满足硬件解码器的跨距和大小要求,这有时是必要的。
GTK 4.14 在卸载时支持这种做法,只显示视口指示的 dmabuf 部分。
GTK 内部的改进
GTK 4.14 合并了新的 GSK 渲染器。新的渲染器与旧的 gl 渲染器一样支持 dmabufs。此外,新的 Vulkan 渲染器会在渲染纹理时生成 dmabufs。
在 GTK 4.16 中,如果可以的话,GtkGLArea widget 也会提供 dmabuf 纹理,因此您可以将其放入 GtkGraphicsOffload widget 中,将其输出直接发送到合成器。
现在可以在 git main 中 gtk4-demo 的 shadertoy 演示中看到这一功能。
改进合成器交互
图形卸载的一个好处是,合成器可以将 dmabuf 传递给内核的 KMS apis,而无需额外复制或合成。这就是所谓的直接扫描输出(direct scanout),由于不使用 GPU 的大部分,因此有助于降低功耗。
合成器只有在 dmabuf 连接到全屏表面并具有完全覆盖该表面的合适尺寸时才能这样做。如果不能完全覆盖,合成器就需要一些保证,即外部部分可以保持黑色。
客户提供这种保证的一种方法是在已连接 dmabuf 的表面下方附加一个特殊构造的黑色缓冲区。现在,如果 GSK 在呈现节点树中找到黑色颜色节点,它就会这样做;如果您设置了 “black-bground “属性,GtkGraphicsOffload widget 也会将该颜色放在那里。这将大大增加您在播放全屏视频时享受直接扫描输出优势的机会。
最后,文章表示 GTK 4 继续改进视频播放效率,并推动该领域的上下改进。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/zixun/47315.html