Carregamentos de vista de acesso não ordenado (UAV) tipados
A Carga Tipada de Vista de Acesso Não Ordenado (UAV) é a capacidade de um sombreador ler a partir de um UAV com um DXGI_FORMATespecífico.
- Visão geral
- Formatos suportados e chamadas de API
- Usando cargas de UAV digitadas de HLSL
- Usando cargas de UAV digitadas UNORM e SNORM do HLSL
- Tópicos relacionados
Visão geral
Uma exibição de acesso não ordenado (UAV) é uma exibição de um recurso de acesso não ordenado (que pode incluir buffers, texturas e matrizes de textura, embora sem amostragem múltipla). Um UAV permite acesso de leitura/gravação temporalmente não ordenado a partir 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. Este acesso simultâneo é tratado através do uso de Atomic Functions.
D3D12 (e D3D11.3) expande a lista de formatos que podem ser usados com cargas de UAV digitadas.
Formatos suportados e chamadas de API
Anteriormente, os três formatos a seguir suportavam cargas de UAV digitadas e eram necessários para hardware D3D11.0. Eles são suportados para todos os hardwares D3D11.3 e D3D12.
- R32_FLOAT
- R32_UINT
- R32_SINT
Os seguintes formatos são suportados como um conjunto no hardware D3D12 ou D3D11.3, portanto, se algum for suportado, todos são suportados.
- 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 seguintes formatos são opcional e individualmente suportados 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 quaisquer formatos adicionais, chame CheckFeatureSupport com a estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS como o primeiro parâmetro (consulte Capability Querying). O campo TypedUAVLoadAdditionalFormats será definido se a lista "supported as a set" acima for suportada. 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 do enum D3D12_FORMAT_SUPPORT2) para determinar o suporte na lista de formatos opcionais suportados 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 de UAV digitadas do HLSL
Para UAVs digitados, o sinalizador HLSL é D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.
Aqui está um exemplo de código de sombreador para processar uma carga de UAV digitada:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
Usando cargas de UAV digitadas UNORM e SNORM do HLSL
Ao usar cargas de UAV tipadas para ler de um recurso UNORM ou SNORM, você deve declarar corretamente o tipo de elemento do objeto HLSL a ser unorm
ou snorm
. É especificado como comportamento indefinido para incompatibilidade do 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 dados R8_UNORM, deverá declarar o tipo de elemento como unorm float
:
RWBuffer<unorm float> uav;
Tópicos relacionados