Linux图形栈

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
    │
    ▼
    显示器屏幕

关键流程逐句拆解(对应上图)

  1. 每个独立应用

    自己通过 Mesa 申请 GBM 显存缓冲区(BO),渲染画面到自己的显存。

  2. 每个应用导出 DMA-BUF fd

    不拷贝画面数据,只把这块显存的文件描述符 fd,通过 DRI3 发给 Xorg。

  3. Xorg 对每个应用都做一次 gbm_bo_import

    拿到每个窗口的 fd,逐个导入成 Xorg 可管理的 GBM BO/Pixmap;
    不复制像素数据,只是认领同一块物理显存 ,零拷贝。

    每个应用窗口自有独立物理显存BO ,渲染在自己显存里。

    应用导出 DMA-BUF fd 传给 Xorg,只传钥匙不传画面。

    Xorg gbm_bo_import 认领同一块物理显存 ,只建管理结构和映射,不复制像素 → 零拷贝。

    多窗口就逐个导入每个fd,每个窗口对应独立BO。

  4. Glamor 接管合成

    把所有导入进来的 BO 都转成 OpenGL 纹理,在 GPU 里完成:

    窗口叠加、层级、透明、缩放、桌面背景合成。

    Glamor 把每个导入的 GBM-BO 直接绑定为 OpenGL 纹理 ,复用原有物理显存。

    所有窗口、背景都变成 GPU 纹理。

    Glamor 用 GPU Shader 完成层级、叠加、透明、缩放 合成。

    全程 GPU 内部完成,无 CPU 拷贝、无内存搬运,性能极高。

  5. 合成完走 Mesa → DRM → GPU

    最终合成好的一帧,通过 DRM PageFlip 直接刷到屏幕。

三个核心真相

  1. 多窗口 每个应用都有自己独立显存,互不干扰。
  2. Xorg 不拷贝画面,只通过 gbm_bo_import 导入 fd 引用显存。
  3. 所有窗口合成、渲染全在 GPU 里完成,CPU 只做调度和协议转发。
相关推荐
盐焗鹌鹑蛋22 分钟前
【Linux】线程概念和控制
java·linux·服务器
顺顺 尼11 小时前
linux 进程信号(上)
linux·c++·算法
niuTaylor11 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
傲世仙尊12 小时前
信号量环形队列与线程池起步-把临界资源拆成很多份
linux
Huangjin007_12 小时前
【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
linux·运维·服务器
ShineWinsu13 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
FlightYe13 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
GeW15 小时前
从代码到共识:技术突围如何映照大国相处之道
linux
承渊政道16 小时前
Linux系统学习【进程信号详细解析——认识、产生、保存以及捕捉信号】
linux·学习·ubuntu·ssh·vs code·进程信号
硅基手札16 小时前
【linux内核专栏01】Linux 内核心智模型与设计哲学
linux·运维·驱动开发·开源软件