Freigeben über


Einschränkungen der Ablaufsteuerung

Anweisungen zur Pixelshaderflusssteuerung haben Beschränkungen, die sich darauf auswirken, wie viele Schachtelungsebenen in die Anweisungen aufgenommen werden können. Darüber hinaus gibt es einige Einschränkungen für die Implementierung der Flusssteuerung pro Pixel mit Farbverlaufsanweisungen.

Anmerkung

Wenn Sie die HLSL-Shaderprofile *_4_0_level_9_x verwenden, verwenden Sie implizit die Shadermodell 2.x Profile, um Direct3D 9-fähige Hardware zu unterstützen. Shadermodell 2.x-Profile unterstützen ein eingeschränktes Ablaufsteuerungsverhalten als das Shadermodell 4.x und neuere Profile.

 

Tiefenanzahl der Pixelshader-Anweisung

ps_2_0 unterstützt keine Ablaufsteuerung. Die Einschränkungen für die anderen Pixelshaderversionen sind unten aufgeführt.

Anzahl der Anweisungstiefe für ps_2_x

Jede Anweisung zählt für mindestens ein Schachtelungstiefelimit. In der folgenden Tabelle ist die Tiefenanzahl aufgeführt, die jede Anweisung der vorhandenen Tiefe hinzufügt oder subtrahiert.

Anweisung Statische Schachtelung Dynamische Schachtelung Schleifen-/Rep-Schachtelung Anrufschachtelung
wenn bool - ps 1 0 0 0
if_comp - ps 0 1 0 0
, falls vorhanden - ps 0 1 0 0
sonst - ps 0 0 0 0
Endif - ps -1(wenn bool - ps) -1(, wenn vor - ps oder if_comp - ps) 0 0
Rep - ps 0 0 1 0
Endrep - ps 0 0 -1 0
Pause - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
Breakp - ps 0 0 0 0
Anruf - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
Ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Schachtelungstiefe

Die Schachtelungstiefe definiert die Anzahl der Anweisungen, die von innen heraus aufgerufen werden können. Jeder Anweisungstyp weist eine oder mehrere Schachtelungsgrenzwerte auf, wie in der folgenden Tabelle angegeben.

Anweisungstyp Maximum
Statische Schachtelung 24 if (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); 0 andernfalls
Dynamische Schachtelung 0 bis 24, siehe D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth
Rep nesting 0 bis 4, siehe D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth
Anrufschachtelung 0 bis 4, siehe D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (unabhängig von rep limit)

 

Anzahl der Anweisungstiefe für ps_2_sw

Jede Anweisung zählt für mindestens ein Schachtelungstiefelimit. Diese Tabelle zeigt die Tiefenanzahl, die jede Anweisung der vorhandenen Tiefe hinzufügt oder subtrahiert.

Anweisung Statische Schachtelung Dynamische Schachtelung Schleifen-/Rep-Schachtelung Anrufschachtelung
wenn bool - ps 1 0 0 0
, falls vorhanden - ps 0 1 0 0
if_comp - ps 0 1 0 0
sonst - ps 0 0 0 0
Endif - ps -1(wenn bool - ps) -1(, wenn vor - ps oder if_comp - ps) 0 0
Rep - ps 0 0 1 0
Endrep - ps 0 0 -1 0
Schleife - ps n/a n/a n/a n/a
Endloop - ps n/a n/a n/a n/a
Pause - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
Breakp - ps 0 0 0 0
Anruf - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
Ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Schachtelungstiefe

Die Schachtelungstiefe definiert die Anzahl der Anweisungen, die von innen heraus aufgerufen werden können. Jeder Anweisungstyp weist eine oder mehrere Schachtelungsgrenzwerte auf, wie in der folgenden Tabelle angegeben.

Anweisungstyp Maximum
Statische Schachtelung 24
Dynamische Schachtelung 24
Rep nesting 4
Anrufschachtelung 4

 

Anzahl der Anweisungstiefe für ps_3_0

Jede Anweisung zählt für mindestens ein Schachtelungstiefelimit. Diese Tabelle zeigt die Tiefenanzahl, die jede Anweisung der vorhandenen Tiefe hinzufügt oder subtrahiert.

Anweisung Statische Schachtelung Dynamische Schachtelung Schleifen-/Rep-Schachtelung Anrufschachtelung
wenn bool - ps 1 0 0 0
, falls vorhanden - ps 0 1 0 0
if_comp - ps 0 1 0 0
sonst - ps 0 0 0 0
Endif - ps -1(wenn bool - ps) -1(, wenn vor - ps oder if_comp - ps) 0 0
Rep - ps 0 0 1 0
Endrep - ps 0 0 -1 0
Schleife - ps 0 0 1 0
Endloop - ps 0 0 -1 0
Pause - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
Breakp - ps 0 0 0 0
Anruf - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
Ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Schachtelungstiefe

Die Schachtelungstiefe definiert die Anzahl der Anweisungen, die von innen heraus aufgerufen werden können. Jeder Anweisungstyp weist eine oder mehrere Schachtelungsgrenzwerte auf, wie in der folgenden Tabelle angegeben.

Anweisungstyp Maximum
Statische Schachtelung 24
Dynamische Schachtelung 24
Schleifen-/Rep-Schachtelung 4
Anrufschachtelung 4

 

Anzahl der Anweisungstiefe für ps_3_sw

Jede Anweisung zählt für mindestens ein Schachtelungstiefelimit. Diese Tabelle zeigt die Tiefenanzahl, die jede Anweisung der vorhandenen Tiefe hinzufügt oder subtrahiert.

Anweisung Statische Schachtelung Dynamische Schachtelung Schleifen-/Rep-Schachtelung Anrufschachtelung
wenn bool - ps 1 0 0 0
, falls vorhanden - ps 0 1 0 0
if_comp - ps 0 1 0 0
sonst - ps 0 0 0 0
Endif - ps -1(wenn bool - ps) -1(, wenn vor - ps oder if_comp - ps) 0 0
Rep - ps 0 0 1 0
Endrep - ps 0 0 -1 0
Schleife - ps 0 0 1 0
Endloop - ps 0 0 -1 0
Pause - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
Breakp - ps 0 0 0 0
Anruf - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
Ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Schachtelungstiefe

Die Schachtelungstiefe definiert die Anzahl der Anweisungen, die von innen heraus aufgerufen werden können. Jeder Anweisungstyp weist eine oder mehrere Schachtelungsgrenzwerte auf, wie in der folgenden Tabelle angegeben.

Anweisungstyp Maximum
Statische Schachtelung 24
Dynamische Schachtelung 24
Schleifen-/Rep-Schachtelung 4
Anrufschachtelung 4

 

Interaktion von Per-Pixel Flusssteuerung mit Bildschirmverläufen

Der Pixelshader-Anweisungssatz enthält mehrere Anweisungen, die Farbverläufe von Mengen im Hinblick auf den Bildschirmbereich x und y erzeugen oder verwenden. Die häufigste Verwendung für Farbverläufe besteht darin, Detailberechnungen für texturbasierte Samplings zu berechnen und bei anisotropischer Filterung Proben entlang der Achse der Anisotropie auszuwählen. In der Regel führen Hardwareimplementierungen den Pixelshader auf mehreren Pixeln gleichzeitig (z. B. ein 2x2-Raster) aus, sodass Farbverläufe von Mengen, die im Shader berechnet werden, als Deltas der Werte an demselben Ausführungspunkt in benachbarten Pixeln ungefährt werden können.

Wenn die Flusssteuerung in einem Shader vorhanden ist, ist das Ergebnis einer in einem bestimmten Verzweigungspfad angeforderten Farbverlaufsberechnung mehrdeutig, wenn angrenzende Pixel separate Flusssteuerungspfade ausführen können. Daher gilt es als illegal, einen Pixelshadervorgang zu verwenden, der eine Farbverlaufsberechnung an einer Stelle anfordert, die sich in einem Flusssteuerelementkonstrukt befindet, das für einen bestimmten Grundtyp, der gerastert wird, über Pixel variieren kann.

Alle Pixelshaderanweisungen werden in diejenigen Vorgänge unterteilt, die zulässig sind, und in diejenigen, die nicht innerhalb der Flusssteuerung zulässig sind:

  • Szenario A: Vorgänge, die nicht innerhalb der Flusssteuerung zulässig sind, die in den Pixeln eines Grundtyps variieren können. Dazu gehören die in der folgenden Tabelle aufgeführten Vorgänge.

    Anweisung Ist in der Ablaufsteuerung zulässig, wenn:
    texld - ps_2_0 und up, texldb - ps und texldp - ps Für die Texturkoordinate wird ein temporäres Register verwendet.
    dsx - ps und dsy - ps Für den Operanden wird ein temporäres Register verwendet.

     

  • Szenario B: Vorgänge, die überall zulässig sind. Dazu gehören die in der folgenden Tabelle aufgeführten Vorgänge.

    Anweisung Ist überall zulässig, wenn:
    texld - ps_2_0 und up, texldb - ps und texldp - ps Eine schreibgeschützte Menge wird für die Texturkoordinate verwendet (kann pro Pixel variieren, z. B. interpolierte Texturkoordinaten).
    dsx - ps und dsy - ps Eine schreibgeschützte Menge wird für den Eingabeopernden verwendet (kann pro Pixel variieren, z. B. interpolierte Texturkoordinaten).
    texldl - ps Der Benutzer stellt ebene-of-detail als Argument bereit, daher gibt es keine Farbverläufe und somit kein Problem mit der Flusssteuerung.
    texldd - ps Der Benutzer stellt Farbverläufe als Eingabeargumente bereit, daher gibt es kein Problem mit der Flusssteuerung.

     

Diese Einschränkungen werden in der Shaderüberprüfung streng erzwungen. Szenarien mit einer Verzweigungsbedingung, die so aussieht, als würde sie konsistent über einen Grundtyp verzweigen, obwohl ein Operand im Bedingungsausdruck eine pixel-shader-berechnete Menge ist, dennoch in Szenario A fällt und nicht zulässig ist. In ähnlichen Szenarien, in denen Farbverläufe für einige von Shader berechnete Menge x aus der dynamischen Flusssteuerung angefordert werden, wobei es jedoch scheint, dass x in keiner der Verzweigungen geändert wird, dennoch in Szenario A fällt und nicht zulässig ist.

Die Prädierung ist in diesen Einschränkungen für die Ablaufsteuerung enthalten, sodass Implementierungen die Implementierung der Verzweigungsanweisungen mit prädizierten Anweisungen trivial austauschen können.

Der Benutzer kann Anweisungen aus szenarien A und B zusammen verwenden. Angenommen, der Benutzer benötigt ein anisotropisches Texturbeispiel mit einer berechneten Shader-Texturkoordinate; Die Texturlast wird jedoch nur benötigt, um Pixel zu erfüllen, die eine bestimmte Pixelbedingung erfüllen. Um diese Anforderungen zu erfüllen, kann der Benutzer die Texturkoordinate für alle Pixel, außerhalb pro Pixel variierender Flusssteuerung, sofort mit dsx - ps und dsy - ps Anweisungen berechnen. Wenn bool - ps /endif - ps Blockpro Pixel ist, kann der Benutzer texldd - ps (Texturlast mit vom Benutzer bereitgestellten Farbverläufen) verwenden und die vordefinierten Farbverläufe übergeben. Eine weitere Möglichkeit, dieses Verwendungsmuster zu beschreiben, besteht darin, dass, während alle Pixel im Grundtyp die Texturkoordinaten berechnen und mit der Farbverlaufsberechnung einbezogen werden mussten, nur die Pixel, die zum Beispiel einer Textur benötigt wurden.

Unabhängig von diesen Regeln ist die Belastung weiterhin für den Benutzer, um sicherzustellen, dass vor dem Berechnen eines Farbverlaufs (oder ausführen eines Texturbeispiels, das implizit einen Farbverlauf berechnet), das Register, das die Quelldaten enthält, für alle Ausführungspfade vorher initialisiert worden sein muss. Die Initialisierung temporärer Register wird im Allgemeinen nicht überprüft oder erzwungen.

-Pixelshaderanweisungen