共用方式為


UAV 計數器

您可以使用 unordered-access-view (UAV) 計數器,將 32 位不可部分完成計數器與 unordered-access-view (UAV) 產生關聯。

UAV 計數器與 Direct3D 11 到 Direct3D 12 的差異

Direct3D 12 應用程式和 Direct3D 11 應用程式都使用相同的高階著色器語言, (HLSL) 著色器函式來存取 UAV 計數器。

  • IncrementCounter
  • DecrementCounter
  • Append
  • 取用

Direct3D 12

在 Direct3D 12 中,32 位值是由應用程式所配置,因此 32 位值可由 CPU 或 GPU 讀取和寫入,就像任何其他 Direct3D 12 資源一樣。

Direct3D 11

在著色器之外,使用 Direct3D 11 時,您必須呼叫 API 方法,才能存取計數器 (例如 ID3D11DeviceCoNtext::CopyStructureCount) 。

使用 UAV 計數器

您的應用程式負責配置 UAV 計數器的 32 位儲存體。 此儲存體可以配置在不同的資源中,作為包含可透過 UAV 存取之資料的儲存體。

請參閱 CreateUnorderedAccessViewD3D12_BUFFER_UAV_FLAGSD3D12_BUFFER_UAV

如果在呼叫 CreateUnorderedAccessView時指定pCounterResource,則會有與 UAV 相關聯的計數器。 在此案例中:

  • StructureByteStride 必須大於零
  • 格式必須是DXGI_FORMAT_UNKNOWN
  • 不得設定 RAW 旗標
  • 這兩個資源都必須是緩衝區
  • CounterOffsetInBytes 必須是 4 個位元組的倍數
  • CounterOffsetInBytes 必須位於計數器資源的範圍內
  • pDesc 不可以是 Null
  • pResource 不可以是 Null

並記下下列使用案例:

  • 如果未指定 pCounterResource則 CounterOffsetInBytes 必須為 0。
  • 如果已設定 RAW 旗標,則格式必須DXGI_FORMAT_R32_TYPELESS,且 UAV 資源必須是緩衝區。
  • 如果未設定 pCounterResource則 CounterOffsetInBytes 必須是 0。
  • 如果未設定 RAW 旗標,且 StructureByteStride = 0,則格式必須是有效的 UAV 格式。

Direct3D 12 會移除附加和計數器 UAV (之間的差異,不過 HLSL 位元組程式碼) 中仍存在差異。

核心執行時間會在 CreateUnorderedAccessView內驗證這些限制。

在繪製/分派期間,計數器資源必須處於 狀態D3D12_RESOURCE_STATE_UNORDERED_ACCESS。 此外,在單一 Draw/Dispatch 呼叫內,應用程式無法透過兩個不同的 UAV 計數器存取相同的 32 位記憶體位置。 如果偵測到其中一個錯誤,偵錯層就會發出錯誤。

沒有 「SetUnorderedAccessViewCounterValue」 或 「CopyStructureCount」 方法,因為應用程式可以直接將資料複製到計數器值,並從計數器值直接複製。

支援具有計數器的 UAV 動態編制索引。

如果著色器嘗試存取沒有相關聯計數器之 UAV 的計數器,偵錯層將會發出警告,而且會發生 GPU 分頁錯誤,導致移除應用程式的裝置。

所有堆積類型都支援 UAV 計數器, (預設、上傳、回讀) 。