D3D12 verfügt über 4 verschiedene Arten von Befehlslisten: Direkt, Bündeln, Berechnen und Kopieren.
Vulkan hat ähnliche Konzepte, aber sie passieren auf andere Weise. Befehlspuffer werden aus Befehlspools zugewiesen. Befehlspools sind direkt einer Warteschlangenfamilie zugeordnet. Aus einem Pool zugewiesene Befehlspuffer können nur an die Warteschlangenfamilie gesendet werden, für die der Pool erstellt wurde.
Warteschlangenfamilien geben die Arten von Vorgängen an, die die Warteschlange ausführen kann: Grafik-, Rechen- oder Speicherkopiervorgänge. Die Befehlswarteschlangen von D3D12 haben ein ähnliches Konzept, aber in der Befehlslisten-API von D3D12 müssen Sie den Listentyp angeben. Vulkan's erhält diese Informationen von der Warteschlangenfamilie, für die der Pool bestimmt ist.
Der D3D12-Befehlslistentyp "Bundle" scheint auf der Oberfläche den sekundären Vulkan-Befehlspuffern ähnlich zu sein. Sie sind jedoch ganz anders.
Der Hauptunterschied besteht darin, dass Bundles den gesamten Status von ihrer Liste der ausgeführten direkten Befehle erben , mit Ausnahme des gebundenen PSO selbst. Dies umfasst Ressourcendeskriptorbindungen.
Sekundäre Vulkan-Befehlspuffer erben keinen Status von ihrer Ausführungsumgebung für den primären Befehlspuffer, mit Ausnahme von sekundären CBs, die in einem Unterpass einer Renderpass-Instanz (und Abfragen) ausgeführt werden. Und diese erben nur den aktuellen Subpass-Status (und Abfragen).
Dies bedeutet, dass Sie im Vergleich zu D3D-Bundles andere Dinge mit ihnen tun.
Bundles werden manchmal verwendet, um Deskriptortabellen zu ändern und Inhalte zu rendern, unter der Annahme, dass die direkte Befehlsliste, in der sie ausgeführt werden, diese Tabellen eingerichtet hat. Bundles ähneln also leichten OpenGL-Anzeigelisten, nur ohne all die schlechten Dinge, die diese tun. Die Absicht bei Bundles ist also, dass Sie sie einmal erstellen und behalten. Sie sollen kleine Dinge sein.
Sekundäre Vulkan-CBs sind für die Thread-Erstellung von Befehlen für eine einzelne Render-Pass-Instanz unerlässlich. Dies liegt daran, dass eine Renderpassinstanz nur innerhalb einer primären CB erstellt werden kann. Für eine optimale Verwendung von Threads muss es daher eine Möglichkeit geben, Befehle zu erstellen, die in demselben Subpass in verschiedenen Threads ausgeführt werden sollen. Dies ist einer der Hauptanwendungsfälle von sekundären CBs. Die Absicht ist also, dass Sie wahrscheinlich in jedem Frame sekundäre CBs erstellen (obwohl Sie sie wiederverwenden können, wenn Sie möchten).
Letztendlich sollen Bundles und sekundäre CBs separate Probleme lösen. Bundles sind im Allgemeinen von der ausführenden Umgebung abhängig, während sekundäre CBs eigenständiger sind.
Gleichzeitig können sekundäre Vulkan-CBs etwas tun, was Bundles nicht können: Sie können in Warteschlangen nur für Computer ausgeführt werden. Da Vulkan zwischen der primären / sekundären Ebene des Befehlspuffers und den Warteschlangen unterscheidet, an die diese CB gesendet werden kann, ist es in Vulkan möglich, sekundäre Befehlspuffer zu haben, die in Warteschlangen nur für Berechnungen oder nur zum Kopieren ausgeführt werden.
Direct3D 12 kann das nicht mit Bundles machen. Die ExecuteBundle
Funktion kann nur in einer direkten Befehlsliste aufgerufen werden. Eine Nur-Kopier-Befehlsliste kann also keine Bundles ausführen.
Zugegeben, da Vulkan außer dem Subpass-Status nichts zwischen sekundären CBs erbt und Rechen- / Kopiervorgänge keine Render-Durchgänge verwenden, kann nicht viel gewonnen werden, wenn solche Befehle eher in eine sekundäre als in eine primäre CB eingefügt werden .
D3D12 hat die gleiche Trennung zwischen Compute-Pipelines und Grafik-Pipelines wie Vulkan. Bei der Ausgabe von Befehlen verfügt D3D12 jedoch nur über einen Pipeline-Bindungspunkt, an den Sie jede Art von Pipeline binden können. Im Gegensatz dazu verfügt Vulkan über separate Bindungspunkte für Computer- und Grafik-Pipelines. Natürlich hat Vulkan keine unterschiedlichen Deskriptor-Bindungspunkte für sie, so dass sich die beiden Pipelines gegenseitig stören können. Wenn Sie jedoch die Ressourcennutzung sorgfältig planen, können Sie einen Versandvorgang aufrufen, ohne die Anforderungen der Grafikpipeline zu stören.
Insgesamt gibt es hier also keinen wirklichen Unterschied in der Pipeline-Architektur.