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 中断触发的完整时序流程:

VBlank 中断触发时序图 VBlank 中断触发时序流程 帧 N 扫描(Active Area) VBlank 区间 帧 N+1 扫描 VBlank 中断触发 安全交换窗口 关键时序说明 • 帧 N 扫描完成后,硬件自动进入 VBlank 区间,此时像素数据不更新 • VBlank 中断在区间起始处触发,通知 DRM 核心可以进行缓冲区交换 • 缓冲区交换必须在 VBlank 区间内完成,否则将产生撕裂或等待下一帧

1.5 DRM 子系统中 VBlank 中断的软件架构

在 DRM 子系统中,VBlank 中断的处理涉及三层软件栈的协作。下图展示了从硬件中断到用户态通知的完整链路:

DRM VBlank 中断软件架构图 DRM VBlank 中断软件架构 用户态层 内核态 DRM 核心层 硬件驱动层 合成器 / Wayland 游戏 / 渲染应用 drmWaitVBlank drm_vblank_handler() drm_handle_vblank() 事件队列 显示控制器 IRQ CRTC 扫描状态机 数据流方向:硬件中断 → DRM 核心处理 → 事件队列 → 用户态通过 drmWaitVBlank 或 Page Flip 回调获取

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 之间调整。

1.7 本节小结