Cargas de vistas de acceso sin ordenar con tipo

La carga con tipo de vista de acceso sin ordenar (UAV) es la capacidad de que un sombreador lea desde un UAV con un DXGI_FORMAT específico.

Información general

Una vista de acceso sin ordenar (UAV) es una vista de un recurso de acceso desordenado (que puede incluir búferes, texturas y matrices de texturas, aunque sin muestreo múltiple). Un UAV permite el acceso temporal de lectura y escritura sin ordenar desde varios subprocesos. Esto significa que este tipo de recurso se puede leer y escribir simultáneamente en varios subprocesos sin generar conflictos de memoria. Este acceso simultáneo se controla mediante el uso de funciones atómicas.

D3D12 y D3D11.3 se expanden en la lista de formatos que se pueden usar con cargas UAV con tipo.

Formatos admitidos y llamadas API

Anteriormente, los tres formatos siguientes admitían cargas UAV con tipo y eran necesarios para el hardware D3D11.0. Se admiten para todos los hardware D3D11.3 y D3D12.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

Los formatos siguientes se admiten como un conjunto en hardware D3D12 o D3D11.3, por lo que, si se admite alguno, se admiten todos.

  • 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

Los siguientes formatos son opcionales y se admiten individualmente en hardware D3D12 y D3D11.3, por lo que es necesario realizar una sola consulta en cada formato para probar la compatibilidad.

  • 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
  • 8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

Para determinar la compatibilidad con cualquier formato adicional, llame a ID3D11Device::CheckFeatureSupport con la estructura D3D11_FEATURE_DATA_D3D11_OPTIONS2 como primer parámetro. El TypedUAVLoadAdditionalFormats bit se establecerá si se admite la lista "compatible como un conjunto" anterior. Realice una segunda llamada a CheckFeatureSupport mediante una estructura de D3D11_FEATURE_DATA_FORMAT_SUPPORT2 (comprobando la estructura devuelta en el miembro D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD de la enumeración D3D11_FORMAT_SUPPORT2 ) para determinar la compatibilidad en la lista de formatos opcionalmente admitidos anteriormente, por ejemplo:

D3D11_FEATURE_DATA_D3D11_OPTIONS2 FeatureData;
ZeroMemory(&FeatureData, sizeof(FeatureData));
HRESULT hr = pDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, &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:
        D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport;
        ZeroMemory(&FormatSupport, sizeof(FormatSupport));
        FormatSupport.InFormat = DXGI_FORMAT_R32G32_FLOAT;
        hr = pDevice->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport, sizeof(FormatSupport));
        if (SUCCEEDED(hr) && (FormatSupport.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD) != 0)
        {
            // DXGI_FORMAT_R32G32_FLOAT supports UAV Typed Load!
        }
    }
}

Uso de cargas UAV con tipo desde HLSL

En el caso de las UAV con tipo, la marca HLSL es D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Este es el código del sombreador de ejemplo para procesar una carga de UAV con tipo:

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

Características de Direct3D 11.3

Modelo de sombreador 5.1