ID3D11Device1::CreateDeviceContextState 方法 (d3d11_1.h)
创建包含所有 Microsoft Direct3D 状态和某些 Direct3D 行为的上下文状态对象。
语法
HRESULT CreateDeviceContextState(
UINT Flags,
[in] const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
REFIID EmulatedInterface,
[out, optional] D3D_FEATURE_LEVEL *pChosenFeatureLevel,
[out, optional] ID3DDeviceContextState **ppContextState
);
参数
Flags
类型: UINT
D3D11_1_CREATE_DEVICE_CONTEXT_STATE_FLAG值的组合,这些值通过使用按位 OR 运算进行组合。 生成的值指定如何创建上下文状态对象。 D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED标志是目前唯一定义的标志。 如果原始设备是使用 D3D11_CREATE_DEVICE_SINGLETHREADED 创建的,则必须使用 D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED 标志从该设备创建所有上下文状态对象。
如果同时为上下文状态对象和设备设置单线程标志,可以保证仅从一个线程调用整个上下文方法和设备方法集。 因此,无需使用关键部分来同步对设备上下文的访问,运行时可以避免使用那些处理器密集型关键部分。
[in] pFeatureLevels
类型: const D3D_FEATURE_LEVEL*
指向 D3D_FEATURE_LEVEL 值的数组的指针。 数组可以包含以下列表中的元素,并确定尝试创建的功能级别的顺序。 与 D3D11CreateDevice 不同,无法将 pFeatureLevels 设置为 NULL ,因为没有默认的功能级别数组。
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1,
};
FeatureLevels
类型: UINT
pFeatureLevels 中的元素数。 与 D3D11CreateDevice 不同,必须将 FeatureLevels 设置为大于 0,因为无法将 pFeatureLevels 设置为 NULL。
SDKVersion
类型: UINT
SDK 版本。 必须将此参数设置为 D3D11_SDK_VERSION。
EmulatedInterface
类型: REFIID
模拟接口的全局唯一标识符 (GUID) 。 此值指定上下文状态对象处于活动状态时设备的行为。 使用 ID3D10Device、ID3D10Device1、ID3D11Device 和 ID3D11Device1 接口上的 __uuidof 运算符获取有效值。 请参阅“备注”。
[out, optional] pChosenFeatureLevel
类型: D3D_FEATURE_LEVEL*
指向从 pFeatureLevels 数组接收D3D_FEATURE_LEVEL值的变量的指针。 这是 CreateDeviceContextState 成功创建上下文状态对象的第一个数组值。 如果对 CreateDeviceContextState 的 调用失败, 则 pChosenFeatureLevel 指向的变量设置为零。
[out, optional] ppContextState
类型: ID3DDeviceContextState**
指向 表示 Direct3D 设备状态的 ID3DDeviceContextState 对象的指针的地址。
返回值
类型: HRESULT
此方法返回 Direct3D 11 返回代码之一。
注解
模拟接口的 REFIID 值是使用 __uuidof 运算符获取的 GUID。 例如, __uuidof(ID3D11Device)
获取 Microsoft Direct3D 11 设备的接口的 GUID。
调用 ID3D11DeviceContext1::SwapDeviceContextState 方法来激活上下文状态对象。 当上下文状态对象处于活动状态时,与上下文状态对象的功能级别及其兼容接口关联的设备行为在 Direct3D 设备上激活,直到下一次调用 SwapDeviceContextState。
当上下文状态对象处于活动状态时,运行时会禁用设备和上下文接口上的某些方法。 例如,使用 __uuidof(ID3D11Device)
创建的上下文状态对象将导致运行时关闭大多数 Microsoft Direct3D 10 设备接口,以及使用 __uuidof(ID3D10Device1)
或 __uuidof(ID3D10Device)
将导致运行时关闭大多数 ID3D11DeviceContext 方法的上下文状态对象。
此行为可确保其中一个模拟接口的用户无法设置另一个模拟接口无法表达的设备状态。 此限制有助于保证 ID3D10Device1 模拟接口准确反映管道的完整状态,并且模拟接口不会与其原始接口定义相反。
例如,假设通过 D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain(而不是 Direct3D 10 等效项)创建设备时,通过 ID3D11DeviceContext 接口使分割阶段处于活动状态。 由于 Direct3D 11 上下文处于活动状态,因此首次通过 QueryInterface 检索 Direct3D 10 接口时处于非活动状态。 这意味着无法立即将从 Direct3D 11 设备检索到的 Direct3D 10 接口传递到函数。 必须先调用 SwapDeviceContextState 才能激活与 Direct3D 10 兼容的上下文状态对象。
下表显示了每个模拟接口处于活动状态和非活动的方法。
模拟接口 | 活动设备或即时上下文接口 | 非活动设备或即时上下文接口 |
---|---|---|
ID3D10Device | ||
ID3D11DeviceContext (由即时上下文发布。Direct3D 10 或 Microsoft Direct3D 10.1 模拟接口对延迟上下文没有影响。) |
下表显示了当指示的上下文状态对象处于活动状态时运行时禁用的即时上下文方法。
当 或 __uuidof(ID3D10Device) 处于活动状态时 __uuidof(ID3D10Device1) ID3D11DeviceContext 的方法 |
处于活动状态时 __uuidof(ID3D11Device) ID3D10Device 的方法 |
---|---|
GetType |
|
IAGetVertexBuffers | |
IASetIndexBuffer | |
IASetInputLayout | |
IASetPrimitiveTopology | |
IASetVertexBuffers | |
下表显示了指示的上下文状态对象处于活动状态时运行时不禁用的即时上下文方法。
当 或 __uuidof(ID3D10Device) 处于活动状态时 __uuidof(ID3D10Device1) ID3D11DeviceContext 的方法 |
处于活动状态时 __uuidof(ID3D11Device) ID3D10Device 的方法 |
---|---|
下表显示了运行时不禁用的 ID3D10Device 接口方法,因为它们不是即时上下文方法。
ID3D10Device 的方法 |
---|
Create*,如 CreateQuery |
Windows Phone 8:支持此 API。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 适用于 Windows 7 的Windows 8和平台更新 [桌面应用 |UWP 应用] |
最低受支持的服务器 | 适用于 Windows Server 2008 R2 的Windows Server 2012和平台更新 [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | d3d11_1.h |
Library | D3D11.lib |