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
相关推荐
世微 如初16 天前
AP5125大功率LED恒流驱动实战:地摊灯项目从原理图到调试笔记
驱动开发·芯片·led电源驱动·降压恒流ic
ScilogyHunter16 天前
Zephyr串口驱动开发及构建完全指南
驱动开发·uart·zephyr
_Emma_16 天前
【DRM&Graphic】Linux图形与显示框架
linux·驱动开发·图形渲染·显示器
董厂长16 天前
Loop Engineering:停止手动提示,开始设计自动提示的系统
大数据·人工智能·驱动开发·llm
Saniffer_SH17 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
暮云星影17 天前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
charlie11451419117 天前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式
暮云星影17 天前
瑞芯微rk3566开发FIT Secure Boot
linux·arm开发·驱动开发·安全
暮云星影18 天前
全志linux开发 USB接口设置
linux·arm开发·驱动开发
sukalot18 天前
windows显示驱动开发-CCD DDI的其它技术
windows·驱动开发