Limites de assinaturas raiz
A assinatura raiz é um imóvel primo, e há limites e custos estritos a serem considerados.
Limites e custos de memória
O tamanho máximo de uma assinatura raiz é de 64 DWORDs.
Esse tamanho máximo é escolhido para evitar o abuso da assinatura raiz como uma forma de armazenar dados em massa. Cada entrada na assinatura raiz tem um custo para esse limite de 64 DWORD:
- As tabelas de descritor custam 1 DWORD cada.
- As constantes raiz custam 1 DWORD cada, pois são valores de 32 bits.
- Os descritores raiz (endereços virtuais de GPU de 64 bits) custam 2 DWORDs cada.
Exemplos estáticos não têm nenhum custo no tamanho da assinatura raiz.
Custos de desempenho
O custo de desempenho (em termos de níveis de indireção) é zero para uma constante raiz, 1 para um descritor raiz e 2 para uma tabela de descritor. Se uma assinatura raiz for grande e estourar da memória mais rápida em memória um pouco mais lenta (o que pode acontecer em algum hardware), adicione 1 ao custo de desempenho para os itens excedentes no final da assinatura raiz.
Pode ocorrer um estouro no hardware que pode ter, por exemplo, um tamanho fixo de 16 DWORDs para espaço de argumento raiz. Esse limite poderá ser reduzido ainda mais em um se o Assembler de Entrada for usado. Nesse caso, haverá estouro na memória ligeiramente mais lenta se a assinatura raiz for muito grande para a memória nativa de 15 ou 16 DWORD. Em outro hardware, não há memória de argumento raiz nativa fixa (portanto, a situação de estouro nunca ocorre).
Para todo o hardware, se qualquer argumento raiz for alterado, o driver deverá manter uma versão de todos os argumentos raiz (ao contrário de outros armazenamentos, como heaps de descritor e recursos de buffer, que não são versão do driver). No hardware em que ocorre uma situação de estouro, apenas a área nativa ou de estouro precisa ser versão, dependendo de onde a alteração ocorreu. Obviamente, a quantidade de controle de versão deve ser mantida no mínimo necessário.
Em geral, considere as seguintes diretrizes:
- Use uma assinatura raiz pequena conforme necessário, embora equilibre isso com a flexibilidade de uma assinatura raiz maior.
- Organize parâmetros em uma assinatura raiz grande para que os parâmetros mais propensos a serem alterados com frequência ou, se a baixa latência de acesso para um determinado parâmetro for importante, ocorram primeiro.
- Se for conveniente, use constantes raiz ou exibições de buffer constante raiz sobre a colocação de exibições constantes de buffer em um heap de descritor.
Exemplos estáticos
Exemplores estáticos (exemplores em que o estado é totalmente definido e imutável) fazem parte das assinaturas raiz, mas não contam para o limite de 64 DWORD. Se um sampler puder ser definido como estático, não será necessário que o sampler faça parte de um heap de descritor.
Não há nenhum custo de desempenho para usar exemplores estáticos, e uma assinatura raiz pode conter uma combinação de exemplores estáticos (armazenados na assinatura raiz ou em espaço reservado em algum hardware) e samplers dinâmicos (armazenados em um heap de descritor de amostra). Os samplers em um heap de descritor podem ser atribuídos e indexados dinamicamente, o que os exemplores estáticos não podem.
Exemplos estáticos podem ser gravados como parte da assinatura raiz em sombreadores HLSL (consulte Especificando assinaturas raiz no HLSL).
Tópicos relacionados