형식화된 UAV(순서가 지정되지 않은 액세스 뷰) 로드
UAV(순서가 지정되지 않은 액세스 뷰) 형식화된 로드는 셰이더가 특정 DXGI_FORMAT 있는 UAV에서 읽을 수 있는 기능입니다.
개요
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
추가 형식에 대한 지원을 확인하려면 D3D11_FEATURE_DATA_D3D11_OPTIONS2 구조체를 첫 번째 매개 변수로 사용하여 ID3D11Device::CheckFeatureSupport를 호출합니다.
TypedUAVLoadAdditionalFormats
위의 "집합으로 지원됨" 목록이 지원되는 경우 비트가 설정됩니다. D3D11_FEATURE_DATA_FORMAT_SUPPORT2 구조체(D3D11_FORMAT_SUPPORT2 열거형의 D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD 멤버에 대해 반환된 구조체 확인)를 사용하여 CheckFeatureSupport를 두 번째로 호출하여 위의 선택적으로 지원되는 형식 목록에서 지원을 확인합니다. 예를 들면 다음과 같습니다.
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!
}
}
}
HLSL의 형식화된 UAV 로드 사용
형식화된 UAV의 경우 HLSL 플래그가 D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.
다음은 형식화된 UAV 로드를 처리하는 예제 셰이더 코드입니다.
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
관련 항목