代码分析本应该自下而上的,但是GPU的主要驱动主要在用户态,所以这次从用户态先开始。
而且Frame怎么画出来的,也是由用户设置state和调用draw call产生的。
下图是从DirectX Spec官网来的:
MESA
MESA源码里面有2套架构,现在驱动主要基于Gallium架构。
Gallium架构
MESA其实实现了很多API接口,不只是上图的OpenGL、GLX、还有OpenGL ES、OpenVG、OpenCL、VDPAU和OpenMAX等。
当前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架构 | 记录成长的痕迹