Prädikation
Prädikation ist ein Feature, das es der GPU und nicht der CPU ermöglicht, zu bestimmen, ob ein Objekt nicht gezeichnet, kopiert oder verteilt werden kann.
Übersicht
Die typische Verwendung von Prädikationen ist die Verdeckung. Wenn ein begrenzungsfeld gezeichnet und verdeckt wird, hat das Zeichnen des Objekts selbst offensichtlich keinen Sinn. In dieser Situation kann das Zeichnen des Objekts "prädikatiert" werden, sodass es vom tatsächlichen Rendering durch die GPU entfernt wird.
Zunächst könnte dies über dem Standardtiefetest und einem frühen Tiefendurchlauf redudant erscheinen. Die Prädikation kann jedoch den Mehraufwand des Draw-Befehlszustands selbst sowie die Rasterung entfernen. Während ein früher Tiefendurchlauf unnötige Pixel entfernt, kann er dennoch Scheitelpunkt-, Hüllen-, Domänen- und Geometrie-Shader ausführen und den Eingabeassembler mit fester Funktion, den Mosaikator und den Rasterizer aufrufen. Durch Zeichnen eines einfachen Begrenzungsfelds oder eines ähnlichen — Begrenzungsvolumens, das einfacher zu verarbeiten und zu rastern ist als das echte Modell, vermeiden Sie unnötige — Rasterung und Verarbeitung.
Im Gegensatz zu Direct3D 11 ist die Prädikation von Abfragen entkoppelt und wird in Direct3D 12 erweitert, um einer Anwendung das Prädikat von Objekten basierend auf einer beliebigen Begründung zu ermöglichen, die der App-Entwickler entscheiden kann (nicht nur Verdeckung).
SetPredication
Die Prädikation kann basierend auf dem Wert von 64 Bits innerhalb eines Puffers festgelegt werden (siehe D3D12 _ PREDICATION _ OP).
Wenn die GPU einen SetPredication-Befehl ausführt, wird der Wert im Puffer ausgerichtet. Zukünftige Änderungen an den Daten im Puffer wirken sich nicht rückwirkend auf den Prädikationszustand aus.
Wenn der Eingabeparameter Buffer NULL ist, ist die Prädikation deaktiviert.
Prädikationshinweise sind in der Direct3D 12-API nicht vorhanden. - und -Prädikation sind für Direkt-, Compute- und Kopierbefehlslisten zulässig. Der Quellpuffer kann einen beliebigen Heaptyp aufweisen (Standard, Upload, Rücklesen, benutzerdefiniert).
Die Kernlaufzeit überprüft Folgendes:
- AlignedBufferOffset ist ein Vielfaches von 8 Bytes.
- Die Ressource ist ein Puffer.
- Der Vorgang ist ein gültiger Member der -Enumeration.
- SetPredication kann nicht innerhalb eines Pakets aufgerufen werden.
- Der Befehlslistentyp unterstützt prädikation.
- Der Offset überschreitet nicht die Puffergröße.
Die Debugebene gibt einen Fehler aus, wenn sich der Quellpuffer nicht im D3D12_RESOURCE_STATE_PREDICATION befindet (was mit D3D12_RESOURCE_STATE_INDIRECT_ARGUMENTund einfach einem Alias identisch ist).
Folgende Vorgänge können als Prädikat festgelegt werden:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle ist nicht selbst prädikatiert. Stattdessen werden einzelne Vorgänge aus der obigen Liste, die auf der Seite des Pakets enthalten sind, als Prädikat verwendet.
Die ID3D12GraphicsCommandList-Methoden ResolveQueryData, BeginQuery und EndQuery sind nicht prädikatiert.