Festlegen und Auffüllen von Deskriptorheaps

Die Deskriptor-Heaptypen, die in einer Befehlsliste festgelegt werden können, sind diejenigen, die Deskriptoren enthalten, für die Deskriptortabellen verwendet werden können (höchstens jeweils eine nacheinander).

Festlegen von Deskriptorheaps

Die Typen von Deskriptorheaps, die in einer Befehlsliste festgelegt werden können, sind:

D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER

Die heaps, die in der Befehlsliste festgelegt werden, müssen auch als sichtbarer Shader erstellt worden sein. Es gibt drei Arten von Befehlslisten: DIRECT, BUNDLE und COMPUTE.

Nachdem ein Deskriptorheap für eine Befehlsliste festgelegt wurde, verweisen nachfolgende Aufrufe, die Deskriptortabellen definieren, auf den aktuellen Deskriptorheap. Der Deskriptortabellenstatus ist am Anfang einer Befehlsliste und nicht definiert, nachdem Deskriptorheaps in einer Befehlsliste geändert wurden. Das redundante Festlegen desselben Deskriptorheaps führt nicht dazu, dass die Deskriptortabelleneinstellungen undefiniert werden.

In einem Bundle können die Deskriptorheaps dagegen nur einmal festgelegt werden (redundante Aufrufe, die zweimal denselben Heap festlegen, führen nicht zu einem Fehler); andernfalls ist das Verhalten nicht definiert. Die deskriptor heaps, die festgelegt sind, müssen mit dem Zustand übereinstimmen, wenn eine Befehlsliste das Bündel aufruft. andernfalls ist das Verhalten nicht definiert. Dadurch können Bundles die Deskriptortabelleneinstellungen der Befehlsliste erben und bearbeiten. Bundles, die Deskriptortabellen nicht ändern (nur erben), müssen überhaupt keinen Deskriptor-Heap festlegen und erben nur von der aufrufenden Befehlsliste.

Wenn Deskriptor-Heaps festgelegt werden (mithilfe von ID3D12GraphicsCommandList::SetDescriptorHeaps), werden alle verwendeten Heaps in einem einzigen Aufruf festgelegt (und alle zuvor festgelegten Heaps werden vom Aufruf deaktiviert). Im Aufruf kann höchstens ein Heap jedes oben aufgeführten Typs festgelegt werden.

Auffüllen von Deskriptorheaps

Nachdem eine Anwendung einen Deskriptorheap erstellt hat, kann sie methoden auf dem Gerät verwenden, um Deskriptoren entweder direkt in den Heap zu generieren oder Deskriptoren von einem Ort an einen anderen zu kopieren.

Der anfängliche Inhalt des Deskriptor-Heapspeichers ist nicht definiert, sodass die Aufforderung an die GPU oder den Treiber, für das Rendering auf nicht initialisierten Arbeitsspeicher zu verweisen, zu nicht definierten Ergebnissen führen kann, z. B. eine Gerätezurücksetzung.

Wenn die Anwendung einen Deskriptorheap so konfiguriert, dass die CPU sichtbar ist, kann die CPU Methoden aufrufen, um Deskriptoren in den Heap zu erstellen und von Ort zu Ort (einschließlich heapsübergreifend) in einer unmittelbaren, freien Threadmethode zu kopieren. Wenn der Heap als SHADER_VISIBLE konfiguriert wurde, ist das Lesen durch die CPU nicht zulässig.

Deskriptorheaps