Share via


dcl_interface_dynamicindexed (sm5 - asm)

Dichiarare i puntatori di tabella delle funzioni (interfacce).

dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...}
Elemento Descrizione
Fp #
[in] Puntatori alla tabella delle funzioni.

Commenti

Ogni interfaccia deve essere associata dall'API prima che lo shader sia utilizzabile. L'associazione fornisce un riferimento a una delle tabelle delle funzioni in modo che gli slot del metodo possano essere compilati. Il compilatore non genererà puntatori per gli oggetti senza riferimenti.

Un puntatore alla tabella delle funzioni ha un set completo di slot di metodo per evitare il livello aggiuntivo di riferimento indiretto richiesto da un puntatore a una rappresentazione da puntatore a vtable C++. Ciò richiederebbe anche che questi puntatori siano a 5 tuple. Nel modello di inlining virtuale HLSL è sempre noto quale variabile/input globale viene usato per una chiamata in modo da poter configurare le tabelle per ogni oggetto radice.

Le dichiarazioni del puntatore a funzione indicano quali tabelle delle funzioni sono legali da usare con esse. Ciò consente anche la derivazione delle informazioni di correlazione del metodo.

La prima [] di una dichiarazione di interfaccia è la dimensione della matrice. Se viene usata l'indicizzazione dinamica, la dichiarazione indicherà che come illustrato. Una matrice di puntatori di interfaccia può anche essere indicizzata in modo statico, non è necessario che le matrici di puntatori di interfaccia mediano l'indicizzazione dinamica.

La numerazione dei puntatori di interfaccia inizia da 0 per la prima dichiarazione e successivamente prende in considerazione le dimensioni della matrice, quindi il primo puntatore dopo una matrice di quattro voci fp0[4][1] sarebbe fp4[][].

Il secondo [] di una dichiarazione di interfaccia è il numero di siti di chiamata, che devono corrispondere al numero di corpi in ogni tabella a cui viene fatto riferimento nella dichiarazione.

Non esistono limiti al numero di scelte della tabella delle funzioni (ft#) elencate in una dichiarazione di interfaccia.

Una determinata tabella di funzioni (ft#) può essere visualizzata più volte in una o più dichiarazioni di interfaccia.

Restrizioni

  • Il numero di siti di oggetti in uno shader, ovvero la somma tra tutte le dichiarazioni fp# delle dichiarazioni [arraySize], non deve essere superiore a 253. Questo numero corrisponde al numero di puntatori che possono essere presenti. Il runtime applica questo limite di 253 per mantenere un limite alle dimensioni dell'DDI per la comunicazione di questi dati del puntatore.

  • Il numero di siti di chiamata in uno shader, ovvero la somma in tutte le istruzioni fcall del numero di destinazioni potenziali del ramo, non deve essere superiore a 4096.

    Ad esempio, una chiamata fcall che usa un indice statico per la prima dimensione fp[][] viene conteggiato come uno:

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

    Una chiamata fcall che usa un indice dinamico conta come numero di elementi nella matrice (prima [] di dcl_interface):

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

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

    Questo limite consente ad alcune implementazioni di adattarsi facilmente alle tabelle delle selezioni del corpo della funzione in una risorsa di archiviazione costante simile al buffer.

Questa istruzione si applica alle fasi dello shader seguenti:

Vertice Scafo Dominio Geometria Pixel Calcolo
X X X X X X

Modello minimo shader

Questa istruzione è supportata nei modelli di shader seguenti:

Modello di shader Supportato
Modello shader 5
Modello shader 4.1 no
Modello shader 4 no
Modello shader 3 (DirectX HLSL) no
Modello shader 2 (DirectX HLSL) no
Modello shader 1 (DirectX HLSL) no

cs_4_0 e cs_4_1 supportano questa istruzione per UAV e SRV.

Assembly modello shader 5 (DirectX HLSL)