linux 图形栈的演进

1. 最开始,就是一段代码直接访问图形卡:XFree8 server;root运行XFree86 server,使之从用户态访问图形卡,不需要内核支持2D加速,非常容易在各操作系统间移植,不需要内核组件,就像这样:

图片发自简书App

2. 然后Utah-GLX 3D加速设计出现,也是从用户态访问图形卡,与2D完全独立,于此同时FrameBuffer驱动也开始推广,FB实现了另外的组件可以同时访问图形卡,为防止与XFree86冲突,在VT切换是,内核会给X server发出保存图像硬件状态的信号。但这中保存GPU状态的的操作是非常脆弱难搞,整体是这样的:

图片发自简书App

所有GL加速必须通过X中转,在数据量大(比如说传纹理)时,性能不行,于是就出现了X.org

3. DRI模块在XFree86和Xorg(XFree86的后代)都有,DRI依赖于一个内核态的组件来检查3D指令流的正确性和安全性,于是OpenGL程序不必root权限就可以向内核的指令缓存提数据,然后内核模块做安全检查后发到硬件。不过来自XFree86的2D指令流依旧直接进硬件而不是走DRM,所以Xserver还是要root,具体架构开始变成这样:

图片发自简书App

4. 前面这一代架构还是需要root权限,并且存在不同的驱动同时操作同一图形硬件的问题,于是就要讲内核的FB功能加到DRM中,然后将Xorg访问图形卡也通过DRM,这样Xorg就不需要root,并且只有一个驱动访问图形硬件了,最终架构变成:

图片发自简书App

DRM为Xorg搞了个KMS(Kernel Modeseting),在KMS模块,DRM负责同时作为FB,并为Xorg提供modsetting服务。

4便是当前流行的linux图形架构,有一些词需要解释:

GLX:GL都知道,加上X就是表示GL的一个扩展,用来将GL与X11窗口系统组合起来,在X窗口使能3D绘图。就等同Android上的EGL,Windows系统上的WGL,MacOS上的AGL。

DRI:Direct Rendering Infrastructure,直接渲染基础设施,使能了GL程序的直接渲染能力,目前有三种X协议扩展实现了DRI,XFree86-DRI,DRI2,DRI3,DRI3应该是最快的。Direct Rendering是相对于Indirect Rendering说的,间接渲染是通过X绕一下实现GL渲染,更慢一些,应该是不支持Opengl1.5后的版本。

DRI driver和DRM driver:DRI driver将GL渲染指令转换成硬件指令来下发到DRM driver,DRM driver是DRI的内核态组件,负责安全、资源争用、buffer管理(DRI2)以及基本上全部非直接3D状态相关的操作硬件工作;DRI driver的大部分代码都Mesa中共享。

Mesa是一个BrianPaul和很多开发者写的GL的软实现,包含软的光栅化,GL状态机,并且可以组合到很多窗口系统如X或Win32。所有开源DRI driver都是基于Mesa,很多闭源DRI驱动也是。

DRI的实现分散在X server和它相关的client库中,Mesa 3D和DRM内核子系统。

5. 最后,在kernel3.12 render nodes提出,DRM和KMS driver分离,Wayland用EGL direct rendering,架构如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章