Erweiterte Verwendung von Deskriptortabellen

In den folgenden Abschnitten werden Informationen zur erweiterten Verwendung von Deskriptortabellen bereitgestellt.

Ändern von Tabelleneinträgen zwischen Renderaufrufen

Nachdem Befehlslisten, auf die Deskriptortabellen festgelegt wurden, an eine Warteschlange für die Ausführung übermittelt wurden, darf die Anwendung nicht aus der CPU die Teile der Descriptor-Heaps bearbeiten, auf die die GPU verweisen kann, bis die Anwendung weiß, dass die GPU die Verwendung der Verweise abgeschlossen hat.

Die Ausführung der Arbeit kann bei einer eng gebundenen Verbindung mit API-Zäunen zum Nachverfolgen des GPU-Fortschritts bestimmt werden, oder mehr grobe Mechanismen wie das Warten darauf, dass das Rendern an die Anzeige gesendet wurde - was immer der Anwendung entspricht. Wenn eine Anwendung weiß, dass nur eine Teilmenge der Region, auf die eine Deskriptortabelle verweist, auf die zugegriffen werden soll (z. B. aufgrund der Flusssteuerung im Shader), sind die anderen unreferenced descriptors weiterhin frei, geändert zu werden. Wenn eine Anwendung zwischen verschiedenen Descriptortabellen zwischen Renderingaufrufen wechseln muss, gibt es einige Ansätze, die die Anwendung auswählen kann:

  • Descriptor-Tabellenversioning: Erstellen (oder Wiederverwenden) einer separaten Deskriptortabelle für jede eindeutige Auflistung von Deskriptoren, auf die von einer Befehlsliste verwiesen werden soll. Beim Bearbeiten und Erneuten von zuvor aufgefüllten Bereichen auf Descriptor-Heaps müssen Anwendungen zuerst sicherstellen, dass die GPU alle Teile eines Descriptor-Heaps verwendet hat, die wiederverwendet werden.
  • Dynamische Indizierung: Anwendungen können Objekte anordnen, die in einem Bereich eines Descriptor-Heaps variieren( oder sogar innerhalb eines Zeichnens variieren), eine Descriptortabelle definieren, die sich auf alle elemente erstreckt und von dem Shader aus, verwenden Sie dynamische Indizierung der Tabelle während der Shaderausführung, um auszuwählen, welches Objekt verwendet werden soll.
  • Direktes Einfügen von Deskriptoren in die Stammsignatur. Nur eine sehr kleine Anzahl von Deskriptoren kann auf diese Weise verwaltet werden, da der Stammsignaturraum begrenzt ist.

Die Anwendung der Verwendung von Descriptor-Tabellenversioning besteht darin, dass der Deskriptorspeicher aus einem Descriptor-Heap für jede eindeutige Gruppe von Deskriptoren, auf die von der Grafikpipeline verwiesen wird, für jede Befehlsliste, die entweder ausgeführt, für die Ausführung in der Warteschlange oder zu jedem bestimmten Zeitpunkt aufgezeichnet werden kann, durchsucht werden muss.

D3D12 verlässt die Verantwortung für die Verwaltung der Versionierung an die Anwendung für die Objekttypen, die über Descriptor-Heaps und Deskriptortabellen verwaltet werden. Ein Vorteil davon ist, dass Anwendungen den Inhaltsinhalt von Deskriptortabellen so viel wie möglich wiederverwenden können, anstatt immer eine neue Descriptor-Tabellenversion für jede Befehlslistenübermittlung zu definieren. Die Stammsignatur ist ein Leerzeichen, das der D3D12-Treiber automatisch versionsiert.

Die Möglichkeit, mehrere Deskriptortabellen an die Stammsignatur (und somit an die Pipeline) zu binden, ermöglicht Anwendungen die Gruppierung und Umschalten von Deskriptorbezügen auf unterschiedliche Häufigkeiten, falls gewünscht. Beispielsweise könnte eine Anwendung eine kleine Zahl (vielleicht nur eine) von großen statischen Deskriptortabellen verwenden, die sich selten ändern oder in welchen Regionen im zugrunde liegenden Deskriptor-Heap-Speicher nach Bedarf gefüllt werden, wobei die Verwendung dynamischer Indizierung aus dem Shader zum Auswählen von Texturen verwendet wird. Gleichzeitig könnte die Anwendung eine andere Ressourcenklasse beibehalten, in der der satz, auf den jeder Zeichnungsaufruf verwiesen wird, mithilfe der Deskriptor-Tabellenversionstechnik von der CPU wechselt.

Indizierung von Grenzen

Die Indizierung einer beliebigen Deskriptortabelle aus dem Shader führt zu einem weitgehend nicht definierten Speicherzugriff, einschließlich der Möglichkeit, beliebiges In-Process-Speicher zu lesen, wie es sich um einen Hardwarestatusdeskriptor handelt und mit der Folge der Funktionsweise der Hardware mit diesem Vorgang lebt. Dadurch könnte ein Geräterücksetzung erzeugt werden, aber Windows nicht abstürzen.

Shader-Derivate und Divergentindexierung

Wenn Pixel-Shader-Aufrufe, die in einem 2x2-Stempel ausgeführt werden (um Derivateberechnungen zu unterstützen) verschiedene Texturindizes auswählen, die aus einer Deskriptortabelle stammen, und wenn die ausgewählte Samplerkonfiguration und -textur für jedes bestimmte Pixel eine LOD-Berechnung aus Texturkoordinatenderivaten erfordert, wird der LOD-Berechnungs- und Textur-Samplingprozess von der Hardware unabhängig für jede Textur-Nachschlagevorgang im 2x2-Stempel ausgeführt, Dies wirkt sich auf die Leistung aus.

Deskriptortabellen