Загрузка типизированного представления неупорядоченного доступа

Типизированные нагрузки в представлении неупорядоченного доступа (UAV) — это возможность шейдера считывать данные из БПЛА с определенным DXGI_FORMAT.

Общие сведения

Неупорядоченное представление доступа (UAV) — это представление ресурса неупорядоченного доступа (которое может включать буферы, текстуры и массивы текстур, хотя и без множественной выборки). UAV обеспечивает временно неупорядоченный доступ на чтение и запись из нескольких потоков. Это означает, что этот тип ресурса может одновременно считываться и записываться несколькими потоками без создания конфликтов памяти. Этот одновременный доступ обрабатывается с помощью атомарных функций.

D3D12 и D3D11.3 расширяет список форматов, которые можно использовать с типизированными загрузками UAV.

Поддерживаемые форматы и вызовы API

Ранее следующие три формата поддерживали типизированные загрузки UAV и требовались для оборудования D3D11.0. Они поддерживаются для всего оборудования D3D11.3 и D3D12.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

Следующие форматы поддерживаются в виде набора на оборудовании D3D12 или D3D11.3, поэтому если они поддерживаются, поддерживаются все.

  • 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

Следующие форматы дополнительно и по отдельности поддерживаются на оборудовании D3D12 и D3D11.3, поэтому для тестирования поддержки необходимо выполнить один запрос к каждому формату.

  • 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

Чтобы определить поддержку любых дополнительных форматов, вызовите ID3D11Device::CheckFeatureSupport с D3D11_FEATURE_DATA_D3D11_OPTIONS2 структурой в качестве первого параметра. Бит TypedUAVLoadAdditionalFormats будет задан, если поддерживается приведенный выше список поддерживаемых как набор. Выполните второй вызов CheckFeatureSupport, используя структуру D3D11_FEATURE_DATA_FORMAT_SUPPORT2 (проверив возвращаемую структуру по D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD члену перечисления D3D11_FORMAT_SUPPORT2 ), чтобы определить поддержку в списке дополнительно поддерживаемых форматов выше, например:

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!
        }
    }
}

Использование типизированных UAV загружает из HLSL

Для типизированных БПЛА флаг HLSL D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Ниже приведен пример кода шейдера для обработки типизированной загрузки UAV:

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

Функции Direct3D 11.3

Модель шейдера 5.1