Condividi tramite


Filosofia della progettazione delle code di comandi e delle liste di comandi

Gli obiettivi di abilitare il riutilizzo del lavoro di rendering e del ridimensionamento multithread, richiedevano 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. In questo modo è possibile eseguire il multithreading.
  2. Le app ora possiedono il modo in cui le chiamate di rendering vengono raggruppate in elementi di lavoro dell'unità di elaborazione grafica (GPU). In questo modo è possibile 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

Il cambiamento 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 usa 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 è a thread libero; Tuttavia, è possibile registrare più elenchi di comandi contemporaneamente, che sfrutta i moderni processori multi-core.

Gli elenchi di comandi vengono in genere eseguiti una sola 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 dell'elenco di comandi, vedere l'esecuzione e la sincronizzazione degli elenchi di comandi.

Raggruppamento di elementi di lavoro GPU

Oltre agli elenchi di comandi, Direct3D 12 sfrutta attualmente le funzionalità presenti in tutti gli hardware aggiungendo un secondo livello di elenchi di comandi, chiamati bundle . Per distinguere questi due tipi, è possibile fare riferimento agli elenchi di comandi di primo livello come elenchi di comandi diretti. Lo scopo dei bundle è consentire alle app di raggruppare un numero ridotto di comandi API per un'esecuzione ripetuta successiva dall'interno di elenchi di comandi diretti. Al momento della creazione di un bundle, il driver eseguirà il maggior numero possibile di pre-elaborazione per rendere 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 fattore di miglioramento dell'efficienza con i singoli thread della 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 ulteriori informazioni, vedere Creando e registrando elenchi di comandi e bundle.

Invio di lavoro GPU

Per eseguire operazioni 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 di garantire che l'elenco dei comandi diretti sia stato completato l'esecuzione sulla GPU prima di inviarlo di nuovo. I bundle non hanno restrizioni di utilizzo simultaneo 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.