enumerazione D3D11_USAGE (d3d11.h)

Identifica l'uso previsto delle risorse durante il rendering. L'utilizzo riflette direttamente se una risorsa è accessibile dalla CPU e/o dall'unità di elaborazione grafica (GPU).

Sintassi

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

Costanti

 
D3D11_USAGE_DEFAULT
Valore: 0
Risorsa che richiede l'accesso in lettura e scrittura dalla GPU. Questa è probabilmente la scelta di utilizzo più comune.
D3D11_USAGE_IMMUTABLE
Valore: 1
Risorsa che può essere letto solo dalla GPU. Non può essere scritto dalla GPU e non può essere accessibile a tutti dalla CPU. Questo tipo di risorsa deve essere inizializzato quando viene creato, poiché non può essere modificato dopo la creazione.
D3D11_USAGE_DYNAMIC
Valore: 2
Risorsa accessibile sia dalla GPU (sola lettura) che dalla CPU (solo scrittura). Una risorsa dinamica è una scelta ottimale per una risorsa che verrà aggiornata dalla CPU almeno una volta per frame. Per aggiornare una risorsa dinamica, usare un metodo Map .

Per informazioni su come usare le risorse dinamiche, vedere Procedura: Usare le risorse dinamiche.
D3D11_USAGE_STAGING
Valore: 3
Risorsa che supporta il trasferimento dei dati (copia) dalla GPU alla CPU.

Commenti

Un'applicazione identifica il modo in cui una risorsa deve essere usata (il relativo utilizzo) in una descrizione della risorsa. Esistono diverse strutture per la creazione di risorse, tra cui: D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC e D3D11_BUFFER_DESC.

Differenze tra Direct3D 9 e Direct3D 10/11:

In Direct3D 9 specificare il tipo di memoria in cui deve essere creata una risorsa in fase di creazione delle risorse (usando D3DPOOL). È stato un processo dell'applicazione per decidere quale pool di memoria fornirebbe la migliore combinazione di funzionalità e prestazioni.

In Direct3D 10/11 un'applicazione non specifica più il tipo di memoria (il pool) in cui creare una risorsa. Si specifica invece l'utilizzo previsto della risorsa e si consente al runtime (in concerto con il driver e un gestore memoria) di scegliere il tipo di memoria che otterrà le migliori prestazioni.

 

Restrizioni relative all'utilizzo delle risorse

Ogni utilizzo determina un compromesso tra l'accessibilità per la CPU e l'accessibilità per la GPU. In generale, l'accesso con prestazioni più elevate per uno di questi due processori significa un accesso più basso alle prestazioni per l'altro. A entrambi gli estremi sono i D3D11_USAGE_DEFAULTe D3D11_USAGE_STAGING utilizzo. D3D11_USAGE_DEFAULT limita quasi completamente l'accesso alla GPU. D3D11_USAGE_STAGING limita l'accesso quasi interamente alla CPU e consente solo un trasferimento dati (copia) di una risorsa tra la GPU e la CPU. È possibile eseguire queste operazioni di copia tramite i metodi ID3D11DeviceContext::CopySubresourceRegion e ID3D11DeviceContext::CopyResource. È anche possibile usare questi metodi di copia per copiare i dati tra due risorse dello stesso utilizzo. È anche possibile usare il metodo ID3D11DeviceContext::UpdateSubresource per copiare la memoria direttamente da un puntatore fornito dalla CPU a qualsiasi risorsa, più utilemente una risorsa con D3D11_USAGE_DEFAULT.

D3D11_USAGE_DYNAMIC l'utilizzo è un caso speciale che ottimizza il flusso di dati dalla CPU alla GPU quando la CPU genera i dati sul volo e invia tali dati con frequenza elevata. D3D11_USAGE_DYNAMIC viene in genere usato sulle risorse con i dati dei vertici e sui buffer costanti. Usare i metodi ID3D11DeviceContext::Map e ID3D11DeviceContext::Unmap per scrivere dati in queste risorse. Per ottenere le prestazioni più elevate per i dati utilizzati in modo seriale, ad esempio i dati dei vertici, usare la sequenza di D3D11_MAP_WRITE_NO_OVERWRITE e D3D11_MAP_WRITE_DISCARD . Per altre informazioni su questa sequenza, vedere Utilizzo comune delle D3D11_MAP_WRITE_DISCARD con D3D11_MAP_WRITE_NO_OVERWRITE.

D3D11_USAGE_IMMUTABLE l'utilizzo è un altro caso speciale che causa la generazione di dati da parte della GPU una sola volta quando si crea una risorsa. D3D11_USAGE_IMMUTABLE è adatto ai dati, ad esempio trame, perché tali dati vengono in genere letti in memoria da un formato di file. Pertanto, quando si crea una trama con D3D11_USAGE_IMMUTABLE, la GPU legge direttamente tale trama in memoria.

Usare la tabella seguente per scegliere l'utilizzo migliore che descrive in che modo la risorsa deve essere accessibile dalla CPU e/o dalla GPU. Naturalmente, ci saranno compromessi sulle prestazioni.

Resource Usage Default Dynamic Non modificabile Gestione temporanea
GPU-Read Sì¹
GPU-Write Sì¹
CPU-Read Sì¹
CPU-Write Sì¹
 

1 : la lettura o la scrittura della GPU di una risorsa con l'utilizzo di D3D11_USAGE_STAGING è limitata alle operazioni di copia. Si usa ID3D11DeviceContext::CopySubresourceRegion e ID3D11DeviceContext::CopyResource per queste operazioni di copia. Inoltre, poiché i formati di profondità e i layout multisample sono dettagli di implementazione di una determinata progettazione GPU, il sistema operativo non può esporre questi formati e layout alla CPU in generale. Pertanto, le risorse di staging non possono essere un buffer a stencil di profondità o una destinazione di rendering multicampionato.

Nota È possibile usare tecnicamente ID3D11DeviceContext::UpdateSubresource per copiare in una risorsa con qualsiasi utilizzo tranne D3D11_USAGE_IMMUTABLE. È tuttavia consigliabile usare ID3D11DeviceContext::UpdateSubresource per aggiornare solo una risorsa con D3D11_USAGE_DEFAULT. È consigliabile usare ID3D11DeviceContext::Map e ID3D11DeviceContext::Unmap per aggiornare le risorse con D3D11_USAGE_DYNAMIC perché è lo scopo specifico delle risorse di D3D11_USAGE_DYNAMIC e quindi il percorso più ottimizzato.
 
NotaD3D11_USAGE_DYNAMIC risorse utilizzano funzionalità hardware specifiche. Di conseguenza, usarli in modo spasimo. Il driver di visualizzazione in genere alloca memoria per D3D11_USAGE_DYNAMIC risorse con un algoritmo di memorizzazione nella cache che favorisca le scritture della CPU e impedisca le letture della CPU. Inoltre, la memoria dietro D3D11_USAGE_DYNAMIC risorse potrebbe anche non essere uguale per le chiamate successive a ID3D11DeviceContext::Map. Pertanto, non aspettarsi prestazioni elevate o anche letture coerenti della CPU da risorse D3D11_USAGE_DYNAMIC .
 
NotaID3D11DeviceContext::CopyStructureCount è un caso speciale di copia da GPU a CPU. Usare ID3D11DeviceContext::CopyStructureCount solo con viste di accesso non ordinate (UAV) di buffer.
 

Opzioni di associazione risorse

Per ottimizzare le prestazioni, non tutte le opzioni di utilizzo delle risorse possono essere usate come risorse di input o output nella pipeline. Questa tabella identifica queste limitazioni.
La risorsa può essere associata come Default Dynamic Non modificabile Gestione temporanea
Input in una fase Sì² Sì³
Output da una fase Sì²
 
  • 2 : se associato come input e un output usando visualizzazioni diverse, ogni visualizzazione deve usare origini secondarie diverse.
  • 3: la risorsa può essere creata solo con una singola sottoresource. La risorsa non può essere una matrice di trama. La risorsa non può essere una catena mipmap.

Requisiti

Requisito Valore
Intestazione d3d11.h

Vedi anche

Enumerazioni delle risorse