1. DRM VBlank 中断基础概念
1.1 VBlank 中断的定义
VBlank(Vertical Blanking Interval,垂直消隐区间)中断是图形显示系统中一个关键的硬件同步信号。在 CRT 或 LCD 显示器的扫描过程中,当电子束(或像素更新)从屏幕右下角完成一帧的绘制,回到左上角开始下一帧的瞬间,会有一段短暂的时间窗口——这就是 VBlank 区间。硬件在该区间起始或结束时刻触发的中断,称为 VBlank 中断。
核心定义: VBlank 中断是显示控制器在完成一帧画面传输后、开始下一帧传输前,向 CPU 发出的同步信号。它标志着帧与帧之间的“安全切换窗口”。
在 Linux DRM(Direct Rendering Manager)子系统中,VBlank 中断被抽象为 drm_vblank 核心机制,用于协调用户态应用(如游戏、合成器)与硬件显示时序之间的同步。
1.2 VBlank 在图形显示中的作用
VBlank 中断在图形显示管线中承担着三个核心作用,缺一不可:
| 作用维度 | 具体描述 | 典型场景 |
|---|---|---|
| 帧同步 | 确保缓冲区交换(Page Flip)发生在 VBlank 区间,避免画面撕裂(Tearing) | 游戏渲染、视频播放 |
| 时序基准 | 为 DRM 核心提供精确的帧时间戳,用于 FPS 统计、动画时间线计算 | 合成器(Compositor)调度 |
| 节能触发 | 在无画面更新时,VBlank 中断可触发显示控制器进入低功耗模式 | 移动设备、笔记本 |
工程经验: 在嵌入式系统中,VBlank 中断的响应延迟直接影响 UI 流畅度。如果中断处理函数耗时过长,会导致下一帧的缓冲区交换错过 VBlank 窗口,产生“掉帧”或“微卡顿”。
1.3 VBlank 与垂直同步(VSync)的关系
垂直同步(VSync)是 VBlank 中断在应用层的直接体现。两者之间的关系可以用一句话概括:VSync 是策略,VBlank 是机制。
- VBlank(硬件信号): 由显示控制器硬件产生,是一个物理事件。DRM 驱动通过注册中断处理函数来捕获该信号。
- VSync(软件策略): 用户态应用(如 OpenGL ES、Vulkan)通过
EGL_SWAP_BEHAVIOR或drmModePageFlip请求,让缓冲区交换等待 VBlank 信号到来后再执行。
当 VSync 开启时,应用渲染帧的提交节奏被强制与显示器的刷新率对齐(例如 60Hz 显示器每 16.67ms 触发一次 VBlank)。当 VSync 关闭时,应用可以随时提交帧,但可能产生撕裂。
常见误区: VBlank 中断并不等同于 VSync。VBlank 是底层硬件中断,VSync 是上层同步策略。即使 VSync 关闭,VBlank 中断依然在硬件层面持续产生,只是 DRM 核心不再强制等待它。
1.4 VBlank 中断时序图
下图展示了从显示器扫描到 VBlank 中断触发的完整时序流程:
1.5 DRM 子系统中 VBlank 中断的软件架构
在 DRM 子系统中,VBlank 中断的处理涉及三层软件栈的协作。下图展示了从硬件中断到用户态通知的完整链路:
1.6 VBlank 中断的关键参数
在设备树和驱动配置中,VBlank 中断涉及以下关键参数,这些参数直接影响中断的触发时机和系统性能:
| 参数名称 | 数据类型 | 说明 | 典型值 |
|---|---|---|---|
interrupts |
u32 数组 | 指定显示控制器的中断号及触发类型 | <0 53 4>(SPI 53, 上升沿触发) |
interrupt-names |
string 数组 | 为中断号命名,DRM 驱动通过名称查找 | "vblank", "error" |
vblank-off-delay |
u32 | 无更新时延迟关闭 VBlank 中断的毫秒数 | 100(100ms) |
max-vblank-count |
u32 | VBlank 序列号的最大值,溢出后回绕 | 0xFFFFFFFF |
优化提示: 在嵌入式设备中,
vblank-off-delay 的配置需要权衡。设置过短会导致频繁开关中断增加功耗,设置过长则可能让 CPU 在无画面更新时被无谓唤醒。建议根据具体场景在 50ms~200ms 之间调整。