Festlegen und Auffüllen von Deskriptorheaps

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

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 ebenfalls 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 Deskriptortabellenzustand ist am Anfang einer Befehlsliste und nach dem Ändern von Deskriptorheaps in einer Befehlsliste nicht definiert. Das redundante Festlegen desselben Deskriptorheaps führt nicht dazu, dass deskriptortabelleneinstellungen nicht definiert sind.

Im Gegensatz dazu können die Deskriptorheaps in einem Bündel nur einmal festgelegt werden (redundante Aufrufe, die den gleichen Heap zweimal festlegen, führen nicht zu einem Fehler). Andernfalls ist das Verhalten nicht definiert. Die festgelegten Deskriptorheaps müssen mit dem Zustand übereinstimmen, wenn eine Befehlsliste das Paket aufruft. Andernfalls ist das Verhalten nicht definiert. Dadurch können Bundles die Deskriptortabelleneinstellungen der Befehlsliste erben und bearbeiten. Bundles, die keine Deskriptortabellen ändern (nur sie erben), müssen überhaupt keinen Deskriptorheap festlegen und erben nur von der Aufrufenden Befehlsliste.

Wenn Deskriptorheaps festgelegt werden (mit ID3D12GraphicsCommandList::SetDescriptorHeaps),werden alle verwendeten Heaps in einem einzigen Aufruf festgelegt (und alle zuvor festgelegten Heaps werden durch den Aufruf nicht festgelegt). 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 Deskriptorheapspeichers ist nicht definiert. Daher kann die Aufforderung der GPU oder des Treibers, zum Rendern auf nicht initialisierten Speicher zu verweisen, zu nicht definierten Ergebnissen führen, z. B. zum Zurücksetzen des Geräts.

Wenn die Anwendung einen Deskriptorheap so konfiguriert, dass er von der CPU sichtbar ist, kann die CPU Methoden aufrufen, um Deskriptoren im Heap zu erstellen und von Ort zu Ort (einschließlich heapübergreifender) sofort und ohne Threading zu kopieren. Wenn der Heap als SHADER_VISIBLE konfiguriert wurde, ist das Lesen durch die CPU nicht zulässig.

Deskriptorheaps