Freigeben über


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

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);
}

Direct3D 11.3-Features

Shadermodell 5.1