Usando descritores diretamente na assinatura raiz

Para evitar a necessidade de passar por um heap de descritor, você pode colocar um descritor diretamente na assinatura raiz. Esses descritores ocuparão muito espaço na assinatura raiz (consulte Limites de assinatura raiz), portanto, recomendamos que você os use com moderação.

Um exemplo de uso seria colocar no layout raiz uma CBV (exibição de buffer constante) que está mudando por desenho. Isso é para que o espaço de heap do descritor não precise ser alocado pelo aplicativo por desenho (e salva apontando uma tabela de descritor no novo local no heap do descritor). Ao colocar algo na assinatura raiz, o aplicativo está apenas entregando a responsabilidade de controle de versão para o driver; mas essa é a infraestrutura que os drivers já têm.

Para renderização que usa extremamente poucos recursos, o uso da tabela/heap do descritor pode não ser necessário se todos os descritores necessários puderem ser colocados diretamente na assinatura raiz.

Esses são os únicos tipos de descritores com suporte na assinatura raiz.

  • CBVs (exibição de buffer constante).
  • SRVs (exibições de recurso de sombreador) /UAVs (exibições de acesso não ordenadas) de recursos de buffer em que a conversão de formato não é necessária (buffers não tipados). Alguns exemplos de buffers não tipado que podem ser associados a descritores raiz incluem StructuredBuffer<type>, RWStructuredBuffer<type>e ByteAddressBufferRWByteAddressBuffer. Buffers tipado, como Buffer<uint> e Buffer<float2> não podem.
  • SRVs de estruturas de aceleração de raytracing, em assinaturas raiz locais ou globais.

Um UAV na raiz não pode ter contadores associados a ele. Os descritores na assinatura raiz aparecem cada um como descritores separados individuais— eles não podem ser indexados dinamicamente.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

No exemplo acima, mySceneData não pode ser declarado como uma matriz, como em cbuffer mySceneData[2] se ele vai ser mapeado para um descritor na assinatura raiz. Isso ocorre porque não há suporte para indexação entre descritores na assinatura raiz. Se desejado, você pode definir buffers constantes individuais separados e defini-los cada um como uma entrada separada na assinatura raiz. Observe que, no mySceneData acima, há uma matriz bar[2]. A indexação dinâmica dentro do buffer constante é válida— um descritor na assinatura raiz se comporta exatamente como o mesmo descritor se comportaria se fosse acessado por meio de um heap de descritor. Isso contrasta com constantes embutidas diretamente na assinatura raiz, que também aparece como um buffer constante, exceto com a restrição de que a indexação dinâmica dentro das constantes embutidas não é permitida, portanto bar[2] , não seria permitido lá.

Essas APIs (da interface ID3D12GraphicsCommandList ) são para definir descritores diretamente na assinatura raiz.

Observação

Não há nenhum conceito de uma matriz de descritor raiz no Direct3D 12. As matrizes de descritor têm suporte apenas em heaps de descritor.