Disegno indiretto

Il disegno indiretto consente di spostare alcune scene attraversate dalla CPU alla GPU, che possono migliorare le prestazioni. Il buffer dei comandi può essere generato dalla CPU o dalla GPU.

Firme dei comandi

L'oggetto firma del comando (ID3D12CommandSignature) consente alle app di specificare il disegno indiretto, in particolare impostando quanto segue:

All'avvio, un'app crea un piccolo set di firme dei comandi. In fase di esecuzione, l'applicazione riempie un buffer con comandi (tramite qualsiasi mezzo che lo sviluppatore di app sceglie). I comandi facoltativamente contenenti lo stato da impostare per le visualizzazioni del buffer dei vertici, le visualizzazioni del buffer di indice, le costanti radice e i descrittori radice (SRV/UAV/CBV non elaborati o strutturati). Questi layout degli argomenti non sono specifici dell'hardware in modo che le app possano generare direttamente i buffer. La firma del comando eredita lo stato rimanente dall'elenco di comandi. L'app chiama quindi ExecuteIndirect per indicare alla GPU di interpretare il contenuto del buffer di argomenti indiretti in base al formato definito da una determinata firma di comando.

Se la firma del comando modifica eventuali argomenti radice, questa viene archiviata all'interno della firma del comando come subset di una firma radice.

Si noti che non viene restituito alcun stato di firma del comando all'elenco dei comandi al termine dell'esecuzione.

Si supponga, ad esempio, che uno sviluppatore di app voglia specificare una costante radice univoca per disegnare nel buffer di argomenti indiretti. L'app creerebbe una firma di comando che consente al buffer degli argomenti indiretti di specificare i parametri seguenti per ogni chiamata di disegno:

  • Valore di una costante radice.
  • Argomenti di disegno (conteggio vertici, numero di istanze e così via).

Il buffer dell'argomento indiretto generato dall'applicazione contiene una matrice di record di dimensioni fisse. Ogni struttura corrisponde a una chiamata di disegno. Ogni struttura contiene gli argomenti di disegno e il valore della costante radice. Il numero di chiamate di disegno viene specificato in un buffer visibile dalla GPU separato.

Un buffer di comando di esempio generato dall'app segue:

formato del buffer dei comandi

Strutture del buffer di argomenti indiretti

Le strutture seguenti definiscono la modalità di visualizzazione di argomenti specifici in un buffer di argomenti indiretti. Queste strutture non vengono visualizzate in alcuna API D3D12. Le applicazioni usano queste definizioni durante la scrittura in un buffer di argomenti indiretti (con la CPU o la GPU):

Creazione di firme comando

Per creare una firma di comando, usare gli elementi API seguenti:

L'ordinamento degli argomenti all'interno di un buffer di argomenti indiretti è definito in modo che corrisponda esattamente all'ordine degli argomenti specificati nel parametro pArguments di D3D12_COMMAND_SIGNATURE_DESC. Tutti gli argomenti per una chiamata di disegno (grafica)/dispatch (calcolo) all'interno di un buffer di argomenti indiretti sono strettamente compressi. Tuttavia, le applicazioni possono specificare uno stride di byte arbitrario tra i comandi draw/dispatch in un buffer di argomenti indiretti.

La firma radice deve essere specificata se e solo se la firma del comando modifica uno degli argomenti radice.

Per SRV/UAV/CBV radice, le dimensioni specificate dall'applicazione sono in byte. Il livello di debug convalida le restrizioni seguenti per l'indirizzo:

  • CBV: l'indirizzo deve essere un multiplo di 256 byte.
  • SRV/UAV non elaborato: l'indirizzo deve essere un multiplo di 4 byte.
  • SRV/UAV strutturati: l'indirizzo deve essere un multiplo dello stride di byte della struttura (dichiarato nello shader).

Una determinata firma di comando è un disegno o una firma del comando di calcolo. Se una firma di comando contiene un'operazione di disegno, è una firma di comando grafica. In caso contrario, la firma del comando deve contenere un'operazione di invio ed è una firma del comando di calcolo.

Le sezioni seguenti mostrano alcune firme dei comandi di esempio.

Nessuna modifica degli argomenti

In questo esempio, il buffer di argomenti indiretti generato dall'applicazione contiene una matrice di strutture a 36 byte. Ogni struttura contiene solo i cinque parametri passati a DrawIndexedInstanced (più riempimento).

Il codice per creare la descrizione della firma del comando segue:

D3D12_INDIRECT_ARGUMENT_DESC Args[1];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED;

D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 36;
ProgramDesc.NumArgumentDescs = 1;
ProgramDesc.pArguments = Args;

Il layout di una singola struttura all'interno di un buffer di argomenti indiretti è:

Byte Descrizione
0:3 IndexCountPerInstance
4:7 InstanceCount
8:11 StartIndexLocation
12:15 BaseVertexLocation
16:19 StartInstanceLocation
20:35 Riempimento

 

Costanti radice e buffer vertex

In questo esempio ogni struttura in un buffer di argomenti indiretti modifica due costanti radice, modifica un'associazione del buffer vertex ed esegue un'operazione di disegno non indicizzata. Non c'è riempimento tra strutture.

Il codice per creare la descrizione della firma del comando è:

D3D12_INDIRECT_ARGUMENT_DESC Args[4];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[0].Constant.RootParameterIndex = 2;
Args[0].Constant.DestOffsetIn32BitValues = 0;
Args[0].Constant.Num32BitValuesToSet = 1;

Args[1].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[1].Constant.RootParameterIndex = 6;
Args[1].Constant.DestOffsetIn32BitValues = 0;
Args[1].Constant.Num32BitValuesToSet = 1;

Args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW;
Args[2].VertexBuffer.Slot = 3;

Args[3].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;

D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 40;
ProgramDesc.NumArgumentDescs = 4;
ProgramDesc.pArguments = Args;

Il layout di una singola struttura all'interno del buffer di argomenti indiretti è il seguente:

Byte Descrizione
0:3 Dati per l'indice dei parametri radice 2
4:7 Dati per l'indice dei parametri radice 6
8:15 Indirizzo virtuale di VB nello slot 3 (64 bit)
16:19 Dimensioni VB
20:23 Stride VB
24:27 VertexCountPerInstance
28:31 InstanceCount
32:35 StartVertexLocation
36:39 StartInstanceLocation

 

Esercitazioni video di apprendimento avanzato DirectX: Eseguire il culling indiretto e asincrono della GPU

Disegno indiretto e culling GPU: procedura dettagliata del codice

Rendering