Freigeben über


Typisierte ungeordnete Zugriffsansicht (UAV) lädt

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

Eine ungeordnete Zugriffssicht (UAV) ist eine Ansicht einer nicht sortierten Zugriffsressource (die Puffer, Texturen und Texturarrays enthalten kann, jedoch ohne Multi-Sampling). 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 Speicherkonflikte zu erzeugen. Dieser gleichzeitige Zugriff wird durch die Verwendung von Atomic Functions verarbeitet.

D3D12 (und D3D11.3) erweitert die Liste der Formate, die mit typisierten UAV-Ladevorgängen verwendet werden können.

Unterstützte Formate und API-Aufrufe

Zuvor 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 Satz 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
  • 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 Funktionsabfragen). Das Feld TypedUAVLoadAdditionalFormats wird festgelegt, wenn die Liste "Als Satz unterstützt" oben unterstützt wird. Führen Sie einen zweiten Aufruf von CheckFeatureSupport aus, 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 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 typisierten UAV-Lasten aus HLSL

Für eingegebene UAVs ist das HLSL-Flag D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Hier sehen Sie Beispiel-Shadercode zum Verarbeiten einer typisierten UAV-Last:

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

Verwenden von UNORM- und SNORM-typisierten UAV-Lasten aus HLSL

Wenn Sie typisierte UAV-Lasten zum Lesen aus einer UNORM- oder SNORM-Ressource verwenden, müssen Sie den Elementtyp des HLSL-Objekts ordnungsgemäß als unorm oder snormdeklarieren. Es wird als nicht definiertes Verhalten angegeben, um dem in HLSL deklarierten Elementtyp mit dem zugrunde liegenden Ressourcendatentyp nicht zu entsprechen. Wenn Sie beispielsweise typisierte UAV-Ladevorgänge für eine Pufferressource mit R8_UNORM Daten verwenden, müssen Sie den Elementtyp als unorm floatdeklarieren:

RWBuffer<unorm float> uav;

Darstellung

Ressourcenbindung

Ressourcenbindung in HLSL

Shadermodell 5.1

Festlegen von Stammsignaturen in HLSL