共用方式為


具類型的未排序存取檢視 (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

若要判斷對任何其他格式的支援,請使用第一個參數呼叫 CheckFeatureSupport,並將 D3D12_FEATURE_DATA_D3D12_OPTIONS 結構稱為第一個參數(請參閱 功能查詢)。 如果支援上述「支援為集合」清單,則會設定 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,HLSL 旗標會D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS。

以下是處理具類型 UAV 載入的著色器程式代碼範例:

RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
  return uav1.Load(coord);
}

從 HLSL 使用 UNORM 和 SNORM 類型的 UAV 負載

使用具類型的 UAV 載入以從 UNORM 或 SNORM 資源讀取時,您必須正確宣告要 unormsnorm之 HLSL 物件的元素類型。 它會指定為未定義的行為,使 HLSL 中宣告的元素類型與基礎資源數據類型不符。 例如,如果您使用具類型的 UAV 載入緩衝區資源搭配R8_UNORM數據,則必須將專案類型宣告為 unorm float

RWBuffer<unorm float> uav;

轉譯

資源系結

HLSL 中的 資源系結

著色器模型 5.1

在 HLSL 中指定根簽章