ID3D11DeviceContext1::SwapDeviceContextState 方法 (d3d11_1.h)

激活给定的上下文状态对象,并将当前设备行为更改为 Direct3D 11、Direct3D 10.1 或 Direct3D 10。

语法

void SwapDeviceContextState(
  [in]            ID3DDeviceContextState *pState,
  [out, optional] ID3DDeviceContextState **ppPreviousState
);

参数

[in] pState

指向先前通过 ID3D11Device1::CreateDeviceContextState 方法创建的上下文状态对象的 ID3DDeviceContextState 接口的 指针。 如果在 pState 设置为 NULL 的情况下调用 SwapDeviceContextState,则调用不起作用。

[out, optional] ppPreviousState

指向变量的指针,该变量接收指向以前激活的上下文状态对象的 ID3DDeviceContextState 接口的指针。

返回值

备注

SwapDeviceContextState 更改设备行为。 此设备行为取决于在创建上下文状态对象时传递给 ID3D11Device1::CreateDeviceContextState 方法的 EmulatedInterface 参数的模拟接口。

延迟上下文不支持 SwapDeviceContextState

SwapDeviceContextState 禁用不兼容的设备接口 ID3D10DeviceID3D10Device1ID3D11DeviceID3D11Device1。 当上下文状态对象处于活动状态时,运行时会禁用设备和上下文接口上的某些方法。 使用 __uuidof(ID3D11Device1)__uuidof(ID3D11Device) 关闭大多数 Direct3D 10 设备接口创建的上下文状态对象。 使用 __uuidof(ID3D10Device1)__uuidof(ID3D10Device) 关闭大多数 ID3D11DeviceContext 方法创建的上下文状态对象。 有关此行为的详细信息,请参阅 ID3D11Device1::CreateDeviceContextState

SwapDeviceContextState 激活 pState 指定的上下文状态对象。 这意味着,在下次调用 SwapDeviceContextState 之前,在 Direct3D 设备上激活与上下文状态对象的功能级别和兼容接口关联的设备行为。 此外,此上下文状态对象上次处于活动状态时保存的任何状态现在将重新激活,以便替换以前的状态。

SwapDeviceContextStateppPreviousState 设置为最近激活的上下文状态对象。 对象允许调用方保存,然后还原以前的设备状态。 此行为在与 Direct3D 设备与其插件共享的插件体系结构(例如 Direct2D)中很有用。Direct2D 接口可以使用上下文状态对象来保存和还原应用程序的状态。

如果调用方之前未调用 ID3D11Device1::CreateDeviceContextState 方法来创建以前的上下文状态对象, 则 SwapDeviceContextState 会将 ppPreviousState 设置为默认上下文状态对象。 在任一情况下, SwapDeviceContextState 的用法都是相同的。

由应用程序指定的功能级别,由上下文状态对象从应用程序提供给 ID3D11Device1::CreateDeviceContextState 的可接受列表中选择的功能级别,每当上下文状态对象处于活动状态时,控制即时上下文的功能级别。 由于 Direct3D 11 设备是自由线程设备,因此设备方法无法查询当前的即时上下文功能级别。 相反,设备在功能级别上运行,该功能级别是以前创建的所有上下文状态对象功能级别的最大级别。 这意味着设备的功能级别可以动态增加。

上下文状态对象的功能级别控制从直接上下文中可用的功能。 但是,为了维护 Direct3D 11 设备方法(尤其是资源创建方法)的自由线程协定,所有创建的上下文状态对象的上限功能级别控制设备创建的资源集。

由于上下文状态对象接口由即时上下文发布,因此接口需要与直接上下文相同的线程模型。 具体而言, SwapDeviceContextState 对于其他直接上下文方法和 ID3D10Device 的等效方法是单线程的。

至关重要的是,由于一次只能使用一种 Direct3D 10 或 Direct3D 11 引用计数行为,因此其中一个 Direct3D 10 和 Direct3D 11 接口必须破坏其引用计数协定。 为了避免这种情况,上下文状态对象的激活会关闭不兼容的版本接口。 此外,如果调用版本接口不兼容的方法,如果该方法具有返回类型 void、返回E_INVALIDARG HRESULT 值或将任何 out 参数设置为 NULL,则调用会以无提示方式失败。

从 Direct3D 11 模式切换到 Direct3D 10 模式或 Direct3D 10.1 模式时,设备的绑定行为会更改。 具体而言,资源的最终版本会导致在 Direct3D 10 模式或 Direct3D 10.1 模式下解除绑定。 在最终发布期间,应用程序会释放资源的所有引用,包括间接引用,例如从视图到资源的链接,以及从上下文状态对象到上下文状态对象的任何绑定资源的链接。 应用程序没有引用的任何绑定资源将被取消绑定并销毁,以保持 Direct3D 10 行为。

SwapDeviceContextState 不会影响 ID3D11VideoContext 设置的任何状态。

由延迟上下文生成的命令列表不保存对上下文状态对象的引用,并且不受上下文状态对象的未来更新的影响。

SwapDeviceContextState 不会影响任何异步对象。 例如,如果在调用 SwapDeviceContextState 之前查询处于活动状态,则查询在调用后仍处于活动状态。

要求

   
最低受支持的客户端 适用于 Windows 7 的 Windows 8 和平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2012 和适用于 Windows Server 2008 R2 的平台更新 [桌面应用 |UWP 应用]
目标平台 Windows
标头 d3d11_1.h
Library D3D11.lib

另请参阅

ID3D11DeviceContext1