Übersicht über Stammsignaturen
Eine Stammsignatur wird von der App konfiguriert und verknüpft Befehlslisten mit den Ressourcen, die die Shader benötigen. Die Grafikbefehlsliste enthält sowohl eine Grafik- als auch eine Computestammsignatur. Eine Computebefehlsliste verfügt einfach über eine Computestammsignatur. Diese Stammsignaturen sind unabhängig voneinander.
Stammparameter und -argumente
Eine Stammsignatur ähnelt einer API-Funktionssignatur. Sie bestimmt die Datentypen, die die Shader erwarten sollten, definiert jedoch nicht den tatsächlichen Arbeitsspeicher oder die tatsächlichen Daten. Ein Stammparameter ist ein Eintrag in der Stammsignatur. Die tatsächlichen Werte der zur Laufzeit festgelegten und geänderten Stammparameter werden als Stammargumente bezeichnet. Das Ändern der Stammargumente ändert die Daten, die von den Shadern gelesen werden.
Stammkonstanten, Deskriptoren und Tabellen
Die Stammsignatur kann drei Parametertypen enthalten: Stammkonstanten (in den Stammargumenten inlineierte Konstanten), Stammdeskriptoren (in den Stammargumenten enthaltene Deskriptoren) und Deskriptortabellen (Zeiger auf einen Deskriptorbereich im Deskriptorheap).
Die Stammkonstanten sind Inline-32-Bit-Werte, die im Shader als Konstantenpuffer angezeigt werden.
Die inlineden Stammdeskriptoren sollten Deskriptoren enthalten, auf die am häufigsten zugegriffen wird, sind jedoch auf CBVs und rohe oder strukturierte UAV- oder SRV-Puffer beschränkt. Ein komplexerer Typ, z. B. eine 2D-Textur-SRV, kann nicht als Stammdeskriptor verwendet werden. Stammdeskriptoren enthalten keine Größenbegrenzung, sodass es keine Out-of-Bounds-Überprüfung geben kann, im Gegensatz zu Deskriptoren in Deskriptorheaps, die eine Größe enthalten.
Deskriptortabelleneinträge in Stammsignaturen enthalten den Deskriptor, den HLSL-Shaderbindungsnamen und das Sichtbarkeitsflag. Details zu Shadernamen finden Sie unter Shadermodell 5.1 . Auf einiger Hardware kann es einen Leistungsgewinn geben, wenn nur Deskriptoren für die Shaderstufen sichtbar gemacht werden, für die sie erforderlich sind (siehe D3D12_SHADER_VISIBILITY).
Das Layout der Stammsignatur ist recht flexibel, mit einigen Einschränkungen für weniger leistungsfähige Hardware. Unabhängig von der Hardwareebene sollten Anwendungen immer versuchen, die Stammsignatur für maximale Effizienz so klein wie nötig zu machen. Anwendungen können darauf verzichten, mehr Deskriptortabellen in der Stammsignatur zu haben, aber weniger Platz für Stammkonstanten oder umgekehrt.
Der Inhalt der Stammsignatur (die Deskriptortabellen, Stammkonstanten und Stammdeskriptoren), die die Anwendung gebunden hat, wird automatisch vom D3D12-Treiber versioniert, wenn sich ein Teil des Inhalts zwischen Draw-Aufrufen (Grafik)/Dispatch (Compute) ändert. Daher erhält jeder Draw/Dispatch einen eindeutigen vollständigen Satz des Stammsignaturzustands.
Idealerweise gibt es Gruppen von Pipelinestatusobjekten (Pipeline State Objects, PSOs), die dieselbe Stammsignatur verwenden. Nachdem eine Stammsignatur für die Pipeline festgelegt wurde, können alle von ihr definierten Bindungen (Deskriptortabellen, Deskriptoren, Konstanten) einzeln festgelegt oder geändert werden, einschließlich vererbung in Bündel.
Eine App kann einen eigenen Kompromiss zwischen der gewünschten Anzahl von Deskriptortabellen und Inlinedeskriptoren (die mehr Platz in Anspruch nehmen, aber ein Indirekten entfernen) und Inlinekonstanten (die keine Indirektion aufweisen) in der Stammsignatur durchführen. Anwendungen sollten die Stammsignatur so sparsam wie möglich verwenden, indem sie auf anwendungsgesteuerten Arbeitsspeicher wie Heaps und Deskriptorheaps angewiesen sind, die auf sie zeigen, um Massendaten darzustellen.
Zugehörige Themen