Condividi tramite


Gestione dello Stato della Pipeline Grafica in Direct3D 12

Questo argomento descrive come viene impostato lo stato della pipeline grafica in Direct3D 12.

Panoramica dello stato della pipeline

Quando la geometria viene inviata all'unità di elaborazione grafica (GPU) da disegnare, sono disponibili un'ampia gamma di impostazioni hardware che determinano la modalità di interpretazione e rendering dei dati di input. Collettivamente, queste impostazioni sono denominate stato della pipeline grafica e includono impostazioni comuni, ad esempio lo stato del rasterizzatore, lo stato di fusione e lo stato dello stencil di profondità, nonché il tipo di topologia primitiva della geometria inviata e gli shader che verranno usati per il rendering. In Microsoft Direct3D 12, la maggior parte dello stato della pipeline grafica viene impostata usando gli oggetti di stato della pipeline (PSO). Un'app può creare un numero illimitato di questi oggetti, rappresentati dall'interfacciaID3D12PipelineState, in genere in fase di inizializzazione. Quindi, in fase di rendering, gli elenchi di comandi possono cambiare rapidamente più impostazioni dello stato della pipeline chiamando ID3D12GraphicsCommandList::SetPipelineState in un bundle o un elenco di comandi diretto per impostare l'oggetto Pipeline State Object (PSO) attivo.

In Direct3D 11, lo stato della pipeline grafica era raggruppato in grandi oggetti di stato a grana grossa, come ID3D11BlendState, che potevano essere creati e impostati in fase di rendering nel contesto immediato con metodi come ID3D11DeviceContext::OMSetBlendState. L'idea alla base di questo è che la GPU potrebbe ottenere efficienza impostando impostazioni correlate, come le impostazioni dello stato blend, tutte in una sola volta. Tuttavia, con l'hardware grafico di oggi, esistono dipendenze tra le diverse unità hardware. Ad esempio, lo stato di fusione hardware potrebbe avere dipendenze dallo stato raster e dallo stato di fusione. Gli oggetti PSO in Direct3D 12 sono stati progettati per consentire alla GPU di pre-elaborare tutte le impostazioni dipendenti in ogni stato della pipeline, in genere durante l'inizializzazione, per passare da uno stato all'altro in fase di rendering il più efficiente possibile.

Si noti che, mentre la maggior parte delle impostazioni dello stato della pipeline viene impostata usando gli oggetti PSO, esistono alcune impostazioni di stato impostate separatamente usando le API fornite da ID3D12GraphicsCommandList. Queste impostazioni e le API associate sono descritte in dettaglio di seguito. Inoltre, esistono differenze nel modo in cui lo stato della pipeline grafica viene ereditato e salvato in modo permanente da elenchi di comandi diretti e bundle. Questo argomento fornisce informazioni dettagliate su entrambi questi elementi seguenti.

Stati della pipeline grafica impostati con oggetti di stato della pipeline

Il modo più semplice per visualizzare tutti i diversi stati della pipeline che è possibile impostare usando un oggetto stato della pipeline consiste nell'esaminare l'argomento di riferimento per l'D3D12_GRAPHICS_PIPELINE_STATE_DESC che si passa a ID3D12Device::CreateGraphicsPipelineState quando si inizializza l'oggetto. Un breve riepilogo degli stati che è possibile impostare include:

  • Bytecode per tutti gli shader, inclusi vertex, pixel, domain, hull e geometry shader.
  • Formato del vertice di input.
  • Tipo di topologia primitiva. Si noti che il tipo di topologia primitiva input-assembler (punto, riga, triangolo, patch) viene impostato all'interno del PSO usando l'enumerazione D3D12_PRIMITIVE_TOPOLOGY_TYPE. L'adiacenza e l'ordinamento primitivi (elenco di righe, strip di riga, strip di righe con dati di adiacenza e così via) vengono impostati dall'interno di un elenco di comandi usando il metodo ID3D12GraphicsCommandList::IASetPrimitiveTopology.
  • Lo stato di miscelazione, stato del rasterizzatore, stato dello stencil di profondità.
  • I formati di stencil di profondità e destinazione di rendering, così come il numero di destinazioni di rendering.
  • Parametri di campionamento multiplo.
  • Buffer di output di streaming.
  • Firma di base. Per ulteriori informazioni, vedere firme di radice.

Stati della pipeline grafica impostati all'esterno dell'oggetto stato della pipeline

La maggior parte degli stati della pipeline grafica viene impostata usando i PSO. Esiste tuttavia un insieme di parametri di stato della pipeline che vengono impostati chiamando i metodi dell'interfaccia ID3D12GraphicsCommandList dall'interno di un elenco di comandi. Nella tabella seguente vengono illustrati gli stati impostati in questo modo e i metodi corrispondenti.

Stato Metodo
Collegamenti di risorse IASetIndexBuffer
IASetVertexBuffers
SOSetTargets
OMSetRenderTargets
SetDescriptorHeaps
Tutti i metodi SetGraphicsRoot...
Tutti i metodi SetComputeRoot...
Finestre di visualizzazione RSSetViewports
Rettangoli di ritaglio RSSetScissorRects
Fattore di fusione OMSetBlendFactor
Valore di riferimento della profondità dello stencil OMSetStencilRef
Ordine della topologia primitiva dell'assemblatore di input e tipo di adiacenza IASetPrimitiveTopology

Ereditarietà dello stato della pipeline grafica

Poiché gli elenchi di comandi diretti sono in genere destinati a un uso alla volta e i bundle devono essere usati più volte contemporaneamente, esistono regole diverse su come ereditano lo stato della pipeline grafica impostata dagli elenchi di comandi o dai bundle precedenti.

Per gli stati della pipeline grafica impostati utilizzando gli oggetti PSO, nessuno di questi stati viene ereditato né dagli elenchi di comandi diretti né dai pacchetti. Lo stato iniziale della pipeline grafica per elenchi di comandi diretti e bundle viene impostato in fase di creazione con il parametro ID3D12PipelineState su ID3D12Device::CreateCommandList. Se non viene specificato alcun pso nella chiamata, viene usato uno stato iniziale predefinito. È possibile modificare l'attuale PSO all'interno di una lista di comandi chiamando ID3D12GraphicsCommandList::SetPipelineState.

Anche gli elenchi di comandi diretti non ereditano lo stato impostato con metodi dell'elenco di comandi come RSSetViewports. Per informazioni dettagliate sui valori iniziali predefiniti per gli stati non PSO, vedere ID3D12GraphicsCommandList::ClearState.

I pacchetti ereditano tutti gli stati della pipeline grafica non configurati tramite PSO, ad eccezione del tipo di topologia primitiva. La topologia primitiva è sempre impostata su D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED quando inizia l'esecuzione di un bundle. Qualsiasi stato impostato all'interno di un bundle (lo stato PSO stesso, lo stato non basato su PSO e le associazioni di risorse) influisce sullo stato dell'elenco di comandi diretti padre. Ad esempio, se un RSSetViewports viene chiamato dall'interno di un bundle, i viewport specificati continueranno a essere impostati nell'elenco dei comandi diretti padre per le chiamate successive alla ExecuteBundle chiamata che imposta i viewport.

Le associazioni di risorse impostate all'interno di un elenco di comandi o di un bundle vengono mantenute. Pertanto, le associazioni di risorse modificate in un elenco di comandi diretto verranno comunque impostate all'interno dell'esecuzione successiva del bundle figlio. Le associazioni di risorse modificate dall'interno di un bundle verranno comunque impostate per le chiamate successive all'interno dell'elenco dei comandi diretti padre.

Per ulteriori informazioni sui binding, consultare la sezione semantica dei bundle di di Utilizzo di una root signature.