資料流程輸出計數器
資料流程輸出是 GPU 將頂點寫入緩衝區的能力。 資料流程輸出計數器會監視進度。
從 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_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT旗標,CreateGraphicsPipelineState將會失敗。
當資源當做資料流程輸出目標使用時,所使用的資源必須處於D3D12_RESOURCE_STATE_STREAM_OUT狀態。 這適用于頂點資料和 BufferFilledSize (,這些) 位於相同或不同的資源中。
沒有特殊的 API 可以設定資料流程輸出緩衝區位移,因為應用程式可以直接使用 CPU 或 GPU 寫入 BufferFilledSize 。
相關主題