OpenGL,GLX,DRI和Mesa3D之间是什么关系?


17

我开始在Linux中进行一些底层3D编程。我在使用高级图形API OpenInventor方面有很多经验。

我知道并不一定要知道所有这些东西如何组合在一起,但是我很好奇。我知道OpenGL只是图形应用程序的标准。Mesa3D似乎是此标准的开源实现。

那么GLX和DRI适合哪里呢?在Wikipedia和所有这些网站上进行挖掘时,我还没有找到关于这一切如何结合的确切解释。硬件加速在哪里发生?专有驱动程序与此有什么关系?

Answers:


15

除OpenGL外,我从未使用过这些库,但我将像您一样尝试通过阅读Wikipedia页面来猜测。

您对Mesa似乎是正确的。这是我们拥有的其他信息:

“ X窗口系统是一种计算机软件系统和网络协议,为联网的计算机提供了基础GUI。它创建了硬件抽象层。”

“ GLX使希望使用OpenGL的程序能够在X窗口系统提供的窗口中使用
。GLX包括三个部分:
-提供OpenGL功能的API。
-X协议的扩展,允许客户端发送3D。渲染命令-X服务器的扩展,用于从客户端接收渲染命令并将其传递到已安装的OpenGL库中。
如果客户端和服务器在同一台计算机上运行并且有加速的3D图形卡,则前两个组件可以被DRI绕过。然后允许客户端程序直接访问图形硬件。”

“直接渲染基础结构(DRI)是X Window系统中使用的接口,它允许用户应用程序访问视频硬件而无需将数据通过X服务器传递。”

“ Open Inventor是一种C ++ 3D图形API,旨在为OpenGL提供更高层次的编程”

为简化起见,让我们想象一下在每个API的入口和出口处发生的简化的数据(和命令)流。从一开始,我们就有您的应用程序(编译的代码),您可以从计算机上运行它。最后,我们在您的屏幕上显示了图像。

在以下情况下,我将只能回答以下问题:-
您的计算机是否具有图形卡(GPU)或只有CPU来处理图形功能?
-您的应用程序是否嵌入在x窗口系统的窗口中?
-如果使用x窗口系统,则“ x服务器”是在您的计算机上还是在网络上的其他计算机上运行?
我假设您有GPU的驱动程序,并且有用于软件渲染的Mesa)。

第一种情况:您运行的是使用OpenInventor编写的图形应用程序,而没有使用X Window System,并且没有图形卡。程序流程将非常类似于:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Mesa
  ↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
  ↓
3D Images on your screen

这里发生的事情称为“软件渲染”:图形命令不是由任何图形硬件处理的,而是由通常运行软件的处理器(通常的CPU)处理的。

第二种情况:现在假设在与上述相同的条件下,您有一张图形卡。该流程看起来像这样:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Proprietary Drivers
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

现在发生的事情称为“硬件加速”,通常比第一种情况要快。

第三种情况:现在,基于我读过的几本Wikipedia行,介绍X Window System流程,或者至少是我的看法。
让我们暂时忘记图形硬件和API。流程应如下所示:

Your application (X Window System sees it as an "X Client")
  ↓ (sends requests defined by the X Window System Core Protocol)
X Server
  ↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
  ↓
Windows or 2D images on your screen

请注意,在使用X Window系统时,屏幕和运行应用程序的计算机可能没有“直接”连接,而是可以通过网络连接。

第四种情况:假设您想从上一个示例向X Client应用程序中添加精美的3D图形渲染。在我看来,X Window System最初无法做到这一点,或者至少它需要大量复杂的代码才能执行与OpenGL API函数相当的功能。
幸运的是,您可以使用GLX向系统添加对OpenGL命令的支持。您现在有:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
  ↓ (convert your request to OpenGL commands)
OpenGL
  ↓ (redirects function calls to implementation defined by)
 ...

现在,在第一种情况下,您可以将最后一个箭头重新连接到“ OpenGL”之后的箭头:您可以在屏幕上获得3D图像!

最后,关于我对DRI的理解:
它似乎允许Mesa访问GPU,因此这会将我们第一个方案的流程修改为:

...
  ↓
Mesa
  ↓ (forwards OpenGL commands)
DRI
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

考虑到其服务器和客户端在同一台计算机上并且您拥有GPU,在使用GLX时,这似乎还会缩短流程。在这种情况下,我们第四种情况的图形将变成:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
  ↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
  ↓
3D Images on your screen

而已 !
现在请记住,我不是Unix环境方面的专家,所以我最好的建议是研究每个API的文档,以准确了解它们可以做什么。
将先前的图表合并为一个图表可能会使事情更容易理解。我让它作为练习给您!


1
它只是一个基于少量句子推论的理论。这不是事实。
KawaiKx 2014年

8

OpenGL与平台无关;这意味着OpenGL API是平台无关的。

OpenGL状态和缓冲区由通常称为上下文的抽象对象收集。

托管平台负责提供一些API,以为基础平台创建OpenGL上下文。在Windows上有wgl *例程(对于GL是Windows),在Unix上有glX *例程(对于X是GL)。

确实,GLX只是允许应用程序创建OpenGL上下文以便使用OpenGL API的API。

常见的WGL / GLX操作包括创建窗口,创建屏幕外缓冲区,使OpenGL上下文在线程上处于当前状态,交换绘制缓冲区...

相反,DRI是内核层,它允许绕过XServer与图形卡直接通信,实际上使用OpenGL例程加速了应用程序。


3

http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html

Direct Rendering Infrastructure,也称为DRI,是一个框架,用于允许以安全有效的方式直接访问X Window System下的图形硬件。它包括对X服务器,几个客户端库和内核(DRM,Direct Rendering Manager)的更改。DRI的最重要用途是创建快速的OpenGL实现,从而为Mesa提供硬件加速。已经将几种3D加速驱动程序写入DRI规范,包括3DFX,AMD(以前称为ATI),英特尔和Matrox生产的芯片组的驱动程序。


2

简单来说,OpenGL是图形库的类型和规范。Mesa是基本实现。DRI是硬件接口系统。

Mesa基本上是指整个框架。但是,我假设您正在谈论Mesa硬件驱动程序。

DRI基本上是处理硬件的内核接口。从技术上讲,它可以用于其他用途,但它是为Mesa制造的,主要用于Mesa。

GLX是所有与X交互的方式!

要了解每个部分是什么,您必须知道如何将它们组合在一起。

程序旨在与任何openGL库进行接口。

GLX是将OpenGL与X11或通过X11进行接口的一种方式。取决于您是使用“直接”接口还是使用“间接”接口,取决于程序是否会为此担心。

libGL几乎就是这些的接口。如果您使用的是Mesa驱动程序,则通常由Mesa提供。

在间接设置中,其过程如下:应用程序框架(即,硬编写的应用程序,引擎或抽象API)| LibGL | Mesa驱动程序| DRI | 硬件

在此配置中,仅在侧面使用GLX来处理程序的GL使用与其他程序之间的接口。除了用于执行需要与X11堆栈及其支持程序(例如,窗口管理器)进行通信的事务的GLX特定调用之外,GLX基本上未受影响。在这种安排下。

此外,命令直通和共享内存可用于进一步优化此系统中的外层。所有这些都减少了延迟,并提高了访问硬件的速度。这就是你通常想要的。

对于间接的应用程序框架 LibGL(用户端)| LibGLX | LibGL(X11侧)| Mesa硬件驱动程序| DRI | 硬件

这样做的好处是您不需要与硬件直接共享的内存缓冲区即可使用此设置。(允许网络客户端,以及更高的健壮性和更安全的设置。)

因此,此设置可以跨多个VM共享一个视频卡,甚至可以跨网络访问。由于更新的扩展,可以使用某些形式的共享内存或虚拟共享“克隆”内存,但这不是直接渲染模式下的直接视频内存访问。

缺点是使用管道或网络套接字与X11进行接口的速度可能很慢,至少会在经过优化的程序上引入延迟,而在最坏的情况下,则会使未经优化的程序的帧速率急剧下降。

对于网络客户端,需要更强健的安全性的设置以及需要多个操作系统通过同一GL堆栈运行来共享硬件的设置,这种设置是更好的选择。它远非最佳,但可以为您提供一定程度的硬件加速。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.