串流輸出是 GPU 將頂點寫入緩衝區的能力。 數據流輸出計數器會監視進度。
- 從 Direct3D 11 到 Direct3D 12 串流計數器 差異
- BufferFilledSize
- 相關主題
從 Direct3D 11 到 Direct3D 12 串流計數器的差異
作為數據流輸出程式的一部分,GPU 必須知道其寫入緩衝區中的目前位置。 在 Direct3D 11 中,驅動程式會配置用來儲存此位置的記憶體,而應用程式作此值的唯一方式是透過 SOSetTargets 方法。 在 Direct3D 12 中,應用程式會配置記憶體來儲存此目前的位置。 沒有任何特殊方式可以作此值,而且應用程式可以使用 CPU 或 GPU 來讀取/寫入該值。
BufferFilledSize
應用程式負責配置名為 BufferFilledSize之 32 位數量的記憶體。 這包含數據流輸出緩衝區中的數據位元組數目。 此記憶體可以放在包含數據流輸出數據的相同資源或不同的資源中。 GPU 會在數據流輸出階段中存取此值,以判斷在緩衝區中附加新頂點數據的位置。 此外,GPU 會存取此值,以判斷發生溢位的時間。
請參閱 結構 D3D12_STREAM_OUTPUT_DESC。
偵錯層會在 id3D12GraphicsCommandList::SOSetTargets中驗證下列專案:
- 如果指定非 NULL 資源,BufferFilledSize 落在 {OffsetInBytes所隱含的範圍中,SizeInBytes}。
- BufferFilledSizeOffsetInBytes 是 4 的倍數。
- BufferFilledSizeOffsetInBytes 位於包含資源的範圍內。
- 指定的資源是緩衝區。
運行時間不會驗證與數據流輸出緩衝區相關聯的堆積類型,因為所有堆積類型都支持數據流輸出。
根簽章必須使用 D3D12_ROOT_SIGNATURE_FLAGS 旗標,指定是否要使用數據流輸出。
您可以針對以 HLSL 撰寫的根簽章指定D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT,其方式類似於指定其他旗標的方式。
當資源當做數據流輸出目標使用時,所使用的資源必須處於D3D12_RESOURCE_STATE_STREAM_OUT狀態。 這同時適用於頂點數據和 BufferFilledSize(這可以是相同或個別的資源)。
沒有特殊的 API 可設定資料流輸出緩衝區位移,因為應用程式可以直接使用 CPU 或 GPU 寫入 BufferFilledSize。
相關主題