Linux图形栈完整架构图
-
多应用+ DRI3 + Xorg + Glamor + GBM + Mesa + DRM
[ 应用1 ] [ 应用2 ] [ 其他GUI应用 ]
│ │ │
▼ ▼ ▼
Mesa/OpenGL Mesa/OpenGL Mesa/OpenGL
│ │ │
分配GBM显存BO 分配GBM显存BO 分配GBM显存BO
│ │ │
导出 DMA-BUF fd 导出 DMA-BUF fd 导出 DMA-BUF fd
│ │ │
└───────────┬───────────┴────────────┬─────────┘
│ │
【DRI3 协议】 进程间传递 fd、分辨率、格式
│
▼
[ Xorg 服务端 ]
│
Xorg 打开 /dev/dri/card0
初始化自身 GBM 设备
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
gbm_bo_import gbm_bo_import gbm_bo_import
(导入应用1 fd) (导入应用2 fd) (导入其他应用fd)
│ │ │
▼ ▼ ▼
各自生成 Xorg Pixmap / GBM BO 对象
│ │ │
└────────────────┬────────────────┘
│
▼
[ Glamor 2D→GL 层 ]
│
把每一个导入的 BO 绑定为 OpenGL 纹理
│
多窗口 GPU 合成(叠加、透明、窗口位置)
│
▼
Mesa 驱动
│
▼
DRM 内核驱动
│
▼
GPU 硬件渲染 & 页面翻转 PageFlip
│
▼
显示器屏幕
关键流程逐句拆解(对应上图)
-
每个独立应用
自己通过 Mesa 申请 GBM 显存缓冲区(BO),渲染画面到自己的显存。
-
每个应用导出 DMA-BUF fd
不拷贝画面数据,只把这块显存的文件描述符 fd,通过 DRI3 发给 Xorg。
-
Xorg 对每个应用都做一次 gbm_bo_import
拿到每个窗口的 fd,逐个导入成 Xorg 可管理的 GBM BO/Pixmap;
不复制像素数据,只是认领同一块物理显存 ,零拷贝。每个应用窗口自有独立物理显存BO ,渲染在自己显存里。
应用导出 DMA-BUF fd 传给 Xorg,只传钥匙不传画面。
Xorg
gbm_bo_import认领同一块物理显存 ,只建管理结构和映射,不复制像素 → 零拷贝。多窗口就逐个导入每个fd,每个窗口对应独立BO。
-
Glamor 接管合成
把所有导入进来的 BO 都转成 OpenGL 纹理,在 GPU 里完成:
窗口叠加、层级、透明、缩放、桌面背景合成。
Glamor 把每个导入的 GBM-BO 直接绑定为 OpenGL 纹理 ,复用原有物理显存。
所有窗口、背景都变成 GPU 纹理。
Glamor 用 GPU Shader 完成层级、叠加、透明、缩放 合成。
全程 GPU 内部完成,无 CPU 拷贝、无内存搬运,性能极高。
-
合成完走 Mesa → DRM → GPU
最终合成好的一帧,通过 DRM PageFlip 直接刷到屏幕。
三个核心真相
- 多窗口 每个应用都有自己独立显存,互不干扰。
- Xorg 不拷贝画面,只通过
gbm_bo_import导入 fd 引用显存。 - 所有窗口合成、渲染全在 GPU 里完成,CPU 只做调度和协议转发。