Share via


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

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.