Uso avanzato delle tabelle descrittore

Nelle sezioni seguenti vengono fornite informazioni sull'uso avanzato delle tabelle del descrittore.

Modifica delle voci di tabella del descrittore tra chiamate di rendering

Dopo che gli elenchi di comandi che impostano le tabelle del descrittore sono state inviate a una coda per l'esecuzione, l'applicazione non deve modificare dalla CPU le parti degli heap del descrittore che la GPU potrebbe fare riferimento fino a quando l'applicazione non sa che la GPU ha terminato di usare i riferimenti.

Il completamento del lavoro può essere determinato a un limite stretto usando le recinzioni API per tenere traccia dello stato della GPU o meccanismi più grossolani, ad esempio attendere che il rendering sia stato inviato per la visualizzazione, indipendentemente dall'applicazione. Se un'applicazione sa che verrà eseguito l'accesso solo a un subset dell'area a cui fa riferimento una tabella del descrittore, ad esempio a causa del controllo del flusso nello shader, gli altri descrittori senza riferimenti saranno comunque liberi di essere modificati. Se un'applicazione deve passare da una tabella di descrizione all'altra tra le diverse chiamate di rendering, l'applicazione può scegliere tra alcuni approcci:If an application needs to switch between different descriptor tables between rendering calls, there are a few approaches the application can choose from:

  • Controllo delle versioni tabella descrittore: creare (o riutilizzare) una tabella di descrittore separata per ogni raccolta univoca di descrittori a cui fare riferimento un elenco di comandi. Quando si modificano e riutilizzano aree popolate in precedenza negli heap del descrittore, le applicazioni devono prima assicurarsi che la GPU abbia terminato di usare qualsiasi parte di un heap descrittore che verrà riciclato.
  • Indicizzazione dinamica: le applicazioni possono disporre gli oggetti che variano in base a disegnare/inviare (o addirittura variare all'interno di un disegno) in un intervallo di un heap descrittore, definire una tabella descrittore che si estende su tutti e dal shader, usare l'indicizzazione dinamica della tabella durante l'esecuzione dello shader per selezionare l'oggetto da usare.
  • Inserimento dei descrittori direttamente nella firma radice. Solo un numero molto ridotto di descrittori può essere gestito in questo modo perché lo spazio della firma radice è limitato.

L'implicazione dell'uso del controllo delle versioni delle tabelle del descrittore è che la memoria del descrittore da un heap descrittore deve essere bruciata per ogni set univoco di descrittori a cui fa riferimento la pipeline grafica per ogni elenco di comandi che potrebbe essere in esecuzione, accodato per l'esecuzione o registrato in qualsiasi momento.

D3D12 lascia la responsabilità di gestire il controllo delle versioni all'applicazione per i tipi di oggetto gestiti tramite heap descrittore e tabelle descrittori. Un vantaggio di questo è che le applicazioni possono scegliere di riutilizzare il contenuto del sommario del descrittore il più possibile, invece di definire sempre una nuova versione della tabella descrittore per ogni invio dell'elenco di comandi. La firma radice è uno spazio che il driver D3D12 esegue automaticamente le versioni.

La possibilità di associare più tabelle di descrittore alla firma radice (e quindi alla pipeline) alla volta consente alle applicazioni di raggruppare e cambiare set di riferimenti di descrittore a frequenze diverse, se necessario. Ad esempio, un'applicazione può usare un numero ridotto (solo uno) di tabelle di descrittore statiche di grandi dimensioni che raramente cambiano o in cui le aree nella memoria dell'heap del descrittore sottostante vengono popolate in base alle esigenze, con l'uso dell'indicizzazione dinamica dallo shader per selezionare le trame. Allo stesso tempo, l'applicazione potrebbe mantenere un'altra classe di risorse in cui il set a cui fa riferimento ogni chiamata di disegno viene spostato dalla CPU usando la tecnica di controllo delle versioni delle tabelle del descrittore.

Indicizzazione out of bounds

L'indicizzazione out of bounds di qualsiasi tabella descrittore dallo shader comporta un accesso in gran parte indefinito alla memoria, inclusa la possibilità di leggere memoria arbitraria in-process come se fosse un descrittore di stato hardware e vivere con la conseguenza di ciò che l'hardware fa con questo. Questo potrebbe produrre un ripristino del dispositivo, ma non arresterà l'arresto anomalo di Windows.

Derivati shader e indicizzazione divergente

Se le chiamate pixel shader in esecuzione in un timbro 2x2 (per supportare calcoli derivati) scelgono indici di trama diversi da campionare da una tabella del descrittore e, se la configurazione e la trama del campionatore selezionato per un determinato pixel richiede un calcolo LOD dai derivati delle coordinate di trama, il calcolo LOD e il processo di campionamento delle trame vengono eseguiti dall'hardware in modo indipendente per ogni ricerca di trama nel stamp 2x2, che influirà sulle prestazioni.

Tabelle del descrittore