Поделиться через


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

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

Обзор

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

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

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

Ранее для оборудования D3D11.0 были необходимы следующие три формата, поддерживаемые типизированными нагрузками UAV. Они поддерживаются для всех оборудования 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
  • R8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

Чтобы определить поддержку любых дополнительных форматов, вызовите CheckFeatureSupport со структурой D3D12_FEATURE_DATA_D3D12_OPTIONS в качестве первого параметра (см. раздел возможности запроса). Поле TypedUAVLoadAdditionalFormats будет задано, если поддерживается приведенный выше список "поддерживаемый как набор". Выполните второй вызов CheckFeatureSupport, используя структуру D3D12_FEATURE_DATA_FORMAT_SUPPORT (проверяя возвращаемую структуру в D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD элементе перечисления D3D12_FORMAT_SUPPORT2), чтобы определить поддержку в списке необязательных поддерживаемых форматов, перечисленных выше, например:

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

Использование типизированной загрузки UAV из HLSL

Для типизированных UAV флаг HLSL D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

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

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

Использование unORM и SNORM typed UAV загружается из HLSL

При использовании типизированной UAV загружается для чтения из ресурса UNORM или SNORM, необходимо правильно объявить тип элемента объекта HLSL для unorm или snorm. Оно указывается как неопределенное поведение, чтобы не совпадать с типом элемента, объявленным в HLSL, с базовым типом данных ресурса. Например, если вы используете типизированные нагрузки UAV на буферный ресурс с данными R8_UNORM, необходимо объявить тип элемента как unorm float:

RWBuffer<unorm float> uav;

отрисовки

привязки ресурсов

привязка ресурсов в HLSL

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

указание корневых подписей в HLSL