Compute-Shader auf hardware-Downlevel

Direct3D 11 bietet die Möglichkeit, Compute-Shader zu verwenden, die auf der meisten Direct3D 10.x-Hardware funktionieren, mit einigen Einschränkungen für den Betrieb. Die Compute-Shadertechnologie wird auch als DirectCompute-Technologie bezeichnet. In diesem Thema wird erläutert, wie Sie Compute-Shader in einer Direct3D 11-App auf Direct3D 10-Hardware verwenden.

Die Unterstützung für Compute-Shader auf Hardware auf downlevel ist nur für Geräte vorgesehen, die mit Direct3D 10.x kompatibel sind. Compute-Shader können nicht auf Direct3D 9.x-Hardware verwendet werden.

Um zu überprüfen, ob Direct3D 10.x-Hardware Compute-Shader unterstützt, rufen Sie ID3D11Device::CheckFeatureSupport auf. Übergeben Sie im CheckFeatureSupport-Aufruf den wert D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS an den Featureparameter , übergeben Sie einen Zeiger auf die D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS-Struktur an den pFeatureSupportData-Parameter , und übergeben Sie die Größe der D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS-Struktur an den FeatureSupportDataSize-Parameter . CheckFeatureSupport gibt TRUE im ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x Member von D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS zurück, wenn die Direct3D 10.x-Hardware Compute-Shader unterstützt.

Im Abschnitt 10Level9-Referenz werden die Unterschiede zwischen den verschiedenen Methoden ID3D11Device und ID3D11DeviceContext auf verschiedenen Featureebenen von 10Level9 aufgeführt.

Ungeordnete Zugriffsansichten (UAVs)

Raw (RWByteAddressBuffer) und Structured (RWStructuredBuffer) Unordered Access Views werden auf Hardware auf downlevel-Hardware mit den folgenden Einschränkungen unterstützt:

  • Nur ein einzelnes UAV kann über ID3D11DeviceContext::CSSetUnorderedAccessViews gleichzeitig an eine Pipeline gebunden sein.
  • Der Basisoffset für ein Raw-UAV muss an einer 256-Byte-Grenze ausgerichtet werden (anstelle der für Direct3D 11-Hardware erforderlichen Ausrichtung von 16 Byte).

Typisierte UAVs werden auf Hardware auf Downlevel nicht unterstützt. Dies umfasst Texture1D-, Texture2D- und Texture3D-UAVs .

Pixel-Shader auf heruntergefahrener Hardware unterstützen keinen ungeordneten Zugriff.

Shaderressourcenansichten (SRVs)

Rohe und strukturierte Puffer als Shaderressourcensichten werden auf Hardware mit Downlevel für schreibgeschützten Zugriff unterstützt, wie auf Direct3D 11-Hardware. Diese Ressourcentypen werden für Vertex-Shader, Geometry-Shader, Pixel-Shader und Compute-Shader unterstützt.

Threadgruppen

Ein Compute-Shader kann in vielen Threads parallel innerhalb einer Threadgruppe ausgeführt werden.

Threadgruppen werden mit den folgenden Einschränkungen auf herunterstufiger Hardware unterstützt:

Threadgruppendimensionen

Threadgruppen, die für Hardware auf downlevel definiert sind, sind auf die X- und Y-Dimensionen 768 beschränkt. Dies ist kleiner als die Maximalwerte von 1024 für Direct3D 11-Hardware. Die maximale Z-Dimension von 64 bleibt unverändert.

Die Gesamtzahl der Threads in der Gruppe (X × Y × Z) ist auf 768 begrenzt. Dies ist weniger als der Grenzwert von 1024 für Direct3D 11-Hardware.

Wenn diese Zahlen überschritten werden, schlägt die Shaderkompilierung fehl.

Two-Dimensional Threadindizes

Ein bestimmter Thread innerhalb einer Threadgruppe wird mithilfe eines von (x,y,z) angegebenen 3D-Vektors indiziert.

Bei Compute-Shadern, die auf heruntergefahrener Hardware arbeiten, unterstützen Threadgruppen nur zwei Dimensionen. Das bedeutet, dass der Z-Wert im 3D-Vektor immer 1 sein muss.

Diese Einschränkung gilt insbesondere für Folgendes:

Freigegebener Threadgruppenspeicher (TGSM)

Der freigegebene Threadgruppenspeicher ist auf 16 KB für Hardware auf downlevel beschränkt. Dies ist weniger als die 32 KB, die für Direct3D 11-Hardware verfügbar sind.

Ein Compute-Shaderthread kann nur in seine eigene Region von TGSM schreiben. Dieser schreibgeschützte Bereich hat eine maximale Größe von 256 Bytes oder weniger, wobei das Maximum abnimmt, wenn die Anzahl der für die Gruppe deklarierten Threads zunimmt.

In der folgenden Tabelle wird die maximale Größe einer TGSM-Region pro Thread für die Anzahl der Threads in der Gruppe definiert:

Anzahl der Threads in der Gruppe Maximale TGSM-Größe pro Thread
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

 

Ein Compute-Shaderthread kann den TGSM von einem beliebigen Speicherort aus lesen.

D3DCompile with D3DCOMPILE_SKIP_OPTIMIZATION

D3DCompile gibt E_NOTIMPL zurück, wenn Sie cs_4_0 zusammen mit der Kompilierungsoption D3DCOMPILE_SKIP_OPTIMIZATION als Shaderziel übergeben. Das cs_5_0 Shaderziel funktioniert mit D3DCOMPILE_SKIP_OPTIMIZATION.

Direct3D 11 für Hardware auf Downlevel