Typisierte, ungeordnete Zugriffsansichtsladevorgänge
Unordered Access View (UAV) Typed Load ist die Möglichkeit für einen Shader, aus einem UAV mit einem bestimmten DXGI_FORMAT zu lesen.
- Übersicht
- Unterstützte Formate und API-Aufrufe
- Verwenden von typisierten UAV-Ladevorgängen aus HLSL
- Zugehörige Themen
Übersicht
Eine ungeordnete Zugriffsansicht (UAV) ist eine Ansicht einer ungeordneten Zugriffsressource (die Puffer, Texturen und Texturarrays enthalten kann, jedoch ohne Multisampling). Ein UAV ermöglicht zeitlich ungeordneten Lese-/Schreibzugriff aus mehreren Threads. Dies bedeutet, dass dieser Ressourcentyp gleichzeitig von mehreren Threads gelesen/geschrieben werden kann, ohne dass Speicherkonflikte entstehen. Dieser gleichzeitige Zugriff wird durch die Verwendung von Atomic Functions verarbeitet.
D3D12 und D3D11.3 erweitern die Liste der Formate, die mit typisierten UAV-Ladevorgängen verwendet werden können.
Unterstützte Formate und API-Aufrufe
Bisher unterstützten die folgenden drei Formate typisierte UAV-Ladevorgänge und waren für D3D11.0-Hardware erforderlich. Sie werden für alle D3D11.3- und D3D12-Hardware unterstützt.
- R32_FLOAT
- R32_UINT
- R32_SINT
Die folgenden Formate werden als Gruppe auf D3D12- oder D3D11.3-Hardware unterstützt. Wenn also eines unterstützt wird, werden alle unterstützt.
- 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
Die folgenden Formate werden optional und einzeln auf D3D12- und D3D11.3-Hardware unterstützt, sodass für jedes Format eine einzelne Abfrage durchgeführt werden muss, um die Unterstützung zu testen.
- 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
Um die Unterstützung für zusätzliche Formate zu bestimmen, rufen Sie ID3D11Device::CheckFeatureSupport mit der D3D11_FEATURE_DATA_D3D11_OPTIONS2-Struktur als ersten Parameter auf. Das TypedUAVLoadAdditionalFormats
Bit wird festgelegt, wenn die obige Liste "unterstützt als Menge" unterstützt wird. Führen Sie einen zweiten Aufruf von CheckFeatureSupport durch, indem Sie eine D3D11_FEATURE_DATA_FORMAT_SUPPORT2-Struktur verwenden (überprüfen Sie die zurückgegebene Struktur mit dem D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD Member der D3D11_FORMAT_SUPPORT2 Enumeration), um die Unterstützung in der Liste der optional unterstützten Formate oben zu ermitteln, z. B.:
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!
}
}
}
Verwenden von typisierten UAV-Ladevorgängen aus HLSL
Für typisierte UAVs ist das HLSL-Flag D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.
Im Folgenden finden Sie Beispiel-Shadercode zum Verarbeiten einer typisierten UAV-Last:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
Zugehörige Themen