쿼리
Direct3D 12에서 쿼리는 쿼리 힙이라는 쿼리 배열로 그룹화됩니다. 쿼리 힙에는 해당 힙과 함께 사용할 수 있는 유효한 쿼리 형식을 정의하는 형식이 있습니다.
Direct3D 11에서 Direct3D 12로 쿼리의 차이점
다음 쿼리 형식은 Direct3D 12에 더 이상 존재하지 않으며 해당 기능은 다른 프로세스에 통합됩니다.
- 이벤트 쿼리 - 이제 이벤트가 펜스에 의해 기능적으로 처리됩니다.
- 연결되지 않은 타임스탬프 쿼리 - GPU 클록은 Direct3D 12에서 안정적인 상태로 설정할 수 있습니다(타이밍 섹션 참조). GPU가 타임스탬프(연결되지 않은 쿼리라고 함) 사이에 전혀 유휴 상태이면 GPU 클록 비교는 의미가 없습니다. 안정적인 파워를 사용하면 서로 다른 명령 목록에서 실행된 두 개의 타임스탬프 쿼리가 안정적으로 비교할 수 있습니다. 동일한 명령 목록 내의 두 타임스탬프는 항상 안정적으로 비교할 수 있습니다.
- Stream 출력 통계 쿼리 - Direct3D 12에는 모든 출력 스트림에 대한 SO(단일 스트림 출력) 오버플로 쿼리가 없습니다. 앱은 여러 단일 스트림 쿼리를 실행한 다음 결과를 상호 연결해야 합니다.
- Stream 출력 통계 조건자 및 폐색 조건자 쿼리 - 쿼리(메모리에 쓰기) 및 조건자(메모리에서 읽는)은 더 이상 결합되지 않으므로 이러한 쿼리 형식이 필요하지 않습니다.
새 이진 폐색 쿼리 형식이 Direct3D 12에 추가되었습니다. 이렇게 하면 개체가 완전히 폐색되었는지 여부(폐색된 픽셀 수보다는)에만 주의하여 디바이스에 이를 나타낼 수 있으므로 쿼리를 보다 효율적으로 수행할 수 있습니다.
쿼리 힙
쿼리는 여러 형식(D3D12_QUERY_HEAP_TYPE)에서 하나일 수 있으며 GPU에 제출되기 전에 쿼리 힙으로 그룹화됩니다.
새 쿼리 형식 D3D12_QUERY_TYPE_BINARY_OCCLUSION 사용할 수 있으며 이진 0/1 결과를 반환한다는 점을 제외하고 D3D12_QUERY_TYPE_OCCLUSION 같이 작동합니다. 0은 깊이 및 스텐실 테스트를 통과한 샘플이 없음을 나타내고, 1은 하나 이상의 샘플이 깊이 및 스텐실 테스트를 통과했음을 나타냅니다. 이렇게 하면 폐색 쿼리가 깊이/스텐실 테스트와 관련된 GPU 성능 최적화를 방해하지 않을 수 있습니다.
쿼리 힙 만들기
쿼리 힙을 만드는 데 관련된 API는 열거형 D3D12_QUERY_HEAP_TYPE, 구조체 D3D12_QUERY_HEAP_DESC및 createQueryHeap 메서드가.
핵심 런타임은 쿼리 힙 형식이 D3D12_HEAP_TYPE 열거형의 유효한 멤버이고 개수가 0보다 큰지 확인합니다.
쿼리 힙 내의 각 개별 쿼리 요소를 개별적으로 시작하고 중지할 수 있습니다.
쿼리 힙을 사용하기 위한 API는 열거형 D3D12_QUERY_TYPE및 BeginQuery및 EndQuery메서드입니다.
D3D12_QUERY_TYPE_TIMESTAMP EndQuery만 지원하는 유일한 쿼리입니다. 다른 모든 쿼리 형식에는 BeginQuery 및 EndQuery필요합니다.
디버그 계층은 다음의 유효성을 검사합니다.
- 타임스탬프 쿼리를 시작하는 것은 불법입니다. 종료만 가능합니다.
- 쿼리를 종료하지 않고 쿼리를 두 번 시작하는 것은 불법입니다(지정된 요소의 경우). 시작 및 종료가 모두 필요한 쿼리의 경우 지정된 요소에 대해 해당 시작 전에 쿼리를 종료하는 것은 불법입니다.
- BeginQuery 전달된 쿼리 형식은 EndQuery전달된 쿼리 형식과 일치해야 합니다.
핵심 런타임은 다음의 유효성을 검사합니다.
BeginQuery 타임스탬프 쿼리에서 호출할 수 없습니다.
BeginQuery 및 EndQuery 모두 지원하는 쿼리 형식(타임스탬프 제외)의 경우 지정된 요소에 대한 쿼리가 명령 목록 경계를 넘지 않아야 합니다.
ElementIndex 범위 내에 있어야 합니다.
쿼리 형식은 D3D12_QUERY_TYPE 열거형의 유효한 멤버입니다.
쿼리 형식은 쿼리 힙과 호환되어야 합니다. 다음 표에서는 각 쿼리 형식에 필요한 쿼리 힙 형식을 보여 있습니다.
쿼리 유형 쿼리 힙 유형 D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS 쿼리 형식은 명령 목록 형식에서 지원됩니다. 다음 표에서는 어떤 명령 목록 형식에서 지원되는 쿼리를 보여 줍니다.
쿼리 유형 지원되는 명령 목록 형식 D3D12_QUERY_TYPE_OCCLUSION 직접적 D3D12_QUERY_TYPE_BINARY_OCCLUSION 직접적 D3D12_QUERY_TYPE_TIMESTAMP 직접, 컴퓨팅 및 선택적으로 복사 D3D12_QUERY_TYPE_PIPELINE_STATISTICS 직접적 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 직접적 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 직접적 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 직접적 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 직접적
쿼리에서 데이터 추출
쿼리에서 데이터를 추출하는 방법은 ResolveQueryData 메서드를 사용하는 것입니다. ResolveQueryData 모든 메모리 형식(시스템 메모리 또는 디바이스 로컬 메모리)에서 작동하지만 대상 리소스가 D3D12_RESOURCE_STATE_COPY_DEST있어야 합니다.