Delen via


Predicatie

Predicatie is een functie waarmee de GPU in plaats van de CPU kan worden bepaald dat een object niet kan worden getekend, gekopieerd of verzonden.

Overzicht

Het typische gebruik van predicatie is met occlusie; als een begrenzingsvak wordt getekend en occluded is, is er duidelijk geen punt in het tekenen van het object zelf. In deze situatie kan de tekening van het object worden 'predicated', waardoor het verwijderen van de werkelijke rendering door de GPU mogelijk is.

In het begin lijkt dit misschien overbodig boven en boven de standaarddieptetest plus een vroege dieptepas. Maar predicatie kan de overhead van de opdrachtstatus tekenen zelf verwijderen, plus de rasterisatie. Hoewel een vroege dieptepas overbodige pixels verwijdert, kan het nog steeds hoekpunt- en romp-, domein- en geometrie-shaders uitvoeren en de invoerassemblyer met vaste functies, tesselator en rasterizer aanroepen. Door een eenvoudig begrenzingsvak of vergelijkbaar begrenzingsvolume te tekenen, wat eenvoudiger is om te verwerken en te rasteren dan het echte model, vermijdt u onnodige rasterisering en verwerking.

In tegenstelling tot Direct3D 11 wordt predicatie losgekoppeld van query's en wordt uitgebreid in Direct3D 12 om een toepassing in staat te stellen objecten te prediceren op basis van een redenering waar de app-ontwikkelaar op kan beslissen (niet alleen occlusie).

SetPredication

Predicatie kan worden ingesteld op basis van de waarde van 64 bits binnen een buffer (raadpleeg D3D12_PREDICATION_OP).

Wanneer de GPU een SetPredication opdracht uitvoert, wordt de waarde in de buffer uitgelijnd. Toekomstige wijzigingen in de gegevens in de buffer beïnvloeden niet met terugwerkende kracht de predicatiestatus.

Als de invoerparameterbuffer NULL is, wordt predicatie uitgeschakeld.

Predicatiehints zijn niet aanwezig in de Direct3D 12-API; en predicatie is toegestaan op direct- en reken- en kopieeropdrachtenlijsten. De bronbuffer kan zich in elk heap-type bevinden (standaard, uploaden, teruglezen, aangepast).

De kernruntime valideert het volgende:

  • AlignedBufferOffset is een veelvoud van 8 bytes
  • De resource is een buffer
  • De bewerking is een geldig lid van de opsomming
  • SetPredication kan niet worden aangeroepen vanuit een bundel
  • Het type opdrachtlijst ondersteunt predicatie
  • De offset overschrijdt niet de buffergrootte

De foutopsporingslaag veroorzaakt een fout als de bronbuffer zich niet in de D3D12_RESOURCE_STATE_PREDICATION bevindt (wat hetzelfde is als D3D12_RESOURCE_STATE_INDIRECT_ARGUMENTen gewoon een aliasstatus).

De reeks bewerkingen die kunnen worden geprediceerd, zijn:

ExecuteBundle- is niet voorafgegaan door een predicatie. In plaats daarvan worden afzonderlijke bewerkingen uit de bovenstaande lijst die zich aan de zijkant van de bundel bevinden, geprediceerd.

De methoden ID3D12GraphicsCommandList ResolveQueryData, BeginQuery- en EndQuery- zijn niet geprediceerd.

tellers en query's

prestatiemeting

overzicht van predicatiequery's