Für den Shader sichtbare Deskriptorheaps

Shader-Deskriptorheaps sind Deskriptorheaps, auf die von Shadern über Deskriptortabellen verwiesen werden kann.

Übersicht

Deskriptorheaps, auf die von Shadern über Deskriptortabellen verwiesen werden kann, gibt es in mehreren Varianten: Ein Heaptyp, D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAP, kann Shaderressourcenansichten, ungeordnete Zugriffsansichten und Konstante Puffersichten enthalten, die alle miteinander gemischt sind. Jeder angegebene Speicherort im Heap kann einer der aufgeführten Deskriptorentypen sein. Ein anderer Heaptyp, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, speichert nur Sampler, was die Tatsache widerspiegelt, dass Sampler für den Großteil der Hardware getrennt von SRVs, UAVs und CBVs verwaltet werden.

Deskriptor-Heaps dieser Typen können als Shader sichtbar oder nicht angefordert werden, wenn der Heap erstellt wird (letzteres – nicht Shader sichtbar – kann für Stagingdeskriptoren auf der CPU nützlich sein). Wenn der Shader sichtbar sein soll, kann jeder der oben genannten Heaptypen eine Hardwaregrößenbegrenzung für jede einzelne Deskriptor-Heapzuordnung aufweisen.

Anwendungen können eine beliebige Anzahl von Deskriptorheaps erstellen, und Nicht-Shader-Deskriptorheaps sind nicht in der Größe eingeschränkt. Wenn ein von der Anwendung erstellter Shader-Deskriptorheap kleiner als die Hardwaregrößenbegrenzung ist, kann der Treiber den Deskriptor-Heap aus einem größeren zugrunde liegenden Deskriptorheap unterteilen, sodass mehrere API-Deskriptorheaps in einen Hardwaredeskriptorheap passen. Der Grund dafür kann sein, dass für einige Hardware das Wechseln zwischen Hardwaredeskriptorheaps während der Ausführung eine GPU-Wartezeit im Leerlauf erfordert (um sicherzustellen, dass GPU-Verweise auf den zuvor deskriptorbasierten Heap abgeschlossen sind). Wenn alle deskriptor heaps, die eine Anwendung erstellt, in die maximalen Kapazitäten des entsprechenden Hardwareheaps passen, treten beim Wechseln der API-Deskriptorheaps während des Renderings keine solchen Wartezeiten auf. Anwendungen müssen jedoch die Möglichkeit zulassen, dass das Wechseln des aktuellen Deskriptorheaps zu einer Wartezeit im Leerlauf führen kann.

Um zu vermeiden, dass diese mögliche Wartezeit auf den Leerlauf auf dem Deskriptor-Heap-Switch beeinträchtigt wird, können Anwendungen Unterbrechungen beim Rendern nutzen, die die GPU aus anderen Gründen im Leerlauf verursachen würden, da die Zeit für deskriptor-Heapwechsel ist, da ohnehin eine Wartezeit auf den Leerlauf stattfindet.

Der Mechanismus und die Semantik zum Identifizieren von Deskriptorheaps zu Shadern während der Befehlsliste/Bündelaufzeichnung werden in der API-Referenz beschrieben.

Beispiel

Die folgende Abbildung zeigt zwei Deskriptorheaps, die auf zwei separate 2D-Texturen verweisen, die in zwei Slots eines großen Standardheaps gespeichert werden. Auf den Deskriptorheap, der als Shader sichtbar ist, kann die Grafikpipeline (einschließlich der Shader) zugreifen, und daher ist die 2D-Textur für die Pipeline verfügbar.

Heaps für sichtbare und nicht sichtbare Deskriptor

Hinweis

Für Deskriptorheaps gibt es häufig eine Obergrenze für die GPU-Hardware für den lokalen GPU-Arbeitsspeicher, der von der CPU geschrieben werden kann (als kombinierter Schreibspeicher bezeichnet). In der Regel liegt dieser Grenzwert bei etwa 96 MB für alle Prozesse. Ein Heap von einer Million Memberdeskriptor mit 32-GB-Deskriptoren würde beispielsweise 32 MB verbrauchen. Der Treiber greifen bei Bedarf auf den Systemspeicher zurück, es empfiehlt sich jedoch, keine große Anzahl großer Deskriptorheaps zu erstellen.

 

Deskriptorheaps