(笔记) Linux环境下的图形系统简介(X window)

时间:2022-03-28 06:50:20

显卡最早只有基本的显示功能,可以称为显示控制器(Display Controller)或者帧缓冲设备,对于这样的显示控制器,当前的Linux内核对其的支持表现为framebuffer驱动,Xorg部分对其的支持是一个名为fbdev的驱动。其后显卡上逐渐加上了2D加速部件,这种情况下面的驱动如下图所示。这个情况下的架构还是比较简单的。

(笔记) Linux环境下的图形系统简介(X window)


随着3D图形显示和运算的需要,带有图形运算功能的显卡出现,这个时候需要有专门的3D驱动来处理3D,于是出现了上图的GLX driver,这里注意到X server依然处在一个中心节点的位置,无论是X11程序还是3D OpenGL程序,都要通过X server才能到底层。同时注意到到现在为止X的2D driver和GLX driver都是直接调用到硬件,而没有通过内核调用。在2.6版本的内核的系统上,依然能看到X 2D driver中有访问硬件有MMIO和CP两套代码,MMIO就是这里的情况,显卡寄存器直接暴露给核外的2D driver(和GLX driver,目前已经不存在这个了)。


(笔记) Linux环境下的图形系统简介(X window)


这种情况下的结构仍然是比较简单的,然而这种情况有一个很大的问题,读过X server代码的(或者参考这篇文章“X Window System Internals”http://xwindow.angelfire.com/)应该知道,X server是单线程的(关于多线程X server,可以google到一些邮件讨论记录),main函数完成系统初始化之后就进入了一个循环,等待客户端程序的连入,等一个客户端程序发送完数据之后其他的客户端才能连上来,OpenGL客户端程序每次要请求硬件都必须先经过X server,然后由X server“代表”OpenGL程序进入硬件,对于场景稍微复杂的3D应用程序来说,这样频繁的和X server交互是难以保证3D渲染的实时性的。

鉴于上面的问题,引入了DRI机制, 这个时候的情况如下图示,GLX driver被DRI driver取代,和Dri driver交互的不再是X server而直接是OpenGL程序。另外DRI(原来是GLX)不直接操作硬件,而是通过内核drm驱动操作硬件,drm提供硬件访问通道和访问机制。在当前的系统上,2D driver以EXA 2D加速驱动的形式存在于Xorg里面,DRI driver则在Mesa中。


(笔记) Linux环境下的图形系统简介(X window)


然后又添加了对远程3D client的支持AIGLX(Accelerated Indirect GLX),这部分的功能和原来的Utah GLX有类似之处。AIGLX可以参考wiki页面(http://en.wikipedia.org/wiki/AIGLX)。


(笔记) Linux环境下的图形系统简介(X window)



Xorg加速:

实际上3D加速和xorg本身并没什么关系
3D只是给大家提供一种机制来创建3D的应用,比如游戏等等,所以3D部分是相对独立的。
3D之所以和xorg有关,是因为我们屏幕只有一个,所有的应用都要往屏幕上面输出,2D的部分要输出
3D的部分也要输出,所以需要有人来管理这个事情,比如说一个window盖住了3D游戏的一部分
那个3D游戏应当只输出没有被覆盖的那个部分。只有这个地方xorg和3D才有交集。glx就是用来干这个的
了。3D部分要使用glx来和xorg交流。