Erweiterte Verwendung von Deskriptortabellen

Die folgenden Abschnitte enthalten Informationen zur erweiterten Verwendung von Deskriptortabellen.

Ändern von Deskriptortabelleneinträgen zwischen Renderingaufrufen

Nachdem die Befehlslisten, die Satzdeskriptortabellen zur Ausführung an eine Warteschlange übermittelt wurden, an eine Warteschlange übermittelt wurden, darf die Anwendung die Teile der Deskriptorheaps, auf die die GPU verweist, nicht von der CPU bearbeiten, bis die Anwendung weiß, dass die GPU die Verweise verwendet hat.

Der Abschluss der Arbeit kann mit API-Zäunen zum Nachverfolgen des GPU-Fortschritts oder groberen Mechanismen wie dem Warten darauf bestimmt werden, dass das Rendering zur Anzeige gesendet wurde – unabhängig davon, was für die Anwendung passt. Wenn eine Anwendung weiß, dass nur auf eine Teilmenge der Region zugegriffen wird, auf die eine Deskriptortabelle verweist (z. B. aufgrund der Flusssteuerung im Shader), können die anderen nicht referenzierten Deskriptoren weiterhin geändert werden. Wenn eine Anwendung zwischen verschiedenen Deskriptortabellen zwischen Renderingaufrufen wechseln muss, gibt es einige Ansätze, aus denen die Anwendung wählen kann:

  • Versionsverwaltung von Deskriptortabellen: Erstellen (oder Wiederverwenden) einer separaten Deskriptortabelle für jede eindeutige Auflistung von Deskriptoren, auf die von einer Befehlsliste verwiesen werden soll. Beim Bearbeiten und Wiederverwenden von zuvor aufgefüllten Bereichen auf Deskriptorheaps müssen Anwendungen zunächst sicherstellen, dass die GPU alle Teile eines Deskriptorheaps verwendet hat, die wiederverwendet werden.
  • Dynamische Indizierung: Anwendungen können Objekte, die je nach Draw/Dispatch (oder sogar innerhalb einer Zeichnung variieren) in einem Bereich eines Deskriptorheaps anordnen, eine Deskriptortabelle definieren, die sich über alle erstreckt, und aus dem Shader die dynamische Indizierung der Tabelle während der Shaderausführung verwenden, 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 Stammsignaturbereich begrenzt ist.

Die Verwendung der Deskriptortabellenversionsverwaltung bedeutet, dass der Deskriptorspeicher eines Deskriptorheaps für jeden eindeutigen Satz von Deskriptoren, auf die von der Grafikpipeline verwiesen wird, für jede Befehlsliste durchgebrannt werden muss, die entweder ausgeführt, in die Warteschlange gestellt oder zu einem bestimmten Zeitpunkt aufgezeichnet werden kann.

D3D12 überlässt der Anwendung die Verwaltung der Versionsverwaltung für die Objekttypen, die über Deskriptorheaps und Deskriptortabellen verwaltet werden. Ein Vorteil ist, dass Anwendungen den Inhalt von Deskriptortabellen so weit wie möglich wiederverwenden können, anstatt immer eine neue Deskriptortabellenversion für jede Befehlslistenübermittlung zu definieren. Die Stammsignatur ist ein Leerzeichen, das vom D3D12-Treiber automatisch erstellt wird.

Die Möglichkeit, mehrere Deskriptortabellen gleichzeitig an die Stammsignatur (und damit an die Pipeline) zu binden, ermöglicht Es Anwendungen, Sätze von Deskriptorbezügen bei Bedarf mit unterschiedlichen Frequenzen zu gruppieren und zu wechseln. Beispielsweise könnte eine Anwendung eine kleine Anzahl (vielleicht nur eine) von großen statischen Deskriptortabellen verwenden, die sich selten ändern, oder in denen Regionen im zugrunde liegenden Deskriptorheapspeicher nach Bedarf aufgefüllt werden, wobei die dynamische Indizierung aus dem Shader verwendet wird, um Texturen auszuwählen. Gleichzeitig könnte die Anwendung eine weitere Ressourcenklasse verwalten, bei der der Satz, auf den durch jeden Draw-Aufruf verwiesen wird, mithilfe der Deskriptortabellenversionsverwaltungsmethode von der CPU gewechselt wird.

Indizierung außerhalb der Grenzen

Die Indizierung einer beliebigen Deskriptortabelle aus dem Shader führt zu einem weitgehend undefinierten Speicherzugriff, einschließlich der Möglichkeit, beliebigen Prozessarbeitsspeicher zu lesen, als ob es sich um einen Hardwarezustandsdeskriptor handelt, und mit der Folge dessen zu leben, was die Hardware damit macht. Dies kann zu einer Zurücksetzung des Geräts führen, stürzt windows jedoch nicht ab.

Shaderderivate und divergente Indizierung

Wenn Pixelshaderaufrufe, die in einem 2x2-Stempel ausgeführt werden (um abgeleitete Berechnungen zu unterstützen), unterschiedliche Texturindizes auswählen, die aus einer Deskriptortabelle entnommen werden sollen, und wenn die ausgewählte Samplerkonfiguration und Textur für ein bestimmtes Pixel eine LOD-Berechnung aus Texturkoordinatenableitungen erfordert, erfolgt der LOD-Berechnungs- und Texturstichprobenprozess unabhängig von der Hardware für jede Textursuche im 2x2-Stempel. Dies wirkt sich auf die Leistung aus.

Deskriptortabellen