Stammsignatur, Version 1.1
Der Zweck der Stammsignatur, Version 1.1, besteht darin, Anwendungen die Angabe von Treibern zu ermöglichen, wenn Deskriptoren in einem Deskriptor-Heap nicht geändert werden oder die Datendeskriptoren nicht geändert werden. Auf diese Weise können Treiber Optimierungen vornehmen, die möglicherweise wissen, dass ein Deskriptor oder der Speicher, auf den er verweist, für einen bestimmten Zeitraum statisch ist.
- Übersicht
- statische und veränderliche Flags
- Version 1.1 API Summary
- Folgen eines Verstoßes gegen statische Kennzeichnungen
- Versionsverwaltung
- Verwandte Themen
Überblick
Die Stammsignaturversion 1.0 ermöglicht den Inhalt von Deskriptor-Heaps und dem Speicher, auf den sie verweisen, jederzeit von Anwendungen frei geändert zu werden, wenn Befehlslisten/Bündel, auf die sie verweisen, potenziell in Flight auf der GPU enthalten sind. Sehr häufig benötigen Anwendungen jedoch nicht die Flexibilität, Deskriptoren oder Arbeitsspeicher zu ändern, nachdem Befehle aufgezeichnet wurden, auf die verwiesen wird.
Anwendungen sind häufig trivial in der Lage,
- Richten Sie Deskriptoren (und mögliche Speicher, auf die sie verweisen) ein, bevor Sie Deskriptortabellen oder Stammbeschreibungen für eine Befehlsliste oder ein Bündel binden.
- Stellen Sie sicher, dass diese Deskriptoren erst geändert werden, wenn die Befehlsliste /bundles, die darauf verweisen, die Ausführung für das letzte Mal abgeschlossen ist.
- Stellen Sie sicher, dass die Daten, auf die die Beschreibungen verweisen, nicht für die gleiche vollständige Dauer geändert werden.
Alternativ kann eine Anwendung nur berücksichtigen, dass sich die Daten nicht für eine kürzere Dauer in der Zeit ändern. Insbesondere können Daten für das Fenster während der Ausführung der Befehlsliste statisch sein, die derzeit auf die Daten verweist, wenn eine Stammparameterbindung (Deskriptortabelle oder Stammbeschreibung) auf die Daten verweist. Mit anderen Worten, eine Anwendung möchte möglicherweise die Ausführung auf der GPU-Zeitachse durchführen, die einige Daten zwischen Bestimmten Zeiträumen aktualisiert, in denen sie über einen Stammparameter festgelegt wird, wissen, dass es statisch ist, wenn sie festgelegt wird.
Wenn Deskriptoren oder die Datendeskriptoren zeigen, sich nicht ändern, sind die spezifischen Optimierungstreiber möglicherweise hardwarespezifische Anbieter, und wichtig, dass sie das Verhalten nicht ändern, als möglicherweise die Leistung zu verbessern. Die Beibehaltung von so viel Wissen über Anwendungsabsichten wie möglich macht keine Belastung für Anwendungen.
Eine Optimierung ist, dass viele Treiber effizientere Speicherzugriffe durch Shader erzeugen können, wenn sie die Zusagen kennen, die eine Anwendung über die Statik von Deskriptoren und Daten machen kann. Beispielsweise können Treiber eine Dereferenzierungsebene für den Zugriff auf einen Deskriptor in einem Heap entfernen, indem sie in einen Stammdeskriptor konvertiert wird, wenn die bestimmte Hardware nicht für die Stammargumentgröße sensibel ist.
Die zusätzliche Aufgabe für Entwickler, die Version 1.1 verwenden, besteht darin, Zusagen zur Volatilität und Statik von Daten zu machen, sodass Treiber die Optimierungen sinnvoll machen können. Entwickler müssen keine Zusagen hinsichtlich der Statik machen.
Die Stammsignaturversion 1.0 funktioniert weiterhin unverändert, obwohl Anwendungen, die Stammsignaturen neu kompilieren, jetzt standardmäßig auf "Stammsignatur 1.1" festgelegt werden (mit einer Option, version 1.0 bei Bedarf zu erzwingen).
Statische und veränderliche Flags
Die folgenden Flags sind Teil der Stammsignatur, um Treibern die Auswahl einer Strategie für die beste Behandlung einzelner Stammargumente zu ermöglichen, wenn sie festgelegt sind, und auch die gleichen Annahmen in Pipeline state Objects (PSOs) einbetten, wenn sie ursprünglich kompiliert werden – da die Stammsignatur Teil eines PSO ist.
Die folgenden Flags werden von der App festgelegt und gelten für Deskriptoren oder Daten.
typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS
{
D3D12_DESCRIPTOR_RANGE_FLAG_NONE = 0,
D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE = 0x1,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE = 0x2,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC = 0x8
} D3D12_DESCRIPTOR_RANGE_FLAGS;
typedef enum D3D12_ROOT_DESCRIPTOR_FLAGS
{
D3D12_ROOT_DESCRIPTOR_FLAG_NONE = 0,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE = 0x2,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC = 0x8
} D3D12_ROOT_DESCRIPTOR_FLAGS;
DESCRIPTORS_VOLATILE
Mit diesem Flagsatz können die Deskriptoren in einem Deskriptor-Heap, auf den eine Stammbeschreibungstabelle verweist, jederzeit von der Anwendung geändert werden, außer wenn die Befehlsliste/Bündel, die die Deskriptortabelle binden, übermittelt wurden und die Ausführung nicht abgeschlossen haben. Beispielsweise bezieht sich das Aufzeichnen einer Befehlsliste und anschließendes Ändern von Deskriptoren in einem Deskriptor heap auf , bevor Übermitteln der Befehlsliste für die Ausführung gültig ist. Dies ist das einzige unterstützte Verhalten der Stammsignatur, Version 1.0.
Wenn das DESCRIPTORS_VOLATILE Flag nicht festgelegt ist, sind Deskriptoren statisch. Für diesen Modus gibt es keine Kennzeichnung. Statische Deskriptoren bedeuten, dass die Deskriptoren in einem Deskriptor heap, auf den eine Stammbeschreibungstabelle verweist, nach dem Initialisieren der Deskriptortabelle für eine Befehlsliste/ein Bundle (während der Aufzeichnung) und die Deskriptoren erst geändert werden können, wenn die Ausführung der Befehlsliste/des Bundles zum letzten Mal abgeschlossen ist. Für Die Stammsignatur, Version 1.1, sind statische Deskriptoren die Standardannahme, und die Anwendung muss bei Bedarf das DESCRIPTORS_VOLATILE Flag angeben.
Bei Bündeln, die Deskriptortabellen mit statischen Deskriptoren verwenden, müssen die Deskriptoren ab dem Zeitpunkt der Aufzeichnung des Bundles (im Gegensatz zum Aufruf des Bundles) bereit sein und sich erst ändern, wenn das Bundle das letzte Mal ausgeführt wurde. Deskriptortabellen, die auf statische Deskriptoren verweisen, müssen während der Bundleaufzeichnung festgelegt und nicht in das Bundle geerbt werden. Es ist gültig für eine Befehlsliste, um eine Beschreibungstabelle mit statischen Deskriptoren zu verwenden, die in einem Bündel festgelegt und zurück zur Befehlsliste zurückgegeben wurden.
Wenn Deskriptoren statisch sind, gibt es eine weitere Änderung des Verhaltens, für die das DESCRIPTORS_VOLATILE Flag festgelegt werden muss. Außerhalb der Grenzen sind Zugriffe auf alle Pufferansichten (im Gegensatz zu Texture1D/2D/3D/Cube-Ansichten) ungültig und erzeugen nicht definierte Ergebnisse, einschließlich möglicher Gerätezurücksetzung, anstatt Standardwerte für Lese- oder Ablegen von Schreibvorgängen zurückzugeben. Der Zweck zum Entfernen der Möglichkeit für Anwendungen, von der Hardware außerhalb der Zugriffsüberprüfung abhängig zu sein, besteht darin, Treibern die Möglichkeit zu geben, statische Deskriptorzugriffe auf Stammdeskriptorzugriffe zu fördern, wenn sie dies effizienter erachen. Stammdeskriptoren unterstützen keine Außer-Grenzen-Überprüfung.
Wenn Anwendungen vom sicheren Speicherzugriffsverhalten beim Zugriff auf Deskriptoren abhängen, müssen sie die Deskriptorbereiche markieren, die auf diese Deskriptoren zugreifen, als DESCRIPTORS_VOLATILE.
DATA_VOLATILE
Mit diesem Flagsatz können die daten, auf die von Deskriptoren verwiesen wird, jederzeit von der CPU geändert werden, außer wenn die Befehlsliste /Bündel, die die Deskriptortabelle binden, übermittelt wurden und die Ausführung nicht abgeschlossen haben. Dies ist das einzige unterstützte Verhalten der Stammsignatur, Version 1.0.
Das Kennzeichen ist sowohl in Deskriptorbereichskennzeichnungen als auch in Stammbeschreibungskennzeichnungen verfügbar.
DATA_STATIC_WHILE_SET_AT_EXECUTE
Mit diesem Kennzeichensatz können die daten, auf die von Deskriptoren verwiesen wird, nicht geändert werden, wenn die zugrunde liegende Stammbeschreibungs- oder Deskriptortabelle während der Ausführung auf der GPU-Zeitachse festgelegt wird und wenn nachfolgende Ziehungen/Verteiler nicht mehr auf die Daten verweisen.
Bevor eine Stammbeschreibungs- oder Beschreibungstabelle für die GPU festgelegt wurde, können diese Daten auch durch dieselbe Befehlsliste/dasselbe Bundle geändert werden. Die Daten können auch geändert werden, während eine Stammbeschreibungs- oder Deskriptortabelle, die auf sie zeigt, weiterhin in der Befehlsliste/dem Bundle festgelegt ist, solange Draw/Dispatches, die darauf verweisen, abgeschlossen sind. Dies erfordert jedoch, dass die Deskriptortabelle erneut an die Befehlsliste gebunden wird, bevor die Stammbeschreibungs- oder Deskriptortabelle das nächste Mal abgeleitet wird. Dadurch kann der Treiber wissen, dass sich daten, auf die von einer Stammbeschreibungs- oder Deskriptortabelle verwiesen wurde, geändert haben.
Der wesentliche Unterschied zwischen DATA_STATIC_WHILE_SET_AT_EXECUTE und DATA_VOLATILE besteht darin, dass DATA_VOLATILE ein Treiber nicht erkennen kann, ob Datenkopien in einer Befehlsliste die Daten geändert haben, auf die ein Deskriptor verweist, ohne dass eine zusätzliche Zustandsnachverfolgung ausgeführt wird. Wenn ein Treiber z. B. eine beliebige Art von Daten vor dem Abrufen von Befehlen in die Befehlsliste einfügen kann (um den Shaderzugriff auf bekannte Daten effizienter zu machen, beispielsweise), DATA_STATIC_WHILE_SET_AT_EXECUTE dem Treiber mitteilen, dass er nur Daten vor dem Abrufen ausführen muss, sobald er über SetGraphicsRootDescriptorTablefestgelegt wird. SetComputeRootDescriptorTable oder einer der Methoden zum Festlegen der Konstantenpufferansicht, der Shaderressourcenansicht oder der nicht angeordneten Zugriffsansicht.
Bei Bündeln gilt die Zusage, dass Daten statisch sind, während sie bei der Ausführung festgelegt werden, für jede Ausführung des Bundles eindeutig.
Das Kennzeichen ist sowohl in Deskriptorbereichskennzeichnungen als auch in Stammbeschreibungskennzeichnungen verfügbar.
DATA_STATIC
Wenn dieses Flag festgelegt ist, wurden die daten, auf die von Deskriptoren verwiesen wird, durch den Zeitpunkt initialisiert, zu dem ein Stammdeskriptor oder eine Deskriptortabelle, die auf den Speicher verweist, während der Aufzeichnung auf eine Befehlsliste/ein Bundle festgelegt wurde, und die Daten können erst geändert werden, wenn die Ausführung der Befehlsliste/des Bundles zum letzten Mal abgeschlossen wurde.
Bei Bündeln beginnt die statische Dauer bei der Stammbeschreibungs- oder Deskriptortabelleneinstellung während der Aufzeichnung des Bündels im Gegensatz zur Aufzeichnung einer aufrufenden Befehlsliste. Darüber hinaus muss eine Beschreibungstabelle, die auf statische Daten zeigt, im Bundle festgelegt und nicht geerbt werden. Es ist gültig für eine Befehlsliste, um eine Deskriptortabelle zu verwenden, die auf statische Daten zeigt, die in einem Bündel festgelegt und zurück zur Befehlsliste zurückgegeben wurden.
Das Kennzeichen ist sowohl in Deskriptorbereichskennzeichnungen als auch in Stammbeschreibungskennzeichnungen verfügbar.
Kombinieren von Kennzeichnungen
Höchstens eines der DATA-Flags kann gleichzeitig angegeben werden, mit Ausnahme von Sampler-Deskriptorbereichen, die überhaupt keine DATENkennzeichnungen unterstützen, da Sampler nicht auf Daten verweisen.
Das Fehlen von DATENkennzeichnungen für SRV- und CBV-Deskriptorbereiche bedeutet, dass ein Standardverhalten von DATA_STATIC_WHILE_SET_AT_EXECUTE angenommen wird. Der Grund, warum diese Standardeinstellung ausgewählt wird, anstatt DATA_STATIC ist, dass DATA_STATIC_WHILE_SET_AT_EXECUTE für die Meisten Fälle viel wahrscheinlicher als sicherer Standardwert ist, während dennoch eine optimierungsmöglichkeit besser ist als die Standardeinstellung für DATA_VOLATILE.
Das Fehlen von DATA-Flags für UAV-Deskriptorbereiche bedeutet, dass ein Standardverhalten von DATA_VOLATILE angenommen wird, da in der Regel UAVs geschrieben werden.
DESCRIPTORS_VOLATILE können nicht mit DATA_STATIC kombiniert werden, aber können mit den anderen DATENkennzeichnungen kombiniert werden. Der Grund, DESCRIPTORS_VOLATILE mit DATA_STATIC_WHILE_SET_AT_EXECUTE kombiniert werden kann, besteht darin, dass veränderliche Deskriptoren während der Ausführung von Befehlslisten/Bundles immer noch bereit sind, und DATA_STATIC_WHILE_SET_AT_EXECUTE nur Zusagen über die Statik innerhalb einer Teilmenge der Befehlsliste/Bündelausführung machen.
Kennzeichnungszusammenfassung
In den folgenden Tabellen sind die Kennzeichenkombinationen zusammengefasst, die verwendet werden können.
Gültige D3D12_DESCRIPTOR_RANGE_FLAGS-Einstellungen | Beschreibung |
---|---|
Keine Kennzeichnungen festgelegt | Deskriptoren sind statisch (standard). Standardannahmen für Daten: für SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE und für UAV: DATA_VOLATILE. Diese Standardwerte für SRV/CBV passen sicher in die Verwendungsmuster für die Mehrzahl der Stammsignaturen an. |
DATA_STATIC | Sowohl Deskriptoren als auch Daten sind statisch. Dadurch wird das Potenzial für die Treiberoptimierung maximiert. |
DATA_VOLATILE | Deskriptoren sind statisch und die Daten sind veränderlich. |
DATA_STATIC_WHILE_SET_AT_EXECUTE | Deskriptoren sind statisch und Daten sind statisch, während sie bei der Ausführung festgelegt sind. |
DESCRIPTORS_VOLATILE | Deskriptoren sind veränderlich und Standardannahmen zu Daten: für SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE und für UAV: DATA_VOLATILE. |
DESCRIPTORS_VOLATILE | DATA_VOLATILE | Sowohl Deskriptoren als auch Daten sind veränderlich, was der Stammsignatur 1.0 entspricht. |
DESCRIPTORS_VOLATILE | DATA_STATIC_WHILE_SET_AT_EXECUTE | Deskriptoren sind veränderlich, beachten Sie jedoch, dass sie während der Ausführung der Befehlsliste immer noch nicht geändert werden können. Daher ist es gültig, die zusätzliche Deklaration zu kombinieren, dass Daten statisch sind, während sie während der Ausführung über die Stammdeskriptortabelle festgelegt werden . Die zugrunde liegenden Deskriptoren sind effektiv länger statisch, als die Daten als statisch versprochen werden. |
Gültige D3D12_ROOT_DESCRIPTOR_FLAGS-Einstellungen | Beschreibung |
---|---|
Keine Kennzeichnungen festgelegt | Standardannahmen für Daten: für SRV/CBV: DATA_STATIC_WHILE_SET_AT_EXECUTE und für UAV: DATA_VOLATILE. Diese Standardwerte für SRV/CBV passen sicher in die Verwendungsmuster für die Mehrzahl der Stammsignaturen an. |
DATA_STATIC | Daten sind statisch, das beste Potenzial für die Treiberoptimierung. |
DATA_STATIC_WHILE_SET_AT_EXECUTE | Daten sind statisch, während sie bei der Ausführung festgelegt sind. |
DATA_VOLATILE | Entspricht der Stammsignatur 1.0. |
Version 1.1-API-Zusammenfassung
Die folgenden API-Aufrufe aktivieren Version 1.1.
Enumerationen
Diese Enumerationen enthalten die Schlüsselkennzeichnungen zum Angeben der Deskriptor- und Datenvolatilität.
- D3D_ROOT_SIGNATURE_VERSION: Versions-IDs.
- D3D12_DESCRIPTOR_RANGE_FLAGS: Ein Flagbereich, der bestimmt, ob Deskriptoren oder Daten veränderlich oder statisch sind.
- D3D12_ROOT_DESCRIPTOR_FLAGS: ein ähnlicher Bereich von Flags wie D3D12_DESCRIPTOR_RANGE_FLAGS, mit der Ausnahme, dass nur Datenkennzeichnungen für Stammdeskriptoren gelten.
Strukturen
Aktualisierte Strukturen (ab Version 1.0) enthalten Verweise auf die Volatilität/statischen Flags.
D3D12_FEATURE_DATA_ROOT_SIGNATURE: Übergeben Sie diese Struktur an CheckFeatureSupport-, um die Unterstützung der Stammsignaturversion 1.1 zu überprüfen.
D3D12_VERSIONED_ROOT_SIGNATURE_DESC: Kann eine beliebige Version einer Stammsignaturbeschreibung enthalten und ist für die Verwendung mit den unten aufgeführten Serialisierungs-/Deserialisierungsfunktionen konzipiert.
Diese Strukturen entsprechen denen, die in Version 1.0 verwendet werden, mit dem Hinzufügen neuer Flags-Felder für Deskriptorbereiche und Stammbeschreibungen:
Funktionen
Die hier aufgeführten Methoden ersetzen die ursprünglichen D3D12SerializeRootSignature und D3D12CreateRootSignatureDeserializer Funktionen, da sie für jede Version der Stammsignatur konzipiert sind. Das serialisierte Formular wird an die CreateRootSignature-API übergeben. Wenn ein Shader mit einer Stammsignatur erstellt wurde, enthält der kompilierte Shader bereits eine serialisierte Stammsignatur.
- D3D12SerializeVersionedRootSignature: Wenn eine Anwendung die D3D12_VERSIONED_ROOT_SIGNATURE Datenstruktur prozedural generiert, muss sie das serialisierte Formular mithilfe dieser Funktion erstellen.
- D3D12CreateVersionedRootSignatureDeserializer : generiert eine Schnittstelle, die die deserialisierte Datenstruktur über GetUnconvertedRootSignatureDesczurückgeben kann.
Methodik
Die ID3D12VersionedRootSignatureDeserializer Schnittstelle wird erstellt, um die Stammsignaturdatenstruktur deserialisieren.
- GetRootSignatureDescAtVersion-: Konvertiert Stammsignaturbeschreibungsstrukturen in eine angeforderte Version.
- GetUnconvertedRootSignatureDesc: Gibt einen Zeiger auf eine D3D12_VERSIONED_ROOT_SIGNATURE_DESC Struktur zurück.
Hilfsstrukturen
Hilfsstrukturen wurden zur Unterstützung der Initialisierung einiger Der Version 1.1-Strukturen hinzugefügt.
- CD3DX12_DESCRIPTOR_RANGE1
- CD3DX12_ROOT_PARAMETER1
- CD3DX12_STATIC_SAMPLER1
- CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC
Weitere Informationen finden Sie unter Hilfsstrukturen und -funktionen für D3D12-.
Folgen von Verstößen gegen Statische-Ness-Flags
Die oben beschriebenen Deskriptoren und Datenkennzeichnungen (sowie die Standardwerte, die durch das Fehlen bestimmter Kennzeichen impliziert werden), definieren eine Zusage der Anwendung an den Treiber darüber, wie sie sich verhalten wird. Wenn eine Anwendung gegen die Zusage verstößt, ist dies ein ungültiges Verhalten: Ergebnisse sind nicht definiert und können über verschiedene Treiber und Hardware hinweg unterschiedlich sein.
Die Debugebene verfügt über Optionen zum Überprüfen, dass Anwendungen ihre Zusagen berücksichtigen, einschließlich der Standardzusagen, die mit der Stammsignaturversion 1.1 enthalten sind, ohne Kennzeichnungen festzulegen.
Versionsverwaltung
Beim Kompilieren von Stammsignaturen, die an Shader angefügt sind, werden neuere HLSL-Compiler standardmäßig die Stammsignatur unter Version 1.1 kompilieren, während alte HLSL-Compiler nur 1.0 unterstützen. Beachten Sie, dass 1.1-Stammsignaturen unter Betriebssystemen nicht funktionieren, die die Stammsignatur 1.1 nicht unterstützen.
Die mit einem Shader kompilierte Stammsignaturversion kann mithilfe von /force_rootsig_ver <version>
zu einer bestimmten Version gezwungen werden. Das Erzwingen der Version ist erfolgreich, wenn der Compiler das Verhalten der Stammsignatur beibehalten kann, die in der erzwungenen Version kompiliert wird, z. B. durch Ablegen nicht unterstützter Flags in der Stammsignatur, die nur zu Optimierungszwecken dienen, sich aber nicht auf das Verhalten auswirken.
Auf diese Weise kann eine Anwendung beispielsweise beim Erstellen der Anwendung eine 1.1-Stammsignatur in 1.0 und 1.1 kompilieren und die entsprechende Version zur Laufzeit auswählen, je nach Betriebssystemunterstützungsebene. Es wäre jedoch am effizientesten, dass eine Anwendung Stammsignaturen einzeln kompiliert (insbesondere, wenn mehrere Versionen erforderlich sind), getrennt von Shadern. Auch wenn Shader nicht anfänglich mit einer angefügten Stammsignatur kompiliert werden, kann der Vorteil der Compilerüberprüfung der Kompatibilität von Stammsignaturen mit einem Shader mithilfe der /verifyrootsignature
Compileroption beibehalten werden. Später zur Laufzeit können PSOs mithilfe von Shadern erstellt werden, die keine Stammsignaturen enthalten, während die gewünschte Stammsignatur (möglicherweise die vom Betriebssystem unterstützte version) als separater Parameter übergeben wird.
Verwandte Themen