Share via


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 di selezione ed è occluso, ovviamente non c'è alcun punto nel disegno dell'oggetto stesso. In questo caso, il disegno dell'oggetto può essere "predicato", consentendone la rimozione dal rendering effettivo dalla GPU.

In un primo momento, questo potrebbe sembrare ridodante sopra e sopra il test di profondità standard più un passaggio di profondità iniziale. Tuttavia, la predicazione può rimuovere il sovraccarico dello stato del comando di disegno stesso, oltre alla rasterizzazione. Mentre un passaggio di profondità iniziale 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 di selezione 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, la predicazione viene disaccoppiata dalle query e viene espansa 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; il predicato e è consentito in elenchi di comandi diretti, di calcolo e di 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
  • Non è possibile 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 (che corrisponde allo stato D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT e semplicemente un alias).

Il set di operazioni che possono essere predicate sono:

ExecuteBundle non è predicato. Al contrario, le singole operazioni dell'elenco precedentemente contenute nel lato del bundle vengono predicate.

I metodi ID3D12GraphicsCommandList ResolveQueryData, BeginQuery e EndQuery non sono predicati.

Contatori e query

Misurazione delle prestazioni

Procedura dettagliata delle query di predicazione