Condividi tramite


Filosofia di progettazione delle code dei comandi e degli elenchi di comandi

Gli obiettivi dell'abilitazione del riutilizzo del lavoro di rendering e della scalabilità multi-thread, sono necessarie modifiche fondamentali al modo in cui le app Direct3D inviano il lavoro di rendering alla GPU. In Direct3D 12 il processo di invio del lavoro di rendering differisce dalle versioni precedenti in tre modi importanti:

  1. Eliminazione del contesto immediato. Ciò consente il multi-threading.
  2. Le app hanno ora il modo in cui le chiamate di rendering vengono raggruppate in elementi di lavoro dell'unità di elaborazione grafica (GPU). Ciò consente di riutilizzare.
  3. Le app ora controllano in modo esplicito quando il lavoro viene inviato alla GPU. Ciò abilita gli elementi 1 e 2.

Rimozione del contesto immediato

La modifica più grande da Microsoft Direct3D 11 a Microsoft Direct3D 12 è che non esiste più un singolo contesto immediato associato a un dispositivo. Per eseguire il rendering, invece, le app creano elenchi di comandi in cui è possibile chiamare le API di rendering tradizionali. Un elenco di comandi è simile al metodo di rendering di un'app Direct3D 11 che ha usato il contesto immediato in cui contiene chiamate che disegnano primitive o modificano lo stato di rendering. Come i contesti immediati, ogni elenco di comandi non è thread libero; tuttavia, è possibile registrare più elenchi di comandi simultaneamente, che sfruttano processori moderni e multi-core.

Gli elenchi di comandi vengono in genere eseguiti una volta. Tuttavia, un elenco di comandi può essere eseguito più volte se l'applicazione garantisce che le esecuzioni precedenti vengano completate prima di inviare nuove esecuzioni. Per altre informazioni sulla sincronizzazione degli elenchi di comandi, vedere Esecuzione e sincronizzazione degli elenchi di comandi.

Raggruppamento di elementi di lavoro GPU

Oltre agli elenchi di comandi, Direct3D 12 sfrutta le funzionalità presenti in tutti gli hardware oggi aggiungendo un secondo livello di elenchi di comandi, denominati bundle. Per distinguere questi due tipi, gli elenchi di comandi di primo livello possono essere definiti elenchi di comandi diretti. Lo scopo dei bundle è consentire alle app di raggruppare un numero ridotto di comandi API insieme per un secondo momento, l'esecuzione ripetuta dall'interno di elenchi di comandi diretti. Al momento della creazione di un bundle, il driver eseguirà il massimo di pre-elaborazione possibile per rendere più efficiente l'esecuzione successiva. I bundle possono quindi essere eseguiti da più elenchi di comandi e più volte all'interno dello stesso elenco di comandi.

Il riutilizzo dei bundle è un grande driver di miglioramento dell'efficienza con singoli thread CPU. Poiché i bundle vengono pre-elaborati e possono essere inviati più volte, esistono alcune restrizioni sulle operazioni che possono essere eseguite all'interno di un bundle. Per altre informazioni, vedere Creazione e registrazione di elenchi di comandi e bundle.

Invio di lavoro GPU

Per eseguire il lavoro sulla GPU, un'app deve inviare in modo esplicito un elenco di comandi a una coda di comandi associata al dispositivo Direct3D. Un elenco di comandi diretto può essere inviato per l'esecuzione più volte, ma l'app è responsabile della completare l'esecuzione dell'elenco di comandi diretti nella GPU prima di inviarla di nuovo. I bundle non dispongono di restrizioni di utilizzo simultanee e possono essere eseguiti più volte in più elenchi di comandi, ma i bundle non possono essere inviati direttamente a una coda di comandi per l'esecuzione.

Qualsiasi thread può inviare un elenco di comandi a qualsiasi coda di comandi in qualsiasi momento e il runtime serializzerà automaticamente l'invio dell'elenco di comandi nella coda dei comandi mantenendo l'ordine di invio.