Ungeordnete Zugriffsansicht (UAV) wird geladen.
Ungeordnete Access-Ansicht (UAV) Typed Load ist die Möglichkeit, einen Shader aus einem UAV mit einem bestimmten DXGI_FORMATzu lesen.
- Übersicht
- Unterstützte Formate und API-Aufrufe
- Verwenden von typierten UAV-Lasten aus HLSL-
- Verwenden von UNORM- und SNORM-typierten UAV-Lasten von HLSL-
- Verwandte Themen
Überblick
Eine ungeordnete Zugriffsansicht (Unordered Access View, 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 von mehreren Threads. Dies bedeutet, dass dieser Ressourcentyp von mehreren Threads ohne Speicherkonflikte gleichzeitig gelesen/geschrieben werden kann. Dieser gleichzeitige Zugriff wird über die Verwendung von Atomfunktionenbehandelt.
D3D12 (und D3D11.3) wird in der Liste der Formate erweitert, die mit typierten UAV-Lasten verwendet werden können.
Unterstützte Formate und API-Aufrufe
Zuvor wurden die folgenden drei Formate unterstützt, die typierte UAV-Ladevorgänge unterstützen und für die D3D11.0-Hardware erforderlich waren. Sie werden für alle D3D11.3- und D3D12-Hardware unterstützt.
- R32_FLOAT
- R32_UINT
- R32_SINT
Die folgenden Formate werden als Satz auf D3D12- oder D3D11.3-Hardware unterstützt, sodass alle unterstützten Formate unterstützt werden.
- 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 erstellt 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
- R8G8_SINT
- R16_UNORM
- R16_SNORM
- R8_SNORM
- A8_UNORM
- B5G6R5_UNORM
- B5G5R5A1_UNORM
- B4G4R4A4_UNORM
Um die Unterstützung für alle zusätzlichen Formate zu ermitteln, rufen Sie CheckFeatureSupport- mit der D3D12_FEATURE_DATA_D3D12_OPTIONS Struktur als ersten Parameter auf (siehe Capability Querying). Das TypedUAVLoadAdditionalFormats Feld wird festgelegt, wenn die obige Liste "unterstützt als Satz" unterstützt wird. Führen Sie einen zweiten Aufruf von CheckFeatureSupportaus, indem Sie eine D3D12_FEATURE_DATA_FORMAT_SUPPORT Struktur verwenden (überprüfen Sie die zurückgegebene Struktur mit dem D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD Member der D3D12_FORMAT_SUPPORT2 Enumeration), um die Unterstützung in der Liste der oben aufgeführten optional unterstützten Formate zu ermitteln, z. B.:
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!
}
}
}
Verwenden von typierten UAV-Lasten aus HLSL
Für typierte UAVs ist das HLSL-Flag D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.
Hier sehen Sie Beispiel-Shadercode zum Verarbeiten einer typierten UAV-Last:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
Verwenden von UNORM- und SNORM-typierten UAV-Lasten aus HLSL
Wenn Sie typierte UAV-Lasten zum Lesen aus einer UNORM- oder SNORM-Ressource verwenden, müssen Sie den Elementtyp des HLSL-Objekts ordnungsgemäß als unorm
oder snorm
deklarieren. Es wird als nicht definiertes Verhalten angegeben, um den in HLSL deklarierten Elementtyp mit dem zugrunde liegenden Ressourcendatentyp nicht übereinzustimmen. Wenn Sie beispielsweise typierte UAV-Lasten für eine Pufferressource mit R8_UNORM Daten verwenden, müssen Sie den Elementtyp als unorm float
deklarieren:
RWBuffer<unorm float> uav;
Verwandte Themen