什么是Linux图形系统与GPU对话的最低级别的开放/公共API



我有一个想法,在过去,XFree86使用/dev/fb*帧缓冲区设备。但是现在看来GUI系统使用OpenGL,这是一个开放的标准。那么OpenGL是最低级别的开放式API吗?所谓"开放",我指的不是晦涩难懂的私有ioctl或封闭源代码的东西。

更新:

在与@datenwolf讨论后,我得到了我需要的东西,他也提供了很好的答案。如果有人想要更多的编码细节:X服务器驱动程序是任何GPU之上X系统的最低公共级别。要知道X服务器驱动程序必须实现什么样的接口:请参阅DDX Design,这是最新X.org的详细文档,告诉您如何编写X驱动程序。

在Linux中,执行图形操作的内核不公开"最低级别的API"。所有的图形驱动程序实际上都是由所谓的"状态跟踪器"在用户空间中实现的,它使用特殊的内核功能与图形硬件直接对话。作为Mesa项目的一部分实现的开源驱动程序使用特定于Linux的DRM API来与硬件对话。NVidia和AMD的专有驱动程序都使用它们非常特定的内核模块。

现在,当谈到最终程序的可用性时,Mesa和专有驱动程序有点不同:

NVidia和AMD/ATI的专有驱动程序根本不提供API供最终用户程序使用。相反,它们被实现为由X服务器加载的模块;X服务器希望驱动程序模块遵循一个特定的方案,该方案通常会随着X服务器的重大变化而变化,因此通常也需要每个X服务器的主要版本更新来更新驱动程序模块。

X服务器又提供了一个众所周知的基于命令流的图形API。通过该API发送的图形命令由X服务器调度,并发送到驱动程序模块的右侧函数的调用中。驱动程序模块反过来包含与GPU对话的整个智能,并将来自X服务器的命令转换为指向GPU的命令。

可以说,X服务器是目前可用于Linux程序的最低级别通用图形API(除了直接使用X驱动程序模块来实现所有功能的程序)。

当谈到X11时,Mesa项目中的驱动程序与专有驱动程序没有什么不同。然而,由于Mesa是开源的,它的开发人员开始实现程序可以直接使用Mesa及其驱动程序的方法,而无需通过X服务器与之交谈。为此,他们选择公开一个符合EGL规范的API。不幸的是,EGL本身是相当无用的,因为它需要一个外部显示系统(或者你只能做屏幕外渲染)。

这就是Wayland进入画面的地方。Wayland不是显示系统。然而,它是一种允许显示系统的构建块相互通信的协议。Wayland显示系统的一个核心组件是合成器,它实际上占据了所谓的"座位"(=显示设备和相关输入设备)。想要在屏幕上显示内容的程序使用Wayland打开与合成器的连接,这为他们提供了一个使用EGL的显示器。然后他们可以使用它来创建实际的绘图表面来进行图形处理。


[1]:实际上,对于一些驱动程序(传统硬件),X服务器必须以root权限启动,这样它才能使用特殊功能ioperm(…)使用out*(…)in*(…)功能直接访问硬件,并打开/dev/mem进行内存访问。在这种情况下,内核在与图形硬件的通信方面支持。但出于安全性和性能的原因,没有人再这样做了。

DRM和KMS,至少对于开源驱动程序堆栈而言。

您需要构建自己的GPU加速渲染器,或者使用GLX

  • 对GPU的最低级别访问是通过X渲染后台
  • X可用的最低级别后端是GLX
  • GLXX直接渲染到GPU加速的OpenGL管道
  • 默认的帧缓冲xrender后端未升级


ComptonX的一个开源合成器,使用GLX后端。

  • 这是使用OpenGL加速X的一个很好的例子
  • GLX应该获得Vulkan的绑定,提供多个OpenGL管道
  • GLX仅在2D中加速X,因为X是2D应用程序
  • 对于3D应用程序,需要自定义渲染器

DRM GPU驱动程序。是开放的。。。

最新更新