> 技术文档 > window显示驱动开发—版本控制

window显示驱动开发—版本控制

OpenAdapter10_2 和驱动程序的适配器特定函数更改了 Direct3D API 与 Direct3D D DDI 之间的版本控制处理方式,而不是 Direct3D 10 处理版本控制 (有关 Direct3D 10 如何处理版本控制的详细信息,请参阅 初始化与 Direct3D 版本 10 DDI) 通信。 与 OpenAdapter10_2 () 一样,与 OpenAdapter10_2) 一样,Direct3D API 必须显式列出其支持的 DDI 版本,而不是依赖驱动程序的 OpenAdapter10_2 函数失败来指示不支持特定版本。 Direct3D 运行时调用用户模式显示驱动程序的 GetSupportedVersions 函数 (驱动程序的适配器特定的函数之一,) 查询驱动程序支持的 DDI 版本。

Direct3D 11 DDI 函数至少有两个新的 DDI 版本。 每个 DDI 版本区分 DDI 是在 Windows Vista 还是 Windows 7 上运行。 但是,支持 Direct3D 11 DDI 并不一定表示完全支持与 D3D_FEATURE_LEVEL_11关联的硬件功能。 驱动程序可以使用不支持 Direct3D 11 DDI 公开的其他功能(如细化等)的硬件支持 Direct3D 11 DDI 的新线程功能。 以下代码演示如何区分每个 DDI 版本:

// D3D11.0 on Vista#define D3D11_DDI_MAJOR_VERSION 11#define D3D11_0_DDI_MINOR_VERSION ...#define D3D11_0_DDI_INTERFACE_VERSION \\ ((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)#define D3D11_0_DDI_BUILD_VERSION ...#define D3D11_0_DDI_SUPPORTED \\ ((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \\ (((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))// D3D11.0 on Windows 7#define D3D11_0_7_DDI_MINOR_VERSION ...#define D3D11_0_7_DDI_INTERFACE_VERSION \\ ((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)#define D3D11_0_7_DDI_BUILD_VERSION ...#define D3D11_0_7_DDI_SUPPORTED \\ ((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \\ (((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16)) #ifndef IS_D3D11_WIN7_INTERFACE_VERSION#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)#endif

版本控制核心变更

1. 显式版本声明(取代隐式失败)
旧版 (D3D10):运行时通过尝试调用不同版本的 OpenAdapter 并检查失败来推断支持情况。

新版 (D3D11+):运行时必须调用 GetSupportedVersions 主动查询驱动支持的 DDI 版本列表,禁止依赖失败推测。

2. DDI 版本与操作系统绑定

DDI 版本 对应操作系统 关键特性 D3D11_0_DDI_INTERFACE_VERSION Windows Vista 基础 D3D11 功能(无细分曲面等) D3D11_1_DDI_INTERFACE_VERSION Windows 7 新增线程池、动态着色器链接等

📌 注意:支持 D3D11 DDI ≠ 支持全部 D3D11 硬件特性(如细分曲面可能缺失)。

 驱动程序实现规范

1. GetSupportedVersions 函数实现

void APIENTRY GetSupportedVersions( D3D10DDI_HADAPTER hAdapter, UINT* pNumVersions, UINT* pVersions) { // 1. 返回支持的 DDI 版本数量 static const UINT supportedVersions[] = { D3D11_1_DDI_INTERFACE_VERSION, // Windows 7 扩展功能 D3D11_0_DDI_INTERFACE_VERSION // Windows Vista 基础功能 }; if (pNumVersions) { *pNumVersions = ARRAYSIZE(supportedVersions); } // 2. 填充支持的版本列表 if (pVersions) { memcpy(pVersions, supportedVersions, sizeof(UINT) * ARRAYSIZE(supportedVersions)); }}

2. 版本感知的适配器初始化

HRESULT APIENTRY OpenAdapter10_2( D3D10DDIARG_OPENADAPTER* pOpenData) { // 1. 根据操作系统版本选择 DDI 功能集 bool isWindows7OrLater = /* 系统版本检测 */; pOpenData->Version = isWindows7OrLater ? D3D11_1_DDI_INTERFACE_VERSION : D3D11_0_DDI_INTERFACE_VERSION; // 2. 填充适配器函数表 pOpenData->pAdapterFuncs_2 = &g_D3D10_2DDI_AdapterFuncs; return S_OK;}

功能级别与 DDI 版本的解耦

1. 硬件能力声明
驱动程序可通过 pfnGetCaps 独立报告硬件支持的功能级别(如 D3D_FEATURE_LEVEL_11_0),与 DDI 版本无关:

void APIENTRY GetCaps( D3D10DDIARG_GETCAPS* pData) { if (pData->Type == D3D11DDICAPS_FEATURE_LEVELS) { D3D_FEATURE_LEVEL* pLevels = (D3D_FEATURE_LEVEL*)pData->pData; pLevels[0] = D3D_FEATURE_LEVEL_11_0; pLevels[1] = D3D_FEATURE_LEVEL_10_1; pData->DataSize = 2 * sizeof(D3D_FEATURE_LEVEL); }}

2. 线程池示例(Windows 7 DDI 扩展)
即使硬件不支持细分曲面,仍可利用 D3D11.1 DDI 的线程优化:

// D3D11.1 DDI 新增线程函数void APIENTRY ExecuteCommandListFromThreadPool( D3D10DDI_HDEVICE hDevice, UINT NumCommands, const D3D11_1DDI_ARG_COMMAND* pCommands) { // 使用软件线程池并行处理命令 ParallelFor(NumCommands, [&](UINT i) { ProcessCommand(&pCommands[i]); });}

版本协商流程图


调试与验证

版本列表测试

  • 强制运行时请求不支持的版本(如 D3D11_2),验证驱动返回 E_INVALIDARG。

功能级别隔离

  • 在支持 D3D11 DDI 但仅具备 FL10.1 的硬件上,确认运行时不启用细分曲面管线。

日志记录

  • 在 GetSupportedVersions 中记录调用参数,验证版本协商逻辑。

总结

  • 显式版本声明:通过 GetSupportedVersions 明确支持的 DDI 版本,避免隐式探测。
  • OS 版本绑定:D3D11_0 对应 Vista,D3D11_1 对应 Win7,新增线程优化等特性。
  • 功能级别独立:DDI 版本与硬件能力解耦,驱动可选择性实现高级特性。