建立內容狀態物件,此物件會保存所有 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
使用位 OR 運算結合D3D11_1_CREATE_DEVICE_CONTEXT_STATE_FLAG值的組合。 產生的值會指定如何建立內容狀態物件。 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、ID3D11Device1、ID3D11Device 和 ID3D11Device1 介面上使用 __uuidof 運算符來取得有效值。 請參閱<備註>。
[out, optional] pChosenFeatureLevel
類型: D3D_FEATURE_LEVEL*
從 pFeatureLevels 陣列接收D3D_FEATURE_LEVEL值的變數指標。 這是 CreateDeviceContextState 成功建立內容狀態物件的第一個數位列值。 如果 CreateDeviceContextState 呼叫失敗, pChosenFeatureLevel 所指向的變數會設定為零。
[out, optional] ppContextState
類型: ID3DDeviceContextState**
ID3DDeviceContextState 物件的指標位址,代表 Direct3D 裝置的狀態。
傳回值
類型: 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 或 D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain 建立裝置時,會透過 ID3D11DeviceContext 介面啟用鑲嵌階段,而不是透過 Direct3D 10 對等專案。 由於 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 的方法 |
|---|---|
| IAGetVertexBuffers | |
| IASetIndexBuffer | |
| IASetInputLayout | |
| IASetPrimitiveTopology | |
| IASetVertexBuffers | |
下表顯示當指定的內容狀態物件為使用中時,運行時間不會停用的立即內容方法。
當 或 __uuidof(ID3D10Device) 為使用中時__uuidof(ID3D10Device1),ID3D11DeviceContext 的方法 |
使用中時 __uuidof(ID3D11Device)ID3D10Device 的方法 |
|---|---|
下表顯示運行時間不會停用的 ID3D10Device 介面方法,因為它們不是立即的內容方法。
| ID3D10Device 的方法 |
|---|
| 建立*,例如 CreateQuery |
Windows Phone 8:支援此 API。
規格需求
| 需求 | 值 |
|---|---|
| 最低支援的用戶端 | 適用於 Windows 7 的 Windows 8 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
| 最低支援的伺服器 | 適用於 Windows Server 2008 R2 的 Windows Server 2012 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
| 目標平台 | Windows |
| 標頭 | d3d11_1.h |
| 程式庫 | D3D11.lib |