Partilhar via


Visão geral dos descritores

Os descritores são criados por chamadas de API e identificam recursos.

Dados do descritor

Um descritor é um bloco relativamente pequeno de dados que descreve completamente um objeto para a GPU, em um formato opaco específico da GPU. Existem vários tipos diferentes de descritores: visualizações de alvo de renderização (RTVs), visualizações de estêncil de profundidade (DSVs), visualizações de recursos de sombreador (SRVs), visualizações de acesso não ordenado (UAVs), visualizações de buffer constante (CBVs) e amostradores.

Os descritores variam em tamanho, dependendo do hardware da GPU. Você pode consultar o tamanho de um SRV, UAV ou CBV chamando ID3D12Device::GetDescriptorHandleIncrementSize. Os descritores são apresentados nesta documentação como unidades indivisíveis; Aqui está um exemplo.

Srv, CBV, UAV e amostrador

Os descritores são criados por chamadas de API e incluirão informações como o recurso e os mapas mip que você deseja que o descritor contenha.

O motorista não rastreia ou mantém referências a descritores, cabe ao aplicativo garantir que o tipo de descritor correto esteja em uso e que as informações estejam atualizadas. Há uma pequena exceção; o driver inspeciona as ligações de destino de renderização para garantir que as cadeias de permuta funcionem corretamente.

Os descritores de objetos não precisam ser liberados. Os drivers não atribuem nenhuma alocação à criação de um descritor. Um descritor pode, no entanto, codificar referências a outras alocações cuja duração a aplicação controla. Por exemplo, um descritor para um SRV deve conter o endereço virtual do recurso D3D (por exemplo, uma textura) ao qual o SRV se refere. É responsabilidade do aplicativo certificar-se de que ele não usa um descritor SRV quando o recurso D3D subjacente do qual depende foi destruído ou está sendo modificado (como ser declarado como não residente).

A forma principal de utilizar descritores é colocá-los em pilhas de descritores, que servem como memória de apoio para eles.

Manipuladores de descritor

O identificador do descritor é o endereço único do descritor. É semelhante a um ponteiro, mas é opaco, pois sua implementação é específica de hardware. O identificador é único em heaps de descritores, assim, por exemplo, uma matriz de identificadores pode fazer referência a descritores em vários heaps.

As alças da CPU são para uso imediato, como cópia, onde a origem e o destino precisam ser identificados. Imediatamente após o uso (por exemplo, uma chamada para ID3D12GraphicsCommandList::OMSetRenderTargets), eles podem ser reutilizados ou seu heap subjacente pode ser descartado.

Os identificadores de GPU não são para uso imediato — eles identificam endereços a partir de uma lista de comandos, para uso no momento de execução da GPU. Eles devem ser preservados até que qualquer lista de comandos que os referencia tenha sido executada inteiramente.

Para criar um identificador de descritor para o início de um heap, depois de criar o próprio heap do descritor, chame um dos seguintes métodos:

Esses métodos retornam as seguintes estruturas:

Como o tamanho dos descritores varia de acordo com o hardware, para obter o incremento entre cada descritor em um heap use:

É seguro deslocar uma localização inicial com um número de incrementos, copiar identificadores e passar identificadores para chamadas de API. Não é seguro desreferenciar um identificador como se fosse um ponteiro de CPU válido, nem analisar os bits de um identificador.

Algumas estruturas auxiliares foram adicionadas, com membros de inicialização, para tornar o gerenciamento de handles um pouco mais fácil.

Descritores nulos

Ao criar descritores usando chamadas de API, as aplicações passam NULL para o ponteiro de recurso na definição do descritor para obter o efeito de nenhum vínculo quando acessado pelo sombreador.

O resto do descritor deve ser preenchido tanto quanto possível. Por exemplo, no caso de SRVs (Shader Resource Views), o descritor pode ser usado para distinguir o tipo de exibição que é (Texture1D, Texture2D e assim por diante). Os parâmetros numéricos no descritor de visualização, como o número de mipmaps, devem ser definidos como valores válidos para um recurso.

Em muitos casos, há um comportamento definido para acessar um recurso não acoplado, como SRVs que retornam valores padrão. Esses parâmetros serão respeitados ao aceder a um descritor NULL, desde que o tipo de acesso do sombreador seja compatível com o tipo do descritor. Por exemplo, se um sombreador espera um SRV Texture2D e acessa um SRV NULL definido como Texture1D, o comportamento é indefinido e pode resultar na redefinição do dispositivo.

Em resumo, para criar um descritor nulo, passe null para o parâmetro pResource ao criar a exibição com métodos como CreateShaderResourceView. Para o parâmetro view description pDesc, defina uma configuração que funcionaria se o recurso não fosse nulo (caso contrário, uma falha pode ocorrer em algum hardware).

Os descritores raiz, no entanto, não devem ser definidos como nulos.

No hardware Tier1 (consulte Hardware Tiers, todos os descritores vinculados (por meio de tabelas de descritores) devem ser inicializados, seja como descritores reais ou nulos, mesmo que não sejam acessados pelo hardware, caso contrário, o comportamento é indefinido.

No hardware Tier2, isso se aplica aos descritores CBV e UAV vinculados, mas não aos descritores SRV.

No hardware Tier3, não há restrição a isso, desde que descritores não inicializados nunca sejam acessados.

Descritores padrão

Para criar um descritor padrão para uma vista específica, passe um parâmetro pResource válido para o método criar vista (como CreateShaderResourceView), mas passe NULL para o parâmetro pDesc. Por exemplo, se o recurso contivesse 14 mips, a exibição conteria 14 mips. O caso padrão abrange o mapeamento mais óbvio de um recurso numa vista. Isso requer que o recurso seja alocado com um nome de formato totalmente qualificado (como DXGI_FORMAT_R8G8B8A8_UNORM_SRGB em vez de DXGI_FORMAT_R8G8B8A8_TYPELESS).

Os descritores predefinidos não podem ser usados com uma visualização da estrutura de aceleração de raytracing, porque o parâmetro pResource fornecido deve ser NULLe a localização deve ser passada através de um D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

Descritores