Windows 显示驱动程序模型 (WDDM) 1.3 及更高版本驱动程序可以支持 Microsoft Direct3D 呈现性能改进,使 Direct3D 9 硬件能够更好地利用硬件命令缓冲区和计数器,并将系统内存高效复制到子资源。 这些功能镜像 Direct3D 版本 10 硬件可用的一些功能,从 Windows 8.1 开始都是新的。
还提供了新的 Direct3D 11.1 资源修整和映射默认性能改进。 下面的行为更改部分概述了映射默认方案。
呈现性能参考
本参考部分介绍用户模式设备驱动程序接口 (DDI) 。
用户模式驱动程序实现的 Direct3D 呈现性能函数
本部分包含 Windows 显示驱动程序模型 (WDDM) 1.3 及更高版本用户模式显示驱动程序实现的函数,以支持 Microsoft Direct3D 呈现性能改进。
PFND3DDDI_FLUSH1: PFND3DDDI_CHECKCOUNTERINFO
PFND3DDDI_CHECKCOUNTER: PFND3DDDI_UPDATESUBRESOURCEUP
1. 核心函数概览
WDDM 1.3 引入以下用户模式驱动(UMD)函数,用于优化 Direct3D 渲染性能:
2. 关键函数详解
(1) PFND3DDDI_FLUSH1
优化目标:减少 Flush 操作的 CPU 开销,支持并行提交。
新增参数:
typedef struct _D3DDDIARG_FLUSH1 {
UINT Flags; // 控制刷新行为(如 D3DDDI_FLUSH1_WAIT_FOR_GPU)
UINT NumSyncObjects; // 同步对象数量
HANDLE* hSyncObjects; // 同步对象句柄数组
} D3DDDIARG_FLUSH1;
驱动实现:
HRESULT APIENTRY Flush1(D3D10DDI_HDEVICE hDevice, CONST D3DDDIARG_FLUSH1* pArgs) {
if (pArgs->Flags & D3DDDI_FLUSH1_WAIT_FOR_GPU) {
WaitForGpuIdle(); // 确保 GPU 完成所有任务
}
SubmitCommandBuffer(); // 提交命令到内核队列
return S_OK;
}
(2) PFND3DDDI_CHECKCOUNTER / CHECKCOUNTERINFO
性能计数器类型(示例):
typedef enum _D3DDDI_COUNTER_TYPE {
D3DDDI_COUNTER_TYPE_FLOAT32, // 浮点数值(如 GPU 利用率)
D3DDDI_COUNTER_TYPE_UINT64 // 整数值(如渲染三角形数)
} D3DDDI_COUNTER_TYPE;
驱动实现
HRESULT APIENTRY CheckCounterInfo(
D3D10DDI_HDEVICE hDevice,
D3DDDI_COUNTER_INFO* pInfo
) {
pInfo->NumCounters = 4; // 支持的计数器数量
strcpy(pInfo->Counters[0].Name, "GPU_BUSY_PERCENT");
pInfo->Counters[0].Type = D3DDDI_COUNTER_TYPE_FLOAT32;
return S_OK;
}
(3) PFND3DDDI_UPDATESUBRESOURCEUP
优化场景:动态更新纹理的局部区域(如游戏中的地形细节)。
参数说明:
typedef struct _D3DDDIARG_UPDATESUBRESOURCEUP {
D3D10DDI_HRESOURCE hDstResource; // 目标资源
UINT DstSubresource; // 子资源索引
const D3D10_DDI_BOX* pDstBox; // 更新区域(NULL 表示全资源)
const VOID* pSrcData; // 源数据指针
UINT SrcRowPitch; // 源数据行间距
UINT SrcDepthPitch; // 源数据深度间距
} D3DDDIARG_UPDATESUBRESOURCEUP;
驱动实现:
HRESULT APIENTRY UpdateSubResourceUP(
D3D10DDI_HDEVICE hDevice,
CONST D3DDDIARG_UPDATESUBRESOURCEUP* pArgs
) {
CopyPartialTexture(pArgs->hDstResource, pArgs->pDstBox, pArgs->pSrcData);
return S_OK;
}
3. 性能优化实践
(1) 多线程渲染
FLUSH1 同步控制:
使用 hSyncObjects 实现线程间任务依赖,避免全局 GPU 等待。
示例:
// 线程1:提交计算着色器任务
DispatchCompute();
hSyncObjects[0] = CreateGpuFence();
Flush1(D3DDDI_FLUSH1_SIGNAL_SYNC_OBJECT, 1, &hSyncObjects[0]);
// 线程2:等待计算完成再渲染
Flush1(D3DDDI_FLUSH1_WAIT_SYNC_OBJECT, 1, &hSyncObjects[0]);
DrawPrimitives();
(2) 动态资源更新
UpdateSubResourceUP 优势:
减少 CPU 内存拷贝(直接使用应用层指针 pSrcData)。
支持部分更新(pDstBox 指定区域),降低带宽占用。
(3) 性能监控集成
计数器应用:
实时显示 GPU 利用率、帧时间等指标(如游戏内调试 HUD)。
自动化性能测试(WHCK 认证要求)。
4. WHCK 认证要求
测试项 | 验证目标 | 工具依赖 |
---|---|---|
Device.Graphics.WDDM13.Flush1 |
多线程刷新同步的正确性。 | HLK 多线程压力测试。 |
Device.Graphics.WDDM13.Counters |
性能计数器数据的准确性与稳定性。 | GPUView 性能分析。 |
Device.Graphics.WDDM13.PartialUpdate |
子资源部分更新的功能与性能。 | PIX 纹理捕获工具。 |
5. 调试与问题排查
常见问题:
- FLUSH1 同步失败:检查同步对象生命周期(避免提前销毁)。
- 计数器数据异常:验证 GPU 硬件寄存器读取逻辑。
工具推荐:
- GPUView:分析刷新命令的时序和同步。
- PIX on Windows:捕获 UpdateSubResourceUP 的调用链。
6. 总结
WDDM 1.3+ 必备:这些函数是驱动支持现代游戏/应用高性能渲染的基础。
关键收益:
降低 CPU 开销(FLUSH1)。
精细化性能分析(CHECKCOUNTER)。
高效资源更新(UPDATESUBRESOURCEUP)。
移动设备优化:部分更新和计数器监控对省电至关重要