Como configurar e preencher heaps de descritores

Os tipos de heap de descritor que podem ser definidos em uma lista de comandos são aqueles que contêm descritores para os quais as tabelas de descritor podem ser usadas (no máximo uma de cada vez).

Configurando heaps de descritor

Os tipos de heap de descritor que podem ser definidos em uma lista de comandos são:

D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER

Os heaps que estão sendo definidos na lista de comandos também devem ter sido criados como sombreadores visíveis. Há três tipos de lista de comandos: DIRECT, BUNDLE e COMPUTE.

Depois que um heap de descritor é definido em uma lista de comandos, chamadas subsequentes que definem tabelas de descritor referem-se ao heap de descritor atual. O estado da tabela do descritor é indefinido no início de uma lista de comandos e depois que os heaps do descritor são alterados em uma lista de comandos. Definir com redundância o mesmo heap de descritor não faz com que as configurações da tabela do descritor sejam indefinidas.

Em um pacote, por outro lado, os heaps do descritor só podem ser definidos uma vez (chamadas redundantes configurando o mesmo heap duas vezes não produzem um erro); caso contrário, o comportamento é indefinido. Os heaps de descritor definidos devem corresponder ao estado quando qualquer lista de comandos chama o pacote; caso contrário, o comportamento é indefinido. Isso permite que os pacotes herdem e editem as configurações de tabela de descritor da lista de comandos. Os pacotes que não alteram tabelas de descritor (herdá-las somente) não precisam definir um heap de descritor e apenas herdarão da lista de comandos de chamada.

Quando os heaps de descritor são definidos (usando ID3D12GraphicsCommandList::SetDescriptorHeaps), todos os heaps que estão sendo usados são definidos em uma única chamada (e todos os heaps definidos anteriormente não são definidos pela chamada). No máximo, um heap de cada tipo listado acima pode ser definido na chamada.

Populando heaps de descritor

Depois que um aplicativo tiver criado um heap de descritor, ele poderá usar métodos no dispositivo para gerar descritores diretamente no heap ou copiar descritores de um lugar para outro.

O conteúdo inicial da memória de heap do descritor é indefinido, portanto, solicitar que a GPU ou o driver façam referência à memória não inicializada para renderização pode causar resultados indefinidos, como uma redefinição de dispositivo.

Se o aplicativo configurar um heap de descritor para ser visível para CPU, a CPU poderá chamar métodos para criar descritores no heap e copiar de um local para outro (inclusive entre heaps) de maneira imediata e gratuita. Se o heap tiver sido configurado como SHADER_VISIBLE, a leitura pela CPU não será permitida.

Heaps de descritores