Heaps de descritores visíveis do sombreador
Heaps de descritor visíveis do sombreador são heaps de descritor que podem ser referenciados por sombreadores por meio de tabelas de descritor.
Visão geral
Heaps de descritor que podem ser referenciados por sombreadores por meio de tabelas de descritor vêm em alguns tipos: um tipo de heap, D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAP, pode conter exibições de recurso de sombreador, exibições de acesso não ordenado e exibições de buffer constante, todas intercaladas. Qualquer local determinado no heap pode ser qualquer um dos tipos listados de descritores. Outro tipo de heap, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, armazena apenas amostras, refletindo o fato de que, para a maioria dos hardwares, os samplers são gerenciados separadamente de SRVs, UAVs, CBVs.
Os heaps de descritor desses tipos podem ser solicitados a serem visíveis para sombreador ou não quando o heap é criado (o último – não sombreador visível – pode ser útil para descritores de preparo na CPU). Quando solicitado a ser visível para o sombreador, cada um dos tipos de heap acima pode ter um limite de tamanho de hardware para qualquer alocação de heap de descritor individual.
Os aplicativos podem criar qualquer número de heaps de descritor e heaps de descritor não visíveis de sombreador não são restritos em tamanho. Se um heap de descritor visível de sombreador criado pelo aplicativo for menor que o limite de tamanho de hardware, o driver poderá optar por subalocar o heap do descritor de um heap de descritor subjacente maior para que vários heaps de descritor de API se ajustem em um heap de descritor de hardware. O motivo pelo qual isso pode acontecer é que, para algum hardware, alternar entre heaps de descritor de hardware durante a execução requer uma espera de GPU por ociosidade (para garantir que as referências de GPU ao heap do descritor anteriormente sejam concluídas). Se todos os heaps de descritor que um aplicativo cria se ajustarem às capacidades máximas do heap de hardware aplicável, essas esperas não ocorrerão ao alternar heaps de descritor de API durante a renderização. Os aplicativos devem permitir a possibilidade, no entanto, de que alternar o heap do descritor atual pode incorrer em uma espera por ociosidade.
Para evitar ser afetado por essa possível espera por ociosidade no comutador de heap do descritor, os aplicativos podem aproveitar as quebras na renderização que fariam com que a GPU ociosa por outros motivos como o tempo para fazer comutadores de heap do descritor, já que uma espera por ociosidade está acontecendo de qualquer maneira.
O mecanismo e a semântica para identificar heaps de descritor para sombreadores durante a gravação de lista de comandos/pacote são descritos na referência da API.
Um exemplo
A imagem abaixo mostra dois heaps de descritor referenciando duas texturas 2D separadas sendo armazenadas em dois slots de um heap padrão grande. O heap do descritor visível pode ser acessado pelo pipeline gráfico (incluindo os sombreadores) e, portanto, a textura 2D está disponível para o pipeline.
Observação
Geralmente, há um limite no hardware de GPU da quantidade de memória local de GPU gravável pela CPU (conhecida como memória combinada de gravação) para heaps de descritor. Normalmente, esse limite é de cerca de 96 MB para todos os processos. Um heap de um milhão de descritores de membro, com descritores de 32bytes, usaria até 32 MB, por exemplo. O driver retornará à memória do sistema se necessário, embora seja uma boa prática não criar um grande número de heaps de descritores grandes.
Tópicos relacionados