_dcl-Schnittstelle (sm5 – asm)

Deklarieren von Funktionstabellenzeigern (Schnittstellen).

dcl _ interface fp # [ arraySize ] [ numCallSites ] = {ft , ft , # # ...}
Element BESCHREIBUNG
Fp#
[in ] Die Funktionstabellenzeiger.

Hinweise

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 abgeleitete Objekte.

Ein Funktionstabellenzeiger verfügt über einen vollständigen Satz von Methodenslots, um die zusätzliche Dekonstruktionsebene zu vermeiden, die eine C++-Zeiger-zu-Zeiger-zu-vtable-Darstellung erfordern würde. Dies würde auch erfordern, dass es sich bei diesen Zeigern um 5-Tupel handelt. 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.

Die 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 Eingabearray fp0 [ 4 ] [ 1 ] fp4 [ ] [ ] wäre.

Die zweite [ ] einer Schnittstellendeklaration ist die Anzahl der Aufrufstandorte, die mit der Anzahl der Körper in jeder Tabelle übereinstimmen müssen, auf die in der Deklaration verwiesen wird.

Es gibt keine Begrenzungen dafür, wie viele Funktionstabellenoptionen # (ft) in einer Schnittstellendeklaration aufgeführt werden können.

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

Beschränkungen

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

  • Die Anzahl der Aufrufsites in einem Shader, die die Summe aller Fcall-Anweisungen der Anzahl potenzieller Branchziele ist, darf nicht mehr als 4096 sein.

    Ein fcall-Wert, der einen statischen Index für die erste [ ] [ ] fp-Dimension verwendet, zählt beispielsweise als eins:

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

    Ein Fcall, der einen dynamischen Index verwendet, zählt als Anzahl der Elemente im Array (erste [ ] der _ dcl-Schnittstelle):

    dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...

    fcall fp1[r0.z + 0][1] // +2

    Dieser Grenzwert hilft einigen Implementierungen, Tabellen der Funktionstextauswahl im konstanten pufferähnlichen Speicher einfach anzupassen.

Diese Anweisung gilt für die folgenden Shaderstufen:

Scheitelpunkt Rumpf Domain Geometrie Pixel Compute
X X X X X X

Shader-Mindestmodell

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.

Shadermodell 5-Assembly (DirectX HLSL)