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


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

Типизированное представление неупорядоченного доступа (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
  • 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

Для типизированных БПЛА флаг 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 загружается из HLSL

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

RWBuffer<unorm float> uav;

Отрисовка

Привязка ресурсов

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

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

Определение корневых подписей в HLSL