Como configurar e preencher heaps de descritores

Os tipos de heap do 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).

Definindo 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 do descritor atual. O estado da tabela do descritor é indefinido no início de uma lista de comandos e depois que os heaps de 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 definindo 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 chamar o pacote; caso contrário, o comportamento é indefinido. Isso permite que os pacotes herdem e editem as configurações da tabela 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 local para outro.

O conteúdo inicial da memória de heap do descritor é indefinido, portanto, pedir à GPU ou driver que faça 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 (incluindo entre heaps) de maneira imediata e livre. Se o heap tiver sido configurado como SHADER_VISIBLE, a leitura pela CPU não será permitida.

Heaps de descritores