共用方式為


資料流程輸出計數器

資料流程輸出是 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會落在 {OffsetInBytesSizeInBytes} 所隱含的範圍中。
  • 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

計數器和查詢