Fragen
In Direct3D 12 werden Abfragen in Arrays von Abfragen gruppiert, die als Abfragehap bezeichnet werden. Ein Abfragehap verfügt über einen Typ, der die gültigen Typen von Abfragen definiert, die mit diesem Heap verwendet werden können.
- Unterschiede bei Abfragen von Direct3D 11 zu Direct3D 12
- Abfrage heaps
- Erstellen von Abfrage heaps
- Extrahieren von Daten aus einer Abfrage
- Verwandte Themen
Unterschiede bei Abfragen von Direct3D 11 zu Direct3D 12
Die folgenden Abfragetypen sind in Direct3D 12 nicht mehr vorhanden, ihre Funktionalität wird in andere Prozesse integriert:
- Ereignisabfragen – ereignisfunktionell wird jetzt von Zaunen behandelt.
- Nicht zusammenhängende Zeitstempelabfragen – GPU-Takte können in Direct3D 12 auf einen stabilen Zustand festgelegt werden (siehe abschnitt Anzeigedauer). GPU-Taktvergleiche sind nicht sinnvoll, wenn die GPU zwischen den Zeitstempeln (als nicht zusammenhängende Abfrage bezeichnet) überhaupt im Leerlauf liegt. Mit stabilen Power Two-Zeitstempelabfragen, die aus verschiedenen Befehlslisten ausgegeben wurden, sind zuverlässig vergleichbar. Zwei Zeitstempel innerhalb derselben Befehlsliste sind immer zuverlässig vergleichbar.
- Datenstromausgabeabfragen – in Direct3D 12 gibt es keine Einzige Streamausgabeabfrage (SO) für alle Ausgabedatenströme. Apps müssen mehrere Einzeldatenstromabfragen ausstellen und dann die Ergebnisse korrelieren.
- Datenstromausgabestatistik prädikat- und Okklusions-Prädikatabfragen - Abfragen (die in den Arbeitsspeicher schreiben) und Prädication (die aus dem Speicher gelesen werden) werden nicht mehr gekoppelt, und daher sind diese Abfragetypen nicht erforderlich.
Direct3D 12 wurde ein neuer binärer Okklusionsabfragetyp hinzugefügt. Dies ermöglicht Prädikationsstrategien, die nur darauf achten, ob ein Objekt vollständig verdeckt wurde oder nicht (und nicht, wie viele Pixel verdeckt wurden), um dies auf dem Gerät anzugeben, was die Abfragen möglicherweise effizienter ausführen kann.
Abfrage heaps
Abfragen können aus einer Reihe von Typen (D3D12_QUERY_HEAP_TYPE) stammen und in Abfragehaps gruppiert werden, bevor sie an die GPU übermittelt werden.
Ein neuer Abfragetyp D3D12_QUERY_TYPE_BINARY_OCCLUSION ist verfügbar und fungiert wie D3D12_QUERY_TYPE_OCCLUSION, mit der Ausnahme, dass es ein Binäres 0/1-Ergebnis zurückgibt: 0 gibt an, dass keine Beispiele tiefen- und Schablonentests bestanden haben, 1 gibt an, dass mindestens ein Beispiel tiefen- und Schablonentest bestanden hat. Dadurch können Okklusionsabfragen keine GPU-Leistungsoptimierung beeinträchtigen, die mit Tiefen-/Schablonentests verbunden ist.
Erstellen von Abfragehaps
Die APIs, die für das Erstellen von Abfrageheaps relevant sind, sind die Enumeration D3D12_QUERY_HEAP_TYPE, die Struktur D3D12_QUERY_HEAP_DESCund die Methode CreateQueryHeap.
Die Kernlaufzeit überprüft, ob der Abfragehaptyp ein gültiges Element der D3D12_HEAP_TYPE Enumeration ist und dass die Anzahl größer als 0 ist.
Jedes einzelne Abfrageelement innerhalb eines Abfragehaps kann separat gestartet und beendet werden.
Die APIs für die Verwendung der Abfragehaps sind die Enumeration D3D12_QUERY_TYPEund 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 beginnen – Sie können sie nur beenden.
- Es ist unzulässig, eine Abfrage zweimal zu beginnen, ohne sie zu beenden (für ein bestimmtes Element). Bei Abfragen, die sowohl "beginnen" als auch "enden" erfordern, ist es unzulässig, eine Abfrage vor dem entsprechenden Anfang (für ein bestimmtes Element) zu beenden.
- Der an BeginQuery übergebene Abfragetyp muss mit dem an EndQueryübergebenen Abfragetyp übereinstimmen.
Die Kernlaufzeit überprüft Folgendes:
BeginQuery- kann nicht für eine Zeitstempelabfrage aufgerufen werden.
Für die Abfragetypen, die sowohl BeginQuery als auch EndQuery- (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 Abfragehap kompatibel sein. Die folgende Tabelle zeigt den Abfragehaptyp, der für jeden Abfragetyp erforderlich ist:
Abfragetyp Abfrage-Heaptyp 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. In der folgenden Tabelle wird gezeigt, 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 Copy 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 Möglichkeit zum Extrahieren von Daten aus einer Abfrage besteht darin, die ResolveQueryData--Methode zu verwenden. ResolveQueryData- funktioniert mit allen Speichertypen (unabhängig davon, ob sie Systemspeicher oder lokaler Gerätespeicher sind), aber die Zielressource muss sich in D3D12_RESOURCE_STATE_COPY_DESTbefinden.