Share via


Cargas de UAV (exibição de acesso não ordenada) digitadas

A carga tipada do UAV (Modo de Exibição de Acesso Não Ordenado) é a capacidade de um sombreador ler de um UAV com um DXGI_FORMAT específico.

Visão geral

Uma exibição de acesso não ordenada (UAV) é uma exibição de um recurso de acesso não ordenado (que pode incluir buffers, texturas e matrizes de textura, embora sem várias amostras). Um UAV permite acesso de leitura/gravação não ordenado temporalmente de vários threads. Isso significa que esse tipo de recurso pode ser lido/gravado simultaneamente por vários threads sem gerar conflitos de memória. Esse acesso simultâneo é tratado por meio do uso de Funções Atômicas.

D3D12 (e D3D11.3) se expande na lista de formatos que podem ser usados com cargas de UAV tipadas.

Formatos e chamadas à API com suporte

Anteriormente, os três formatos a seguir tinham suporte para carregamentos de UAV tipados e eram necessários para hardware D3D11.0. Eles têm suporte para todos os hardwares D3D11.3 e D3D12.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

Os formatos a seguir têm suporte como um conjunto no hardware D3D12 ou D3D11.3, portanto, se houver suporte para qualquer um, todos têm suporte.

  • 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

Os formatos a seguir têm suporte opcional e individual no hardware D3D12 e D3D11.3, portanto, uma única consulta precisaria ser feita em cada formato para testar o suporte.

  • 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

Para determinar o suporte para qualquer formato adicional, chame CheckFeatureSupport com a estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS como o primeiro parâmetro (consulte Consulta de funcionalidade). O campo TypedUAVLoadAdditionalFormats será definido se a lista "com suporte como um conjunto" acima tiver suporte. Faça uma segunda chamada para CheckFeatureSupport, usando uma estrutura D3D12_FEATURE_DATA_FORMAT_SUPPORT (verificando a estrutura retornada em relação ao membro D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD da enumeração D3D12_FORMAT_SUPPORT2 ) para determinar o suporte na lista de formatos opcionalmente com suporte listados acima, por exemplo:

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!
        }
    }
}

Usando cargas UAV tipadas do HLSL

Para UAVs tipado, o sinalizador HLSL é D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Veja um exemplo de código de sombreador para processar uma carga UAV tipada:

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

Usando cargas UAV digitadas unorm e SNORM de HLSL

Ao usar cargas UAV tipadas para leitura de um recurso UNORM ou SNORM, você deve declarar corretamente o tipo de elemento do objeto HLSL como unorm ou snorm. Ele é especificado como um comportamento indefinido para incompatível com o tipo de elemento declarado em HLSL com o tipo de dados de recurso subjacente. Por exemplo, se você estiver usando cargas de UAV tipadas em um recurso de buffer com R8_UNORM dados, deverá declarar o tipo de elemento como unorm float:

RWBuffer<unorm float> uav;

Renderização

Associação de Recursos

Associação de recursos no HLSL

Modelo de sombreador 5.1

Como especificar assinaturas raiz no HLSL