共用方式為


數據流輸出計數器

串流輸出是 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,其方式類似於指定其他旗標的方式。

如果 geometry 著色器包含數據流輸出,但根簽章未設定D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT旗標,則 createGraphicsPipelineState 將會失敗。

當資源當做數據流輸出目標使用時,所使用的資源必須處於D3D12_RESOURCE_STATE_STREAM_OUT狀態。 這同時適用於頂點數據和 BufferFilledSize(這可以是相同或個別的資源)。

沒有特殊的 API 可設定資料流輸出緩衝區位移,因為應用程式可以直接使用 CPU 或 GPU 寫入 BufferFilledSize

計數器和查詢