Metodo ID3D12Device::CreatePlacedResource (d3d12.h)

Crea una risorsa inserita in un heap specifico. Le risorse posizionate sono gli oggetti risorsa più leggeri disponibili e sono il più veloce per creare e distruggere.

L'applicazione può riutilizzare la memoria video sovrapponendo più risorse Direct3D inserite e riservate nelle aree dell'heap. Il modello di riutilizzo della memoria semplice (descritto in Osservazioni) esiste per chiarire quale risorsa sovrapposta è valida in qualsiasi momento. Per ottimizzare il supporto degli strumenti grafici, l'ereditarietà dei dati del modello semplice non è supportata; e riquadri con granularità più fine e invalidazione delle risorse secondarie non sono supportati. Si verifica solo l'invalidazione completa delle risorse sovrapposte.

Sintassi

HRESULT CreatePlacedResource(
  ID3D12Heap                *pHeap,
  UINT64                    HeapOffset,
  const D3D12_RESOURCE_DESC *pDesc,
  D3D12_RESOURCE_STATES     InitialState,
  const D3D12_CLEAR_VALUE   *pOptimizedClearValue,
  REFIID                    riid,
  void                      **ppvResource
);

Parametri

pHeap

Tipo: [in] ID3D12Heap*

Puntatore all'interfaccia ID3D12Heap che rappresenta l'heap in cui viene inserita la risorsa.

HeapOffset

Tipo: UINT64

Offset, in byte, della risorsa. L'heapOffset deve essere un multiplo dell'allineamento della risorsa e HeapOffset più le dimensioni della risorsa devono essere inferiori o uguali alle dimensioni dell'heap. GetResourceAllocationInfo deve essere usato per comprendere le dimensioni delle risorse della trama.

pDesc

Tipo: [in] const D3D12_RESOURCE_DESC*

Puntatore a una struttura D3D12_RESOURCE_DESC che descrive la risorsa.

InitialState

Tipo: D3D12_RESOURCE_STATES

Lo stato iniziale della risorsa, come combinazione or bit per bit di D3D12_RESOURCE_STATES costanti di enumerazione.

Quando una risorsa viene creata insieme a un heap D3D12_HEAP_TYPE_UPLOAD , InitialState deve essere D3D12_RESOURCE_STATE_GENERIC_READ. Quando una risorsa viene creata insieme a un heap D3D12_HEAP_TYPE_READBACK , InitialState deve essere D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Tipo: [in, facoltativo] const D3D12_CLEAR_VALUE*

Specifica un D3D12_CLEAR_VALUE che descrive il valore predefinito per un colore chiaro.

pOptimizedClearValue specifica un valore per il quale le operazioni cancellate sono ottimali. Quando la risorsa creata è una trama con i flag D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET o D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL , l'applicazione deve scegliere il valore con cui verrà chiamata l'operazione cancellata.

Le operazioni di cancellazione possono essere chiamate con altri valori, ma queste operazioni non saranno altrettanto efficienti come quando il valore corrisponde a quello passato alla creazione di risorse.

pOptimizedClearValue deve essere NULL se usato con D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Tipo: REFIID

Identificatore univoco globale (GUID) per l'interfaccia della risorsa. Si tratta di un parametro di input.

È possibile ottenere l'ID REFIID o IL GUID dell'interfaccia alla risorsa usando la __uuidof macro . Ad esempio, __uuidof(ID3D12Resource) ottiene il GUID dell'interfaccia a una risorsa. Anche se riid è, in genere, il GUID per ID3D12Resource, può essere qualsiasi GUID per qualsiasi interfaccia. Se l'oggetto risorsa non supporta l'interfaccia per questo GUID, la creazione ha esito negativo con E_NOINTERFACE.

ppvResource

Tipo: [out, facoltativo] void**

Puntatore a un blocco di memoria che riceve un puntatore alla risorsa. ppvResource può essere NULL per abilitare il test delle funzionalità. Quando ppvResource è NULL, non verrà creato alcun oggetto e S_FALSE verrà restituito quando pResourceDesc e altri parametri sono validi.

Valore restituito

Tipo: HRESULT

Questo metodo restituisce E_OUTOFMEMORY se la memoria non è sufficiente per creare la risorsa. Per altri possibili valori restituiti, vedere Codici restituiti Direct3D 12 .

Commenti

CreatePlacedResource è simile al mapping completo di una risorsa riservata a un offset all'interno di un heap; ma anche lo spazio indirizzi virtuale associato a un heap può essere riutilizzato.

Le risorse inserite hanno un peso più leggero per creare e distruggere le risorse di cui è stato eseguito il commit. Ciò è dovuto al fatto che non viene creato alcun heap né eliminato definitivamente durante tali operazioni. Inoltre, le risorse inserite consentono una tecnica di peso ancora più leggera per riutilizzare la memoria rispetto alla creazione e alla distruzione delle risorse, vale a dire riutilizzare tramite aliasing e barriere di aliasing. Più risorse posizionate possono sovrapporsi contemporaneamente nello stesso heap, ma solo una singola risorsa sovrapposta può essere usata alla volta.

Sono disponibili due semantiche di utilizzo delle risorse, un modello semplice e un modello avanzato. È consigliabile scegliere il modello semplice (ingrandisce il supporto degli strumenti grafici nell'ecosistema diversificato di GPU), a meno che non si trovi e fino a quando non si trova il modello avanzato per l'app.

Modello semplice

In questo modello è possibile considerare una risorsa inserita in uno dei due stati: attivo o inattivo. Non è valido per la GPU leggere o scrivere da una risorsa inattiva. Le risorse inserite vengono create nello stato inattivo.

Per attivare una risorsa con una barriera di aliasing in un elenco di comandi, l'applicazione deve passare la risorsa in D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore può essere lasciato NULL durante un'attivazione. Tutte le risorse che condividono la memoria fisica con la risorsa attivata diventano ora inattive, incluse le risorse inserite e riservate sovrapposte.

Le barriere di aliasing devono essere raggruppate e inviate insieme per ottimizzare l'efficienza.

Dopo l'attivazione, le risorse con flag di destinazione di rendering o stencil di profondità devono essere ulteriormente inizializzate. Vedere le note sull'inizializzazione delle risorse richiesta di seguito.

Note sull'inizializzazione delle risorse necessaria

Alcuni tipi di risorse richiedono comunque l'inizializzazione. Le risorse con flag di destinazione di rendering o stencil di profondità devono essere inizializzate con un'operazione non crittografata o una raccolta di copie di sottorisorse complete. Se è stata usata una barriera di aliasing per indicare la transizione tra due risorse con alias, l'inizializzazione deve verificarsi dopo la barriera di aliasing. Questa inizializzazione è ancora necessaria ogni volta che una risorsa sarebbe stata attivata nel modello semplice.

Le risorse inserite e riservate con i flag di destinazione di rendering o stencil di profondità devono essere inizializzate con una delle operazioni seguenti prima che siano supportate altre operazioni.

Le applicazioni devono preferire l'operazione più esplicita che comporta la minima quantità di texel modificati. Si considerino gli esempi seguenti.

  • L'uso di un buffer di profondità per risolvere la visibilità dei pixel richiede in genere che ogni texel di profondità inizi da 1,0 o 0. Pertanto, un'operazione Cancella deve essere l'opzione più efficiente per l'inizializzazione del buffer di profondità con alias.
  • Un'applicazione può usare una destinazione di rendering con alias come destinazione per il mapping del tono. Poiché il rendering dell'applicazione viene eseguito su ogni pixel durante il mapping del tono, DiscardResource deve essere l'opzione più efficiente per l'inizializzazione.

Modello avanzato

In questo modello è possibile ignorare l'astrazione dello stato attivo/inattivo. È invece necessario rispettare queste regole di livello inferiore.

  • Una barriera di aliasing deve essere compresa tra due diversi accessi alle risorse GPU della stessa memoria fisica, purché tali accessi si trovino nella stessa chiamata a ExecuteCommandLists .
  • La prima operazione di rendering per determinati tipi di risorsa con alias deve comunque essere un'inizializzazione, proprio come il modello semplice.

Le operazioni di inizializzazione devono essere eseguite su un'intera sottorisorsa o su una granularità di 64 KB. Un'intera inizializzazione di sottorisorsa è supportata per tutti i tipi di risorse. Una granularità di inizializzazione di 64 KB, allineata a un offset di 64 KB, è supportata per buffer e trame con il layout della trama 64KB_UNDEFINED_SWIZZLE o 64KB_STANDARD_SWIZZLE (fare riferimento a D3D12_TEXTURE_LAYOUT).

Note sulla barriera di aliasing

La barriera di aliasing può impostare NULL sia per pResourceAfter che per pResourceBefore. La definizione di coerenza della memoria di ExecuteCommandLists e una barriera di aliasing sono le stesse, in modo che due accessi con alias alla stessa memoria fisica non richiedano alcuna barriera di aliasing quando gli accessi si trovano in due diverse chiamate ExecuteCommandLists .

Per i modelli di utilizzo avanzati D3D12, la definizione di sincronizzazione di ExecuteCommandLists equivale a una barriera di aliasing. Di conseguenza, le applicazioni possono inserire una barriera di aliasing tra il riutilizzo della memoria fisica o assicurarsi che i due utilizzi alias della memoria fisica vengano eseguiti in due chiamate separate a ExecuteCommandLists.

La quantità di inattivazione varia in base alle proprietà delle risorse. Le trame con layout di memoria non definiti rappresentano il peggiore dei casi, perché l'intera trama deve essere attivata in modo atomico. Per due risorse sovrapposte con layout definiti, l'attivazione può comportare solo le aree allineate sovrapposte di una risorsa. L'ereditarietà dei dati può anche essere ben definita. Per altri dettagli, vedere Aliasing della memoria ed ereditarietà dei dati.

Requisiti

Requisito Valore
Piattaforma di destinazione Windows
Intestazione d3d12.h
Libreria D3D12.lib
DLL D3D12.dll

Vedi anche

CreateCommittedResource

CreateReservedResource

ID3D12Device

Heaps condivisi