Linux GPU系列-05-MESA架构 [转载]

代码分析本应该自下而上的,但是GPU的主要驱动主要在用户态,所以这次从用户态先开始。
而且Frame怎么画出来的,也是由用户设置state和调用draw call产生的。
下图是从DirectX Spec官网来的:

Linux GPU系列-05-MESA架构 [转载]

MESA

MESA源码里面有2套架构,现在驱动主要基于Gallium架构。

Linux GPU系列-05-MESA架构 [转载]

Gallium架构

Linux GPU系列-05-MESA架构 [转载]

MESA其实实现了很多API接口,不只是上图的OpenGL、GLX、还有OpenGL ES、OpenVG、OpenCL、VDPAU和OpenMAX等。

当前MESA驱动实现状态大致如下:

Linux GPU系列-05-MESA架构 [转载]

Linux GPU系列-05-MESA架构 [转载]

Gallium展开

Gallium中主要包含下面几块:

  • Auxiliary模块:一些公共函数或者辅助的服务,比如状态缓存和缓存管理等。
  • State Tracker: 它负责把上层库的state(blend modes、texture statte等)和draw command(glDrawArrays、glDrawPixels)等转换成MESA内部的pipe对象和操作。
  • Pipe Driver: 把Gallium的state、shader和primitive概念转换成硬件能懂的语言
  • Winsys: 实例化state tracker和pipe driver,并和具体的操作系统及2D显示驱动绑定

其中只有Pipe Driver和具体的硬件有关系。
对于GPU硬件厂家来说,主要实现Pipe driver和winsys层。

从数据流看,如下:

state tracker -> Pipe Driver -> Winsyst -> 具体的OS -> OS内核态GPU驱动 -> 具体的GPU硬件

另外Gallium中还有两个比较重要的概念:

  • CSO context:GPU中有些状态是不变的常量,Gallium提供了CSO机制帮助创建、销毁、管理这些对象
  • Draw: 有些硬件不支持坐标变换,光照、裁剪,Gallium也提供了软件机制帮忙实现

加上这两个概念之后,数据流如下:

state tracker -> CSO context -> Draw -> Pipe Driver -> Winsys -> 具体的OS -> OS内核态GPU驱动 -> 具体的GPU硬件

state tracker和pipe driver通信是通过pipe context 和pipe screen这两个软件概念
state tracker也可以直接通过p_winsys和Winsys通信,一般GPU厂商也要实现一个自己的winsys,可以参考纯软的 kms_dri_sw_winsys.c

参考

OpenGL Concepts
Gallium3D Technical Overview
Nouveau: Accelerated Open Source driver for nVidia cards
How to start developing on Gallium?
Linux graphic stack
mesa 框架与目录结构
gallium offcial document
MESA wiki不用*.html)
The Linux graphics stack, Optimus and the Nouveau driver
Linux Graphics
Gallium3D
TG-Gallium Driver Stack
Gallium3DComponents

原文地址:

Linux GPU系列-05-MESA架构 | 记录成长的痕迹

上一篇:PAT乙级 1015 德才论 (25 分)


下一篇:[转载] Android raw与assets区别