DRI与DRM

张开发
2026/4/21 19:51:26 15 分钟阅读

分享文章

DRI与DRM
在 Linux 图形栈中DRI与DRM是紧密关联的核心技术共同支撑现代 GPU 加速渲染与显示控制。DRIDirect Rendering Infrastructure直接渲染架构定义一套完整的用户态 内核态协同框架目标是让应用程序绕过 X Server 直接访问 GPU 硬件实现高效 3D 渲染OpenGL/Vulkan。核心定位用户态渲染基础设施提供应用→Mesa→DRM 的调用链路。演进DRI1早期方案应用直接操作硬件多进程冲突、安全性差。DRI2引入 DRM 内核管理解决资源竞争支持 DMA-BUF 共享。DRI3优化同步与合成适配 Wayland减少 X 依赖。用户态组件Mesa 3DlibGL/libEGL实现 OpenGL/Vulkan对接 DRM 驱动。DRI 驱动Mesa 中各 GPU 的硬件加速后端如 iris、radeonsi、nouveau。窗口系统Xorg/Wayland 通过 DRI 与 DRM 交互。创始与早期开发发起方Precision InsightJens Owen、Kevin E. Martin 主导资金与协作Red Hat、Silicon Graphics (SGI)提供资助首次发布随XFree86 4.0于 1999 年广泛发布维护主体当前核心托管freedesktop.orgdri.freedesktop.org社区维护由自由软件社区主导无单一公司所有关键历史承接后由Tungsten Graphics后被VMware收购接手核心维护现整合进X.Org Server与Mesa生态与DRM 内核子系统深度绑定libdrm作为 DRI 用户态接口库归 Mesa 项目统一维护DRMDirect Rendering Manager直接渲染管理器定义Linux 内核子系统是 GPU 硬件的统一管理者为用户态提供安全、受控的硬件访问接口。核心职责GPU 资源仲裁独占 GPU管理命令队列避免多应用冲突。显存管理GEM/TTM 管理显存支持 DMA-BUF 零拷贝共享。显示控制KMS内核模式设置管理显示器、分辨率、图层、原子更新。同步机制VBlank、Fences、同步对象协调渲染与显示防撕裂。中断 / DMA / 电源管理统一处理硬件底层操作。内核组件drm.ko核心框架提供通用 UAPI 与驱动抽象。厂商驱动i915、amdgpu、nouveau、rockchip 等基于 DRM 框架实现。DRI 与 DRM 的关系DRI用户态一套标准让 OpenGL/Vulkan 程序能直接访问 GPU不走 X11 转发。DRM内核子系统负责安全管理 GPU、显存、显示输出。DRM 是内核态的 “硬件管家”DRI 是用户态的 “渲染桥梁”DRI 依赖 DRM 提供的内核接口实现应用对 GPU 的直接、安全、高效访问。应用通过 DRI 接口调用 MesaMesa 通过 DRM 把命令发给内核内核驱动指挥 GPU 干活。架构分层从上到下应用层游戏、桌面、OpenGL/Vulkan 程序用户态MesalibGL/libEGL→ DRI 驱动 → DRM UAPIioctl内核态DRM 子系统drm.ko 厂商驱动→ KMS/GEM/TTM硬件层GPU、显存、显示器Mesa 3DMesa Linux 世界的开源图形驱动总栈它同时干三件事实现OpenGL、OpenGL ES、Vulkan、OpenCL等标准 API提供各种 GPU 的硬件驱动Intel、AMD、ARM、NVIDIA 开源等通过DRI 接口对接内核DRM完成直接渲染你可以理解为Mesa 用户态图形 API 硬件驱动 DRI 实现在 Linux 图形栈里它是绝对中间层应用程序游戏、桌面、浏览器 ↓ libGL、libEGL、libvulkan都来自 Mesa ↓ DRI 协议Mesa 内部实现 ↓ DRM内核驱动接口 /dev/dri/card0 ↓ GPU 硬件没有 MesaLinux 就没有通用开源 3D 加速能力。创始创始人Brian Paul1993 年启动核心维护与贡献方截至 2026主导公司 / 组织Intel主力贡献维护iris核显驱动与核心架构AMD主力贡献维护radeonsi、RADV驱动VMware继承 Tungsten Graphics 遗产Brian Paul 等核心开发者在职Valve近年提交量领先优化游戏与 Vulkan 支持Collabora、Igalia、Google、Red Hat、Broadcom长期深度贡献托管与治理代码托管freedesktop.orggitlab.freedesktop.org/mesa/mesa社区主导、公司赞助无单一商业实体控制完整工作流程从打开窗口到显示画面1. 应用启动打开 DRM 设备应用或合成器 / 窗口管理器open(/dev/dri/card0, O_RDWR);这就是DRM 设备节点。内核做什么创建drm_file上下文标记这个进程的 GPU 权限初始化 GEM/TTM 显存管理器初始化 KMS显示模式管理模块这一步是所有渲染的起点。2. 通过 DRI 建立渲染连接DRI3 流程MesalibGL通过 DRI 协议和 DRM 交互应用请求创建窗口 / 可渲染表面Mesa 通过DRI3向 DRM 申请一块帧缓冲scanout buffer一组显存对象GEM bo内核 DRM 分配物理显存返回GEM handle给用户态此时用户态拿到可直接 mmap 的显存地址部分平台GPU 可识别的 buffer 对象用于跨进程共享的DMA-BUF fd这就是DRI 负责的 “直接渲染通道”。3. 应用提交 OpenGL 渲染命令核心渲染流程应用调用glDrawArrays(...); glClear(...);Mesa / DRI 驱动做把 GL 命令翻译成 GPU 原生指令shader、顶点、纹理构建GPU 命令缓冲区command buffer通过 DRM_IOCTL 发送给内核 DRM内核 DRM 做校验命令安全性防止越权访问调度 GPU 执行命令管理多进程 GPU 时间片避免抢占冲突GPU 做真正执行渲染把结果写入 GEM 显存→这一步就是 “直接渲染”不经过 X Server所以叫 DRI。4. 渲染完成准备显示KMS 模式设置显示由 DRM 的KMSKernel Mode Setting负责内核获取当前显示管线CRTC显示控制器 → Connector接口 HDMI/DP → Panel屏幕应用 / 合成器通过 DRM 告诉内核用哪个显存 buffer 作为画面源分辨率、刷新率、图层位置内核配置硬件扫描scanout典型 ioctlDRM_IOCTL_MODE_SETCRTCDRM_IOCTL_MODE_ATOMIC原子操作现代桌面用5. 页面翻转与垂直同步Page Flip VBlank为了不撕裂DRM 提供页翻转应用渲染好一帧调用DRM_IOCTL_MODE_PAGE_FLIP内核等待下一个 VBlank垂直消隐期瞬间切换 CRTC 指向的显存 buffer发送 flip 事件完成信号整个过程无撕裂、零拷贝、内核级同步。DRI 与 DRM 到底怎么分工DRI用户态定义应用 ↔ Mesa ↔ 内核的标准接口管理渲染上下文、窗口表面、共享缓冲负责把图形 API 翻译成硬件命令DRM内核态真正管理 GPU 硬件分配显存GEM/TTM调度 GPU 执行控制屏幕显示KMS提供安全隔离、权限控制一句话分工DRI 定义怎么 “谈”DRM 负责怎么 “干”。DRI 与 DRM架构图应用程序 ↓ Mesa 3D (libGL) —— DRI 协议层 ↓ DRM UAPI (ioctl) ↓ 内核 DRM 子系统 ├─ GEM/TTM 显存管理 ├─ GPU 命令调度 └─ KMS 显示输出 ↓ GPU 硬件 → 显示器DRI与MesaDRI 是一套接口标准协议Mesa 是实现这套标准的开源库Mesa 内部实现了完整的 DRI 逻辑通过 DRI 接口直接调用 DRM内核让应用能绕开 X 服务器直接用 GPU 渲染。Mesa 是 Linux 下开源的 OpenGL / Vulkan 实现包含libGL.solibEGL.solibgallium 各种硬件驱动iris、radeonsi、panfrost、llvmpipe 等Mesa 是 DRI 的官方实现者。没有 MesaDRI 只是个空标准没有 DRIMesa 无法高效访问内核 DRM。DRI Mesa 完整工作流程应用游戏 / 浏览器 / 桌面调用 OpenGL链接到Mesa libGLMesa 内部走DRI 接口通过 DRIMesa 打开/dev/dri/card0Mesa 构建 GPU 命令流通过 DRI → 调用 DRM ioctl 提交给内核内核 DRM 调度 GPU 执行渲染渲染结果通过 DRM-KMS 送上屏幕这就是Direct Rendering直接渲染。DRI 驱动在哪里就在 Mesa 里。比如iris_dri.so → Intel 核显radeonsi_dri.so → AMDnouveau_dri.so → NVIDIA 开源panfrost_dri.so → Arm Mali这些.dri.so就是 Mesa 编译出来的、遵循 DRI 标准的硬件驱动。

更多文章