Загрузка типизированного неупорядоченного представления доступа (UAV)
Типизированное представление неупорядоченного доступа (UAV) — это возможность шейдера считывать данные из БПЛА с определенным DXGI_FORMAT.
- Обзор
- Поддерживаемые форматы и вызовы API
- Использование типизированных UAV загружает из HLSL
- Использование типизированных БПЛА UNORM и SNORM загружается из HLSL
- Связанные темы
Общие сведения
Неупорядоченное представление доступа (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;
Связанные темы