GPU如何支持OpenGL和DirectX API的执行?

11

我正在尝试理解OpenGL和DirectX如何与图形卡一起工作。

如果我在OpenGL中编写一个绘制三角形的程序,以及在DirectX中编写另一个执行相同任务的程序,那么GPU会发生什么情况?

当我们运行程序时,每个对OpenGL库和每个对DirectX库的调用都会产生针对GPU的代码,两个程序生成的GPU的机器代码是否相同?(就像DirectX和OpenGL是预编译的Java字节码一样,在实际运行时,它们会产生相同的结果)

还是说GPU有两个不同的指令集,一个用于每种API。我的意思是,OpenGL和DirectX对GPU来说到底是什么,它们如何区分这两种API?

这只是从程序员的角度来看的不同吗?


3
这是驱动程序和显卡预编译的组合,对于DX和OpenGL略有不同。请参阅http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/。 - Martin Beckett
GPU能否同时在OpenGL和DirectX上下文中运行,还是它们总是分开的?(例如,多个[隔离的]上下文,但每个上下文只有一个API。) - user166390
之前的GPU(即Kepler架构之前)一般只能同时执行一个“指令缓冲区”。而Kepler架构是我所知道的第一个真正能够同时处理多个指令流的架构。 - Bahbar
我已经在这里回答了这些问题 https://dev59.com/hGs05IYBdhLWcg3wPPWB#7372760 和 https://dev59.com/MGw15IYBdhLWcg3wxuvL#6401607 以及 https://dev59.com/MGw15IYBdhLWcg3wxuvL#6401607。 - datenwolf
1个回答

9

我已经在这里回答过了 On Windows, how does OpenGL differ from DirectX?

以下是其中一个答案的完整引用:


这个问题几乎不可能回答,因为OpenGL本身只是一个前端API,只要实现符合规范并且结果符合规范,可以按任何方式完成。

问题可能是:OpenGL驱动程序在最低级别上如何工作。现在这又是不可能一般性地回答的,因为驱动程序与某些硬件紧密相连,而这些硬件可能再次按照开发人员设计的方式进行操作。

因此,问题应该是:“OpenGL和图形系统的幕后工作看起来如何?”让我们从下往上看:

  1. 在最低级别上,有一些图形设备。现在这些是提供控制其操作的一组寄存器(哪些寄存器确切地依赖于设备)的GPU,具有用于着色器的程序内存,用于输入数据(顶点、纹理等)的大容量存储器以及与其余系统通信的I/O通道,通过该通道它接收/发送数据和命令流。

  2. 图形驱动程序跟踪GPU的状态以及使用GPU的应用程序的所有资源。此外,它负责转换或任何其他处理应用程序发送的数据(将纹理转换为GPU支持的像素格式,在GPU的机器代码中编译着色器)。此外,它为应用程序提供一些抽象的、依赖于驱动程序的接口。

  3. 然后是依赖于驱动程序的OpenGL客户端库/驱动程序。在Windows上,通过opengl32.dll代理加载,而在Unix系统上,它位于两个位置:

    • X11 GLX模块和依赖于驱动程序的GLX驱动程序
    • /usr/lib/libGL.so可能包含一些用于直接渲染的驱动程序相关内容

    在MacOS X上,这恰好是“OpenGL框架”。

    正是这部分将你的OpenGL调用翻译成调用第2部分中描述的驱动程序特定函数的部分。

  4. 最后是实际的OpenGL API库,在Windows上是opengl32.dll,在Unix上是/usr/lib/libGL.so;这主要只是将命令传递给OpenGL实现本身。

实际通信如何发生无法概括:

在Unix中,3<->4的连接可以通过套接字(如果需要,也可以通过网络进行)或共享内存进行。在Windows中,接口库和驱动程序客户端都加载到进程地址空间中,因此这不是太多的通信,而是简单的函数调用和变量/指针传递。在MacOS X中,这与Windows类似,只是OpenGL接口和驱动程序客户端之间没有分离(这就是为什么MacOS X很难跟上新的OpenGL版本,它总是需要完整的操作系统升级才能提供新的框架)。
3<->2之间的通信可能通过ioctl、读/写或将某些内存映射到进程地址空间并配置MMU以在对该内存进行更改时触发一些驱动程序代码来完成。在任何操作系统上,这都非常相似,因为您始终必须穿越内核/用户空间边界:最终要经过某些系统调用。
系统和GPU之间的通信通过外围总线及其定义的访问方法进行,因此使用PCI、AGP、PCI-E等通过端口I/O、内存映射I/O、DMA、IRQs等工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接