dcl_interface_dynamicindexed (sm5 – asm)
Declarar ponteiros de tabela de funções (interfaces).
dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...} |
---|
Item | Descrição |
---|---|
Fp # |
[in] Os ponteiros da tabela de funções. |
Comentários
Cada interface precisa ser associada da API antes que o sombreador seja utilizável. A associação fornece uma referência a uma das tabelas de função para que os slots de método possam ser preenchidos. O compilador não gerará ponteiros para objetos não referenciados.
Um ponteiro de tabela de funções tem um conjunto completo de slots de método para evitar o nível extra de indireção que uma representação de ponteiro para ponteiro para vtable do C++ exigiria. Isso também exigiria que esses ponteiros fossem de 5 tuplas. No modelo de inlining virtual HLSL, sempre se sabe qual variável/entrada global é usada para uma chamada para que possamos configurar tabelas por objeto raiz.
Declarações de ponteiro de função indicam quais tabelas de funções são legais para usar com elas. Isso também permite a derivação de informações de correlação de método.
O primeiro [] de uma declaração de interface é o tamanho da matriz. Se a indexação dinâmica for usada, a declaração indicará isso, conforme mostrado. Uma matriz de ponteiros de interface também pode ser indexada estaticamente, não é necessário que matrizes de ponteiros de interface signifiquem indexação dinâmica.
A numeração de ponteiros de interface começa em 0 para a primeira declaração e, posteriormente, leva em conta o tamanho da matriz, portanto, o primeiro ponteiro após uma matriz de quatro entradas fp0[4][1] seria fp4[][].
O segundo [] de uma declaração de interface é o número de sites de chamada, que devem corresponder ao número de corpos em cada tabela referenciada na declaração.
Não há limites para quantas opções de tabela de funções (ft#) podem ser listadas em uma declaração de interface.
Uma determinada tabela de funções (ft#) pode aparecer mais de uma vez em uma ou mais declarações de interface.
Restrições
O número de sites de objeto em um sombreador, que é a soma em todas as declarações fp# de suas declarações [arraySize], não deve ser superior a 253. Esse número corresponde a quantos ponteiros podem estar presentes. O runtime impõe esse limite de 253 para manter um limite no tamanho da DDI para comunicar esses dados de ponteiro.
O número de sites de chamada em um sombreador, que é a soma em todas as instruções fcall do número de destinos de branch potenciais, não deve ser superior a 4096.
Por exemplo, uma fcall que usa um índice estático para a primeira dimensão fp[][] conta como uma:
fcall fp0[0][0] // +1
Uma fcall que usa uma contagem de índice dinâmico como o número de elementos na matriz (primeiro [] de dcl_interface):
dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...
fcall fp1[r0.z + 0][1] // +2
Esse limite ajuda algumas implementações a se ajustarem facilmente a tabelas de seleções do corpo da função no armazenamento constante semelhante ao buffer.
Esta instrução se aplica aos seguintes estágios de sombreador:
Vértice | Casco | Domínio | Geometry | Pixel | Computação |
---|---|---|---|---|---|
X | X | X | X | X | X |
Modelo de sombreador mínimo
Esta instrução tem suporte nos seguintes modelos de sombreador:
Modelo de Sombreador | Com suporte |
---|---|
Modelo de sombreador 5 | sim |
Modelo de sombreador 4.1 | não |
Modelo de sombreador 4 | não |
Modelo de sombreador 3 (DirectX HLSL) | não |
Modelo de sombreador 2 (DirectX HLSL) | não |
Modelo de sombreador 1 (DirectX HLSL) | não |
cs_4_0 e cs_4_1 dão suporte a esta instrução para UAV e SRV.