형식화된 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
  • R8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

추가 형식에 대한 지원을 확인하려면 D3D12_FEATURE_DATA_D3D12_OPTIONS 구조체를 첫 번째 매개 변수로 사용하여 CheckFeatureSupport를 호출합니다(기능 쿼리 참조). 위의 “세트로 지원되는” 목록이 지원되는 경우 TypedUAVLoadAdditionalFormats 필드가 설정됩니다. D3D12_FEATURE_DATA_FORMAT_SUPPORT 구조체(D3D12_FORMAT_SUPPORT2 열거형의 D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD 멤버에 대해 반환된 구조체 확인)를 사용하여 CheckFeatureSupport를 두 번째로 호출하여 위에 나열된 선택적으로 지원되는 형식 목록에서 지원을 확인합니다. 예를 들면 다음과 같습니다.

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

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);
}

HLSL의 UNORM 및 SNORM 형식화된 UAV 로드 사용

UNORM 또는 SNORM 리소스에서 읽는 데 형식화된 UAV 로드를 사용할 경우 HLSL 개체의 요소 형식을 unorm 또는 snorm으로 적절하게 선언해야 합니다. HLSL로 선언된 요소 형식이 기본 리소스 데이터 형식과 일치하지 않는 것은 정의되지 않은 동작으로 지정됩니다. 예를 들어 R8_UNORM 데이터가 있는 버퍼 리소스에서 형식화된 UAV 로드를 사용하는 경우 요소 형식을 로 unorm float선언해야 합니다.

RWBuffer<unorm float> uav;

렌더링

리소스 바인딩

HLSL의 리소스 바인딩

셰이더 모델 5.1

HLSL의 루트 서명 지정