D3D12_TEXTURE_LAYOUT enumeração (d3d12.h)

Especifica as opções de layout de textura.

Syntax

typedef enum D3D12_TEXTURE_LAYOUT {
  D3D12_TEXTURE_LAYOUT_UNKNOWN = 0,
  D3D12_TEXTURE_LAYOUT_ROW_MAJOR = 1,
  D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE = 2,
  D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE = 3
} ;

Constantes

 
D3D12_TEXTURE_LAYOUT_UNKNOWN
Valor: 0
Indica que o layout é desconhecido e provavelmente depende do adaptador.
Durante a criação, o driver escolhe o layout mais eficiente com base em outras propriedades de recurso, especialmente o tamanho do recurso e os sinalizadores.
Prefira essa escolha, a menos que determinadas funcionalidades sejam necessárias de outro layout de textura.

Existem otimizações de upload de textura de cópia zero para arquiteturas UMA; consulte ID3D12Resource::WriteToSubresource.
D3D12_TEXTURE_LAYOUT_ROW_MAJOR
Valor: 1
Indica que os dados para a textura são armazenados em ordem de linha principal (às vezes chamada de "ordem linear de tom").

Esse layout de textura localiza texels consecutivos de uma linha contíguamente na memória, antes dos texels da próxima linha.
Da mesma forma, texels consecutivos de uma determinada fatia de profundidade ou matriz são contíguos na memória antes dos texels da próxima fatia de profundidade ou matriz.
O preenchimento pode existir entre linhas e entre fatias de profundidade ou matriz para alinhar coleções de dados.
Um passo é a distância na memória entre linhas, profundidade ou fatias de matriz; e inclui qualquer preenchimento.

Esse layout de textura permite o compartilhamento dos dados de textura entre vários adaptadores, quando outros layouts não estão disponíveis.

Muitas restrições se aplicam, pois esse layout geralmente não é eficiente para uso extensivo:


  • A localidade dos texels próximos não é rotacionalmente invariável.

  • Há suporte apenas para as seguintes propriedades de textura:


  • A textura deve ser criada em um heap com D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER.


Os buffers são criados com D3D12_TEXTURE_LAYOUT_ROW_MAJOR, pois os dados de textura principal de linha podem estar localizados neles sem criar um objeto de textura.
Isso é comumente usado para carregar ou ler dados de textura de volta, especialmente para adaptadores discretos/NUMA.
No entanto, D3D12_TEXTURE_LAYOUT_ROW_MAJOR também podem ser usados ao realizar marshaling de dados de textura entre GPUs ou adaptadores.
Para obter exemplos de uso com ID3D12GraphicsCommandList::CopyTextureRegion, consulte alguns dos seguintes tópicos:

D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE
Valor: 2
Indica que o layout dentro de blocos de 64 KB e o empacotamento de mip final é até o driver.
Nenhum padrão de swizzle padrão.

Esse layout de textura é organizado em regiões contíguas de 64 KB, também conhecidas como blocos, contendo uma quantidade quase equilateral de número consecutivo de texels ao longo de cada dimensão.
Os blocos são organizados em ordem de linha principal.
Embora não haja preenchimento entre blocos, normalmente há texels não utilizados no último bloco em cada dimensão.
O layout de texels dentro do bloco é indefinido.
Cada sub-recurso segue imediatamente onde o sub-recurso anterior termina e a ordem de sub-recurso segue a mesma sequência que ordinais de sub-recurso.
No entanto, o empacotamento tail mip é específico do adaptador.
Para obter mais detalhes, consulte camada de recurso lado a lado e ID3D12Device::GetResourceTiling.

Esse layout de textura permite cenários de textura parcialmente residentes ou esparsos quando usados junto com a funcionalidade de mapeamento de página de memória virtual.
Esse layout de textura deve ser usado junto com ID3D12Device::CreateReservedResource para habilitar o uso de ID3D12CommandQueue::UpdateTileMappings.

Algumas restrições se aplicam a texturas com este layout:

D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE
Valor: 3
Indica que uma textura padrão usa o padrão de swizzle padronizado.

Esse layout de textura é organizado da mesma forma que D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE, exceto pelo fato de que o layout de texels dentro do bloco é definido. O empacotamento tail mip é específico do adaptador.

Esse layout de textura permite otimizações ao realizar marshaling de dados entre vários adaptadores ou entre a CPU e a GPU.
A quantidade de cópia pode ser reduzida quando vários componentes entendem o layout de memória de textura.
Esse layout geralmente é mais eficiente para uso extensivo do que o layout principal de linha, devido à localidade invariável rotacional de texels vizinhos.
Normalmente, esse layout só pode ser usado com adaptadores que dão suporte a swizzle padrão, mas existem exceções para heaps compartilhados entre adaptadores.

As restrições para esse layout são que não há suporte para o seguinte:

Comentários

Essa enumeração é usada pela estrutura D3D12_RESOURCE_DESC .

Essa enumeração controla o padrão de swizzle de texturas padrão e habilita o suporte ao mapa em texturas padrão. Os chamadores devem consultar D3D12_FEATURE_DATA_D3D12_OPTIONS para garantir que cada opção tenha suporte.

Os formatos de swizzle padrão se aplicam em cada parte do tamanho de página e as páginas são dispostas em ordem linear em relação umas às outras. Um padrão de intercalação de 16 bits define a conversão do local da intrapágina pré-girado para o local pós-giratório.

Padrões de swizzle padrão

Para demonstrar, considere o formato de swizzle 2D 32bpp acima. Isso é representado pelas seguintes máscaras de intercalação, em que os bits à esquerda são mais significativos:

UINT xBytesMask = 1010 1010 1000 1111
UINT yMask =      0101 0101 0111 0000

Para calcular o endereço giratório, o código a seguir pode ser usado (em que há suporte para a instrução intrínseca _pdep_u32):

UINT swizzledOffset = resourceBaseOffset +
                      _pdep_u32(xOffset, xBytesMask) +
                      _pdep_u32(yOffset, yBytesMask);

Requisitos

Requisito Valor
Cabeçalho d3d12.h

Confira também

CD3DX12_RESOURCE_DESC

Enumerações principais

Otimizações de UMA: texturas acessíveis à CPU e swizzle padrão