Compartilhar via


Heaps de descritor visível do sombreador

Heaps de descritor visível do sombreador são heaps de descritor que podem ser referenciados por sombreadores por meio de tabelas de descritor.

Visão geral

Os 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 ordenadas e exibições de buffer constante, tudo intermixado. 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 do hardware, os exemplodores são gerenciados separadamente de SRVs, UAVs, CBVs.

Os heaps de descritor desses tipos podem ser solicitados a ficar visíveis ou não quando o heap é criado (este último – não sombreador visível – pode ser útil para os descritores de preparo na CPU). Quando solicitado a ser visível para 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 sublocar 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 estejam 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 a alternância do heap do descritor atual possa 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 pausas 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 lista de comandos/gravação de pacote são descritos na referência da API.

Um exemplo

A imagem abaixo mostra dois heaps de descritor fazendo referência a 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 de gráficos (incluindo os sombreadores) e, portanto, a textura 2D está disponível para o pipeline.

heaps de descritor visíveis e não visíveis

Nota

Geralmente, há um limite no hardware de GPU da quantidade de memória local 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 descritor de um milhão de membros, com descritores de 32bytes, usaria até 32 MB, por exemplo. O driver recuará na memória do sistema se necessário, embora seja uma boa prática não criar um grande número de heaps de descritor grandes.

 

heaps de descritor