UAV 카운터

UAV(unordered-access-view) 카운터를 사용하여 32비트 원자성 카운터를 UAV(unordered-access-view)와 연결할 수 있습니다.

Direct3D 11에서 Direct3D 12로 UAV 카운터의 차이점

Direct3D 12 앱과 Direct3D 11 앱은 모두 UAV 카운터에 액세스하기 위해 동일한 HLSL(상위 수준 셰이더 언어) 셰이더 함수를 사용합니다.

  • IncrementCounter
  • DecrementCounter
  • Append
  • 사용

Direct3D 12

Direct3D 12에서 32비트 값은 애플리케이션에서 할당되므로 다른 Direct3D 12 리소스와 마찬가지로 CPU 또는 GPU에서 32비트 값을 읽고 쓸 수 있습니다.

Direct3D 11

셰이더 외부에서 Direct3D 11을 사용하면 카운터에 액세스하기 위해 API 메서드를 호출해야 합니다(예: ID3D11DeviceContext::CopyStructureCount).

UAV 카운터 사용

앱은 UAV 카운터에 대해 32비트 스토리지를 할당해야 합니다. 이 스토리지는 UAV를 통해 액세스할 수 있는 데이터가 포함된 리소스가 아닌 다른 리소스에서 할당될 수 있습니다.

CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGSD3D12_BUFFER_UAV 참조하세요.

pCounterResourceCreateUnorderedAccessView 호출로 지정되면 UAV와 연결된 카운터가 있습니다. 이 경우 다음과 같습니다.

  • StructureByteStride는 0보다 커야 합니다.
  • 형식은 DXGI_FORMAT_UNKNOWN
  • RAW 플래그를 설정하면 안 됩니다.
  • 두 리소스가 모두 버퍼여야 합니다.
  • CounterOffsetInBytes는 4바이트의 배수여야 합니다.
  • CounterOffsetInBytes는 카운터 리소스 범위 내에 있어야 합니다.
  • pDesc는 NULL일 수 없습니다.
  • pResource는 NULL일 수 없습니다.

또한 다음 사용 사례에 유의하세요.

  • pCounterResource가 지정되지 않은 경우 CounterOffsetInBytes는 0이어야 합니다.
  • RAW 플래그가 설정된 경우 형식은 DXGI_FORMAT_R32_TYPELESS 있어야 하며 UAV 리소스는 버퍼여야 합니다.
  • pCounterResource가 설정되지 않은 경우 CounterOffsetInBytes는 0이어야 합니다.
  • RAW 플래그가 설정되지 않고 StructureByteStride가 0인 경우 형식은 유효한 UAV 형식이어야 합니다.

Direct3D 12에서는 추가 및 카운터 UAV 간에 차이가 없습니다(단, HLSL 바이트코드에는 계속 차이가 있음).

핵심 런타임은 CreateUnorderedAccessView 내부에서 이 제한 사항의 유효성을 검사합니다.

그리기/디스패치 중에 카운터 리소스가 상태 D3D12_RESOURCE_STATE_UNORDERED_ACCESS 있어야 합니다. 또한 단일 Draw/Dispatch 호출 내에서 애플리케이션이 두 개의 개별 UAV 카운터를 통해 동일한 32비트 메모리 위치에 액세스하는 것은 잘못된 동작입니다. 이 동작 중 하나가 발견되면 디버그 계층에서 오류가 발생합니다.

앱에서는 직접 카운터 값에 대해 데이터를 복사할 수 있으므로 “SetUnorderedAccessViewCounterValue” 또는 “CopyStructureCount” 메서드가 없습니다.

카운터가 있는 UAV의 동적 인덱싱이 지원됩니다.

셰이더가 연결된 카운터가 없는 UAV의 카운터에 액세스하려고 하면 디버그 계층에서 경고를 실행하고 앱의 디바이스 제거를 초래하는 GPU 페이지 폴트가 발생합니다.

UAV 카운터는 모든 힙 형식(기본값, 업로드, 다시 읽기)에서 지원됩니다.