Verwenden von Deskriptoren direkt in der Stammsignatur
Um die Notwendigkeit zu vermeiden, einen Deskriptorheap zu durchlaufen, können Sie einen Deskriptor direkt in die Stammsignatur einfügen. Diese Deskriptoren nehmen viel Platz in der Stammsignatur ein (siehe Grenzwerte für Stammsignaturen), daher wird empfohlen, sie sparsam zu verwenden.
Eine Beispielverwendung besteht darin, im Stammlayout eine konstante Pufferansicht (CBV) zu platzieren, die sich pro Zeichnung ändert. Dies ist so, dass der Deskriptor-Heapraum nicht von der Anwendung pro Zeichnung zugewiesen werden muss (und eine Deskriptortabelle an der neuen Position im Deskriptorheap speichert). Indem sie etwas in die Stammsignatur eingibt, übergibt die Anwendung lediglich die Versionsverwaltungsverantwortung an den Treiber. Aber das ist die Infrastruktur, die Treiber bereits haben.
Für das Rendern mit sehr wenigen Ressourcen ist die Deskriptortabelle/heap-Verwendung möglicherweise überhaupt nicht erforderlich, wenn alle erforderlichen Deskriptoren direkt in der Stammsignatur platziert werden können.
Dies sind die einzigen Typen von Deskriptoren, die in der Stammsignatur unterstützt werden.
- Konstante Pufferansicht (CBVs).
- Shaderressourcensichten (SRVs) / Unordered Access Views (UAVs) von Pufferressourcen, bei denen keine Formatkonvertierung erforderlich ist (nicht typisierte Puffer). Einige Beispiele für nicht typisierte Puffer, die mit Stammdeskriptoren gebunden werden können, sind
StructuredBuffer<type>
,RWStructuredBuffer<type>
undRWByteAddressBuffer
ByteAddressBuffer
. Typisierte Puffer wieBuffer<uint>
undBuffer<float2>
können nicht. - SRVs von Raytracingbeschleunigungsstrukturen in lokalen oder globalen Stammsignaturen.
Einem UAV im Stamm können keine Leistungsindikatoren zugeordnet sein. Deskriptoren in der Stammsignatur werden jeweils als einzelne separate Deskriptoren angezeigt– sie können nicht dynamisch indiziert werden.
struct SceneData
{
uint foo;
float bar[2];
int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);
Im obigen Beispiel mySceneData
kann nicht als Array deklariert werden, als cbuffer mySceneData[2]
ob es einem Deskriptor in der Stammsignatur zugeordnet werden soll. Das liegt daran, dass die Indizierung über Deskriptoren hinweg in der Stammsignatur nicht unterstützt wird. Bei Bedarf können Sie einzelne Konstantenpuffer definieren und jeweils als separaten Eintrag in der Stammsignatur definieren. Beachten Sie, dass in mySceneData
oben ein Array bar[2]
vorhanden ist. Die dynamische Indizierung innerhalb des Konstantenpuffers ist gültig. Ein Deskriptor in der Stammsignatur verhält sich genauso wie derselbe Deskriptor, wenn der Zugriff über einen Deskriptorheap erfolgt. Dies steht im Gegensatz zu Inliningkonstanten direkt in der Stammsignatur, die auch wie ein Konstantenpuffer erscheint, mit der Ausnahme der Einschränkung, dass die dynamische Indizierung innerhalb der inlineden Konstanten nicht zulässig ist, also bar[2]
dort nicht zulässig wäre.
Diese APIs (über die ID3D12GraphicsCommandList-Schnittstelle ) dienen zum Festlegen von Deskriptoren direkt in der Stammsignatur.
- SetComputeRootConstantBufferView
- SetGraphicsRootConstantBufferView
- SetComputeRootShaderResourceView
- SetGraphicsRootShaderResourceView
- SetComputeRootUnorderedAccessView
- SetGraphicsRootUnorderedAccessView
Hinweis
Es gibt kein Konzept eines Stammdeskriptorarrays in Direct3D 12. Deskriptorarrays werden nur in Deskriptorheaps unterstützt.