Query

In Direct3D 12 le query vengono raggruppate in matrici di query denominate heap di query. Un heap di query ha un tipo che definisce i tipi validi di query che possono essere usati con tale heap.

Differenze nelle query da Direct3D 11 a Direct3D 12

I tipi di query seguenti non sono più presenti in Direct3D 12 e le relative funzionalità vengono incorporate in altri processi:

  • Query di eventi : l'evento è ora gestito da recinti.
  • Query timestamp non contigue : gli orologi GPU possono essere impostati su uno stato stabile in Direct3D 12 (vedere la sezione Intervallo ). I confronti di clock GPU non sono significativi se la GPU è inattiva tra i timestamp (nota come query non contigua). Con una potenza stabile due query timestamp eseguite da elenchi di comandi diversi sono confrontabili in modo affidabile. Due timestamp all'interno dello stesso elenco di comandi sono sempre confrontabili in modo affidabile.
  • Query di statistiche di output di flusso: in Direct3D 12 non è presente alcuna query di overflow di output del flusso singolo (SO) per tutti i flussi di output. Le app devono eseguire più query a flusso singolo e quindi correlare i risultati.
  • Eseguire il predicato delle statistiche di output di flusso e le query predicate di occlusione : query (che scrivono in memoria) e Predicazione (che leggono dalla memoria) non sono più associate e quindi questi tipi di query non sono necessari.

È stato aggiunto un nuovo tipo di query di occlusione binaria a Direct3D 12. Ciò consente strategie di predicazione che interessano solo se un oggetto è stato completamente o meno occluso (anziché quanti pixel sono stati occlusi) per indicare questo al dispositivo, che potrebbe essere in grado di eseguire in modo più efficiente le query.

Heap di query

Le query possono essere una di diversi tipi (D3D12_QUERY_HEAP_TYPE) e vengono raggruppate in heap di query prima di essere inviate alla GPU.

Un nuovo tipo di query D3D12_QUERY_TYPE_BINARY_OCCLUSION è disponibile e agisce come D3D12_QUERY_TYPE_OCCLUSION ad eccezione del fatto che restituisce un risultato binario 0/1: 0 indica che nessun campione ha superato il test di profondità e stencil, 1 indica che almeno un campione ha superato il test di profondità e stencil. In questo modo, le query di occlusione non interferiscono con l'ottimizzazione delle prestazioni della GPU associata al test depth/stencil.

Creazione di heap di query

Le API rilevanti per la creazione di heap di query sono l'enumerazione D3D12_QUERY_HEAP_TYPE, lo struct D3D12_QUERY_HEAP_DESC e il metodo CreateQueryHeap.

Il runtime di base convaliderà che il tipo di heap della query sia un membro valido dell'enumerazione D3D12_HEAP_TYPE e che il conteggio sia maggiore di 0.

Ogni singolo elemento di query all'interno di un heap di query può essere avviato e arrestato separatamente.

Le API per l'uso degli heap di query sono l'enumerazione D3D12_QUERY_TYPE e i metodi BeginQuery e EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP è l'unica query che supporta solo EndQuery . Tutti gli altri tipi di query richiedono BeginQuery e EndQuery.

Il livello di debug convaliderà quanto segue:

  • Non è possibile avviare una query timestamp. È possibile terminarla solo
  • È illegale iniziare una query due volte senza terminarla (per un determinato elemento). Per le query che richiedono sia inizio che fine, è illegale terminare una query prima dell'inizio corrispondente (per un determinato elemento).
  • Il tipo di query passato a BeginQuery deve corrispondere al tipo di query passato a EndQuery.

Il runtime di base convaliderà quanto segue:

  • BeginQuery non può essere chiamato in una query timestamp.

  • Per i tipi di query che supportano sia BeginQuery che EndQuery (tutti tranne timestamp), una query per un determinato elemento non deve estendersi ai limiti dell'elenco di comandi.

  • ElementIndex deve essere compreso nell'intervallo.

  • Il tipo di query è un membro valido dell'enumerazione D3D12_QUERY_TYPE .

  • Il tipo di query deve essere compatibile con l'heap della query. La tabella seguente illustra il tipo di heap di query necessario per ogni tipo di query:

    Tipo di query Tipo di heap di query
    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

     

  • Il tipo di query è supportato dal tipo di elenco di comandi. La tabella seguente illustra le query supportate in quali tipi di elenco di comandi.

    Tipo di query Tipi di elenco di comandi supportati
    D3D12_QUERY_TYPE_OCCLUSION Connessione diretta
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Connessione diretta
    D3D12_QUERY_TYPE_TIMESTAMP Direct, Compute e facoltativamente Copia
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Connessione diretta
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Connessione diretta
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Connessione diretta
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Connessione diretta
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Connessione diretta

     

Estrazione di dati da una query

Il modo per estrarre dati da una query consiste nell'usare il metodo ResolveQueryData . ResolveQueryData funziona con tutti i tipi di memoria (che si tratti di memoria di sistema o memoria locale del dispositivo), ma richiede che la risorsa di destinazione sia in D3D12_RESOURCE_STATE_COPY_DEST.