Metodo ID3D12Device::CreatePlacedResource (d3d12.h)

Crea una risorsa inserita in un heap specifico. Le risorse inserite sono gli oggetti risorsa più leggeri disponibili e sono i più veloci da creare e distruggere.

L'applicazione può riutilizzare la memoria video sovrapponendo più risorse direct3D inserite e riservate nelle aree 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, con la semplice ereditarietà dei dati del modello non è supportata; non sono supportati riquadri con granularità fine e invalidazione della sotto-risorsa. 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, alla risorsa. Il 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 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

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

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 cui le operazioni non crittografate 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 non crittografata.

Le operazioni di cancellazione possono essere chiamate con altri valori, ma tali 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 REFIIDo GUIDdell'interfaccia alla risorsa usando la macro __uuidof. 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 non riesce 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 i 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.

Osservazioni

CreatePlacedResource è simile al mapping completo di una risorsa riservata a un offset all'interno di un heap; ma anche lo spazio degli indirizzi virtuali 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 né eliminato alcun heap 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, ovvero il riutilizzo tramite aliasing e barriere di aliasing. Più risorse posizionate possono sovrapporsi contemporaneamente nello stesso heap, ma è possibile usare solo una singola risorsa sovrapposta alla volta.

Esistono due semantiche di utilizzo delle risorse inserite: un modello semplice e un modello avanzato. Ti consigliamo di scegliere il modello semplice (ottimizza il supporto degli strumenti grafici nell'ecosistema diversificato di GPU), a meno che non trovi e fino a quando non trovi il modello avanzato per la tua 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, che includono risorse inserite e riservate sovrapposte.

Le barriere di aliasing devono essere raggruppate e inviate insieme per massimizzare 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 della risorsa richiesta di seguito.

Note sull'inizializzazione della risorsa richiesta

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 complete di sottorisorse. 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 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 a 1,0 o 0. Pertanto, un'operazione Clear deve essere l'opzione più efficiente per l'inizializzazione del buffer di profondità con aliasing.
  • Un'applicazione può usare una destinazione di rendering con alias come destinazione per il mapping del tono. Poiché l'applicazione eseguirà il rendering su ogni pixel durante il mapping del tono, DiscardResource dovrebbe 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 ExecuteCommandLists chiamata.
  • La prima operazione di rendering in 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. Per tutti i tipi di risorse è supportata un'intera inizializzazione di sottorisorsa. 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 per pResourceAfter e pResourceBefore. La definizione di coerenza della memoria di ExecuteCommandLists e una barriera di aliasing sono uguali, in modo che due accessi con alias alla stessa memoria fisica non richiedano alcuna barriera di aliasing quando gli accessi si trovano in due ExecuteCommandLists chiamate.

Per i modelli di utilizzo avanzati D3D12, la definizione di sincronizzazione di ExecuteCommandLists equivale a una barriera di aliasing. Pertanto, le applicazioni possono inserire una barriera di aliasing tra il riutilizzo della memoria fisica o assicurarsi che i due utilizzi con alias della memoria fisica si verifichino 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 sono il caso peggiore, perché l'intera trama deve essere disattivata in modo atomico. Per due risorse sovrapposte con layout definiti, l'disattivazione può comportare solo le aree allineate sovrapposte di una risorsa. L'ereditarietà dei dati può anche essere ben definita. Per altre informazioni, vedere Aliasing della memoria e ereditarietà dei dati.

Fabbisogno

Requisito Valore
piattaforma di destinazione Finestre
intestazione d3d12.h
libreria D3D12.lib
dll D3D12.dll

Vedere anche

CreateCommittedResource

CreateReservedResource

ID3D12Device

heap condivisi