Übersicht über Stammsignaturen
Eine Stammsignatur wird von der App konfiguriert und verknüpft Befehlslisten mit den Ressourcen, die die Shader benötigen. Die Grafikbefehlsliste verfügt sowohl über eine Grafik- als auch über eine Computestammsignatur. Eine Computebefehlsliste verfügt einfach über eine Computestammsignatur. Diese Stammsignaturen sind voneinander unabhängig.
Stammparameter und -argumente
Eine Stammsignatur ähnelt einer API-Funktionssignatur, 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 von Stammparametern, die zur Laufzeit festgelegt und geändert werden, werden als Stammargumente bezeichnet. Durch das Ändern der Stammargumente werden die Daten geändert, die die Shader lesen.
Stammkonstanten, Deskriptoren und Tabellen
Die Stammsignatur kann drei Typen von Parametern enthalten: Stammkonstanten (konstanten inline in den Stammargumenten), Stammdeskriptoren (Inline in den Stammargumenten enthaltene Deskriptoren) und Deskriptortabellen (Zeiger auf einen Deskriptorbereich im Deskriptorheap).
Die Stammkonstanten sind 32-Bit-Inlinewerte, die im Shader als Konstantenpuffer angezeigt werden.
Die inline enthaltenen Stammdeskriptoren sollten Deskriptoren enthalten, auf die am häufigsten zugegriffen wird, ist jedoch auf CBVs und unformatierte 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ößenbeschränkung, sodass im Gegensatz zu Deskriptoren in Deskriptorheaps, die eine Größe enthalten, keine Überprüfung außerhalb der Grenzen erfolgen kann.
Deskriptortabelleneinträge in Stammsignaturen enthalten den Deskriptor, den HLSL-Shaderbindungsnamen und das Sichtbarkeitsflag. Ausführliche Informationen zu Shadernamen finden Sie unter Shadermodell 5.1. Bei einigen Hardwarekomponenten kann es zu Leistungssteigerungen kommen, wenn Deskriptoren nur für die Shaderstufen sichtbar gemacht werden, die sie erfordern (siehe D3D12 _ SHADER _ VISIBILITY).

Das Layout der Stammsignatur ist recht flexibel, wobei einige Einschränkungen für weniger fähige Hardware bestehen. Unabhängig von der Hardwareebene sollten Anwendungen immer versuchen, die Stammsignatur so klein wie nötig zu gestalten, um maximale Effizienz zu erzielen. Anwendungen können mehr Deskriptortabellen in der Stammsignatur aufweisen, aber weniger Platz für Stammkonstanten haben oder umgekehrt.
Der Inhalt der Stammsignatur (deskriptortabellen, Stammkonstanten und Stammdeskriptoren), die von der Anwendung gebunden wurde, wird automatisch vom D3D12-Treiber versionsgeändert, wenn sich ein Teil des Inhalts zwischen Draw-Aufrufen (Grafiken)/Dispatch-Aufrufen (Compute) ändert. Daher erhält jeder Draw/Dispatch einen eindeutigen vollständigen Satz von Stammsignaturstatus.
Im Idealfall gibt es Gruppen von Pipelinezustandsobjekten (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ündeln.
Eine App kann einen eigenen Kompromiss zwischen der Anzahl der Deskriptortabellen machen, die sie inlinedeskriptoren (die mehr Platz benötigen, aber eine Dekonstruktion entfernen) inlinekonstanten (die keine Dekonstruktion aufweisen) in der Stammsignatur wünschen. Anwendungen sollten die Stammsignatur so wenig wie möglich verwenden, indem sie sich auf anwendungsgesteuerten Speicher wie Heaps und Deskriptorheaps verlassen, die auf sie zeigen, um Massendaten darzustellen.