若要支持 Microsoft DirectX Graphics Infrastructure (DXGI) 设备驱动程序接口 (DDI) ,用户模式显示驱动程序必须包含 Dxgiddi.h 头文件。 Dxgiddi.h 还包括 Dxgitype.h 头文件,其中包含与应用程序级 DXGI 构造共享的定义。 Dxgiddi.h 定义了多个用户模式显示驱动程序入口点和 DXGI 回调函数,驱动程序可以使用该函数与内核通信, (包括显示微型端口驱动程序) 。
Microsoft Direct3D 运行时提供对 D3D10DDIARG_CREATEDEVICE 结构的 DXGIBaseDDI 成员在调用 CreateDevice (D3D10) 函数时指向的DXGI_DDI_BASE_ARGS结构中的 DXGI DDI 的访问权限。 用户模式显示驱动程序提供指向 DXGI 函数的指针。
驱动程序通过 DXGI_DDI_BASE_ARGS的 pDXGIDDIBaseFunctionsXxx 成员所指向的结构成员来实现这些函数。 驱动程序应记录指向 dxGI 回调函数表的指针,DXGI_DDI_BASE_ARGS的 pDXGIBaseCallbacks 成员指向该函数表供以后使用。 驱动程序应记录指向 DXGI 回调函数表的指针,而不是记录指向 DXGI 回调函数的单个指针,因为只要用户模式显示驱动程序中没有线程,Direct3D 运行时就可以更改回调函数的地址。
软件光栅器还有进一步的 DXGI 用户模式显示驱动程序要求。 更具体地说,这种用户模式显示驱动程序 (,任何不支持与图形适配器) 上的 Direct3D 版本 9 DDI 实现共享的硬件的驱动程序都必须从其 CreateDevice (D3D10) 函数返回DXGI_STATUS_NO_REDIRECTION值而不是S_OK值。 此返回值向 DXGI 指示它不应使用共享资源表示路径来影响与桌面窗口管理器 (DWM) 的通信。 当调用共享资源函数 (即 CreateResource (D3D10) 和 OpenResource (D3D10) 函数时,将创建 共享资源 表示路径,) 设置D3D10_DDI_RESOURCE_MISC_SHARED标志。 但是,DXGI 应改用与交换链相关的技术,该交换链的缓冲区仅适用于 CPU。 例如,DXGI 应通过共享资源表示路径以外的方式将呈现的数据从后台缓冲区移动到桌面。 在这种情况下,DXGI 实际上调用驱动程序的 PresentDXGI 函数来移动呈现的数据,而不是与 DWM 的通信。
1. 软件光栅器特殊处理
标志返回:必须返回 DXGI_STATUS_NO_REDIRECTION 避免DWM共享路径。
呈现替代方案:实现 PresentDXGI 直接处理CPU可访问缓冲区:
HRESULT APIENTRY MyDXGIPresent(DXGI_DDI_ARG_PRESENT* pPresentData
) {if (IsSoftwareDevice()) {// CPU拷贝交换链缓冲区到DWM兼容内存CopyToDWMBuffer(pPresentData->hSurface);return S_OK;}// 硬件路径...
}
2.共享资源路径禁用影响
行为变化 | 软件光栅器 | 硬件驱动 |
---|---|---|
D3D10_DDI_RESOURCE_MISC_SHARED | 忽略,不走DWM共享 | 正常创建共享GDI兼容资源 |
Present流程 | 强制走 PresentDXGI 回调 | 可选DWM优化路径 |
3. 驱动实现检查清单
函数表完整性:实现所有 DXGI_DDI_BASE_FUNCTIONS 必要函数。
线程安全存储:深拷贝回调表指针(勿直接引用运行时内存)。
软件适配:正确返回 DXGI_STATUS_NO_REDIRECTION 并实现CPU端Present。
注册表配置:INF文件中声明DXGI支持能力。
4. 调试技巧
- DXGI调试层:启用 DXGI_DEBUG_DDI 捕获接口调用错误。
- PIX捕获:验证 PresentDXGI 的调用参数和时序。
- WDK日志:使用 WPP_TRACING 记录DXGI DDI调用序列。
5. 硬件驱动优化建议
- 异步Present:支持 DXGI_PRESENT_DO_NOT_SEQUENCE 减少延迟。
- HDR元数据:实现 SetHDRMetaData 传递色彩空间信息。
- 撕裂控制:处理 DXGI_PRESENT_ALLOW_TEARING 标志。