硬件加速原理分析探索

我理解如何编写OpenGL / DirectX程序,我知道它背后的数学和概念性东西,但我很好奇GPU-CPU通信如何在低级别上运行。

假设我有一个用C语言编写的OpenGL程序,它显示一个三角形并将摄像机旋转45度。当我编译这个程序时,它会变成一系列ioctl调用,然后gpu驱动程序将相应的命令发送到gpu,其中旋转三角形并设置适当颜色的适当像素的所有逻辑都是有线的在?或者将程序编译成“gpu程序”,加载到gpu并计算旋转等?还是完全不同的东西?

许多人都有这样的疑问, 在查阅若干Stack Overflow技术文刊后做一些肤浅的总结吧:

首先这个问题几乎不可能回答,因为OpenGL本身只是一个前端API,只要实现符合规范并且结果符合这一点,它就可以按照您喜欢的方式完成。

问题可能是:OpenGL驱动程序如何在最低级别上运行。现在再次无法回答这个问题,因为驱动程序与某些硬件密切相关,而开发人员可能会根据这些硬件设计它。

所以问题应该是:“它在OpenGL和图形系统的幕后平均看起来如何?”。让我们从下往上看:

  1. 在最低级别有一些图形设备。现在这些是GPU,它们提供一组寄存器来控制它们的操作(这些寄存器完全取决于设备)具有一些用于着色器的程序存储器,用于输入数据的大容量存储器(顶点,纹理等)以及用于其余部分的I / O通道它接收/发送数据和命令流的系统。

  2. 图形驱动程序跟踪GPU状态以及使用GPU的所有资源应用程序。它还负责转换或任何其他处理应用程序发送的数据(将纹理转换为GPU支持的pixelformat,在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实现。

实际沟通的发生方式不能一概而论:

3 < - > 2之间的通信可以通过ioctl,读/写,或者通过将一些存储器映射到进程地址空间并配置MMU以在完成对该存储器的改变时触发一些驱动器代码。这在任何操作系统上都非常相似,因为你总是必须越过内核/用户区边界:最后你会经历一些系统调用。

系统和GPU之间的通信是通过外围总线及其定义的访问方法实现的,因此PCI,AGP,PCI-E等通过端口I / O,内存映射I / O,DMA,IRQ进行工作。

 

 

“gpu程序”发挥作用的唯一地方是你的代码是否显式创建了着色器。也就是说,如果您对OpenGL / D3D进行API调用,导致着色器的编译和链接。为此,您(在运行时,而不是C / C ++编译时)生成或加载以某种着色器语言表示着色器的字符串。然后,您通过着色器编译器推送它们,并返回该API中表示该着色器的对象。然后,将一个或多个着色器应用于特定的渲染命令。这些步骤中的每一步都明确地发生在C / C ++代码的指导下,如前所述,它在CPU上运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xosg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值