ID3D12Device::CreatePlacedResource-Methode (d3d12.h)
Erstellt eine Ressource, die in einem bestimmten Heap platziert wird. Platzierte Ressourcen sind die leichtesten verfügbaren Ressourcenobjekte und sind am schnellsten zu erstellen und zu zerstören.
Ihre Anwendung kann den Videospeicher wiederverwenden, indem sie mehrere Direct3D-Platzierte und reservierte Ressourcen in Heap-Regionen überlappen. Das modell für die erneute Verwendung des einfachen Arbeitsspeichers (in Anmerkungenbeschrieben) besteht darin, zu klären, welche überlappende Ressource zu einem bestimmten Zeitpunkt gültig ist. Um die Unterstützung von Grafiktools zu maximieren, wird die Datenvererbung des einfachen Modells nicht unterstützt. und eine differenzierte Kachel und eine ungültige Unterressource wird nicht unterstützt. Es tritt nur eine vollständige überlappende Ressourceninvaligierung auf.
Syntax
HRESULT CreatePlacedResource(
ID3D12Heap *pHeap,
UINT64 HeapOffset,
const D3D12_RESOURCE_DESC *pDesc,
D3D12_RESOURCE_STATES InitialState,
const D3D12_CLEAR_VALUE *pOptimizedClearValue,
REFIID riid,
void **ppvResource
);
Parameter
pHeap
Typ: [in] ID3D12Heap-*
Ein Zeiger auf die ID3D12Heap- Schnittstelle, die den Heap darstellt, in dem die Ressource platziert wird.
HeapOffset
Typ: UINT64-
Der Offset in Byte zur Ressource. Die HeapOffset- muss ein Vielfaches der Ausrichtung der Ressource sein, und HeapOffset- und die Ressourcengröße muss kleiner oder gleich der Heapgröße sein. GetResourceAllocationInfo- muss verwendet werden, um die Größe von Texturressourcen zu verstehen.
pDesc
Typ: [in] D3D12_RESOURCE_DESC*
Ein Zeiger auf eine D3D12_RESOURCE_DESC Struktur, die die Ressource beschreibt.
InitialState
Der Anfangszustand der Ressource als bitweise OR'd-Kombination aus D3D12_RESOURCE_STATES Enumerationskonstanten.
Wenn eine Ressource zusammen mit einem D3D12_HEAP_TYPE_UPLOAD Heap erstellt wird, muss InitialState-D3D12_RESOURCE_STATE_GENERIC_READwerden. Wenn eine Ressource zusammen mit einem D3D12_HEAP_TYPE_READBACK Heap erstellt wird, muss InitialState-D3D12_RESOURCE_STATE_COPY_DESTsein.
pOptimizedClearValue
Typ: [in, optional] const D3D12_CLEAR_VALUE*
Gibt einen D3D12_CLEAR_VALUE an, der den Standardwert für eine klare Farbe beschreibt.
pOptimizedClearValue gibt einen Wert an, für den klare Vorgänge am besten geeignet sind. Wenn die erstellte Ressource eine Textur mit dem D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET oder D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL Flags ist, sollte Ihre Anwendung den Wert auswählen, mit dem der clear-Vorgang am häufigsten aufgerufen wird.
Clear-Vorgänge können mit anderen Werten aufgerufen werden, aber diese Vorgänge sind nicht so effizient wie wenn der Wert mit dem Wert übereinstimmt, der an die Ressourcenerstellung übergeben wird.
pOptimizedClearValue muss NULL sein, wenn sie mit D3D12_RESOURCE_DIMENSION_BUFFERverwendet wird.
riid
Typ: REFIID-
Der global eindeutige Bezeichner (GUID) für die Ressourcenschnittstelle. Dies ist ein Eingabeparameter.
Die REFIIDoder GUID-der Schnittstelle zur Ressource kann mithilfe des __uuidof
-Makros abgerufen werden. Beispielsweise ruft __uuidof(ID3D12Resource)
die GUID- der Schnittstelle zu einer Ressource ab. Obwohl riid ist, ist die GUID für ID3D12Resource-, kann es sich um eine beliebige GUID- für jede Schnittstelle sein. Wenn das Ressourcenobjekt die Schnittstelle für diese GUID-nicht unterstützt, schlägt die Erstellung mit E_NOINTERFACEfehl.
ppvResource
Typ: [out, optional] void**
Ein Zeiger auf einen Speicherblock, der einen Zeiger auf die Ressource empfängt. ppvResource- kann NULL sein, um Funktionstests zu aktivieren. Wenn ppvResource- NULL ist, wird kein Objekt erstellt, und S_FALSE wird zurückgegeben, wenn pResourceDesc- und andere Parameter gültig sind.
Rückgabewert
Typ: HRESULT-
Diese Methode gibt E_OUTOFMEMORY zurück, wenn nicht genügend Arbeitsspeicher zum Erstellen der Ressource vorhanden ist. Weitere mögliche Rückgabewerte finden Sie unter Direct3D 12-Rückgabecodes.
Bemerkungen
CreatePlacedResource- ähnelt der vollständigen Zuordnung einer reservierten Ressource zu einem Offset innerhalb eines Heaps; der virtuelle Adressraum, der einem Heap zugeordnet ist, kann ebenfalls wiederverwendet werden.
Platzierte Ressourcen sind leichter zu erstellen und zu zerstören, als zugesicherte Ressourcen sind. Dies liegt daran, dass während dieser Vorgänge kein Heap erstellt oder zerstört wird. Darüber hinaus ermöglichen platzierte Ressourcen eine noch leichtere Gewichtungstechnik, um Speicher wiederzuverwenden als die Ressourcenerstellung und -zerstörung – d. h. durch Aliasing und Aliasing-Barrieren. Mehrere platzierte Ressourcen können sich auf demselben Heap gleichzeitig überlappen, aber es kann jeweils nur eine einzelne überlappende Ressource verwendet werden.
Es gibt zwei platzierte Ressourcenverwendungsemantik – ein einfaches Modell und ein erweitertes Modell. Es wird empfohlen, das einfache Modell auszuwählen (es maximiert die Unterstützung von Grafiktools über das vielfältige Ökosystem von GPUs hinweg), es sei denn, Sie stellen fest, dass Sie das erweiterte Modell für Ihre App benötigen.
Einfaches Modell
In diesem Modell können Sie eine platzierte Ressource in einem von zwei Zuständen berücksichtigen: aktiv oder inaktiv. Es ist ungültig, dass die GPU eine inaktive Ressource lesen oder schreiben kann. Platzierte Ressourcen werden im inaktiven Zustand erstellt.
Um eine Ressource mit einer Aliasingbarriere in einer Befehlsliste zu aktivieren, muss Ihre Anwendung die Ressource in D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfterübergeben. pResourceBefore- kann während einer Aktivierung NULL hinterlassen werden. Alle Ressourcen, die physischen Arbeitsspeicher für die aktivierte Ressource gemeinsam nutzen, werden jetzt inaktiv, einschließlich überlappender platzierter und reservierter Ressourcen.
Aliasingbarrieren sollten gruppiert und übermittelt werden, um die Effizienz zu maximieren.
Nach der Aktivierung müssen Ressourcen mit den Renderziel- oder Tiefenschablonenkennzeichnungen weiter initialisiert werden. Siehe die Hinweise zur erforderlichen Ressourceninitialisierung unten.
Hinweise zur erforderlichen Ressourceninitialisierung
Für bestimmte Ressourcentypen ist weiterhin initialisiert. Ressourcen mit dem Renderziel- oder Tiefenschablonenflaggen müssen entweder mit einem klaren Vorgang oder einer Sammlung vollständiger Unterressourcenkopien initialisiert werden. Wenn eine Aliasingbarriere verwendet wurde, um den Übergang zwischen zwei aliasierten Ressourcen zu kennzeichnen, muss die Initialisierung nach der Aliasing-Barriere erfolgen. Diese Initialisierung ist immer noch erforderlich, wenn eine Ressource im einfachen Modell aktiviert wurde.
Platzierte und reservierte Ressourcen mit dem Renderziel- oder Tiefenschablonenflaggen müssen mit einem der folgenden Vorgänge initialisiert werden, bevor andere Vorgänge unterstützt werden.
- Ein Vorgang löschen; beispiel ClearRenderTargetView oder ClearDepthStencilView.
- Ein DiscardResource--Vorgang.
- Ein Kopieren Vorgang; beispiel CopyBufferRegion, CopyTextureRegionoder CopyResource.
Anwendungen sollten den explizitsten Vorgang bevorzugen, der zu der geringsten Menge von Texeln führt, die geändert wurden. Sehen Sie sich die folgenden Beispiele an.
- Die Verwendung eines Tiefenpuffers zum Lösen der Pixelsichtbarkeit erfordert in der Regel, dass jeder Tiefen texel mit 1,0 oder 0 beginnt. Daher sollte ein Löschen Vorgangs die effizienteste Option für die Alias-Tiefenpufferinitialisierung sein.
- Eine Anwendung kann ein aliasiertes Renderziel als Ziel für die Tonzuordnung verwenden. Da die Anwendung während der Tonzuordnung über jedes Pixel gerendert wird, sollte DiscardResource- die effizienteste Option für die Initialisierung sein.
Erweitertes Modell
In diesem Modell können Sie die Abstraktion des aktiven/inaktiven Zustands ignorieren. Stattdessen müssen Sie diese Regeln auf niedrigerer Ebene berücksichtigen.
- Eine Aliasingbarriere muss zwischen zwei verschiedenen GPU-Ressourcenzugriffen desselben physischen Speichers liegen, solange sich diese Zugriffe innerhalb desselben ExecuteCommandLists Aufruf befinden.
- Der erste Renderingvorgang für bestimmte Arten von aliasierten Ressourcen muss dennoch eine Initialisierung sein, genau wie das einfache Modell.
Initialisierungsvorgänge müssen entweder für eine gesamte Unterressource oder für eine Granularität von 64 KB auftreten. Eine gesamte Unterressourceninitialisierung wird für alle Ressourcentypen unterstützt. Eine Granularität der 64 KB-Initialisierung, die an einem Offset von 64 KB ausgerichtet ist, wird für Puffer und Texturen mit dem 64KB_UNDEFINED_SWIZZLE- oder 64KB_STANDARD_SWIZZLE Texturlayout unterstützt (siehe D3D12_TEXTURE_LAYOUT).
Hinweise zur Aliasing-Barriere
Die Aliasingbarriere kann SOWOHL für pResourceAfter- als auch für pResourceBefore-NULL festlegen. Die Definition der Speicherkohärenz von ExecuteCommandLists und eine Aliasing-Barriere sind identisch, sodass zwei aliasierte Zugriffe auf denselben physischen Speicher keine Aliasingbarriere benötigen, wenn sich die Zugriffe in zwei verschiedenen ExecuteCommandLists Aufrufe befinden.
Bei erweiterten D3D12-Verwendungsmodellen entspricht die Synchronisierungsdefinition von ExecuteCommandLists einer Aliasingbarriere. Daher können Anwendungen entweder eine Aliasingbarriere zwischen dem erneuten Verwenden des physischen Speichers einfügen oder sicherstellen, dass die beiden aliasierten Verwendungen des physischen Speichers in zwei separaten Aufrufen von ExecuteCommandListsauftreten.
Die Anzahl der Inaktivierung variiert je nach Ressourceneigenschaften. Texturen mit nicht definierten Speicherlayouts sind im schlimmsten Fall, da die gesamte Textur atomar deaktiviert werden muss. Bei zwei überlappenden Ressourcen mit definierten Layouts kann die Inaktivierung nur zu den überlappenden ausgerichteten Bereichen einer Ressource führen. Die Datenvererbung kann sogar gut definiert werden. Weitere Informationen finden Sie unter Speicheraliasing und Datenvererbung.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Fenster |
Header- | d3d12.h |
Library | D3D12.lib |
DLL- | D3D12.dll |