延迟上下文简介

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

应用程序使用延迟上下文来创建命令列表。 如果用户模式显示驱动程序指示它通过 D3D11DDI_THREADING_CAPS 结构的D3D11DDICAPS_COMMANDLISTS_BUILD_2标志支持命令列表,则它还必须支持创建和操作延迟上下文的功能。 有关驱动程序如何指示线程功能的详细信息,请参阅 支持线程、命令列表和三维管道。 延迟上下文与直接上下文的不同之处在于,在应用程序通过执行生成的命令列表来显式请求执行命令之前,无法执行延迟上下文记录的命令。 为了创建和使用延迟上下文,Direct3D 版本 11 提供了以下新的 DDI 函数。 这些函数是创建设备/即时上下文组合所需的信息的子集。

CalcPrivateDeferredContextSizeCreateDeferredContext 函数的语义类似于其他类似的 DDI 函数。

Direct3D 运行时为每次调用驱动程序的 CreateDeferredContext 函数传递新的驱动程序句柄和核心层句柄,以创建每个延迟的上下文。 每个延迟上下文的管道状态必须等效于直接上下文在对它执行清除状态操作后具有的管道状态。 驱动程序必须填充 D3D11DDIARG_CREATEDEFERREDCONTEXT 结构的 p11ContextFuncs 成员指向 的 D3D11DDI_DEVICEFUNCS 结构的成员,以及其函数表中的一部分函数;运行时使用每个相应的延迟上下文D3D10DDI_HDEVICE处理 D3D11DDIARG_CREATEDEFERREDCONTEXT 的 hDrvContext 成员使用此函数表指定的值。

驱动程序必须继续为延迟上下文提供以 pfnCreatepfnOpenpfnDestroy 开头的函数。 这些函数与延迟上下文的其余部分共享相同的线程语义,它们用于打开和关闭上下文本地 DDI 句柄,如 使用 Context-Local DDI 句柄中所述。 以 pfnCalcPrivatepfnCheck 开头的函数不用于延迟上下文;因此,在创建延迟上下文时,驱动程序可以将这些函数 的 D3D11DDI_DEVICEFUNCS 成员设置为 NULL 。 其余大部分设备函数都用于延迟上下文支持。 不过,驱动程序不会利用其 QueryGetData 函数。 但是,驱动程序会利用其 ResourceMapResourceUnmap 函数。 驱动程序仅支持使用即时上下文句柄在直接上下文上使用 Direct3D 版本 11 资源固定的 ResourceIsStagingBusy 函数和新的 DDI 函数。 有关不用于延迟上下文的函数的完整列表,请参阅 排除延迟上下文的 DDI 函数

驱动程序利用D3D11DDIARG_CREATEDEFERREDCONTEXT p11UMCallbacks成员指向的 内存块中提供的核心层回调函数。 这些核心层回调函数为每个延迟上下文提供刷新状态 DDI。 但最重要的是,添加了从 Direct3D 10 更改中所述的 pfnPerformAmortizedProcessingCb 回调函数。

驱动程序不应期望 pfnDisableDeferredStagingResourceDestruction 成员D3D11DDI_CORELAYER_DEVICECALLBACKS指向的 pfnDisableDeferredStagingResourceDestruction 回调函数有效。 驱动程序应在 CreateDevice (D3D10) 函数中调用 pfnDisableDeferredStagingResourceDestruction,用于设备/即时上下文;之后,驱动程序不应使用新的 Direct3D 版本 11 DDI 语义调用 pfnDisableDeferredStagingResourceDestruction

驱动程序的 RecycleCreateDeferredContext 函数必须清除延迟上下文的管道状态,类似于驱动程序的 CreateDeferredContext 清除延迟上下文的管道状态。 在运行时调用驱动程序的 AbandonCommandListCreateCommandListRecycleCreateCommandList 之后,运行时可以将延迟上下文句柄与驱动程序的 DestroyDevice (D3D10) RecycleCreateDeferredContext 函数一起使用。 有关 RecycleCreateDeferredContext 的详细信息,请参阅 小型命令列表的优化