較舊硬體的計算著色器
Direct3D 11 可讓您使用在大部分 Direct3D 10.x 硬體上運作的 計算著色器,但作業有一些限制。 計算著色器技術也稱為 DirectCompute 技術。 在 Direct3D 10 硬體上的 Direct3D 11 應用程式中,本主題討論如何使用 計算著色器。
對舊版硬體的計算著色器支援,僅限於與 Direct3D 10.x 相容的裝置。 計算著色器無法在 Direct3D 9.x 硬體上使用。
若要檢查 Direct3D 10.x 硬體是否支援計算著色器,請呼叫 ID3D11Device::CheckFeatureSupport。 在 CheckFeatureSupport 呼叫中,將 D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS 值傳遞至 Feature 參數,將 D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 結構指標傳遞至 pFeatureSupportData 參數,並將 D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 結構的大小傳遞至 FeatureSupportDataSize 參數。 如果 Direct3D 10.x 硬體支援計算著色器,CheckFeatureSupport 會在 D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONSComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x 成員中傳 回 true。
10Level9 參考 一節列出了各種 ID3D11Device 和 ID3D11DeviceContext 方法在不同 10Level9 功能層級上行為的差異。
未排序的存取檢視 (UAV)
在舊版硬體上支援 Raw(RWByteAddressBuffer)和 Structured(RWStructuredBuffer)非排序存取檢視,但有下列限制:
- 一次只能將單一 UAV 系結至管線,ID3D11DeviceContext::CSSetUnorderedAccessViews。
- 原始 UAV 的基準偏移需在256位元組界限上對齊(而不是 Direct3D 11 硬體所要求的16位元組對齊)。
舊型硬體不支援類型化的UAV。 這包括 Texture1D、Texture2D和 Texture3D UAV。
較低階硬體上的像素著色器不支援無序訪問。
著色器資源檢視【SRV】
舊版硬體支援原始和結構化緩衝區作為著色器資源檢視,以便進行唯讀存取,因為它們位於 Direct3D 11 硬體上。 頂點著色器、幾何著色器、圖元著色器以及計算著色器都支援這些資源類型。
線程群組
計算著色器可以在線程群組內的多個線程上平行執行。
下層硬體支援線程群組,但有下列限制:
線程群組維度
針對下層硬體定義的線程群組限制為 768 的 X 和 Y 維度。 這小於 Direct3D 11 硬體的 1024 最大值。 最大 Z 維度為 64 不變。
群組中的線程總數(X × Y × Z) 限制為 768。 這小於 Direct3D 11 硬體的 1024 限制。
如果超過這些數位,著色器編譯將會失敗。
Two-Dimensional 線程索引
線程群組中的特定線程會使用指定的 3D 向量來編製索引(x,y,z)。
對於在舊版硬體上運作的計算著色器,線程群組僅支援兩個維度。 這表示 3D 向量中的 Z 值必須一律為 1。
這項限制特別適用於下列各項:
- ID3D11DeviceContext::Dispatch— ThreadGroupCountZ 參數必須是 1。
- ID3D11DeviceContext::DispatchIndirect— 降級硬體不支援此函式。
- numthreads— Z 值必須是 1。
線程群組共享記憶體 (TGSM)
下層硬體上的線程群組共用記憶體限制為 16Kb。 這小於 Direct3D 11 硬體可用的 32Kb。
計算著色器線程只能寫入至自己的 TGSM 區域。 此僅限寫入區域的大小上限為 256 個字節或更少,且群組宣告的線程數目會隨著數目增加而減少。
下表針對群組中的線程數目,定義 TGSM 區域的每個線程大小上限:
群組中的線程數目 | 每個線程的 TGSM 大小上限 |
---|---|
0-64 | 256 |
65-68 | 240 |
69-72 | 224 |
73-76 | 208 |
77-84 | 192 |
85-92 | 176 |
93-100 | 160 |
101-112 | 144 |
113-128 | 128 |
129-144 | 112 |
145-168 | 96 |
169-204 | 80 |
205-256 | 64 |
257-340 | 48 |
341-512 | 32 |
513-768 | 16 |
計算著色器線程可能會從任何位置讀取 TGSM。
使用 D3DCOMPILE_SKIP_OPTIMIZATION 的 D3DCompile
當您將 cs_4_0 作為著色器目標並使用 D3DCOMPILE_SKIP_OPTIMIZATION 編譯選項時,D3DCompile 會返回 E_NOTIMPL。 cs_5_0著色器目標適用於 D3DCOMPILE_SKIP_OPTIMIZATION。
相關主題