UAV) 載入 (具類型的未排序存取檢視
未排序的存取檢視 (UAV) 具型別載入是著色器從具有特定 DXGI_FORMAT的 UAV 讀取的能力。
概觀
UAV) (未排序存取檢視是未排序存取資源 (檢視,其中可能包含緩衝區、紋理和紋理陣列,但不含多重取樣) 。 UAV 允許從多個執行緒進行暫時未排序的讀取/寫入存取。 這表示此資源類型可由多個執行緒同時讀取/寫入,而不會產生記憶體衝突。 此同時存取是透過使用 Atomic Functions來處理。
D3D12 (和 D3D11.3) 會展開可用於具類型 UAV 載入的格式清單。
支援的格式和 API 呼叫
先前,下列三種格式支援類型 UAV 載入,而且 D3D11.0 硬體需要。 所有 D3D11.3 和 D3D12 硬體都支援它們。
- R32_FLOAT
- R32_UINT
- R32_SINT
在 D3D12 或 D3D11.3 硬體上支援下列格式,因此如果支援任何格式,則支援全部。
- R32G32B32A32_FLOAT
- R32G32B32A32_UINT
- R32G32B32A32_SINT
- R16G16B16A16_FLOAT
- R16G16B16A16_UINT
- R16G16B16A16_SINT
- R8G8B8A8_UNORM
- R8G8B8A8_UINT
- R8G8B8A8_SINT
- R16_FLOAT
- R16_UINT
- R16_SINT
- R8_UNORM
- R8_UINT
- R8_SINT
下列格式是 D3D12 和 D3D11.3 硬體選擇性且個別支援的格式,因此必須針對每個格式進行單一查詢,以測試支援。
- R16G16B16A16_UNORM
- R16G16B16A16_SNORM
- R32G32_FLOAT
- R32G32_UINT
- R32G32_SINT
- R10G10B10A2_UNORM
- R10G10B10A2_UINT
- R11G11B10_FLOAT
- R8G8B8A8_SNORM
- R16G16_FLOAT
- R16G16_UNORM
- R16G16_UINT
- R16G16_SNORM
- R16G16_SINT
- R8G8_UNORM
- R8G8_UINT
- R8G8_SNORM
- R8G8_SINT
- R16_UNORM
- R16_SNORM
- R8_SNORM
- A8_UNORM
- B5G6R5_UNORM
- B5G5R5A1_UNORM
- B4G4R4A4_UNORM
若要判斷支援任何其他格式,請使用D3D12_FEATURE_DATA_D3D12_OPTIONS結構呼叫CheckFeatureSupport作為第一個參數, (參考功能查詢) 。 如果支援上述 「支援為集合」清單,將會設定 TypedUAVLoadAdditionalFormats 欄位。 使用D3D12_FEATURE_DATA_FORMAT_SUPPORT結構對CheckFeatureSupport進行第二次呼叫, (針對D3D12_FORMAT_SUPPORT2 ) 列舉D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD成員檢查傳回的結構,以判斷上述選擇性支援格式清單中的支援,例如:
D3D12_FEATURE_DATA_D3D12_OPTIONS FeatureData;
ZeroMemory(&FeatureData, sizeof(FeatureData));
HRESULT hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &FeatureData, sizeof(FeatureData));
if (SUCCEEDED(hr))
{
// TypedUAVLoadAdditionalFormats contains a Boolean that tells you whether the feature is supported or not
if (FeatureData.TypedUAVLoadAdditionalFormats)
{
// Can assume “all-or-nothing” subset is supported (e.g. R32G32B32A32_FLOAT)
// Cannot assume other formats are supported, so we check:
D3D12_FEATURE_DATA_FORMAT_SUPPORT FormatSupport = {DXGI_FORMAT_R32G32_FLOAT, D3D12_FORMAT_SUPPORT1_NONE, D3D12_FORMAT_SUPPORT2_NONE};
hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &FormatSupport, sizeof(FormatSupport));
if (SUCCEEDED(hr) && (FormatSupport.Support2 & D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD) != 0)
{
// DXGI_FORMAT_R32G32_FLOAT supports UAV Typed Load!
}
}
}
從 HLSL 使用具類型的 UAV 載入
若為具類型的 UAV,則會D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS HLSL 旗標。
以下是處理具類型 UAV 載入的著色器程式碼範例:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
從 HLSL 使用 UNORM 和 SNORM 類型的 UAV 載入
使用具類型的 UAV 載入從 UNORM 或 SNORM 資源讀取時,您必須正確宣告 HLSL 物件的專案類型為 unorm
或 snorm
。 它會指定為未定義的行為,使 HLSL 中宣告的專案類型與基礎資源資料類型不符。 例如,如果您在緩衝區資源上使用具類型的 UAV 載入與R8_UNORM資料,則必須將元素類型宣告為 unorm float
:
RWBuffer<unorm float> uav;
相關主題