支持线程、命令列表和 3-D 管道

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

用户模式显示驱动程序指示当 Direct3D 版本 11 运行时调用驱动程序的 GetCaps (D3D10_2) 函数时,它支持 (线程、命令列表和三维管道) 的新 Direct3D 版本 11 功能。 GetCaps (D3D10_2) 是驱动程序的适配器特定函数之一,驱动程序在 D3D10DDIARG_OPENADAPTER 结构pAdapterFuncs_2成员指向的D3D10_2DDI_ADAPTERFUNCS结构中提供。 有关在驱动程序初始化期间提供特定于适配器的函数的详细信息,请参阅 使用 Direct3D 版本 11 DDI 初始化通信。 调用其 GetCaps (D3D10_2) 函数时,用户模式显示驱动程序会根据请求类型 (提供新的 Direct3D 版本 11 功能,该类型是在 getCaps (D3D10_2) 函数的 pData 参数指向) 的 D3D10_2DDIARG_GETCAPS 结构的 Type 成员中指定的。

线程和命令列表

Direct3D 版本 11 API 需要一种可同步应用程序线程的操作模式,以确保一次只有一个线程在 DDI 中运行。 Direct3D 版本 11 API 还需要一种具有命令列表的软件仿真的操作模式。 这些操作模式由以前版本的 DDI ((例如 Direct3D 版本 10 DDI) )要求和利用。 因此,作为驱动程序编写器的辅助开发,这些相同的操作模式已扩展为存在于 Direct3D 版本 11 DDI 上。 驱动程序编写者可以决定他们希望其驱动程序支持 Direct3D 版本 11 DDI 的操作模式。

所有驱动程序最终都应完全支持所有类型的线程操作 (即,所有驱动程序最终应支持 ) D3D11DDI_THREADING_CAPS 结构的所有线程功能。 但是,驱动程序可以要求 API 模拟命令列出或强制执行驱动程序的单线程操作模式。 在创建 API 设备期间,但在创建 DDI 设备之前,API 必须了解驱动程序的线程功能。 因此,运行时在调用驱动程序的 GetCaps (D3D10_2) 适配器特定函数时确定驱动程序的线程功能,并将 D3D10_2DDIARG_GETCAPS的 Type 成员设置为 D3D11DDICAPS_THREADING。 驱动程序返回指向 D3D10_2DDIARG_GETCAPSpData 成员中的D3D11DDI_THREADING_CAPS结构的指针,该成员标识驱动程序的线程功能。 驱动程序必须支持自由线程模式 (D3D11DDICAPS_FREETHREADED) 如果驱动程序还支持命令列表 (D3D11DDICAPS_COMMANDLISTS_BUILD_2) ,因为命令列表基于自由线程模式。 驱动程序必须选择加入才能支持自由线程模式和命令列表。 应用程序可以通过使用应用程序级 CheckFeatureSupport 函数和D3D11_FEATURE_THREADING常量来确定驱动程序指示的支持;但是,由于 API 提供的支持,某些应用程序可能并不关心。

三维管道级别

支持 Direct3D 版本 11 DDI 的驱动程序不需要支持 Direct3D 版本 11 DDI 的所有硬件功能。 驱动程序可以在仅支持 Direct3D 版本 10 DDI 的硬件之上支持 Direct3D 版本 11 DDI 的新线程模型。 当运行时调用驱动程序的 GetCaps (D3D10_2) 函数时,Direct3D 版本 11 运行时确定驱动程序的最大硬件支持级别,D3D10_2DDIARG_GETCAPS Type 成员设置为 D3D11DDICAPS_3DPIPELINESUPPORT 。 驱动程序返回指向 D3D10_2DDIARG_GETCAPS 的 pData 成员中的D3D11DDI_3DPIPELINESUPPORT_CAPS结构的指针,该成员标识最大硬件支持级别。

API 不只是使用 DDI 版本作为 API 功能级别支持的主要指标:API 允许驱动程序将反馈到此过程。 运行时选择一个D3D11DDI_3DPIPELINELEVEL值,并在设备创建期间通过调用驱动程序的 CreateDevice (D3D10) 函数将该值反馈给驱动程序,作为D3D10DDIARG_CREATEDEVICE结构的 Flags 成员的一部分。

如果驱动程序支持的硬件级别低于 Direct3D 版本 11 的 Direct3D 版本 11 在 Direct3D 版本 11 上,则会对驱动程序的操作产生轻微影响。 第一个是 Direct3D 版本 11 运行时可能永远不会调用许多新的 Direct3D 版本 11 DDI 函数。 例如,如果驱动程序支持的硬件功能级别低于 Direct3D 版本 11,Direct3D 版本 11 运行时不会调用任何新的着色器阶段 DDI 函数 (DsSetShader) 。 其他 DDI 函数遵循功能级别的规则,并忽略 Direct3D 版本 11 DDI 可能与更高功能相关联这一事实。 例如,即使 Direct3D 版本 11 API 的 IAVertexInputSlots 为 32,但 Direct3D 版本 10 功能级别仅允许 16,而这正是驱动程序应期望的。

弃用或转换的功能提供了另一个有趣的方面。 在 Direct3D 版本 11 DDI 级别无法弃用,因为弃用必须支持表达早期版本 DDI 函数的功能。 例如,PIPELINESTATS 的 Direct3D 11 API 版本始终不变;但是,它 请求使用 Direct3D 10 功能级别和 Direct3D 11 功能级别 D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS的不同D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS ,等等。 即使 API 尝试弃用文本筛选器大小,驱动程序完全弃用 DDI 函数表条目也比尝试重新使用函数表条目进行其他操作更容易。

即使支持 Direct3D 版本 11 DDI 的驱动程序不支持完整的 Direct3D 版本 11 功能级别,驱动程序也无法选择退出“扩展格式感知”,如 支持扩展格式感知中所述。 由于驱动程序支持 Direct3D 版本 11 DDI,因此驱动程序应处理以下任务:

  • 支持 BGR 格式

  • 正确响应对其 CheckFormatSupport 函数的调用,以检查XR_BIAS支持。 驱动程序应声明支持或拒绝支持。

  • 允许强制转换完全类型化后备缓冲区

Direct3D 版本 11 API 还会通知驱动程序应用程序是否通过D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED标志使用多个线程。 如果通过调用驱动程序的 CreateDevice (D3D10) 函数创建显示设备时,D3D10DDIARG_CREATEDEVICE 结构的 Flags 成员中存在此标志,则驱动程序可以确定不创建延迟上下文,并且不需要同步驱动程序,因为不会进行并发创建。