Share via


쿼리

Direct3D 12에서 쿼리는 쿼리 힙이라는 쿼리 배열로 그룹화됩니다. 쿼리 힙에는 해당 힙과 함께 사용할 수 있는 유효한 형식의 쿼리를 정의하는 형식이 있습니다.

Direct3D 11부터 Direct3D 12까지 쿼리의 차이점

다음 쿼리 유형은 Direct3D 12에 더 이상 제공되지 않으며 해당 기능은 다른 프로세스에 통합됩니다.

  • 이벤트 쿼리 - 이제 이벤트는 기능적으로 펜스에 의해 처리됩니다.
  • 비연속 타임스탬프 쿼리 - Direct3D 12에서 GPU 시계를 안정적인 상태로 설정할 수 있습니다(타이밍 섹션 참조). GPU 시계 비교는 GPU가 타임스탬프 사이에서 유휴 상태인 경우(비연속 쿼리라고도 함) 의미가 없습니다. 안정적인 성능을 사용할 경우 다른 명령 목록에서 발급된 두 타임스탬프 쿼리를 안정적으로 비교할 수 있습니다. 동일한 명령 목록 내의 두 타임스탬프는 항상 안정적으로 비교할 수 있습니다.
  • 스트림 출력 통계 쿼리 - Direct3D 12에는 모든 출력 스트림에 대한 SO(단일 스트림 출력) 오버플로 쿼리가 없습니다. 앱은 여러 단일 스트림 쿼리를 실행한 후 결과를 상호 연결해야 합니다.
  • 스트림 출력 통계 예측 및 폐색 예측 쿼리 - 쿼리(메모리에 쓰기) 및 예측(메모리에서 읽기)는 더 이상 쌍을 이루지 않으므로 이러한 쿼리 유형은 필요하지 않습니다.

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_DESCCreateQueryHeap 메서드입니다.

코어 런타임은 쿼리 힙 형식이 D3D12_HEAP_TYPE 열거형의 유효한 멤버이고 개수가 0보다 큰지 유효성을 검사합니다.

쿼리 힙 내의 각 개별 쿼리 요소를 별도로 시작 및 중지할 수 있습니다.

쿼리 힙을 사용하기 위한 API는 열거 형 D3D12_QUERY_TYPEBeginQueryEndQuery 메서드입니다.

D3D12_QUERY_TYPE_TIMESTAMP EndQuery 만 지원하는 유일한 쿼리입니다. 다른 모든 쿼리 유형에는 BeginQueryEndQuery가 필요합니다.

디버그 레이어는 다음의 유효성을 검사합니다.

  • 타임스탬프 쿼리를 시작하는 것은 불법입니다. 종료할 수 있습니다.
  • 한 쿼리를 종료하지 않고 두 번 시작하는 것은 올바르지 않습니다(지정된 요소에 대해). 시작 및 종료가 모두 필요한 쿼리의 경우 지정된 요소의 경우 해당 시작 전에 쿼리를 종료하는 것은 불법입니다.
  • BeginQuery로 전달되는 쿼리 유형은 EndQuery로 전달되는 쿼리 유형과 일치해야 합니다.

핵심 런타임은 다음의 유효성을 검사합니다.

  • BeginQuery는 타임스탬프 쿼리에서 호출할 수 없습니다.

  • BeginQueryEndQuery를 둘 다 지원하는 쿼리 유형의 경우(타임스탬프의 경우 모두 제외) 지정된 요소에 대한 쿼리가 명령 목록 범위를 벗어날 수 없습니다.

  • 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 Direct, Compute 및 선택적으로 복사
    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 있어야 합니다.