window显示驱动开发—验证覆盖支持

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
相关推荐
花小璇学linux6 小时前
imx6ull-驱动开发篇14——原子操作
linux·驱动开发·嵌入式软件
程序员JerrySUN1 天前
当前主流GPU全景讲解:架构、功能与应用方向
数据库·人工智能·驱动开发·redis·缓存·架构
猫猫的小茶馆2 天前
【STM32】HAL库中的实现(二):串口(USART)/看门狗(IWDG/WWDG)/定时器(TIM)
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·智能硬件
sukalot2 天前
window显示驱动开发—覆盖 DDI
驱动开发
花小璇学linux2 天前
imx6ull-驱动开发篇10——pinctrl 子系统
linux·驱动开发·imx6ull·嵌入式软件
sukalot2 天前
window显示驱动开发—可选内容保护 DDI 函数
驱动开发
sukalot2 天前
window显示驱动开发—内容保护的资源
驱动开发
花小璇学linux2 天前
imx6ull-驱动开发篇11——gpio子系统
驱动开发
车载操作系统---攻城狮3 天前
[驱动开发篇] Can通信进阶 --- CanFD 的三次采样
驱动开发