Verwenden einer Stammsignatur
Die Stammsignatur ist die Definition einer beliebig angeordneten Auflistung von Deskriptortabellen (einschließlich ihres Layouts), Stammkonstanten und Stammdeskriptoren. Jeder Eintrag hat Kosten in Bezug auf einen maximalen Grenzwert, sodass die Anwendung das Gleichgewicht zwischen der Anzahl der einzelnen Eintragstypen, die die Stammsignatur enthalten wird, abwägen kann.
Die Stammsignatur ist ein Objekt, das durch manuelle Spezifikation in der API erstellt werden kann. Alle Shader in einem PSO müssen mit dem mit der PSO angegebenen Stammlayout kompatibel sein, andernfalls müssen die einzelnen Shader eingebettete Stammlayouts enthalten, die miteinander übereinstimmen. Andernfalls schlägt die PSO-Erstellung fehl. Eine Eigenschaft der Stammsignatur ist, dass Shader bei der Erstellung nichts darüber wissen müssen, obwohl Stammsignaturen bei Bedarf auch direkt in Shadern erstellt werden können. Vorhandene Shaderressourcen erfordern keine Änderungen, um mit Stammsignaturen kompatibel zu sein. Das Shadermodell 5.1 wurde eingeführt, um zusätzliche Flexibilität zu bieten (dynamische Indizierung von Deskriptoren innerhalb von Shadern) und kann nach Bedarf inkrementell von vorhandenen Shaderressourcen übernommen werden.
Befehlslistensemantik
Am Anfang einer Befehlsliste ist die Stammsignatur nicht definiert. Grafikshadierer verfügen über eine separate Stammsignatur vom Compute-Shader, die jeweils unabhängig in einer Befehlsliste zugewiesen sind. Die Stammsignatur, die für eine Befehlsliste oder ein Bündel festgelegt ist, muss auch mit dem derzeit festgelegten PSO unter Draw/Dispatch übereinstimmen. Andernfalls ist das Verhalten nicht definiert. Vorübergehende Stammsignaturkonflikte vor Draw/Dispatch sind in Ordnung, z. B. das Festlegen eines inkompatiblen PSO vor dem Wechsel zu einer kompatiblen Stammsignatur (sofern diese zum Zeitpunkt des Aufrufs von Draw/Dispatch kompatibel sind). Durch das Festlegen eines PSO wird die Stammsignatur nicht geändert. Die Anwendung muss eine dedizierte API aufrufen, um die Stammsignatur festzulegen.
Sobald eine Stammsignatur für eine Befehlsliste festgelegt wurde, definiert das Layout den Satz von Bindungen, die die Anwendung bereitstellen soll, und welche PSOs für die nächsten Draw/Dispatch-Aufrufe verwendet werden können (die mit demselben Layout kompiliert wurden). Beispielsweise kann eine Stammsignatur von der Anwendung so definiert werden, dass sie die folgenden Einträge aufweist. Jeder Eintrag wird als "Slot" bezeichnet.
- [0 ] Ein CBV-Deskriptor inline (Stammdeskriptoren)
- [1 ] Eine Deskriptortabelle mit 2 SRVs, 1 CBVs und 1 UAV
- [2 ] Eine Deskriptortabelle mit einem Sampler
- [3 ] Eine 4x32-Bit-Auflistung von Stammkonstanten
- [4 ] Eine Deskriptortabelle, die eine nicht angegebene Anzahl von SRVs enthält
In diesem Fall wird erwartet, dass die Anwendung vor dem Ausstellen von Draw/Dispatch die entsprechende Bindung auf jeden der Slots [ 0..4 festgelegt ] hat, die die Anwendung mit ihrer aktuellen Stammsignatur definiert hat. Beispielsweise muss an Slot 1 eine Deskriptortabelle gebunden werden. Dabei handelt es sich um [ ] einen zusammenhängenden Bereich in einem Deskriptorheap, der 2 SRVs, 1 CBVs und 1 UAV enthält (oder bei der Ausführung enthalten wird). Entsprechend müssen Deskriptortabellen auf die Slots [ 2 und 4 festgelegt ] [ ] werden.
Die Anwendung kann einen Teil der Stammsignaturbindungen gleichzeitig ändern (der Rest bleibt unverändert). Wenn sich z. B. nur eine der Konstanten in Slot 2 zwischen den Zeichnern ändern [ ] muss, muss die Anwendung neu bindungen. Wie bereits erwähnt, wird für den Treiber/die Hardware der gesamte Stammsignaturbindungsstatus bei der automatischen Änderung geändert. Wenn eine Stammsignatur in einer Befehlsliste geändert wird, werden alle vorherigen Stammsignaturbindungen veraltet, und alle neu erwarteten Bindungen müssen vor Draw/Dispatch festgelegt werden. Andernfalls ist das Verhalten nicht definiert. Wenn die Stammsignatur redundant auf dieselbe festgelegt ist, werden vorhandene Stammsignaturbindungen nicht veralten.
Bundlesemantik
Bundles erben die Stammsignaturbindungen der Befehlsliste (die Bindungen an die verschiedenen Slots im obigen Beispiel für die Befehlsliste). Wenn ein Paket einige der geerbten Stammsignaturbindungen ändern muss, muss es zuerst die Stammsignatur auf die gleiche wie die aufrufende Befehlsliste festlegen (die geerbten Bindungen werden nicht veraltet). Wenn das Paket die Stammsignatur so festlegt, dass sie sich von der aufrufenden Befehlsliste unterscheidet, hat dies die gleiche Auswirkung wie das Ändern der Stammsignatur in der oben beschriebenen Befehlsliste: Alle vorherigen Stammsignaturbindungen sind veraltet, und neu erwartete Bindungen müssen vor Draw/Dispatch festgelegt werden. Andernfalls ist das Verhalten nicht definiert. Wenn ein Paket keine Stammsignaturbindungen ändern muss, muss es die Stammsignatur nicht festlegen.
Der folgende Code zeigt einen Beispielaufruffluss in ein Bündel.
// Command List
...
pCmdList->SetGraphicsRootSignature(pRootSig); // new parameter space
MyEngine_SetTextures(); // bundle inherits descriptor table setting
MyEngine_SetAnimationFactor(fTime); // bundle inherits root constant
pCmdList->ExecuteBundle(...);
...
// Bundle
pBundle->SetGraphicsRootSignature(pRootSig); // same as caller, in order to inherits bindings
pBundle->SetPipelineState(pPS);
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,0,drawIDOffset);
pBundle->Draw(...); // using inherited textures / animation factor
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,1,drawIDOffset);
pBundle->Draw(...);
...
Wenn sie aus einem Bündel stammen, werden alle Änderungen am Stammlayout und/oder an bindungsänderungen, die ein Bündel vornimmt, an die Aufrufende Befehlsliste geerbt, wenn die Ausführung eines Pakets abgeschlossen ist.
Weitere Informationen zur Vererbung finden Sie im Abschnitt Vererbung des Grafikpipelinezustands unter Verwalten des Grafikpipelinezustands in Direct3D 12.