Descriptor Heaps
Descriptor Heaps são um dos principais mecanismos de gerenciamento de recursos na API gráfica Direct3D 12. Eles representam arrays de descritores de recursos, simplificando e acelerando o acesso aos dados durante a renderização.
Conceitos Principais
No Direct3D 12, os descritores são usados para representar recursos como texturas, buffers e samplers. Um Descriptor Heap é uma área especial de memória que contém esses descritores, permitindo que a GPU acesse rapidamente os dados necessários.
Tipos de Descriptor Heaps
O Direct3D 12 fornece quatro tipos de Descriptor Heaps:
- CBV/SRV/UAV Heap – Armazena os seguintes descritores:
- CBV (Constant Buffer View) – Representa buffers constantes.
- SRV (Shader Resource View) – Representa recursos usados em shaders (como texturas e buffers estruturados).
- UAV (Unordered Access View) – Representa recursos que podem ser acessados em qualquer ordem (por exemplo, para cálculos em Compute Shader).
- Sampler Heap – Contém descritores de samplers, que controlam a filtragem e o endereçamento de texturas.
- RTV Heap (Render Target View) – Armazena descritores de render targets (RTVs), usados como buffers de saída de renderização.
- DSV Heap (Depth Stencil View) – Contém descritores para buffers de profundidade e stencil (DSVs), responsáveis por testes de profundidade e operações de stencil.
Criação e Uso de Descriptor Heaps
Para criar um Descriptor Heap, usa-se a estrutura D3D12_DESCRIPTOR_HEAP_DESC, onde são definidos os seguintes parâmetros:
- Tipo do Heap (Type – CBV_SRV_UAV, SAMPLER, RTV, DSV).
- Número de descritores (NumDescriptors).
- Flags (Flags – por exemplo, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, caso o heap deva estar acessível nos shaders).
- Máscara de nó (NodeMask) para sistemas com múltiplos adaptadores.
Exemplo de criação de um descriptor heap para RTV:
D3D12_DESCRIPTOR_HEAP_DESC renderTargetHeapDesc = {};
renderTargetHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
renderTargetHeapDesc.NumDescriptors = 1;
renderTargetHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
device->CreateDescriptorHeap(&renderTargetHeapDesc, IID_PPV_ARGS(&rtvHeap));
Gerenciamento de Descritores
Após criar um Descriptor Heap, é necessário alocar descritores para os recursos. Isso pode ser feito com device->Create...View, por exemplo:
device->CreateRenderTargetView(renderTarget, nullptr, rtvHeap->GetCPUDescriptorHandleForHeapStart());
Aqui, GetCPUDescriptorHandleForHeapStart() retorna um D3D12_CPU_DESCRIPTOR_HANDLE que aponta para o início do heap.
Se o heap for utilizado em shaders, ele deve ser configurado com SetDescriptorHeaps e vinculado às tabelas de descritores usando SetGraphicsRootDescriptorTable ou SetComputeRootDescriptorTable.
Conclusão
Os Descriptor Heaps desempenham um papel fundamental no gerenciamento de recursos no Direct3D 12, oferecendo um mecanismo flexível e eficiente para acessar dados. O uso adequado dos Descriptor Heaps pode melhorar significativamente o desempenho da GPU e otimizar a eficiência da renderização.