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 存取之資料的記憶體。
請參閱 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 會移除 append 和 counter UAV 之間的差異(雖然 HLSL 位元組程式代碼中仍然存在差異)。
核心運行時間會在 CreateUnorderedAccessView內驗證這些限制。
在繪製/分派期間,計數器資源必須處於 狀態 D3D12_RESOURCE_STATE_UNORDERED_ACCESS。 此外,在單一 Draw/Dispatch 呼叫內,應用程式透過兩個不同的 UAV 計數器存取相同的 32 位記憶體位置無效。 如果偵測到其中一個錯誤,偵錯層將會發出錯誤。
沒有 「SetUnorderedAccessViewCounterValue」 或 「CopyStructureCount」 方法,因為應用程式可以直接將數據複製到計數器值,並從計數器值直接複製。
支援具有計數器的UAV動態編製索引。
如果著色器嘗試存取沒有相關聯計數器的 UAV 計數器,則偵錯層會發出警告,且 GPU 頁面錯誤將發生,導致應用程式裝置遭到移除。
所有堆積類型都支援 UAV 計數器(預設、上傳、回寫)。