Sub-recursos (Elementos gráficos Direct3D 12)
Descreve como um recurso é dividido em sub-recursos e como fazer referência a um único, múltiplo ou fatia de sub-recursos.
- sub-recursos de exemplo
- de indexação de sub-fonte
- de fatia de Mip
- Array slice
- de fatia do plano
- vários sub-recursos
- APIs de sub-recursos
- tópicos relacionados
Sub-recursos de exemplo
Se um recurso contiver um buffer, ele simplesmente conterá um sub-recurso com um índice de 0. Se o recurso contiver uma textura (ou matriz de textura), referenciar as sub-fontes será mais complexo.
Algumas APIs acessam um recurso inteiro (como o método ID3D12GraphicsCommandList::CopyResource), outras acessam uma parte de um recurso (por exemplo, o método ID3D12Resource::ReadFromSubresource). Os métodos que acessam uma parte de um recurso geralmente usam uma descrição de exibição (como a estrutura D3D12_TEX2D_ARRAY_SRV) para especificar os sub-recursos a serem acessados. Consulte a seção de APIs de Sub-fonte do para obter uma lista completa.
Indexação de sub-fonte
Para indexar um sub-recurso específico, os níveis de mip são indexados primeiro à medida que cada entrada de matriz é indexada.
de indexação de sub-recursos
Fatia de Mip
Uma fatia de mip inclui um nível de mipmap para cada textura em uma matriz, conforme mostrado na imagem a seguir.
Fatia de matriz
Considerando uma matriz de texturas, cada textura com mipmaps, uma fatia de matriz inclui uma textura e todos os seus níveis de mip, conforme mostrado na imagem a seguir.
Fatia de plano
Normalmente, os formatos planares não são usados para armazenar dados do RGBA, mas nos casos em que eles estão (talvez 24bpp de dados RGB), um plano pode representar a imagem vermelha, um o verde e outro a imagem azul. Um plano, porém, não é necessariamente uma cor, duas ou mais cores podem ser combinadas em um plano. Normalmente, os dados planares são usados para dados YCbCr e Depth-Stencil sub-amostrados. Depth-Stencil é o único formato que dá suporte total a mipmaps, matrizes e vários planos (geralmente plano 0 para Profundidade e plano 1 para Estêncil).
A indexação de sub-fonte para uma matriz de duas imagens Depth-Stencil, cada uma com três níveis de mip, é mostrada abaixo.
O YCbCr sub-amostrado dá suporte a matrizes e tem planos, mas não dá suporte a mipmaps. As imagens YCbCr têm dois planos, um para a luminância (Y) ao qual o olho humano é mais sensível, e um para a cromínio (tanto Cb, quanto Cr, intercalado) aos quais o olho humano é menos sensível. Esse formato permite a compactação dos valores de cromínio para compactar uma imagem sem afetar a luminância e é um formato de compactação de vídeo comum por esse motivo, embora seja usado para compactar imagens mortas. A imagem abaixo mostra o formato NV12, observando que a cromínio foi compactada para um quarto da resolução da luminância, o que significa que a largura de cada plano é idêntica, e o plano de cromínio é metade da altura do plano de luminância. Os planos seriam indexados como sub-recursos de maneira idêntica à Depth-Stencil exemplo acima.
Os formatos planar existiam no Direct3D 11, mas planos individuais não podiam ser tratados individualmente, por exemplo, para operações de cópia ou mapeamento. Isso foi alterado no Direct3D 12 para que cada plano recebesse sua própria ID de sub-fonte. Compare os dois métodos a seguir para calcular a ID de sub-fonte.
Direct3D 11
inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
return MipSlice + (ArraySlice * MipLevels);
}
Direct3D 12
inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{
return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize);
}
A maioria dos hardwares pressupõe que a memória do plano N é sempre alocada imediatamente após o plano N-1.
Uma alternativa ao uso de sub-recursos é que um aplicativo pode alocar um recurso completamente separado por plano. Nesse caso, o aplicativo entende que os dados são planares e usa vários recursos para representá-los.
Vários sub-recursos
Uma exibição de recurso de sombreador pode selecionar qualquer região retangular de sub-recursos, usando uma das fatias descritas acima e o uso criterioso de campos nas estruturas de exibição (como D3D12_TEX2D_ARRAY_SRV), conforme mostrado na imagem.
Uma exibição de destino de renderização só pode usar uma única fatia de sub-fonte ou mip e não pode incluir sub-recursos de mais de uma fatia de mip. Ou seja, cada textura em uma exibição de destino de renderização deve ter o mesmo tamanho. Uma exibição de recurso de sombreador pode selecionar qualquer região retangular de sub-recursos, conforme mostrado na imagem.
APIs de sub-fonte
As seguintes APIs fazem referência e funcionam com sub-recursos:
Enumerações:
As estruturas a seguir contêm índices de PlaneSlice, a maioria contém índices MipSlice.
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
As estruturas a seguir contêm índices ArraySlice, a maioria contém índices de MipSlice.
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
As estruturas a seguir contêm índices MipSlice, mas nem índices ArraySlice nem PlaneSlice.
As estruturas a seguir também fazem referência a sub-recursos:
- D3D12_DISCARD_REGION: uma estrutura usada na preparação para descartar um recurso.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT: adiciona um deslocamento em um recurso ao volume básico.
- D3D12_RESOURCE_TRANSITION_BARRIER: descreve a transição de sub-recursos entre diferentes usos (recurso de sombreador, destino de renderização etc.).
- D3D12_SUBRESOURCE_DATA: os dados de sub-fonte incluem os próprios dados e o tom de linha e fatia.
- D3D12_SUBRESOURCE_FOOTPRINT: um volume inclui o formato, largura, altura, profundidade e tom de linha do sub-recurso.
- D3D12_SUBRESOURCE_INFO: contém o deslocamento, o tom de linha e o tom de profundidade da sub-fonte.
- D3D12_SUBRESOURCE_TILING: descreve um volume de sub-recursos em bloco (consulte de recursos de blocos de volume).
- D3D12_TEXTURE_COPY_LOCATION: descreve uma parte de uma textura para fins de cópia.
- D3D12_TILED_RESOURCE_COORDINATE: descreve as coordenadas de um recurso em bloco.
Métodos:
- ID3D12Device::GetCopyableFootprints: obtém informações sobre um recurso, para habilitar uma cópia a ser feita.
- ID3D12Device::GetResourceTiling: obtém informações sobre como um recurso em blocos é dividido em blocos.
- ID3D12GraphicsCommandList::ResolveSubresource: copia um sub-recurso de várias amostras em um sub-recurso não multi sampled.
- ID3D12Resource::Map: retorna um ponteiro para os dados especificados no recurso e nega o acesso da GPU ao sub-recurso.
- ID3D12Resource::ReadFromSubresource: copia dados de uma sub-fonte ou uma região retangular de uma sub-fonte.
- ID3D12Resource::Unmap: cancela o intervalo de memória especificado e invalida o ponteiro para o recurso. Restabelece o acesso de GPU ao sub-recurso.
- ID3D12Resource::WriteToSubresource: copia dados para uma sub-fonte ou uma região retangular de uma sub-fonte.
As texturas devem estar no estado D3D12_RESOURCE_STATE_COMMON para acesso à CPU por meio de WriteToSubresource e ReadFromSubresource ser legal; mas os buffers não. O acesso à CPU a um recurso normalmente é feito por meio de Mapa/Desencapsar.
Tópicos relacionados