Sottoresources (Grafica Direct3D 12)
Viene descritto come una risorsa è suddivisa in sottorisorse e come fare riferimento a una singola sezione o a una singola sezione di sottorisorse.
Sottorisorse di esempio
Se una risorsa contiene un buffer, contiene semplicemente una sottoresource con un indice pari a 0. Se la risorsa contiene una trama (o matrice di trama), fare riferimento alle sottoresource è più complesso.
Alcune API accedono a un'intera risorsa, ad esempio il metodo ID3D12GraphicsCommandList::CopyResource , altri accedono a una parte di una risorsa, ad esempio il metodo ID3D12Resource::ReadFromSubresource . I metodi che accedono a una parte di una risorsa in genere usano una descrizione della visualizzazione (ad esempio la struttura D3D12_TEX2D_ARRAY_SRV ) per specificare le sottoresource da accedere. Per un elenco completo, vedere la sezione API subresource .
Indicizzazione di sottorisorse
Per indicizzare una determinata sottoresource, i livelli mip vengono indicizzati prima quando ogni voce di matrice viene indicizzata.
Sezione Mip
Una sezione mip include un livello mipmap per ogni trama in una matrice, come illustrato nell'immagine seguente.
Sezione matrice
Dato una matrice di trame, ogni trama con mipmaps, una sezione di matrice include una trama e tutti i relativi livelli mip, come illustrato nell'immagine seguente.
Sezione piano
In genere i formati planari non vengono usati per archiviare i dati RGBA, ma nei casi in cui è (forse 24bpp dati RGB), un piano potrebbe rappresentare l'immagine rossa, una verde e un'immagine blu. Un piano però non è necessariamente un colore, due o più colori possono essere combinati in un piano. Più in genere i dati planari vengono usati per i dati di YCbCr e di Depth-Stencil. Depth-Stencil è l'unico formato che supporta completamente mipmap, matrici e più piani (spesso piano 0 per Profondità e piano 1 per Stencil).
L'indicizzazione di sottoresource per una matrice di due immagini Depth-Stencil, ognuna con tre livelli mip, è illustrata di seguito.
YCbCr sub-sampled supporta matrici e ha piani, ma non supporta mipmaps. Le immagini YCbCr hanno due piani, uno per la luminanza (Y) che l'occhio umano è più sensibile a, e uno per la dominanza (sia Cb, che Cr, interleaved) che l'occhio umano è meno sensibile a. Questo formato consente la compressione dei valori di dominanza per comprimere un'immagine senza influire sulla luminanza ed è un formato di compressione video comune per tale motivo, anche se viene usato per comprimere immagini ancora. L'immagine seguente mostra il formato NV12, notando che la dominanza è stata compressa in un quarto della risoluzione della luminanza, il che significa che la larghezza di ogni piano è identica e il piano di dominanza è la metà dell'altezza del piano di luminanza. I piani verranno indicizzati come sottoresource in modo identico all'esempio Depth-Stencil precedente.
I formati planari esistono in Direct3D 11, ma i singoli piani non possono essere risolti singolarmente, ad esempio per le operazioni di copia o mapping. Questa modifica è stata modificata in Direct3D 12 in modo che ogni piano abbia ricevuto il proprio ID di sottoresource. Confrontare i due metodi seguenti per calcolare l'ID di sottoresource.
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);
}
La maggior parte dell'hardware presuppone che la memoria per il piano N sia sempre allocata immediatamente dopo il piano N-1.
Un'alternativa all'uso di sottoresource è che un'app potrebbe allocare una risorsa completamente separata per piano. In questo caso, l'applicazione riconosce che i dati sono planari e utilizza più risorse per rappresentarlo.
Più sottorisorse
Una visualizzazione delle risorse shader può selezionare qualsiasi area rettangolare di sottoresource, usando una delle sezioni descritte in precedenza e l'uso insodibile dei campi nelle strutture di visualizzazione (ad esempio D3D12_TEX2D_ARRAY_SRV), come illustrato nell'immagine.
Una visualizzazione di destinazione di rendering può usare solo una singola sezione subresource o mip e non può includere sottorisorse da più sezioni mip. Ovvero, ogni trama in una visualizzazione di destinazione di rendering deve essere la stessa dimensione. Una visualizzazione shader-resource può selezionare qualsiasi area rettangolare di sottoresource, come illustrato nell'immagine.
API subresource
Le API seguenti fanno riferimento e funzionano con le sottoresource:
Enumerazioni:
Le strutture seguenti contengono indici PlaneSlice , la maggior parte contiene indici MipSlice .
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Le strutture seguenti contengono indici ArraySlice , la maggior parte contiene indici 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
Le strutture seguenti contengono indici MipSlice , ma né Gli indici ArraySlice né PlaneSlice .
Le strutture seguenti fanno riferimento anche alle sottoresource:
- D3D12_DISCARD_REGION : una struttura usata in preparazione per l'eliminazione di una risorsa.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : aggiunge un offset in una risorsa al footprint di base.
- D3D12_RESOURCE_TRANSITION_BARRIER : descrive la transizione di sottorisorse tra diversi usi (risorsa shader, destinazione di rendering e così via).
- D3D12_SUBRESOURCE_DATA : i dati di sottoresource includono i dati stessi e il passo della riga e della sezione.
- D3D12_SUBRESOURCE_FOOTPRINT : un footprint include il formato, la larghezza, l'altezza, la profondità e il passo di riga della sottoresource.
- D3D12_SUBRESOURCE_INFO : contiene l'offset, il passo di riga e il passo di profondità della sottoresource.
- D3D12_SUBRESOURCE_TILING : descrive un volume subresource riquadri (vedere Risorse riquadri del volume).
- D3D12_TEXTURE_COPY_LOCATION : descrive una parte di una trama allo scopo di copiare.
- D3D12_TILED_RESOURCE_COORDINATE : descrive le coordinate di una risorsa riquadri.
Metodi:
- ID3D12Device::GetCopyableFootprints : ottiene informazioni su una risorsa per abilitare la creazione di una copia.
- ID3D12Device::GetResourceTiling : ottiene informazioni su come una risorsa riquadri è suddivisa in riquadri.
- ID3D12GraphicsCommandList::ResolveSubresource : copia una sottoresource multi-sampled in una sottoresource non a campione.
- ID3D12Resource::Map : restituisce un puntatore ai dati specificati nella risorsa e nega l'accesso della GPU alla sottoresource.
- ID3D12Resource::ReadFromSubresource : copia i dati da una sottoresource o da un'area rettangolare di una sottoresource.
- ID3D12Resource::Unmap : annulla il mapping dell'intervallo di memoria specificato e invalida il puntatore alla risorsa. Reintegra l'accesso della GPU alla sottoresource.
- ID3D12Resource::WriteToSubresource : copia i dati in una sottoresource o in un'area rettangolare di una sottoresource.
Le trame devono trovarsi nello stato D3D12_RESOURCE_STATE_COMMON per l'accesso alla CPU tramite WriteToSubresource e ReadFromSubresource per essere legali; ma i buffer non sono. L'accesso alla CPU a una risorsa viene in genere eseguito tramite Map/Unmap.
Argomenti correlati