我们最早在去年秋天引入了对 dmabuf 和图形卸载的支持,它已包含在 GTK 4.14 中。自从我们上次讨论以来,又发生了一些改进,因此现在是时候进行另一次更新了。
变换
当您旋转显示器时,其长宽比会从横向(例如,1920 x 1200)变为纵向(1200 x 1920)。但是合成器处理的帧缓冲区仍然是 1920 x 1200。
在某些其他情况下,内容可能需要在显示之前进行一些变换。例如,当显示来自前置摄像头的视频流时。
到目前为止,GTK 将翻转或旋转的纹理视为不可卸载的,但是经过最近的一些改进,我们现在将在卸载内容时将此类变换传递给合成器。
快速插曲
这是一个很好的机会来解释,GTK 变换 API 依赖于*您*来提供对有用类别的分类,例如 2D 平移、缩放、旋转或任意 3D 变换。
因此,最好使用特定的方法,例如 gsk_transform_rotate 或 gsk_transform_translate,而不是自己计算变换矩阵并使用 gsk_transform_matrix,这不会给我们提供有关我们正在处理的变换类型的信息。如果没有此信息,我们将错过诸如上述变换卸载之类的优化。
Benjamin 在 这里简要概述了我们的变换方法。
纹理
卸载工作的最初目标是启用 dmabuf 内容的传递。但是,通常情况并非如此。我们仍然更常见地接收 GL 纹理中的内容(例如,来自 gstreamer)。值得庆幸的是,mesa 具有 GL 扩展,允许我们将纹理导出为 dmabuf。我们最近使用它来启用 GL 纹理的卸载。
请注意,这些扩展可能并非在所有地方都可用,并且各个驱动程序在 dmabuf 支持方面可能会存在问题。
总结
在即将发布的 GTK 4.16 版本中,图形卸载应该会更频繁地工作。
您可以立即尝试这些改进,例如,在新的 Showtime 应用的每日构建中