Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Descreve como um recurso é dividido em subrecursos e como fazer referência a um único, múltiplo ou fatia de subrecursos.
-
Exemplo de subrecursos
- de indexação de subrecursos
- Mip fatia
- Matriz fatia
- Corte de avião
- Vários subrecursos
- APIs de subrecursos
- Tópicos relacionados
Exemplo de subrecursos
Se um recurso contém um buffer, então ele simplesmente contém um subrecurso com um índice de 0. Se o recurso contiver uma textura (ou matriz de textura), a referência aos subrecursos será mais complexa.
Algumas APIs acessam um recurso inteiro (como o métodoID3D12GraphicsCommandList::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 subrecursos a serem acessados. Consulte a seção APIs de subrecursos para obter uma lista completa.
Indexação de subrecursos
Para indexar um subrecurso específico, os níveis de mip são indexados primeiro à medida que cada entrada de matriz é indexada.
de indexação de subrecursos
Mip fatia
Uma fatia mip inclui um nível de mipmap para cada textura em uma matriz, conforme mostrado na imagem a seguir.
Fatia de matriz
Dada uma matriz de texturas, cada textura com mipmaps, uma fatia de matriz inclui uma textura e todos os seus níveis de mip, como mostrado na imagem a seguir.
Fatia plana
Normalmente, os formatos planares não são usados para armazenar dados RGBA, mas nos casos em que é (talvez dados RGB de 24bpp), um plano pode representar a imagem vermelha, um verde e outro a imagem azul. Um plano, embora não seja necessariamente uma cor, duas ou mais cores podem ser combinadas em um plano. Mais tipicamente dados planares são usados para dados YCbCr e Depth-Stencil subamostrados. Depth-Stencil é o único formato que suporta totalmente mipmaps, matrizes e vários planos (geralmente plano 0 para profundidade e plano 1 para Stencil).
A indexação de subrecursos para uma matriz de duas imagens Depth-Stencil, cada uma com três níveis de mip, é mostrada abaixo.
de indexação de estêncil de profundidade
O YCbCr subamostrado suporta matrizes e tem planos, mas não suporta mipmaps. As imagens YCbCr têm dois planos, um para a luminância (Y) a que o olho humano é mais sensível e outro para a crominância (Cb e Cr, intercalada) à qual o olho humano é menos sensível. Este formato permite a compressão dos valores de crominância, a fim de comprimir uma imagem sem afetar a luminância, e é um formato de compressão de vídeo comum por esse motivo, embora seja usado para comprimir imagens estáticas. A imagem abaixo mostra o formato NV12, observando que a crominância foi comprimida a um quarto da resolução da luminância, o que significa que a largura de cada plano é idêntica, e o plano de crominância é metade da altura do plano de luminância. Os planos seriam indexados como subrecursos de forma idêntica ao exemplo Depth-Stencil acima.
Os formatos planares existiam no Direct3D 11, mas os planos individuais não podiam ser abordados 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 subrecurso. Compare os dois métodos a seguir para calcular a ID do subrecurso.
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 do hardware assume que a memória para o plano N é sempre alocada imediatamente após o plano N-1.
Uma alternativa ao uso de subrecursos é 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 subrecursos
Uma exibição de recurso de sombreador pode selecionar qualquer região retangular de subrecursos, 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 um único subrecurso ou fatia mip e não pode incluir subrecursos de mais de uma fatia mip. Ou seja, todas as texturas em uma exibição de destino de renderização devem ter o mesmo tamanho. Uma exibição de recurso de sombreador pode selecionar qualquer região retangular de subrecursos, conforme mostrado na imagem.
APIs de subrecursos
As seguintes APIs fazem referência e funcionam com subrecursos:
Enumerações:
As estruturas a seguir contêm PlaneSlice índices, a maioria contém MipSlice índices.
- 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 ArraySlice índices, a maioria contém MipSlice índices.
- 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 de MipSlice, mas nem ArraySlice nem PlaneSlice índices.
As seguintes estruturas também fazem referência a subrecursos:
- D3D12_DISCARD_REGION : uma estrutura usada na preparação para o descarte de um recurso.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : adiciona um deslocamento em um recurso à pegada básica.
- D3D12_RESOURCE_TRANSITION_BARRIER : descreve a transição de subrecursos entre diferentes usos (recurso sombreador, destino de renderização, etc.).
- D3D12_SUBRESOURCE_DATA : os dados do subrecurso incluem os próprios dados e o passo de linha e fatia.
- D3D12_SUBRESOURCE_FOOTPRINT : uma superfície de cobertura inclui o formato, a largura, a altura, a profundidade e a distância entre linhas do subrecurso.
- D3D12_SUBRESOURCE_INFO : contém o deslocamento, o passo da linha e o passo de profundidade do subrecurso.
- D3D12_SUBRESOURCE_TILING : descreve um volume de subrecursos lado a lado (consulte Volume Tiled Resources).
- D3D12_TEXTURE_COPY_LOCATION : descreve uma porção de uma textura para fins de cópia.
- D3D12_TILED_RESOURCE_COORDINATE : descreve as coordenadas de um recurso lado a lado.
Metodologia:
- ID3D12Device::GetCopyableFootprints : obtém informações sobre um recurso, para permitir que uma cópia seja feita.
- ID3D12Device::GetResourceTiling : obtém informações sobre como um recurso lado a lado é dividido em blocos.
- ID3D12GraphicsCommandList::ResolveSubresource : copia um subrecurso com várias amostras para um subrecurso sem várias amostras.
- ID3D12Resource::Map : retorna um ponteiro para os dados especificados no recurso e nega o acesso da GPU ao subrecurso.
- ID3D12Resource::ReadFromSubresource : copia dados de um subrecurso ou de uma região retangular de um subrecurso.
- ID3D12Resource::Unmap : desmapeia o intervalo de memória especificado e invalida o ponteiro para o recurso. Restabelece o acesso da GPU ao subrecurso.
- ID3D12Resource::WriteToSubresource : copia dados para um subrecurso ou uma região retangular de um subrecurso.
As texturas devem estar no estado D3D12_RESOURCE_STATE_COMMON para que o acesso à CPU por meio WriteToSubresource e ReadFromSubresource seja legal; mas os buffers não. O acesso da CPU a um recurso é normalmente feito através do Map/Unmap.
Tópicos relacionados