Recursos divididos em volumes (Direct3D 12)
Texturas de volume (3D) podem ser usadas como recursos lado a lado, observando que a resolução do bloco é tridimensional.
Visão geral
Os recursos lado a lado separam um objeto de recurso Direct3D de sua memória de backup (os recursos no passado tinham uma relação 1:1 com a memória de suporte). Isso permite uma variedade de cenários interessantes, como streaming em dados de textura e reutilização ou redução do uso de memória.
Há suporte para recursos lado a lado de textura 2D no Direct3D 11.2. O suporte opcional para texturas lado a lado 3D está disponível para Direct3D 12 e Direct3D 11.3 (consulte D3D12_TILED_RESOURCES_TIER).
As dimensões de recursos típicas usadas em blocos são 4 x 4 blocos para texturas 2D e 4 x 4 x 4 blocos para texturas 3D.
Bits/pixel (1 amostra/pixel) | Dimensões de bloco (pixels, w x h x d) |
---|---|
8 | 64x32x32 |
16 | 32x32x32 |
32 | 32x32x16 |
64 | 32x16x16 |
128 | 16x16x16 |
BC 1,4 | 128x64x16 |
BC 2,3,5,6,7 | 64x64x16 |
Observe que não há suporte para os seguintes formatos com recursos lado a lado: formatos de 96bpp, formatos de vídeo, R1_UNORM, R8G8_B8G8_UNORMR8R8_G8B8_UNORM.
Nos diagramas abaixo, cinza escuro representa blocos NULL.
- Mapeamento padrão de recurso lado a lado de textura 3D (mip mais detalhado)
- Mapeamento padrão de recurso lado a lado de textura 3D (segundo mip mais detalhado)
- Recurso lado a lado de textura 3D (mip mais detalhado)
- Recurso lado a lado de textura 3D (segundo mip mais detalhado)
- Recurso lado a lado de textura 3D (bloco único)
- Recurso lado a lado de textura 3D (caixa uniforme)
Mapeamento padrão de recurso lado a lado de textura 3D (mip mais detalhado)
Mapeamento padrão de recurso lado a lado de textura 3D (segundo mip mais detalhado)
Recurso lado a lado de textura 3D (mip mais detalhado)
O código a seguir configura um recurso lado a lado 3D no mip mais detalhado.
D3D12_TILED_RESOURCE_COORDINATE trCoord{};
trCoord.X = 1;
trCoord.Y = 0;
trCoord.Z = 0;
trCoord.Subresource = 0;
D3D12_TILE_REGION_SIZE trSize{};
trSize.bUseBox = false;
trSize.NumTiles = 63;
Recurso lado a lado de textura 3D (segundo mip mais detalhado)
O código a seguir configura um recurso lado a lado 3D e o segundo mip mais detalhado.
D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 1;
trCoord.Y = 0;
trCoord.Z = 0;
trCoord.Subresource = 1;
D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = false;
trSize.NumTiles = 6;
Recurso lado a lado de Textura 3D (bloco único)
O código a seguir configura um único recurso de bloco.
D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 1;
trCoord.Y = 1;
trCoord.Z = 1;
trCoord.Subresource = 0;
D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = true;
trSize.NumTiles = 27;
trSize.Width = 3;
trSize.Height = 3;
trSize.Depth = 3;
Recurso lado a lado de textura 3D (caixa uniforme)
O código a seguir configura um recurso lado a lado de caixa uniforme (observe a instrução trSize.bUseBox = true;) :
D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 0;
trCoord.Y = 1;
trCoord.Z = 0;
trCoord.Subresource = 0;
D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = true;
trSize.NumTiles = 27;
trSize.Width = 3;
trSize.Height = 3;
trSize.Depth = 3;
APIs de recurso lado a lado
As mesmas chamadas à API são usadas para recursos lado a lado 2D e 3D.
Enumerações
- D3D12_TILED_RESOURCES_TIER : determina o nível de suporte a recursos lado a lado.
- D3D12_FORMAT_SUPPORT2 : usado para testar o suporte a recursos lado a lado.
- D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS : determina o suporte a recursos lado a lado em um recurso de várias amostras.
- D3D12_TILE_COPY_FLAGS : mantém sinalizadores para copiar de e para recursos em blocos e buffers lineares.
Estruturas
- D3D12_TILED_RESOURCE_COORDINATE : contém a coordenada x, y e z e a referência de sub-recurso. Observe que há uma estrutura auxiliar: CD3DX12_TILED_RESOURCE_COORDINATE.
- D3D12_TILE_REGION_SIZE : especifica o tamanho e o número de blocos da região lado a lado.
- D3D12_TILE_SHAPE : a forma do bloco como largura, altura e profundidade em texels.
- D3D12_FEATURE_DATA_D3D12_OPTIONS : mantém o nível de camada de recurso do bloco com suporte e um volumeliano, VolumeTiledResourcesSupported, indicou se há suporte para recursos lado a lado de volume.
Métodos
- ID3D12Device::CheckFeatureSupport : usado para determinar quais recursos e em qual camada têm suporte pelo hardware atual.
- ID3D12GraphicsCommandList::CopyTiles : copia blocos do buffer para o recurso lado a lado ou vice-versa.
- ID3D12CommandQueue::UpdateTileMappings : atualiza mapeamentos de locais de bloco em recursos lado a lado para locais de memória em um heap de recursos.
- ID3D12CommandQueue::CopyTileMappings : copia mapeamentos de um recurso lado a lado de origem para um recurso lado a lado de destino.
- ID3D12Device::GetResourceTiling : obtém informações sobre como um recurso lado a lado é dividido em blocos.