初始化与 Direct3D 版本 11 DDI 之间的通信

本部分仅适用于 Windows 7 及更高版本以及 Windows Server 2008 R2 及更高版本的 Windows 操作系统。

通信初始化

若要初始化与用户模式显示驱动程序 DLL 版本 11 DDI 的通信,Direct3D 版本 11 运行时首先加载 DLL(如果尚未加载 DLL)。 接下来,Direct3D 运行时通过 DLL 的导出表调用用户模式显示驱动程序的 OpenAdapter10_2 函数,以打开图形适配器的实例。 OpenAdapter10_2 函数是 DLL 的唯一导出函数。

注意

OpenAdapter10_2 函数与 OpenAdapter10 函数相同,只是驱动程序的适配器特定函数表的返回方式不同:

  • OpenAdapter10_2返回 D3D10DDIARG_OPENADAPTER 结构的pAdapterFuncs_2 成员中的表,其中 pAdapterFuncs_2 指向 D3D10_2DDI_ADAPTERFUNCS 结构。
  • OpenAdapter10 返回 D3D10DDIARG_OPENADAPTERpAdapterFuncs 成员中的表,其中 pAdapterFuncs 指向D3D10DDI_ADAPTERFUNCS 结构。

OpenAdapter10_2 旨在提高驱动程序初始化效率。 必须在 Direct3D 版本 11 驱动程序中实现 OpenAdapter10_2 。 还可以在 Direct3D 版本 10.1 驱动程序中实现 OpenAdapter10_2 (而不是 OpenAdapter10) ,以提高这些驱动程序的初始化效率。 有关在 Direct3D 版本 10.1 驱动程序中实现 OpenAdapter10_2 的详细信息,请参阅 版本发现支持OpenAdapter10_2 处理运行时和驱动程序之间的版本控制和其他信息的交换。

版本控制

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 

信息交换

除了指定版本信息外,驱动程序的 OpenAdapter10_2 函数还会在运行时和驱动程序之间交换其他信息。

在调用驱动程序的 OpenAdapter10_2 函数时,运行时在 D3D10DDIARG_OPENADAPTER 结构的 pAdapterCallbacks 成员中提供 pfnQueryAdapterInfoCb 适配器回调函数。 用户模式显示驱动程序应调用 pfnQueryAdapterInfoCb 适配器回调函数,以从显示微型端口驱动程序查询图形硬件功能。

运行时调用用户模式显示驱动程序的 CreateDevice (D3D10) 函数 (驱动程序的适配器特定函数之一,) 创建用于处理呈现状态集合和完成初始化的显示设备。 初始化完成后,Direct3D 版本 11 运行时可以调用 显示驱动程序提供的 Direct3D 版本 11 函数,用户模式显示驱动程序可以调用 运行时提供的函数

使用 D3D10DDIARG_CREATEDEVICE结构调用 用户模式显示驱动程序的 CreateDevice (D3D10) 函数,其成员按以下方式设置,以初始化用户模式显示驱动程序的版本 11 DDI:

  • 运行时将 Interface 设置为运行时从用户模式显示驱动程序所需的接口版本。

  • 运行时将 Version 设置为一个数字,驱动程序可以使用该数字来标识何时生成运行时。 例如,驱动程序可以使用版本号来区分 Windows Vista 发布的运行时和随后续 Service Pack 发布的运行时,后者可能包含驱动程序所需的修补程序。

  • 运行时设置 hRTDevice 以指定驱动程序调用回运行时时驱动程序应使用的句柄。

  • 运行时设置 hDrvDevice 以指定运行时在后续驱动程序调用中使用的句柄。

  • 运行时在 pKTCallbacks 指向的 D3DDDI_DEVICECALLBACKS 结构中提供其特定于设备的回调函数的表。 用户模式显示驱动程序调用运行时提供的回调函数来访问显示微型端口驱动程序中的内核模式服务。

  • 用户模式显示驱动程序在 p11DeviceFuncs 指向的D3D11DDI_DEVICEFUNCS结构中返回其特定于设备的功能的表。

  • 运行时提供 DXGIBaseDDI 指向的DXGI_DDI_BASE_ARGS结构。 运行时和用户模式显示驱动程序为此结构提供其 DirectX 图形基础结构 DDI

  • 运行时设置 hRTCoreLayer 以指定驱动程序在调用回运行时以访问核心 Direct3D 10 功能时驱动程序应使用的句柄 (即,在 调用 p11UMCallbacks 成员指定) 的函数时。

  • 运行时在 p11UMCallbacks 指向的 D3D11DDI_CORELAYER_DEVICECALLBACKS 结构中提供其核心回调函数的表。 用户模式显示驱动程序调用运行时提供的核心回调函数来刷新状态。