UAV(unordered-access-view) 카운터를 사용하여 32비트 원자성 카운터를 UAV(unordered-access-view)와 연결할 수 있습니다.
Direct3D 11에서 Direct3D 12로 UAV 카운터의 차이점
Direct3D 12 앱과 Direct3D 11 앱은 모두 동일한 HLSL(상위 수준 셰이더 언어) 셰이더 함수를 사용하여 UAV 카운터에 액세스합니다.
- IncrementCounter
- DecrementCounter
- 추가
- 사용
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_FLAGS 및 D3D12_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와 카운터 UAV의 구분을 제거합니다(HLSL 바이트코드에는 여전히 구분이 있음).
핵심 런타임은 CreateUnorderedAccessView내에서 이러한 제한 사항의 유효성을 검사합니다.
그리기/디스패치 중에 카운터 리소스는 D3D12_RESOURCE_STATE_UNORDERED_ACCESS상태여야 합니다. 또한 단일 그리기/디스패치 호출 내에서 애플리케이션이 별도의 두 UAV 카운터를 통해 동일한 32비트 메모리 위치에 액세스하는 것은 유효하지 않습니다. 이 중 하나가 검색되면 디버그 계층에서 오류가 발생합니다.
앱이 카운터 값과 직접 데이터를 복사할 수 있기 때문에 "SetUnorderedAccessViewCounterValue" 또는 "CopyStructureCount" 메서드는 없습니다.
카운터가 있는 UAV의 동적 인덱싱이 지원됩니다.
셰이더가 연결된 카운터가 없는 UAV의 카운터에 액세스하려고 하면 디버그 계층에서 경고가 발생하고 GPU 페이지 오류가 발생하여 앱의 디바이스가 제거됩니다.
UAV 카운터는 모든 힙 유형(기본값, 업로드, 읽기 저장)에서 지원됩니다.