Mappatura delle trame predefinita
L'uso del mapping delle trame predefinito riduce l'utilizzo della copia e della memoria durante la condivisione dei dati delle immagini tra la GPU e la CPU. Tuttavia, deve essere usato solo in situazioni specifiche. Il layout swizzle standard evita la copia o lo scorrimento dei dati in più layout.
Panoramica
Le trame predefinite per il mapping non devono essere la prima scelta per gli sviluppatori. Gli sviluppatori dovrebbero prima scrivere codice in modo compatibile con la GPU discreta, cioè non avere accesso alla CPU per la maggior parte delle trame e caricare con CopySubresourceRegion1. Tuttavia, per alcuni casi, la CPU e la GPU possono interagire così frequentemente sugli stessi dati, che il mapping delle trame predefinite diventa utile per risparmiare energia o per velocizzare una progettazione specifica su schede o architetture specifiche. Le applicazioni devono rilevare questi casi e ottimizzare le copie non necessarie.
In D3D11.3, le trame create con D3D11_TEXTURE_LAYOUT_UNDEFINED (un membro dell'enumerazione D3D11_TEXTURE_LAYOUT) e nessun accesso alla CPU sono i più efficienti per il rendering e il campionamento frequenti della GPU. Quando si esegue il test delle prestazioni, queste texture devono essere confrontate con D3D11_TEXTURE_LAYOUT_UNDEFINED con accesso alla CPU, D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE con accesso alla CPU e D3D11_TEXTURE_LAYOUT_ROW_MAJOR per il supporto tra adattatori.
L'uso di D3D11_TEXTURE_LAYOUT_UNDEFINED con accesso alla CPU consente i metodi WriteToSubresource, ReadFromSubresource, Map (precluding l'accesso dell'applicazione al puntatore) e Unmap; ma può sacrificare l'efficienza dell'accesso alla GPU. L'uso di D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE con accesso alla CPU consente WriteToSubresource, ReadFromSubresource, Map (che restituisce un puntatore valido all'applicazione) e Unmap. Potrebbe anche sacrificare l'efficienza dell'accesso alla GPU più di quanto faccia D3D11_TEXTURE_LAYOUT_UNDEFINED con l'accesso alla CPU.
In generale, le applicazioni dovrebbero creare la maggior parte delle trame come accessibili solo dalla GPU e con D3D11_TEXTURE_LAYOUT_UNDEFINED.
In precedenza alla funzionalità di mapping delle trame predefinite, era presente un solo layout standardizzato per i dati multidimensionali: "lineare", noto anche come "row-major". Le applicazioni devono evitare le texture USAGE_STAGING e USAGE_DYNAMIC quando è disponibile l'impostazione predefinita della mappa. Le trame USAGE_STAGING e USAGE_DYNAMIC usano il layout lineare.
D3D11.3 (e D3D12) introducono un layout di dati multidimensionale standard. Questa operazione viene eseguita per consentire a più unità di elaborazione di operare sugli stessi dati senza copiare i dati o ruotare i dati tra più layout. Un layout standardizzato consente un miglioramento dell'efficienza tramite effetti di rete e consente agli algoritmi di effettuare tagli brevi presupponendo un modello specifico.
Si noti però che questo swizzle standard è una funzionalità hardware e potrebbe non essere supportato da tutte le GPU.
API D3D11.3
A differenza di D3D12, D3D11.3 non supporta il mapping delle trame per impostazione predefinita, quindi è necessario eseguire una query D3D11_FEATURE_DATA_D3D11_OPTIONS2. Lo standard swizzle dovrà anche essere interrogato con una chiamata a ID3D11Device::CheckFeatureSupport e controllando il campo StandardSwizzle64KBSupported
di D3D11_FEATURE_DATA_D3D11_OPTIONS2.
Le seguenti API fanno riferimento al texturing:
Enumerazioni
- D3D11_TEXTURE_LAYOUT : controlla il modello swizzle delle trame predefinite e abilita il supporto delle mappe nelle trame predefinite.
- D3D11_FEATURE : fa riferimento D3D11_FEATURE_DATA_D3D11_OPTIONS2.
- D3D11_TILE_COPY_FLAG : contiene flag per copiare le risorse tiled swizzled da e verso buffer lineari.
Strutture
- D3D11_TEXTURE2D_DESC1 : descrive una trama 2D. Prendere nota della struttura helper CD3D11_TEXTURE2D_DESC1.
- D3D11_TEXTURE3D_DESC1 : descrive una trama 3D. Prendere nota della struttura helper CD3D11_TEXTURE3D_DESC1.
Metodi
- ID3D11Device3::CreateTexture2D1 : crea una matrice di trame 2D.
- ID3D11Device3::CreateTexture3D1 : crea una singola trama 3D.
- ID3D11Device3::WriteToSubresource : copia i dati in una texture D3D11_USAGE_DEFAULT mappata usando Map.
- ID3D11Device3::ReadFromSubresource : copia i dati da una texture D3D11_USAGE_DEFAULT che è stata mappata utilizzando Map.
- ID3D11DeviceContext::Map : ottiene un puntatore ai dati contenuti in una sottorisorsa e nega l'accesso alla GPU a tale sottorisorsa.
- ID3D11DeviceContext::Unmap : invalida il puntatore a una risorsa e riabilita l'accesso della GPU a tale risorsa.
- ID3D11Texture2D1::GetDesc1 : ottiene le proprietà di una risorsa texture 2D.
- ID3D11Texture3D1::GetDesc1 : ottiene le proprietà di una risorsa trama 3D.
Argomenti correlati