Direct3D 版本 11.2 DXGI 函数
本部分中的参考页介绍由用户模式显示驱动程序实现的 Microsoft DirectX 图形基础结构 (DXGI) 函数,这些功能是为 Microsoft Direct3D 版本 11.2 运行时添加的。 Direct3D 11.2 随 Windows 8.1 一起引入。
当运行时调用 CreateDevice (D3D10) 时,用户模式显示驱动程序 DLL 导出 OpenAdapter10_2 函数,并通过 D3D10_2DDI_ADAPTERFUNCS 结构的成员提供指向适配器特定函数的指针。
驱动程序在调用用户模式显示驱动程序的特定于适配器的 CreateDevice (D3D10) 函数时,通过 DXGI1_3_DDI_BASE_FUNCTIONS 结构的成员提供指向 Direct3D 版本 11.2 DXGI 函数的指针。
PFNDDXGIDDI_PRESENT_MULTIPLANE_OVERLAYCB: PFNDDXGIDDI_PRESENTCB
PFNDDXGIDDI_SUBMITPRESENTBLTTOHWQUEUECB: PFNDDXGIDDI_SUBMITPRESENTTOHWQUEUECB
备注
Direct3D 11.2 运行时支持的其他 DXGI 函数包含在 用户模式驱动程序实现的多平面覆盖函数部分中。
1. 版本背景与核心升级
Direct3D 11.2 随 Windows 8.1 引入,其 DXGI DDI 扩展聚焦:
- 多平面覆盖增强:支持更复杂的混合场景(如HUD+视频+3D场景)
- 硬件队列优化:新增 SubmitPresentBltToHwQueue 提升Blit效率
- 显示缩放控制:系统级缩放比例管理(如高DPI显示)
2. 驱动初始化流程
(1) 适配器级注册 (OpenAdapter10_2)
需扩展 D3D10_2DDI_ADAPTERFUNCS 以支持11.2能力查询:
HRESULT OpenAdapter10_2(D3D10DDIARG_OPENADAPTER* pOpenData) {
pOpenData->pAdapterFuncs_2->pfnGetSupportedVersions = MyGetDDIVersions;
// ...其他标准函数
}
(2) 设备创建时提供DXGI 1.3 DDI
填充 DXGI1_3_DDI_BASE_FUNCTIONS 结构:
static const DXGI1_3_DDI_BASE_FUNCTIONS dxgi1_3_funcs = {
.pfnPresent = MyPresentDXGI_11_2,
// 继承11.1函数...
// 新增11.2专有函数
.pfnSubmitPresentBltToHwQueue = MySubmitBltToQueue,
.pfnReclaimResources = MyReclaimResources
};
3. 关键新增函数实现
(1) 多平面覆盖增强
// 多平面覆盖配置回调(由DWM调用)
HRESULT APIENTRY MyPresentMultiplaneOverlayCB(
DXGI_DDI_ARG_PRESENT_MULTIPLANE_OVERLAY* pOverlayData
) {
// 支持每平面独立旋转和混合
for (UINT i = 0; i < pOverlayData->NumPlanes; i++) {
ConfigureOverlayPlane(
pOverlayData->pPlanes[i].PlaneIndex,
&pOverlayData->pPlanes[i].Transform,
pOverlayData->pPlanes[i].BlendMode
);
}
return S_OK;
}
(2) 硬件队列提交优化
void APIENTRY MySubmitBltToQueue(
DXGI_DDI_ARG_SUBMITPRESENTBLTTOHWQUEUE* pBltData
) {
// 直接提交到硬件Blit引擎队列
QueueBltCommand(
pBltData->hSrcResource,
pBltData->hDstResource,
&pBltData->BltRect,
pBltData->ColorSpace
);
}
(3) 资源回收通知
HRESULT APIENTRY MyReclaimResources(
DXGI_DDI_ARG_RECLAIMRESOURCES* pReclaimData
) {
// 标记资源可被GPU内存管理器回收
for (UINT i = 0; i < pReclaimData->NumResources; i++) {
MarkResourceAsReclaimable(pReclaimData->phResources[i]);
}
return S_OK;
}
4. 硬件特性报告
通过 DXGI1_3_DDI_BASE_CALLBACKS 扩展:
typedef struct DXGI1_3_DDI_BASE_CALLBACKS {
DXGI1_2_DDI_BASE_CALLBACKS;
PFNDDXGIDDI_GETSCALINGRECTS pfnGetScalingRects;
PFNDDXGIDDI_CHECKSCALINGSUPPORT pfnCheckScalingSupport;
} DXGI1_3_DDI_BASE_CALLBACKS;
5. 显示缩放控制
BOOL APIENTRY MyCheckScalingSupport(
DXGI_DDI_ARG_CHECKSCALINGSUPPORT* pSupport
) {
// 报告硬件支持的缩放比例范围
pSupport->MinScaling = 50; // 最小50%
pSupport->MaxScaling = 400; // 最大400%
return TRUE;
}
6. 调试与验证
Direct3D调试层:启用 D3D11_2DDI_DEBUG 捕获参数错误
GPUView:分析 SubmitPresentBltToHwQueue 执行时序
PIX:捕获多平面覆盖层的混合效果
关键设计原则:
多平面覆盖必须支持至少8个同时活动的平面
硬件队列提交应避免CPU-GPU同步点
缩放控制需与桌面DPI设置联动