dcl_interface_dynamicindexed (sm5 - asm)
Deklarieren Sie Funktionstabellenzeiger (Schnittstellen).
dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...} |
---|
Element | Beschreibung |
---|---|
Fp # |
[in] Die Funktionstabellenzeiger. |
Bemerkungen
Jede Schnittstelle muss von der API gebunden werden, bevor der Shader verwendet werden kann. Die Bindung gibt einen Verweis auf eine der Funktionstabellen, sodass die Methodenslots ausgefüllt werden können. Der Compiler generiert keine Zeiger für nicht referenzierte Objekte.
Ein Funktionstabellenzeiger verfügt über einen vollständigen Satz von Methodenslots, um die zusätzliche Indirektierungsebene zu vermeiden, die eine C++-Zeiger-auf-Table-Darstellung erfordern würde. Dies erfordert auch, dass dieser Zeiger 5-Tupel sein muss. Im virtuellen HLSL-Inliningmodell ist immer bekannt, welche globale Variable/Eingabe für einen Aufruf verwendet wird, sodass wir Tabellen pro Stammobjekt einrichten können.
Funktionszeigerdeklarationen geben an, welche Funktionstabellen mit ihnen verwendet werden dürfen. Dies ermöglicht auch die Ableitung von Methodenkorrelationsinformationen.
Der erste [] einer Schnittstellendeklaration ist die Arraygröße. Wenn die dynamische Indizierung verwendet wird, gibt die Deklaration dies wie gezeigt an. Ein Array von Schnittstellenzeigern kann auch statisch indiziert werden. Es ist nicht erforderlich, dass Arrays von Schnittstellenzeigern dynamische Indizierung bedeuten.
Die Nummerierung von Schnittstellenzeigern beginnt bei 0 für die erste Deklaration und berücksichtigt anschließend die Arraygröße, sodass der erste Zeiger nach einem fp0[4][1] fp4[][] wäre.
Die zweite [] einer Schnittstellendeklaration ist die Anzahl der Aufrufstandorte, die mit der Anzahl der Textkörper in jeder Tabelle übereinstimmen muss, auf die in der Deklaration verwiesen wird.
Es gibt keine Grenzen dafür, wie viele Optionen für Funktionstabellen (ft#) in einer Schnittstellendeklaration aufgeführt werden können.
Eine bestimmte Funktionstabelle (ft#) kann mehr als einmal in einer oder mehreren Schnittstellendeklarationen angezeigt werden.
Beschränkungen
Die Anzahl der Objektwebsites in einem Shader, also die Summe aller fp#- Deklarationen ihrer [arraySize]-Deklarationen, darf nicht mehr als 253 sein. Diese Zahl entspricht der Anzahl dieser Zeiger. Die Laufzeit erzwingt diesen Grenzwert von 253, um die Größe des DDI für die Kommunikation dieser Zeigerdaten zu begrenzen.
Die Anzahl der Aufrufwebsites in einem Shader, also die Summe aller fcall-Anweisungen der Anzahl potenzieller Branchziele, darf nicht mehr als 4096 sein.
Beispielsweise zählt ein fcall , der einen statischen Index für die erste fp[][][]- Dimension verwendet, als eine:
fcall fp0[0][0] // +1
Ein Aufruf , der einen dynamischen Index verwendet, zählt als Anzahl der Elemente im Array (erstes [] von dcl_interface):
dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...
fcall fp1[r0.z + 0][1] // +2
Dieser Grenzwert hilft einigen Implementierungen, Tabellen mit Funktionskörperauswahlen in konstanten pufferähnlichen Speicher einzufügen.
Diese Anweisung gilt für die folgenden Shaderphasen:
Scheitelpunkt | Hull | Domain | Geometrie | Pixel | Compute |
---|---|---|---|---|---|
X | X | X | X | X | X |
Minimales Shadermodell
Diese Anweisung wird in den folgenden Shadermodellen unterstützt:
Shadermodell | Unterstützt |
---|---|
Shadermodell 5 | ja |
Shadermodell 4.1 | Nein |
Shadermodell 4 | Nein |
Shadermodell 3 (DirectX HLSL) | Nein |
Shadermodell 2 (DirectX HLSL) | Nein |
Shadermodell 1 (DirectX HLSL) | Nein |
cs_4_0 und cs_4_1 unterstützen diese Anweisung für UAV und SRV.