Linux的3D加速

关键字

DRI    Direct Rendering Infrastructure

DRM   Direct Rendering Manager

 

XLib               XServer 的客户端库

GlxLib            OpenGL的通过XServer方式的客户端库, OpenGL也可以不通过XServer的方式。

 

libdrm  即可为XServer使用,又可以为直接渲染客户端程序使用,它们都直接使用/dev/drm 这个设备接口。

 

GPU The graphics processor

CPU

 

 

GPU  有自己的内存,称之为显存VRAM。

GPU 不能访问主存,但是VRAM可以通过地址映射的方式映射到CPU的地址空间,这样CPU就能读写显存。

 

如果我们不使用GPU的加速功能,我们仅仅是简单的访问显存的一部分,以便让我们想显示的部分显示到屏幕上。

这就是我们普通的LINUX显示驱动,fbcon vga16fb。

 

如果我们想使用显卡的加速功能,使之承担主要的图形运算任务,我们必须发送一系列命令给GPU的命令队列。

 

CPU通过“环形缓冲”发送命令给GPU。

 

DRM是一个内核模块。

DRI 通过 DRM实现对图形加速卡的控制,以一种安全有效的方式实现对图形卡的使用。

 

Xserver 和 OpenGL是 DRI 的直接使用者。

 

DRI为显卡驱动提供公用的一种机制和框架。

 

 

各种图形程序的数据流:

 

Linux的3D加速_第1张图片

 

 

 

 

 

Direct rendering program (3D): 
Direct rendering (3D data) -> 3D data -> Graphics Hardware

 

Direct rendering program (2D): 
X Protocol Encode -> Protocol Decode -> DIX -> XAA -> DDX Driver -> Graphics Hardware

 

 

 

 

Indirect rendering program (2D): 
X Protocol Encode -> Protocol Decode -> DIX -> XAA -> DDX Driver -> Graphics Hardware

 

Indirect rendering program (3D): 
X Protocol Decode -> GLX -> Mesa (including SW rasterizer) -> DDX Driver -> Graphics Hardware

 

 

各种图形的控制流图:

 

 

Linux的3D加速_第2张图片

 

 

现在对上面的两个图进行详细的讲解:

 

 

1)MMIO

 

Memory-mapped I/O (MMIO)

和 port I/O (also called port-mapped I/O (PMIO) or isolated I/O)

内存映射的IO和端口映射的IO是计算机CPU和外围设备实现输入输出的两种互补基本方式。

 

另外一种方式是DMA不过这种方式,是绕过CPU的,直接实现主存和外围设备之间的数据交换。

 

内存映射的IO其实是通过和主存一样的地址总线,通过硬件的方式连接到CPU上。映射的内存和寄存器都有自己的物理地址。其实际相当于物理内存的一部分。CPU用访问普通内存的方式访问它们。

 

端口映射的IO使用专门的指令实现IO操作。这种方式常见于INTEL的处理器,这种方式的IO地址空间和普通内存的地址空间是相互隔离的。

 

 

2) 图形协议栈

 

1. X driver

 

- sometimes referred to as DDX

- handles display/modesetting, 2D and video acceleration

- accesses hardware directly for modesetting; acceleration can access hardware directly or use drm driver

- acceleration must go through drm driver if also running 3D

- modesetting is starting to migrate to kernel/drm; for "kernel modesetting" (KMS) the X driver calls drm to set modes

- memory management is done by X driver today but starting to migrate to kernel/drm (GEM, TTM)

- source code in xorg/driver/xf86-video-ati, xorg/driver/xf86-video-radeonhd

 

2. DRM aka kernel driver

 

- manages DMA mechanism for feeding commands to GPU, typically ring buffer

- starting to include memory management and modesetting (as these move from X driver to drm)

- comes built into kernel or you can download & install a newer copy

- source code in mesa/drm

 

3. Mesa aka 3D driver

 

- originally written for software rendering, accessed via X server ("indirect rendering")

- hardware acceleration added years ago; interface for plugging in hardware drivers

- Mesa itself supports full GL 2.1, most hardware drivers support less

- submits commands to GPU via drm driver (#2 above)

- two modes - "direct" rendering (interface lib calls Mesa directly) or "indirect" rendering (interface lib passes commands to X server, X server calls Mesa)

- when running "direct" rendering the DRI protocols allow 3D and 2D (X) drivers to work together

- when running "indirect" rendering the X server can coordinate everything itself and convert pixmaps to textures for compositing through GL

- Accelerated Indirect GL rendering through X = AIGLX

 

 

 


你可能感兴趣的:(linux,server,interface,图形,protocols,textures)