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 die schnellsten, um sie zu erstellen und zu zerstören.

Ihre Anwendung kann den Videospeicher wiederverwenden, indem mehrere Direct3D-platzierte und reservierte Ressourcen in Heapregionen überlappen. Das einfache Wiederverwendungsmodell des Arbeitsspeichers (siehe Hinweise) dient dazu, zu klären, welche sich ü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 differenziertere Kachel- und Unterressourceninvalidierung wird nicht unterstützt. Es tritt nur eine vollständige überlappende Ressourceninvalidierung 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 Bytes für die Ressource. Das HeapOffset muss ein Vielfaches der Ausrichtung der Ressource sein, und HeapOffset und die Ressourcengröße müssen kleiner oder gleich der Heapgröße sein. GetResourceAllocationInfo muss verwendet werden, um die Größe der Texturressourcen zu verstehen.

pDesc

Typ: [in] const D3D12_RESOURCE_DESC*

Ein Zeiger auf eine D3D12_RESOURCE_DESC Struktur, die die Ressource beschreibt.

InitialState

Typ: D3D12_RESOURCE_STATES

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 InitialStateD3D12_RESOURCE_STATE_GENERIC_READ werden. Wenn eine Ressource zusammen mit einem D3D12_HEAP_TYPE_READBACK Heap erstellt wird, muss InitialStateD3D12_RESOURCE_STATE_COPY_DEST werden.

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 optimal sind. Wenn es sich bei der erstellten Ressource um eine Textur mit dem D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET - oder D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL-Flags handelt, 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 an die Ressourcenerstellung übergebenen Wert übereinstimmt.

pOptimizedClearValue muss NULL sein, wenn es mit D3D12_RESOURCE_DIMENSION_BUFFER verwendet wird.

riid

Typ: REFIID

Der globally unique Identifier (GUID) für die Ressourcenschnittstelle. Dies ist ein Eingabeparameter.

Die REFIID oder GUID der Schnittstelle zur Ressource kann mithilfe des __uuidof Makros abgerufen werden. Ruft beispielsweise __uuidof(ID3D12Resource) die GUID der Schnittstelle zu einer Ressource ab. Riid ist zwar am häufigsten die GUID für ID3D12Resource, kann jedoch 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_NOINTERFACE fehl.

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 .

Hinweise

CreatePlacedResource ähnelt dem vollständigen Zuordnen einer reservierten Ressource zu einem Offset innerhalb eines Heaps. der einem Heap zugeordnete virtuelle Adressraum kann jedoch auch wiederverwendet werden.

Platzierte Ressourcen sind leichter zu erstellen und zu zerstören als verpflichtete Ressourcen. 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 einfachere Technik zur Wiederverwendung von Arbeitsspeicher als die Erstellung und Zerstörung von Ressourcen– d. h. die Wiederverwendung durch Aliasing und Aliasing-Barrieren. Mehrere platzierte Ressourcen können sich auf demselben Heap gleichzeitig überlappen, aber nur eine einzelne überlappende Ressource kann gleichzeitig verwendet werden.

Es gibt zwei semantische Semantiken für die Ressourcennutzung: ein einfaches Modell und ein erweitertes Modell. Es wird empfohlen, das einfache Modell zu wählen (es maximiert die Unterstützung von Grafiktools über das unterschiedliche Ökosystem von GPUs hinweg), es sei denn, Sie und bis Sie feststellen, dass Sie das erweiterte Modell für Ihre App benötigen.

Einfaches Modell

In diesem Modell können Sie eine platzierte Ressource als in einem von zwei Zuständen betrachten: aktiv oder inaktiv. Es ist ungültig, dass die GPU eine inaktive Ressource liest oder schreibt. Platzierte Ressourcen werden im inaktiven Zustand erstellt.

Um eine Ressource mit einer Aliasbarriere 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 belassen werden. Alle Ressourcen, die den physischen Arbeitsspeicher mit der aktivierten Ressource gemeinsam nutzen, werden jetzt inaktiv, einschließlich überlappender platzierter und reservierter Ressourcen.

Aliasbarrieren sollten gruppiert und übermittelt werden, um die Effizienz zu maximieren.

Nach der Aktivierung müssen Ressourcen mit dem Renderziel oder der Tiefenschablonenflagge weiter initialisiert werden. Sehen Sie sich die Hinweise zur erforderlichen Ressourceninitialisierung unten an.

Hinweise zur erforderlichen Ressourceninitialisierung

Bestimmte Ressourcentypen müssen weiterhin initialisiert werden. Ressourcen mit dem Renderziel- oder Tiefenschablonenflag müssen entweder mit einem clear-Vorgang oder einer Sammlung vollständiger Unterressourcenkopien initialisiert werden. Wenn eine Aliasbarriere verwendet wurde, um den Übergang zwischen zwei aliasierten Ressourcen zu kennzeichnen, muss die Initialisierung nach der Aliasingbarriere erfolgen. Diese Initialisierung ist immer dann erforderlich, wenn eine Ressource im einfachen Modell aktiviert wurde.

Platzierte und reservierte Ressourcen mit dem Renderziel- oder Tiefenschablonenflag müssen mit einem der folgenden Vorgänge initialisiert werden, bevor andere Vorgänge unterstützt werden.

Anwendungen sollten den explizitsten Vorgang bevorzugen, der zu der geringsten Menge an geänderten Texels führt. Betrachten Sie die folgenden Beispiele.

  • Die Verwendung eines Tiefenpuffers zum Lösen der Pixelsichtbarkeit erfordert in der Regel, dass jeder Tiefentexel mit 1,0 oder 0 beginnt. Daher sollte ein Clear-Vorgang die effizienteste Option für die Aliastiefenpufferinitialisierung 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 beachten.

  • Eine Aliasbarriere muss zwischen zwei verschiedenen GPU-Ressourcenzugriffen desselben physischen Arbeitsspeichers liegen, solange sich diese Zugriffe innerhalb desselben ExecuteCommandLists-Aufrufs befinden.
  • Der erste Renderingvorgang für bestimmte Typen von aliasierten Ressourcen muss weiterhin 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 ausgeführt werden. Eine gesamte Unterressourceninitialisierung wird für alle Ressourcentypen unterstützt. Eine Initialisierungsgranularität von 64 KB, die auf einen 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 Aliasbarriere

Die Aliasbarriere kann NULL sowohl für pResourceAfter als auch für pResourceBefore festlegen. Die Definition der Speicherkohärenz von ExecuteCommandLists und eine Aliasingbarriere sind identisch, sodass zwei Aliaszugriffe auf denselben physischen Arbeitsspeicher keine Aliasbarriere benötigen, wenn sich die Zugriffe in zwei verschiedenen ExecuteCommandLists-Aufrufen befinden.

Bei erweiterten D3D12-Nutzungsmodellen entspricht die Synchronisierungsdefinition von ExecuteCommandLists einer Aliasbarriere. Daher können Anwendungen entweder eine Aliasbarriere zwischen der Wiederverwendung des physischen Arbeitsspeichers einfügen oder sicherstellen, dass die beiden aliasierten Nutzungen des physischen Arbeitsspeichers in zwei separaten Aufrufen von ExecuteCommandLists erfolgen.

Der Umfang der Inaktivierung variiert je nach Ressourceneigenschaften. Texturen mit undefinierten Speicherlayouts sind der schlechteste Fall, da die gesamte Textur atomar inaktiviert werden muss. Bei zwei überlappenden Ressourcen mit definierten Layouts kann die Inaktivierung nur zu überlappenden, ausgerichteten Regionen einer Ressource führen. Die Datenvererbung kann sogar gut definiert sein. Weitere Informationen finden Sie unter Speicheraliasing und Datenvererbung.

Anforderungen

Anforderung Wert
Zielplattform Windows
Kopfzeile d3d12.h
Bibliothek D3D12.lib
DLL D3D12.dll

Weitere Informationen

CreateCommittedResource

CreateReservedResource

ID3D12Device

Freigegebene Heaps