Abfragen
In Direct3D 12 werden Abfragen in Arrays von Abfragen gruppiert, die als Abfrageheap bezeichnet werden. Ein Abfrageheap verfügt über einen Typ, der die gültigen Arten von Abfragen definiert, die mit diesem Heap verwendet werden können.
- Unterschiede in Abfragen von Direct3D 11 zu Direct3D 12
- Abfrageheaps
- Erstellen von Abfrageheaps
- Extrahieren von Daten aus einer Abfrage
- Zugehörige Themen
Unterschiede in Abfragen von Direct3D 11 zu Direct3D 12
Die folgenden Abfragetypen sind in Direct3D 12 nicht mehr vorhanden, da ihre Funktionalität in andere Prozesse integriert wird:
- Ereignisabfragen : Ereignisfunktional wird jetzt von Zäunen behandelt.
- Nicht zusammenhängende Zeitstempelabfragen : GPU-Uhren können in Direct3D 12 auf einen stabilen Zustand festgelegt werden (siehe Abschnitt Timing ). GPU-Taktvergleiche sind nicht sinnvoll, wenn die GPU zwischen den Zeitstempeln überhaupt im Leerlauf ist (als disjoint-Abfrage bezeichnet). Mit stabilem Power-Two-Zeitstempel sind Abfragen, die aus verschiedenen Befehlslisten ausgegeben werden, zuverlässig vergleichbar. Zwei Zeitstempel innerhalb derselben Befehlsliste sind immer zuverlässig vergleichbar.
- Abfragen der Streamausgabestatistik : In Direct3D 12 gibt es keine SO-Überlaufabfrage (Single Stream Output) für alle Ausgabedatenströme. Apps müssen mehrere Einzeldatenstromabfragen ausgeben und dann die Ergebnisse korrelieren.
- Datenstromausgabestatistik-Prädikat- und Okklusions-Prädikatabfragen – Abfragen (die in den Arbeitsspeicher schreiben) und Prädication (die aus dem Arbeitsspeicher gelesen werden) sind nicht mehr gekoppelt, sodass diese Abfragetypen nicht mehr benötigt werden.
Direct3D 12 wurde ein neuer Abfragetyp für binäre Okklusionen hinzugefügt. Dadurch können Prädicationsstrategien, die nur darauf achten, ob ein Objekt vollständig verworren wurde oder nicht (und nicht, wie viele Pixel verworren wurden), dies für das Gerät angeben, das die Abfragen möglicherweise effizienter ausführen kann.
Abfrageheaps
Abfragen können aus mehreren Typen (D3D12_QUERY_HEAP_TYPE) stammen und in Abfrageheaps gruppiert werden, bevor sie an die GPU gesendet werden.
Ein neuer Abfragetyp D3D12_QUERY_TYPE_BINARY_OCCLUSION ist verfügbar und verhält sich wie D3D12_QUERY_TYPE_OCCLUSION, mit dem Unterschied, dass er ein binäres 0/1-Ergebnis zurückgibt: 0 gibt an, dass keine Stichprobentiefe und Schablonentests bestanden haben, 1 gibt an, dass mindestens ein Beispiel die Tiefe und schablonentests bestanden hat. Dadurch können Okklusionsabfragen keine GPU-Leistungsoptimierung im Zusammenhang mit Tiefen-/Schablonentests beeinträchtigen.
Erstellen von Abfrageheaps
Die für das Erstellen von Abfrageheaps relevanten APIs sind die Enumeration D3D12_QUERY_HEAP_TYPE, die Struktur D3D12_QUERY_HEAP_DESC und die CreateQueryHeap-Methode.
Die Core Runtime überprüft, ob der Abfrageheaptyp ein gültiges Element der D3D12_HEAP_TYPE-Enumeration ist und dass die Anzahl größer als 0 ist.
Jedes einzelne Abfrageelement innerhalb eines Abfrageheaps kann separat gestartet und beendet werden.
Die APIs für die Verwendung der Abfrageheaps sind die Enumeration D3D12_QUERY_TYPE und die Methoden BeginQuery und EndQuery.
D3D12_QUERY_TYPE_TIMESTAMP ist die einzige Abfrage, die nur EndQuery unterstützt. Alle anderen Abfragetypen erfordern BeginQuery und EndQuery.
Die Debugebene überprüft Folgendes:
- Es ist unzulässig, eine Zeitstempelabfrage zu starten– Sie können sie nur beenden.
- Es ist unzulässig, eine Abfrage zweimal zu starten, ohne sie zu beenden (für ein bestimmtes Element). Bei Abfragen, die sowohl "begin" als auch "end" erfordern, ist es unzulässig, eine Abfrage vor dem entsprechenden Start (für ein bestimmtes Element) zu beenden.
- Der an BeginQuery übergebene Abfragetyp muss mit dem an EndQuery übergebenen Abfragetyp übereinstimmen.
Die Core Runtime überprüft Folgendes:
BeginQuery kann nicht für eine Zeitstempelabfrage aufgerufen werden.
Für die Abfragetypen, die sowohl BeginQuery als auch EndQuery (alle mit Ausnahme des Zeitstempels) unterstützen, darf eine Abfrage für ein bestimmtes Element keine Befehlslistengrenzen umfassen.
ElementIndex muss sich innerhalb des Bereichs befinden.
Der Abfragetyp ist ein gültiges Element der D3D12_QUERY_TYPE Enumeration.
Der Abfragetyp muss mit dem Abfrageheap kompatibel sein. Die folgende Tabelle zeigt den Abfrageheaptyp, der für jeden Abfragetyp erforderlich ist:
Abfragetyp Abfrageheaptyp D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS Der Abfragetyp wird vom Befehlslistentyp unterstützt. Die folgende Tabelle zeigt, welche Abfragen für welche Befehlslistentypen unterstützt werden.
Abfragetyp Unterstützte Befehlslistentypen D3D12_QUERY_TYPE_OCCLUSION Direkt D3D12_QUERY_TYPE_BINARY_OCCLUSION Direkt D3D12_QUERY_TYPE_TIMESTAMP Direct, Compute und optional Kopieren D3D12_QUERY_TYPE_PIPELINE_STATISTICS Direkt D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Direkt D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Direkt D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Direkt D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Direkt
Extrahieren von Daten aus einer Abfrage
Die Methode zum Extrahieren von Daten aus einer Abfrage besteht darin, die ResolveQueryData-Methode zu verwenden. ResolveQueryData funktioniert mit allen Arbeitsspeichertypen (unabhängig davon, ob es sich um Systemspeicher oder lokalen Gerätespeicher handelt), erfordert jedoch, dass sich die Zielressource in D3D12_RESOURCE_STATE_COPY_DEST befindet.