D3D11_USAGE enumeração (d3d11.h)

Identifica o uso esperado de recursos durante a renderização. O uso reflete diretamente se um recurso é acessível pela CPU e/ou pela GPU (unidade de processamento gráfico).

Syntax

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

Constantes

 
D3D11_USAGE_DEFAULT
Valor: 0
Um recurso que requer acesso de leitura e gravação pela GPU. É provável que essa seja a opção de uso mais comum.
D3D11_USAGE_IMMUTABLE
Valor: 1
Um recurso que só pode ser lido pela GPU. Ele não pode ser gravado pela GPU e não pode ser acessado pela CPU. Esse tipo de recurso deve ser inicializado quando ele é criado, pois ele não pode ser alterado após a criação.
D3D11_USAGE_DYNAMIC
Valor: 2
Um recurso acessível pela GPU (somente leitura) e pela CPU (somente gravação). Um recurso dinâmico é uma boa opção para um recurso que será atualizado pela CPU pelo menos uma vez por quadro. Para atualizar um recurso dinâmico, use um método Map .

Para obter informações sobre como usar recursos dinâmicos, consulte Como usar recursos dinâmicos.
D3D11_USAGE_STAGING
Valor: 3
Um recurso que dá suporte à transferência de dados (cópia) da GPU para a CPU.

Comentários

Um aplicativo identifica a maneira como um recurso deve ser usado (seu uso) em uma descrição do recurso. Há várias estruturas para criar recursos, incluindo: D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC e D3D11_BUFFER_DESC.

Diferenças entre o Direct3D 9 e o Direct3D 10/11:

No Direct3D 9, você especifica o tipo de memória em que um recurso deve ser criado no no momento da criação do recurso (usando D3DPOOL). Era trabalho de um aplicativo decidir qual pool de memória forneceria a melhor combinação de funcionalidade e desempenho.

No Direct3D 10/11, um aplicativo não especifica mais em que tipo de memória (o pool) criar um recurso. Em vez disso, especifique o uso pretendido do recurso e permita que o runtime (em conjunto com o driver e um gerenciador de memória) escolha o tipo de memória que obterá o melhor desempenho.

 

Restrições de uso de recursos

Cada uso determina uma compensação entre a acessibilidade para a CPU e a acessibilidade para a GPU. Em geral, o acesso de alto desempenho para um desses dois processadores significa acesso de menor desempenho para o outro. Em ambos os extremos estão os usos de D3D11_USAGE_DEFAULT e D3D11_USAGE_STAGING . D3D11_USAGE_DEFAULT restringe o acesso quase inteiramente à GPU. D3D11_USAGE_STAGING restringe o acesso quase inteiramente à CPU e permite apenas uma transferência de dados (cópia) de um recurso entre a GPU e a CPU. Você pode executar essas operações de cópia por meio dos métodos ID3D11DeviceContext::CopySubresourceRegion e ID3D11DeviceContext::CopyResource . Você também pode usar esses métodos de cópia para copiar dados entre dois recursos do mesmo uso. Você também pode usar o método ID3D11DeviceContext::UpdateSubresource para copiar a memória diretamente de um ponteiro fornecido pela CPU para qualquer recurso, mais útil um recurso com D3D11_USAGE_DEFAULT.

D3D11_USAGE_DYNAMIC uso é um caso especial que otimiza o fluxo de dados da CPU para a GPU quando a CPU gera esses dados em tempo real e envia esses dados com alta frequência. D3D11_USAGE_DYNAMIC normalmente é usado em recursos com dados de vértice e em buffers constantes. Use os métodos ID3D11DeviceContext::Map e ID3D11DeviceContext::Unmap para gravar dados nesses recursos. Para obter o desempenho mais alto para dados consumidos em série, como dados de vértice, use a sequência de D3D11_MAP_WRITE_NO_OVERWRITE e D3D11_MAP_WRITE_DISCARD . Para obter mais informações sobre essa sequência, consulte Uso comum de D3D11_MAP_WRITE_DISCARD com D3D11_MAP_WRITE_NO_OVERWRITE.

D3D11_USAGE_IMMUTABLE uso é outro caso especial que faz com que a GPU gere dados apenas uma vez quando você cria um recurso. D3D11_USAGE_IMMUTABLE é adequado para dados como texturas porque esses dados normalmente são lidos na memória de algum formato de arquivo. Portanto, quando você cria uma textura com D3D11_USAGE_IMMUTABLE, a GPU lê diretamente essa textura na memória.

Use a tabela a seguir para escolher o uso que melhor descreve como o recurso precisará ser acessado pela CPU e/ou pela GPU. Claro, haverá compensações de desempenho.

Uso de recurso Default Dinâmico Imutável Staging
GPU-Read sim sim sim sim¹
GPU-Write sim sim¹
CPU-Read sim¹
CPU-Write sim sim¹
 

1 – A leitura ou gravação de GPU de um recurso com a D3D11_USAGE_STAGING uso é restrita a operações de cópia. Você usa ID3D11DeviceContext::CopySubresourceRegion e ID3D11DeviceContext::CopyResource para essas operações de cópia. Além disso, como formatos de estêncil de profundidade e layouts de várias estênceis são detalhes de implementação de um design de GPU específico, o sistema operacional não pode expor esses formatos e layouts à CPU em geral. Portanto, os recursos de preparo não podem ser um buffer de estêncil de profundidade ou um destino de renderização com várias amostras.

Nota Tecnicamente, você pode usar ID3D11DeviceContext::UpdateSubresource para copiar para um recurso com qualquer uso, exceto D3D11_USAGE_IMMUTABLE. No entanto, recomendamos usar ID3D11DeviceContext::UpdateSubresource para atualizar apenas um recurso com D3D11_USAGE_DEFAULT. É recomendável usar ID3D11DeviceContext::Map e ID3D11DeviceContext::Unmap para atualizar recursos com D3D11_USAGE_DYNAMIC porque essa é a finalidade específica de D3D11_USAGE_DYNAMIC recursos e, portanto, é o caminho mais otimizado.
 
ObserveD3D11_USAGE_DYNAMIC recursos consomem recursos de hardware específicos. Portanto, use-os com moderação. O driver de exibição normalmente aloca memória para D3D11_USAGE_DYNAMIC recursos com um algoritmo de cache que favorece gravações de CPU e dificulta as leituras da CPU. Além disso, a memória por trás D3D11_USAGE_DYNAMIC recursos pode nem ser a mesma para chamadas sucessivas para ID3D11DeviceContext::Map. Portanto, não espere leituras de CPU de alto desempenho nem mesmo consistentes de D3D11_USAGE_DYNAMIC recursos.
 
ObservaçãoID3D11DeviceContext::CopyStructureCount é um caso especial de cópia de GPU para CPU. Use ID3D11DeviceContext::CopyStructureCount somente com UAVs (exibições de acesso não ordenadas) de buffers.
 

Opções de associação de recursos

Para maximizar o desempenho, nem todas as opções de uso de recursos podem ser usadas como recursos de entrada ou saída para o pipeline. Esta tabela identifica essas limitações.
O recurso pode ser associado como Default Dinâmico Imutável Staging
Entrada para um estágio yes² sim,00 sim
Saída de um estágio yes²
 
  • 2 - Se associado como uma entrada e uma saída usando exibições diferentes, cada exibição deve usar sub-recursos diferentes.
  • 3 – O recurso só pode ser criado com um único sub-recurso. O recurso não pode ser uma matriz de textura. O recurso não pode ser uma cadeia de mipmap.

Requisitos

Requisito Valor
Cabeçalho d3d11.h

Confira também

Enumerações de recursos