Assinaturas raiz de exemplo
A seção a seguir mostra assinaturas raiz variando em complexidade de vazio a completamente cheio.
- Uma assinatura raiz vazia
- Uma constante
- Adicionando uma exibição de buffer constante raiz
- Tabelas de descritor de associação
- Uma assinatura raiz mais complexa
- Exibições de recursos do sombreador de streaming
- Tópicos relacionados
Uma assinatura raiz vazia
É improvável que uma assinatura raiz vazia seja útil, mas pode ser usada em uma passagem de renderização trivial com o uso apenas do assembler de entrada e sombreadores mínimos de vértice e pixel que não acessam nenhum descritor. Além disso, os estágios de mesclagem, destino de renderização e estêncil de profundidade estão disponíveis, mesmo com uma assinatura raiz vazia.
Uma constante
O slot de associação de API é onde o argumento raiz para esse parâmetro será associado no tempo de registro da lista de comandos. O número de slots de associação de API é implícito, com base na ordem dos parâmetros na assinatura raiz (o primeiro é sempre zero). O slot de associação HLSL é onde o sombreador verá o parâmetro raiz aparecer. O tipo ("uint" no exemplo acima) não é conhecido pelo hardware, mas é apenas um comentário na imagem, o hardware simplesmente verá o único DWORD como o conteúdo.
Para associar uma constante no tempo de registro da lista de comandos, um comando semelhante ao seguinte seria usado:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
Adicionando uma exibição de buffer constante raiz
Este exemplo mostra duas constantes raiz e uma CBV (Exibição de Buffer Constante) raiz que custa dois slots DWORD.
Para associar uma exibição de buffer constante, use um comando como o seguinte. Observe que o primeiro parâmetro (2) é o slot mostrado na imagem. Normalmente, uma matriz de constantes será configurada e disponibilizada para os sombreadores em b0 como cbv.
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
Tabelas de descritor de associação
Este exemplo mostra o uso de duas tabelas de descritor; um declarando uma tabela de cinco descritores que estarão disponíveis no momento da execução em um heap de descritor CBV_SRV_UAV e outro declarando uma tabela de dois descritores que aparecerão no momento da execução em um heap de descritor de sampler.
Para associar tabelas de descritor ao gravar uma lista de comandos.
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
Outro recurso da assinatura raiz é a constante raiz float4 que tem quatro DWORDS de tamanho. O comando a seguir associa apenas os dois DWORDS intermediários dos quatro.
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
Uma assinatura raiz mais complexa
Este exemplo mostra uma assinatura raiz densa com a maioria dos tipos de entradas. Duas das tabelas de descritor (nos slots 3 e 6) incluem matrizes de tamanho não associadas. A carga aqui está no aplicativo para tocar apenas em descritores válidos em um heap. Matrizes não associadas ou muito grandes exigem a camada de hardware 2+ do suporte à associação de recursos.
Há dois exemplores estáticos (associados sem a necessidade de slots de assinatura raiz).
No slot 9, UAV u4 e UAV u5 são declarados no mesmo deslocamento de tabela do descritor. Esse é o uso de um descritor de alias, um descritor na memória aparecerá como u4 e u5 nos sombreadores HLSL. Nesse caso, o sombreador deve ser compilado com a opção D3D10_SHADER_RESOURCES_MAY_ALIAS ou a opção ou /res_may_alias
no FXC. Os descritores aliased permitem que um descritor seja associado a vários pontos de associação, sem precisar fazer alterações nos sombreadores.
Exibições de recursos do sombreador de streaming
Essa assinatura raiz ilustra um cenário em que todas as SRVs são transmitidas dentro e fora de uma grande matriz. No momento da execução, uma tabela de descritor pode ser definida uma vez quando a assinatura raiz é definida. Em seguida, todas as leituras de textura são feitas pela indexação na matriz por meio de constantes alimentadas por meio dos primeiros argumentos raiz. Apenas um único heap de descritor é necessário e só é atualizado à medida que as texturas são transmitidas dentro ou fora de slots de descritor gratuitos.
Os deslocamentos do descritor no heap grande são identificados por sombreadores usando as constantes nas exibições de buffer constante. Por exemplo, se um sombreador receber uma ID de material, ele poderá indexar em uma matriz grande usando a constante para acessar o descritor necessário (que faz referência à textura necessária).
Esse cenário requer hardware com camada de associação de recursos2+.
Tópicos relacionados