1. 覆盖 DDI 概述
Windows 7 引入了新的覆盖 DDI(Overlay DDI),允许用户模式显示驱动程序(UMD)支持硬件覆盖平面(Hardware Overlay Planes)。覆盖平面通常用于视频播放、UI合成等高性能场景,可以绕过常规合成路径,直接输出到显示设备,减少延迟和功耗3。
1.1 覆盖 DDI 的主要功能
- 硬件加速覆盖:允许视频解码器等应用直接写入覆盖缓冲区,避免额外的内存拷贝。
- 色彩空间转换(CSC)支持:支持 YUV→RGB 转换,适用于视频播放。
- 多平面合成:允许同时显示多个覆盖层(如视频+UI)。
- 低延迟呈现:适用于游戏、视频会议等实时应用。
2. 必须实现的覆盖 DDI 函数
UMD 需实现以下核心函数以支持覆盖功能:
2.1 CreateOverlay
HRESULT APIENTRY CreateOverlay(
D3DDDIARG_CREATEOVERLAY* pCreateOverlay
);
功能:创建覆盖平面资源。
参数:
hResource:目标表面(需为 D3DDDIFMT_A8R8G8B8 或 D3DDDIFMT_NV12)。
OverlayInfo:定义覆盖属性(如色彩空间、缩放模式)。
实现要点:
检查硬件是否支持请求的像素格式(如 NV12 用于视频)。
分配覆盖平面并返回句柄。
2.2 UpdateOverlay
HRESULT APIENTRY UpdateOverlay(
D3DDDIARG_UPDATEOVERLAY* pUpdateOverlay
);
功能:更新覆盖平面的位置、缩放或透明度。
典型用例:视频窗口移动或调整大小时调用。
2.3 FlipOverlay
HRESULT APIENTRY FlipOverlay(
D3DDDIARG_FLIPOVERLAY* pFlipOverlay
);
功能:切换覆盖平面的显示缓冲区(用于双缓冲/三缓冲)。
优化建议:使用 GPU 硬件翻转(如 D3DKMT_FLIPOVERLAY)避免 CPU 参与。
2.4 DestroyOverl
HRESULT APIENTRY DestroyOverlay(
D3DDDIARG_DESTROYOVERLAY* pDestroyOverlay
);
安全要求:释放所有关联的硬件资源,并重置覆盖状态。
3. 覆盖 DDI 的高级功能
3.1 色彩空间转换(CSC)
覆盖 DDI 支持自动 YUV→RGB 转换,驱动程序需声明支持的色彩标准:
typedef struct _D3DDDI_OVERLAYINFO {
D3DDDI_COLOR_SPACE_TYPE ColorSpace; // BT.601/BT.709
BOOL bEnableCSC; // 是否启用硬件CSC
} D3DDDI_OVERLAYINFO;
硬件要求:
- 支持 BT.601(SDTV)和 BT.709(HDTV)标准4。
3.2 多平面合成
Windows 7 允许同时激活多个覆盖平面(如主桌面+视频覆盖)。驱动程序需:
- 通过 D3DKMT_QUERYADAPTERINFO 查询最大覆盖平面数。
- 管理各平面的 Z 顺序(通过 UpdateOverlay 的 ZPos 参数)。
4. 实现示例
4.1 创建覆盖平面
HRESULT APIENTRY CreateOverlay(D3DDDIARG_CREATEOVERLAY* pCreate) {
// 验证像素格式
if (pCreate->OverlayFormat != D3DDDIFMT_NV12 &&
pCreate->OverlayFormat != D3DDDIFMT_A8R8G8B8) {
return D3DDDIERR_UNSUPPORTEDFORMAT;
}
// 分配硬件覆盖层
OVERLAY_CTX* pCtx = AllocOverlayHW();
pCreate->hOverlay = (HANDLE)pCtx;
return S_OK;
}
4.2 处理覆盖翻转
HRESULT APIENTRY FlipOverlay(D3DDDIARG_FLIPOVERLAY* pFlip) {
OVERLAY_CTX* pCtx = (OVERLAY_CTX*)pFlip->hOverlay;
return HW_FlipOverlay(pCtx, pFlip->hSource);
}
5. 测试与认证
5.1 WHCK 测试要求
测试项 | 验证目标 |
---|---|
Device.Graphics.Overlay.Basic | 覆盖创建/销毁功能 |
Device.Graphics.Overlay.ColorSpace | CSC 正确性 |
Device.Graphics.Overlay.MultiPlane | 多平面合成稳定性 |
5.2 调试工具
- GPUView:检查覆盖平面是否绕过合成引擎。
- PIX:捕获覆盖 DDI 调用链。
6. 性能优化建议
零拷贝路径:确保视频解码器可直接写入覆盖缓冲区。
硬件缩放:启用 D3DDDI_OVERLAYSTRETCH 减少 CPU 干预。
动态禁用:当覆盖无内容时自动释放硬件资源。
7. 向后兼容性
若需支持 Windows 7 以上版本:
#if (NTDDI_VERSION >= NTDDI_WIN7)
// 实现完整覆盖 DDI
#else
// 返回 E_NOTIMPL
#endif