Condividi tramite


Fase Output flusso

La fase di output del flusso (SO) può trasmettere vertici alla memoria appena prima che questi vertici arrivino al rasterizer. L'output del flusso funziona come un tocco nella pipeline. Questo tocco può essere attivato anche quando i dati continuano a scorrere verso il basso fino al rasterizer. I dati inviati tramite l'output del flusso vengono concatenati ai buffer. Questi buffer possono essere ricircolati nei passaggi successivi come input della pipeline.

Un vincolo relativo all'output del flusso è che è associato allo shader geometry, in cui devono essere creati insieme (anche se possono essere "NULL"/"off"). Anche se i buffer di memoria specifici che vengono trasmessi in uscita non sono associati a una determinata coppia di output geometry shader e flusso. Solo la descrizione delle parti dei dati del vertice da inserire in un output di flusso è associata al geometry shader.

L'output del flusso potrebbe essere utile per salvare i dati della pipeline ordinati che verranno riutilizzati. Ad esempio, un batch di vertici potrebbe essere "skinnato" passando i vertici nella pipeline come se siano punti indipendenti (solo per visitare tutti loro una volta), applicando operazioni "skinning" su ogni vertice e trasmettendo i risultati alla memoria. I vertici "skinned" salvati sono successivamente disponibili per l'uso come input.

Poiché la quantità di output scritta tramite l'output del flusso è dinamica, è necessario un nuovo tipo di Draw, DrawAuto, per consentire il riutilizzo dei buffer di output di flusso con l'assembler di input, senza il coinvolgimento della CPU per determinare la quantità di dati effettivamente scritti. Inoltre, le query sono necessarie per attenuare il overflow dell'output del flusso, nonché recuperare la quantità di dati scritti nei buffer di output del flusso (D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE e D3D10DDI_QUERY_STREAMOUTPUTSTATS dell'enumerazione D3D10DDI_QUERY ).

Il runtime Direct3D chiama le funzioni driver seguenti per creare e configurare l'output del flusso:

CalcPrivateGeometryShaderWithStreamOutput

CreateGeometryShaderWithStreamOutput

SoSetTargets