共用方式為


UAV 計數器

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

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

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

  • IncrementCounter
  • DecrementCounter
  • 附加
  • 取用

Direct3D 12

在 Direct3D 12 中,32 位值是由應用程式所配置,因此 CPU 或 GPU 可以讀取和寫入 32 位值,就像任何其他 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 會移除 append 和 counter UAV 之間的差異(雖然 HLSL 位元組程式代碼中仍然存在差異)。

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

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

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

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

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

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