Linux 下的显卡驱动 之DRI(Direct Rendering Infrastructure)(1)

Linux 下的显卡驱动

                                                      之DRIDirect Rendering Infrastructure

关于DRI

3D图形加速芯片并不是什么新技术,早在十年前,各个大型机的厂商就己经开始了这项工作,随着个人电脑的普及,具备3D图形加速特性的PC也飞入寻常 百姓家,任何对3D技术有兴趣的工程师都想将3D技术应用于linux 系统,但这又是一项十分复杂而且坚苦的工作,需要许许多多有才能的人工作在一起才能解决这个问题。

DRI(Direct Rendering Infrastructure)是一套软件架构,它可以在X Window 系统下让应用程序快速而有效的访问图形处理器,这就为类似于OpenGL这类高效的图形系统的实现铺平了道路。

在X Windows系统中,传统的做法是定义一个X server 的进程,这个进程可以直接访问图形处理单元,而应用程序(我们称之为client)则通过socket 与X server通讯,通过这条进程间的通道将应用程序所要绘制的图形传达给X server .这样X server 和X app就运行在不同的进程空间内,这种方式虽然安全并且灵活(X server 和X app甚至可以在不同的主机上),但却十分的低效。

X protocol很好扩展,我们十分容易的就可以在X 11中增加对OpenGL的支持,但问题是,显示3D图形所需要传递给X Server的信息号十分巨大,远远不是2D图形所能相比的,socket通路(进程间通信的方式)难以承受这么大的数据量。DRI的设计目的就是在应用程序和图形显示单元间提供一条带宽更宽更短延时的通路,从而可以让OpenGL发挥出图形处理单元的全部性能。

我们先来看看X 中的图形系统的构架

clip_image002

下面是DRI架构中的图形系统,我们可以很清楚看到在opengl与hardawre中多了一条直连通路:

clip_image004

DRI的设计目标:

1)充分发挥图形处理单元的性能。

2)支持多种不同的图形处理芯片。

3)支持多个应用同时使用图形处理单元进行图形的显示与计算。

4)安全性要求,防止恶意应用利用DRI破坏系统。

5)可移植性要求,DRI要能方便的移植到其它的操作系统和平台上。

6)兼容OpenGL和GLX 的相关协议要求。

7)能集成在XFree86项目中。

8)要求开源。

DRI的主要组件:

DRI的主要功能是直接控制数据流通路,涉及kernel层,Xserver 层,app层,DRI的架构有一个清晰的影响范围和特性。

在每一个层次,DRI组件都作为一个插件加入到原有人系统中,这样系统的每一层就都能共享所有的DRI驱动。

客户端(app)特性:

1)产生的vertex 和 texture数据更容易被访问。

2)可以使用MMIO和DMA。

3)多通路并行处理。

4)无root权限。

5)禁用PIO。

6)用于DMA的内存池和VSYNC事件的响应。

X Server 特性:

1)可以检测到图形硬件单元。

2)root权限。

3)使能PIO,MMIO,DMA.

4)良好的可移植性。

5)使用间接方式访问vertex 和 texture数据。

6)用于DMA的内存池和VSYNC事件的响应。

OS Kernel 特性:

1)可访问物理地址空间。

2)可以使用MMIO和DMA。

3)可能用IRQ处理程序处理VSYNC事件。

4)创建内存映射。

5)难以在不同的OS之间移植。

6)不推荐在内核中使用浮点运算。

DRI控制流程图:

clip_image006

DRI组件

libGL功能:

1)向client app提供兼容OpenGL的API。

2)实现GLX API。

3)在系统中寻找合适的图形驱动。

4)向图形驱动分发OpenGL的调用。

3D driver

1)实现OpenGL API。

2)将收到的数据传送到硬件。

3)为相关的绘图场境跟踪硬件状态。

4)操作DMA作为数据传输数据。

5)对图形硬件不提供的API或功能进行软件实现。

DRI extension

1)UI窗口配置。

2D driver

1)检测初始化硬件。

2)为3D功能提前申请显存。

3)同步2D和3D操作。

4)识别3D驱动和DRM模块的加载。

5)管理cliprect(与GUI相关的一个概念)键表。

6)批准合适的app访问DRM驱动。

DRM core module

DRM驱动的抽象层,为了方便DRM驱动的移植与实现。

DRM module

1)在内核 空间向用户层提供可以直接访问GPU硬件的接口。

2)GPU的同步管理。

3)分配DMA空间。

4)向用户层的显卡驱动提供DMA使用接口。

SAREA

1)直接记忆GPU状态。

2)记忆cliprects。

clip_image008

DRI活动图:

clip_image010

DRI时序图

clip_image012

阅读更多

没有更多推荐了,返回首页