2016-05-17 13 views
2

Ich habe gerade angefangen, die neue DirectX 12 API zu lernen. Ich möchte eine Art Rendering-Engine auf dx12 schreiben und während der Initialisierung soll ich Deskriptor-Heaps erstellen. Das Problem dabei ist, dass ich zu diesem Zeitpunkt nicht weiß, wie viele Ressourcenansichten ich in Zukunft erstellen werde. z.B. Wenn ich einige Arten von Nachbearbeitungseffekten hinzufügen möchte, die eine Texturierung erfordern, muss ich Renderzielansichten für die Texturen erstellen, die ich rendere. Die Menge dieser RTVs kann jedoch variieren. Wie also erstellen Sie Deskriptor-Heaps, die groß genug sind, um mit jeder Situation fertig zu werden?DirectX 12 - Deskriptor Heaps

Irgendwelche Ratschläge?

+0

Warum verwenden Sie insbesondere DirectX 12? Sind Sie bereits ein Experte in Direct3D 11? –

+0

Ja, in den letzten zwei Jahren habe ich gelernt dx11 – Philinator

+0

Wann und wie Sie Ihre Deskriptor-Heaps verwalten, bleibt per definitionem Ihnen in DX 12 überlassen. Wenn Sie Ihre eigene Version der DirectX 11-Runtime schreiben möchten, dann ist DirectX 12 Sie :) –

Antwort

2

Die Idee mit Deskriptorhaufen ist eine große GPU sichtbar zu haben, und eine Reihe von CPU sichtbar. es ist, weil SetDescriptorHeaps eine kostspielige Operation ist, möchten Sie es nicht mehr als ein- oder zweimal einen Rahmen nennen.

Sie müssen den großen sichtbaren GPU-Heap als Ringpuffer verwenden und Raum für die aktuelle Zeichnung oder den Versand zuweisen, den Sie vorbereiten und von den verschiedenen sichtbaren CPD-Deskriptoren kopieren möchten. Sie können so viele CPU-sichtbare Deskriptor-Heaps haben, wie Sie möchten, es ist mehr oder weniger nur ein regulärer Zuordnungsumbruch in ein d3d-Objekt.

Die Kopie hat keinen Lebenszeitschutz und wird sofort von der CPU ausgeführt. Achten Sie darauf, keinen Deskriptor zu rollen, der möglicherweise noch auf der GPU verwendet wird.

Ich spreche hier über SRV und Sampler. RTV sind nur CPU-sichtbar, und Sie können beliebig viele Deskriptor-Heaps erstellen, einen Deskriptor, wenn Sie möchten, und den D3D-Objekt-Overhead nicht sonderlich interessiert, er hat keine Auswirkungen auf die Laufzeit.

+0

Gibt es wirklich keinen Overhead bei der Erstellung mehrerer Deskriptor-Heaps für Render-Zielansichten? – Philinator

+0

Sie meinen also, ich sollte einen sehr großen Heapspeicher für SRVs, UAVs und CBVs erstellen und einen neuen Heapspeicher für jede RTV erstellen? Bitte korrigieren Sie mich, wenn ich mich irre. – Philinator

+0

@Philinator Die RTV/DSV-Heaps dienen nur zur CPU-Nutzung, sie interagieren nicht mit der GPU, ihre Nummer spielt keine Rolle. Dies ist bei SRV/UAV/CBV und Sampler nicht der Fall. Ein Aufruf von 'SetDescriptorHeaps' kann auf einer bestimmten Hardware kostspielig sein und sollte mit wechselnden Argumenten um jeden Preis vermieden werden. Ihre einzige Lösung besteht darin, die Deskriptoren in kleinen, sichtbaren Heap-Dateien zu erstellen, deren Anzahl zählt nicht, und rufen Sie dann 'CopyDescriptors' oder 'CopyDescriptorsSimple' auf die große GPU an der Verwendungsstelle. Aber ich paraphrasiere nur meine Antwort hier :) – galop1n