这个问题几乎是不可能回答的,因为OpenGL本身只是一个前端API,并且只要实现遵守规范并且结果符合此规范,就可以用任何您喜欢的方式来完成。
问题可能是:OpenGL驱动程序如何在最低级别上工作。现在,这通常再也不可能回答,因为驱动程序与某些硬件紧密相关,尽管开发人员设计了硬件,但它仍然可以执行某些操作。
因此问题应该是:“在OpenGL和图形系统的幕后,它的平均外观如何?”。让我们从下往上看:
在最低级别上有一些图形设备。如今,这些GPU提供了一组控制其操作的寄存器(这些寄存器确实与设备相关),具有一些用于着色程序的程序存储器,一些用于输入数据(顶点,纹理等)的大容量存储器以及通往其余部分的I / O通道接收/发送数据和命令流的系统的状态。
图形驱动程序跟踪GPU的状态以及使用GPU的所有资源应用程序。它还负责转换或处理应用程序发送的数据(将纹理转换为GPU支持的像素格式,在GPU的机器代码中编译着色器)。此外,它为应用程序提供了一些抽象的,依赖于驱动程序的接口。
然后是依赖于驱动程序的OpenGL客户端库/驱动程序。在Windows上,这是通过opengl32.dll通过代理加载的,而在Unix系统上,它位于两个位置:
- X11 GLX模块和依赖于驱动程序的GLX驱动程序
- 和/usr/lib/libGL.so可能包含一些与驱动程序有关的东西,用于直接渲染
在MacOS X上,这恰好是“ OpenGL框架”。
这是将OpenGL调用的方式转换为对(2)中描述的驱动程序部分中的驱动程序特定函数的调用的部分。
最后是实际的OpenGL API库,Windows和Unix /usr/lib/libGL.so中的opengl32.dll;这大部分只是将命令传递给了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,IRQ进行工作。