Predicazione
Predicazione è una funzionalità che consente alla GPU anziché alla CPU di determinare di non disegnare, copiare o inviare un oggetto.
Panoramica
L'uso tipico della predicazione è con occlusione; se viene disegnato un rettangolo delimitatore ed è occluso, ovviamente non c'è alcun punto nel disegno dell'oggetto stesso. In questo caso, il disegno dell'oggetto può essere "predicato", abilitando la rimozione dal rendering effettivo dalla GPU.
In un primo momento, questo potrebbe sembrare ridondante oltre al test di profondità standard più un passaggio di profondità precoce. Ma il predicato può rimuovere il sovraccarico dello stato del comando di disegno stesso, oltre alla rasterizzazione. Mentre un passaggio di profondità precoce rimuove i pixel non necessari, può comunque eseguire vertex, hull, domain e geometry shader e richiamare l'assembler di input a funzione fissa, tesselator e rasterizer. Disegnando un semplice rettangolo delimitatore o un volume di delimitazione simile, che è più semplice da elaborare e rasterizzare rispetto al modello reale, è possibile evitare l'elaborazione e la rasterizzazione non necessarie.
A differenza di Direct3D 11, il predicato è disaccoppiato dalle query e viene espanso in Direct3D 12 per consentire a un'applicazione di predicare gli oggetti in base a qualsiasi ragionamento che lo sviluppatore dell'app può decidere (non solo l'occlusione).
SetPredication
Il predicato può essere impostato in base al valore di 64 bit all'interno di un buffer (fare riferimento a D3D12_PREDICATION_OP).
Quando la GPU esegue un comando SetPredication , blocca il valore nel buffer. Le modifiche future ai dati nel buffer non influiscono retroattivamente sullo stato del predicato.
Se il parametro di input Buffer è NULL, il predicato è disabilitato.
Gli hint di predicazione non sono presenti nell'API Direct3D 12; e il predicato sono consentiti in elenchi di comandi diretti, di calcolo e copia. Il buffer di origine può essere in qualsiasi tipo di heap (impostazione predefinita, caricamento, readback, personalizzato).
Il runtime di base convaliderà quanto segue:
- AlignedBufferOffset è un multiplo di 8 byte
- La risorsa è un buffer
- L'operazione è un membro valido dell'enumerazione
- Impossibile chiamare SetPredication dall'interno di un bundle
- Il tipo di elenco dei comandi supporta il predicato
- L'offset non supera le dimensioni del buffer
Il livello di debug genera un errore se il buffer di origine non si trova nel D3D12_RESOURCE_STATE_PREDICATION (uguale a D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT e semplicemente un alias).
Il set di operazioni che possono essere predicate sono:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle non è predicato. Al contrario, le singole operazioni dell'elenco precedente, contenute sul lato del bundle, sono predicate.
I metodi ID3D12GraphicsCommandList ResolveQueryData, BeginQuery e EndQuery non sono predicati.
Argomenti correlati