Direct3D 版本 11.1 DXGI 函数
本部分介绍为 Microsoft Direct3D 版本 11.1 运行时添加的用户模式显示驱动程序实现的 Microsoft DirectX 图形基础结构 (DXGI) 函数。 Direct3D 11.1 随 Windows 8 一起引入。
当运行时调用 CreateDevice (D3D10) 时,用户模式显示驱动程序 DLL 导出 OpenAdapter10_2 函数,并通过 D3D10_2DDI_ADAPTERFUNCS 结构的成员提供指向适配器特定函数的指针。
驱动程序在调用用户模式显示驱动程序的特定于适配器的 CreateDevice (D3D10) 函数时,通过 DXGI1_2_DDI_BASE_FUNCTIONS 结构的成员提供指向 Direct3D 版本 11.1 DXGI 函数的 指针。
1. 版本背景与核心升级
Direct3D 11.1 随 Windows 8 引入,其 DXGI DDI 扩展主要增强:
- 异构渲染支持:改进多引擎(3D/计算/复制)协同
- HDR与宽色域:新增色彩空间管理接口
- 低延迟呈现:支持帧延迟控制(如 DXGI1_2_DDI_PRESENT_FLAGS)
- 交换链多样化:包括窗口化无撕裂模式
2. 驱动初始化流程
(1) 适配器级注册 (OpenAdapter10_2)
需实现 D3D10_2DDI_ADAPTERFUNCS 函数表:
// 在驱动入口点注册
HRESULT OpenAdapter10_2(D3D10DDIARG_OPENADAPTER* pOpenData) {
pOpenData->pAdapterFuncs_2->pfnCalcPrivateDeviceSize = MyCalcPrivateDeviceSize;
pOpenData->pAdapterFuncs_2->pfnCreateDevice = MyCreateDevice_11_1;
// ...其他必要函数
return S_OK;
}
(2) 设备创建时提供DXGI 1.2 DDI
在 CreateDevice 中填充 DXGI1_2_DDI_BASE_FUNCTIONS:
static const DXGI1_2_DDI_BASE_FUNCTIONS dxgi1_2_funcs = {
.pfnPresent = MyPresentDXGI_11_1,
.pfnGetGammaCaps = MyGetGammaCaps_11_1,
.pfnSetDisplayMode = MySetDisplayMode_11_1,
.pfnSetResourcePriority = MySetResourcePriority_11_1,
// 新增11.1专有函数
.pfnCheckMultiplaneOverlaySupport = MyCheckOverlaySupport,
.pfnPresentMultiplaneOverlay = MyPresentOverlay
};
*pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions = (DXGI_DDI_BASE_FUNCTIONS*)&dxgi1_2_funcs;
3. 关键新增函数实现
(1) 多平面覆盖 (Multiplane Overlay)
用于硬件加速视频/UI合成:
BOOL APIENTRY MyCheckOverlaySupport(
DXGI_DDI_ARG_CHECKMULTIPLANEOVERLAYSUPPORT* pSupport
) {
// 检查硬件是否支持指定格式的覆盖层
return (pSupport->Format == DXGI_FORMAT_NV12) ? TRUE : FALSE;
}
HRESULT APIENTRY MyPresentOverlay(
DXGI_DDI_ARG_PRESENTMULTIPLANEOVERLAY* pOverlay
) {
// 配置硬件覆盖层引擎
ConfigureOverlayPlane(pOverlay->PlaneIndex, &pOverlay->Transform);
return S_OK;
}
(2) HDR元数据控制
void APIENTRY MySetHDRMetaData(
DXGI_DDI_ARG_SETHDRMETADATA* pMetaData
) {
// 传递ST.2086元数据到显示控制器
WriteHDRMetaData(
pMetaData->hMonitor,
pMetaData->Type,
&pMetaData->MetaData
);
}
(3) 低延迟呈现
HRESULT APIENTRY MyPresentDXGI_11_1(
DXGI_DDI_ARG_PRESENT* pPresent
) {
if (pPresent->Flags.LowLatency) {
// 跳过队列直接提交到显示引擎
SubmitImmediateFlip(pPresent->hSurface);
} else {
// 常规呈现路径
QueueStandardPresent(pPresent->hSurface);
}
return S_OK;
}
4. 硬件特性报告
通过 DXGI1_2_DDI_BASE_CALLBACKS 扩展能力查询:
typedef struct DXGI1_2_DDI_BASE_CALLBACKS {
DXGI_DDI_BASE_CALLBACKS;
PFNDDXGIDDI_GETMULTIPLANEOVERLAYCAPS pfnGetMultiplaneOverlayCaps;
PFNDDXGIDDI_CHECKVIDEOPROCESSORFORMAT pfnCheckVideoProcessorFormat;
} DXGI1_2_DDI_BASE_CALLBACKS;
5. 软件回退路径
若硬件不支持某些11.1特性:
HRESULT MyCreateDevice_11_1(/*...*/) {
if (!CheckFeatureSupport(D3D11_1_FEATURE)) {
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions =
&dxgi_legacy_funcs; // 回退到基础DXGI DDI
}
}
6. 调试与验证
- DXGI 调试工具:使用 DXGI_DEBUG_DDI 层捕获1.2调用
- PIX for Windows:分析多平面覆盖层合成流程
- ETW日志:追踪 PresentMultiplaneOverlay 调用频率
关键设计原则:
- 保持向后兼容,未实现的11.1函数应返回 DXGI_DDI_UNSUPPORTED
- 所有新增函数必须线程安全
- 优先使用硬件加速路径(如覆盖层引擎)