Uso avanzato delle tabelle descrittore
Nelle sezioni seguenti vengono fornite informazioni sull'uso avanzato delle tabelle del descrittore.
- Modifica delle voci della tabella dei descrittori tra chiamate di rendering
- 'indicizzazione out-of-bounds
- derivati shader e di indicizzazione divergenti
- argomenti correlati
Modifica delle voci di tabella del descrittore tra chiamate di rendering
Dopo che gli elenchi di comandi che impostano le tabelle dei descrittori sono stati inviati 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 ristretto usando i recinti API per tenere traccia dello stato della GPU o meccanismi più grossolani come l'attesa di visualizzare il rendering, indipendentemente dall'applicazione. Se un'applicazione sa che verrà eseguito l'accesso solo a un subset dell'area a cui punta una tabella del descrittore (ad esempio a causa del controllo del flusso nello shader), gli altri descrittori senza riferimenti sono ancora liberi di essere modificati. Se un'applicazione deve passare da tabelle di descrittori diverse tra le chiamate di rendering, l'applicazione può scegliere tra alcuni approcci:
- 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. Durante la modifica e il riutilizzo di 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 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 questi oggetti e dallo 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 descrittore è che la memoria del descrittore di un heap descrittore deve essere masterizzato 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 descrittori e tabelle descrittori. Un vantaggio di questo è che le applicazioni possono scegliere di riutilizzare il più possibile il contenuto del sommario del descrittore anziché definire sempre una nuova versione della tabella descrittore per ogni invio di elenco di comandi. La firma radice è uno spazio che il driver D3D12 esegue automaticamente.
La possibilità di associare più tabelle descrittori alla firma radice (e quindi alla pipeline) alla volta consente alle applicazioni di raggruppare e cambiare set di riferimenti descrittori a frequenze diverse, se necessario. Ad esempio, un'applicazione potrebbe usare un numero ridotto (solo uno) di tabelle di descrittori statici di grandi dimensioni che raramente cambiano o in cui le aree nella memoria 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 passato dalla CPU usando la tecnica di controllo delle versioni della tabella descrittore.
Indicizzazione out-of-bounds
L'indicizzazione dei limiti 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 vivendo con la conseguenza di ciò che l'hardware fa con questo. Questo potrebbe produrre una reimpostazione del dispositivo, ma non arresterà l'arresto anomalo di Windows.
Derivati shader e indicizzazione divergente
Se le chiamate di 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 della trama, il calcolo LOD e il processo di campionamento delle trame vengono eseguiti dall'hardware indipendentemente per ogni ricerca di trama nel timbro 2x2, che influirà sulle prestazioni.
Argomenti correlati