Mapeamento de textura padrão
O uso do mapeamento de textura padrão reduz o uso de cópia e memória ao compartilhar dados de imagem entre a GPU e a CPU. No entanto, ele só deve ser usado em situações específicas. O layout de swizzle padrão evita copiar ou girar dados em vários layouts.
Visão geral
Mapear texturas padrão não deve ser a primeira opção para desenvolvedores. Os desenvolvedores devem codificar de maneira discreta e amigável à GPU primeiro (ou seja, não têm acesso à CPU para a maioria das texturas e carregar com CopySubresourceRegion1). Mas, para determinados casos, a CPU e a GPU podem interagir com tanta frequência nos mesmos dados, que o mapeamento de texturas padrão se torna útil para economizar energia ou acelerar um design específico em adaptadores ou arquiteturas específicas. Os aplicativos devem detectar esses casos e otimizar as cópias desnecessárias.
No D3D11.3, texturas criadas com D3D11_TEXTURE_LAYOUT_UNDEFINED (um membro da enumeração D3D11_TEXTURE_LAYOUT ) e nenhum acesso à CPU são as mais eficientes para renderização e amostragem frequentes de GPU. Durante o teste de desempenho, essas texturas devem ser comparadas com D3D11_TEXTURE_LAYOUT_UNDEFINED com acesso à CPU e D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE com acesso à CPU e D3D11_TEXTURE_LAYOUT_ROW_MAJOR para suporte a adaptadores cruzados.
Usar D3D11_TEXTURE_LAYOUT_UNDEFINED com acesso à CPU habilita os métodos WriteToSubresource, ReadFromSubresource, Map (impedindo o acesso do aplicativo ao ponteiro) e Unmap; mas pode sacrificar a eficiência do acesso à GPU. Usar D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE com acesso à CPU habilita WriteToSubresource, ReadFromSubresource, Map (que retorna um ponteiro válido para o aplicativo) e Unmap. Ele também pode sacrificar a eficiência do acesso à GPU mais de D3D11_TEXTURE_LAYOUT_UNDEFINED com acesso à CPU.
Em geral, os aplicativos devem criar a maioria das texturas como acessíveis somente para GPU e com D3D11_TEXTURE_LAYOUT_UNDEFINED.
Anterior ao recurso de texturas padrão de mapeamento, havia apenas um layout padronizado para dados multidimensionais: "linear", também conhecido como "linha principal". Os aplicativos devem evitar texturas USAGE_STAGING e USAGE_DYNAMIC quando o padrão do mapa estiver disponível. As texturas USAGE_STAGING e USAGE_DYNAMIC usam o layout linear.
D3D11.3 (e D3D12) introduzem um layout de dados multidimensional padrão. Isso é feito para permitir que várias unidades de processamento operem nos mesmos dados sem copiar os dados ou girar os dados entre vários layouts. Um layout padronizado permite ganhos de eficiência por meio de efeitos de rede e permite que os algoritmos façam atalhos assumindo um padrão específico.
Observe, porém, que esse swizzle padrão é um recurso de hardware e pode não ter suporte de todas as GPUs.
D3D11.3 APIs
Ao contrário do D3D12, o D3D11.3 não dá suporte ao mapeamento de textura por padrão, portanto, você precisa consultar D3D11_FEATURE_DATA_D3D11_OPTIONS2. O swizzle standard também precisará ser consultado com uma chamada para ID3D11Device::CheckFeatureSupport e verificando o StandardSwizzle64KBSupported
campo de D3D11_FEATURE_DATA_D3D11_OPTIONS2.
As seguintes APIs fazem referência ao mapeamento de textura:
Enumerações
- D3D11_TEXTURE_LAYOUT : controla o padrão de swizzle de texturas padrão e habilita o suporte ao mapa em texturas padrão.
- D3D11_FEATURE : faz referência a D3D11_FEATURE_DATA_D3D11_OPTIONS2.
- D3D11_TILE_COPY_FLAG : contém sinalizadores para copiar recursos em blocos de e para buffers lineares.
Estruturas
- D3D11_TEXTURE2D_DESC1 : descreve uma textura 2D. Observe a estrutura auxiliar CD3D11_TEXTURE2D_DESC1.
- D3D11_TEXTURE3D_DESC1 : descreve uma textura 3D. Observe a estrutura auxiliar CD3D11_TEXTURE3D_DESC1.
Métodos
- ID3D11Device3::CreateTexture2D1 : cria uma matriz de texturas 2D.
- ID3D11Device3::CreateTexture3D1 : cria uma única textura 3D.
- ID3D11Device3::WriteToSubresource : copia dados em uma textura D3D11_USAGE_DEFAULT que foi mapeada usando o Mapa.
- ID3D11Device3::ReadFromSubresource : copia dados de uma textura D3D11_USAGE_DEFAULT que foi mapeada usando o Mapa.
- ID3D11DeviceContext::Map : obtém um ponteiro para os dados contidos em um sub-recurso e nega o acesso de GPU a esse sub-recurso.
- ID3D11DeviceContext::Unmap : invalida o ponteiro para um recurso e reabilita o acesso da GPU a esse recurso.
- ID3D11Texture2D1::GetDesc1 : obtém as propriedades de um recurso de textura 2D.
- ID3D11Texture3D1::GetDesc1 : obtém as propriedades de um recurso de textura 3D.
Tópicos relacionados