Freigeben über


dcl_interface (sm5 - asm)

Deklarieren Sie Funktionstabellenzeiger (Schnittstellen).

dcl_interface 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, damit 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 Dereferenzierungsebene zu vermeiden, die für eine C++-Zeiger-zu-V-Tabellendarstellung erforderlich wäre. Dies würde auch erfordern, dass diese Zeiger 5-Tupel sind. Im virtuellen HLSL-Inliningmodell ist immer bekannt, welche globale Variable/Eingabe für einen Aufruf verwendet wird, damit 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.

Das 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 vier Einstiegsarray fp0[4][1] fp4[][].

Der 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 für die Anzahl der Optionen für Funktionstabellen (ft#), die in einer Schnittstellendeklaration aufgeführt werden können.

Eine bestimmte Funktionstabelle (ft#) kann in einer oder mehreren Schnittstellendeklarationen mehrmals angezeigt werden.

Beschränkungen

  • Die Anzahl der Objektstandorte in einem Shader, die die Summe aller fp#- Deklarationen ihrer [arraySize]-Deklarationen darstellt, darf nicht mehr als 253 sein. Diese Zahl entspricht der Anzahl dieser Zeiger, die vorhanden sein können. Die Laufzeit erzwingt diesen Grenzwert von 253, um die Größe des DDI für die Kommunikation dieser Zeigerdaten zu begrenzen.

  • Die Anzahl der Aufrufstandorte in einem Shader, die die Summe aller fcall-Anweisungen der Anzahl potenzieller Branchziele darstellt, darf nicht mehr als 4096 sein.

    Beispielsweise zählt ein fcall,der einen statischen Index für die erste fp[][]]- Dimension verwendet:

    fcall fp0[0][0] // +1

    Ein fcall , der einen dynamischen Index verwendet, zählt als Anzahl von Elementen 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 dabei, Tabellen mit Funktionstextauswahlen in konstanten pufferähnlichen Speicher zu integrieren.

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.

Assembly des Shadermodells 5 (DirectX HLSL)