Cargas de la vista de acceso sin ordenar (UAV) con tipo
La carga con tipo de vista de acceso sin ordenar (UAV) es la capacidad de un sombreador para leer desde un UAV con un DXGI_FORMAT específico.
- Información general
- Formatos admitidos y llamadas API
- Uso de cargas UAV con tipo desde HLSL
- Uso de cargas UAV con tipo UNORM y SNORM desde HLSL
- Temas relacionados
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 de lectura y escritura sin ordenar temporalmente 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 expande 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 todo el hardware D3D11.3 y D3D12.
- R32_FLOAT
- R32_UINT
- R32_SINT
Los siguientes formatos 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 opcionalmente 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
- R8G8_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 CheckFeatureSupport con la estructura D3D12_FEATURE_DATA_D3D12_OPTIONS como primer parámetro (consulte Consultas de funcionalidad). El campo TypedUAVLoadAdditionalFormats se establecerá si se admite la lista "compatible como un conjunto" anterior. Realice una segunda llamada a CheckFeatureSupport mediante una estructura de D3D12_FEATURE_DATA_FORMAT_SUPPORT (comprobando la estructura devuelta en el miembro D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD de la enumeración D3D12_FORMAT_SUPPORT2 ) para determinar la compatibilidad en la lista de formatos admitidos opcionalmente enumerados anteriormente, por ejemplo:
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!
}
}
}
Uso de cargas UAV con tipo desde HLSL
En el caso de los 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 UAV con tipo:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
Uso de cargas UAV con tipo UNORM y SNORM desde HLSL
Cuando se usan cargas UAV con tipo para leer desde un recurso UNORM o SNORM, debe declarar correctamente el tipo de elemento del objeto HLSL para que sea unorm
o snorm
. Se especifica como comportamiento indefinido para que no coincida el tipo de elemento declarado en HLSL con el tipo de datos de recurso subyacente. Por ejemplo, si usa cargas UAV con tipo en un recurso de búfer con R8_UNORM datos, debe declarar el tipo de elemento como unorm float
:
RWBuffer<unorm float> uav;
Temas relacionados