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 存取之資料的儲存體。
請參閱 CreateUnorderedAccessView、 D3D12_BUFFER_UAV_FLAGS 和 D3D12_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 計數器, (預設、上傳、回讀) 。