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, esistono un'ampia gamma di impostazioni hardware che determinano come vengono interpretati e sottoposti a rendering i dati di input. Collettivamente, queste impostazioni sono denominate stato della pipeline grafica e includono impostazioni comuni, ad esempio lo stato rasterizzatore, lo stato di fusione e lo 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 oggetti di stato della pipeline (PSO). Un'app può creare un numero illimitato di questi oggetti, rappresentati dall'interfaccia ID3D12PipelineState , 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 elenco di comandi diretto o un bundle per impostare il PSO attivo.
In Direct3D 11 lo stato della pipeline grafica è stato in bundle in oggetti di stato con granularità grossolana di grandi dimensioni, ad esempio ID3D11BlendState che possono 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, ad esempio le impostazioni dello stato blend, tutte contemporaneamente. Tuttavia, con l'hardware grafico di oggi, esistono dipendenze tra le diverse unità hardware. Ad esempio, lo stato della 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 rendere il passaggio tra stati al momento del rendering il più efficiente possibile.
Si noti che, sebbene la maggior parte delle impostazioni dello stato della pipeline sia 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. Esistono inoltre differenze nel modo in cui lo stato della pipeline grafica viene ereditato e salvato in modo permanente da elenchi di comandi diretti e aggregazioni. In questo argomento vengono forniti dettagli su entrambi questi argomenti.
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 dei vertici di input.
- Tipo di topologia primitiva. Si noti che il tipo di topologia primitiva dell'assembler di input (punto, linea, triangolo, patch) viene impostato all'interno dell'oggetto PSO usando l'enumerazione D3D12_PRIMITIVE_TOPOLOGY_TYPE . L'adiacenza e l'ordinamento primitivi (elenco di righe, strip di riga, strip di riga con dati di adiacenza e così via) vengono impostati dall'interno di un elenco di comandi usando il metodo ID3D12GraphicsCommandList::IASetPrimitiveTopology .
- Stato di fusione, stato rasterizzatore, stato dello stencil di profondità.
- Gli stencil profondità e i formati di destinazione di rendering, nonché il numero di destinazioni di rendering.
- Parametri di campionamento multipla.
- Buffer di output di streaming.
- Firma radice. Per altre informazioni, vedere Firme radice.
Stati della pipeline grafica impostati all'esterno dell'oggetto stato della pipeline
La maggior parte degli stati della pipeline grafica viene impostata usando gli oggetti PSO. Esiste tuttavia un set di parametri di stato della pipeline impostati chiamando i metodi dell'interfaccia ID3D12GraphicsCommandList dall'interno di un elenco di comandi. La tabella seguente illustra gli stati impostati in questo modo e i metodi corrispondenti.
State | Metodo |
---|---|
Associazioni di risorse |
IASetIndexBuffer IASetVertexBuffers SOSetTargets OMSetRenderTargets SetDescriptorHeaps Tutti i metodi SetGraphicsRoot... Tutti i metodi SetComputeRoot... |
Finestre | RSSetViewports |
Recti scissor | RSSetScissorRects |
Fattore di fusione | OMSetBlendFactor |
Valore di riferimento dello stencil di profondità | OMSetStencilRef |
Ordine della topologia primitiva dell'assembler 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 sul modo in cui ereditano lo stato della pipeline grafica impostata dagli elenchi di comandi o dai bundle precedenti.
Per gli stati della pipeline grafica impostati tramite PSO, nessuno di questi stati viene ereditato da elenchi di comandi diretti o aggregazioni. 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'oggetto PSO corrente all'interno di un elenco di comandi chiamando ID3D12GraphicsCommandList::SetPipelineState.
Gli elenchi di comandi diretti non ereditano anche 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 bundle ereditano tutti gli stati della pipeline grafica non impostati con 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 del relativo 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 chiamata ExecuteBundle 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. E 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 altre informazioni sulle associazioni, vedere la sezione Semantica bundle di Using a Root Signature (Uso di una firma radice).