DXGKDDI_QUERYCURRENTFENCE 콜백 함수(d3dkmddi.h)

DxgkDdiQueryCurrentFence 함수는 하드웨어 명령 실행 단위에서 완료된 최신 제출 펜스 식별자에 대해 쿼리합니다.

구문

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

매개 변수

[in] hAdapter

디스플레이 어댑터와 연결된 컨텍스트 블록에 대한 핸들입니다. 디스플레이 미니포트 드라이버는 이전에 DxgkDdiAddDevice 함수의 MiniportDeviceContext 출력 매개 변수에서 Microsoft DirectX 그래픽 커널 하위 시스템에 이 핸들을 제공했습니다.

[in/out] pCurrentFence

현재 펜스 데이터에 대한 정보를 포함하는 DXGKARG_QUERYCURRENTFENCE 구조체에 대한 포인터입니다.

반환 값

DxgkDdiQueryCurrentFence 는 펜스 데이터가 성공적으로 검색되지 않은 경우 STATUS_SUCCESS 반환하거나 적절한 오류 결과를 반환합니다.

설명

펜스는 64비트 데이터와 주소를 포함하는 명령입니다. 디스플레이 미니포트 드라이버는 GPU(그래픽 처리 장치)로 전송되는 DMA(직접 메모리 액세스) 스트림에 펜스를 삽입할 수 있습니다. GPU가 펜스를 읽을 때 GPU는 지정된 펜스 주소에 펜스 데이터를 씁니다. 그러나 GPU가 펜스 데이터를 메모리에 쓰기 전에 펜스 명령 앞에 있는 기본 형식의 모든 픽셀이 사용 중지되고 메모리에 올바르게 기록되도록 해야 합니다.

참고 GPU는 펜스 명령 앞의 기본 요소에서 마지막 픽셀이 사용 중지되기를 기다리는 동안 전체 파이프라인을 중단하지 않아도 됩니다. GPU는 대신 펜스 지침을 따르는 기본 형식을 실행할 수 있습니다.
 
GPU 컨텍스트별 가상 주소 공간을 지원하는 하드웨어는 다음 유형의 펜스를 지원해야 합니다.
  • 일반 펜스는 사용자 모드에서 만든 DMA 버퍼에 삽입할 수 있는 펜스입니다. 사용자 모드의 DMA 버퍼 콘텐츠를 신뢰할 수 없으므로 이러한 DMA 버퍼 내의 펜스는 실제 주소가 아닌 GPU 컨텍스트 주소 공간의 가상 주소를 참조해야 합니다. 이러한 가상 주소에 대한 액세스는 GPU가 액세스하는 다른 가상 주소와 동일한 메모리 유효성 검사 메커니즘에 의해 바인딩됩니다.
  • 권한 있는 펜스 는 커널 모드에서 만들어지고 액세스할 수 있는 DMA 버퍼에만 삽입할 수 있는 펜스입니다. 이러한 DMA 버퍼 내의 펜스는 메모리의 실제 주소를 참조합니다.

    사용자 모드에서 펜스 대상 주소에 액세스할 수 있는 경우 악성 소프트웨어는 펜스의 메모리 위치에 대해 그래픽 작업을 수행하여 커널이 수신해야 하는 내용의 내용을 재정의할 수 있습니다.

권한 있는 DMA 버퍼에는 일반 및 권한 있는 펜스가 모두 포함될 수 있습니다. 그러나 권한 있는 DMA 버퍼에 일반 펜스가 포함된 경우 이러한 DMA 버퍼를 생성한 커널 구성 요소는 내부의 일반 펜스에 액세스할 수 없다는 것을 알고 있습니다.

디스플레이 미니포트 드라이버가 DMA 버퍼의 마지막 펜스를 놓친 경우 드라이버의 DxgkDdiQueryCurrentFence 함수를 호출하여 누락된 펜스를 보고할 수 있습니다. 예를 들어 하드웨어가 메모리에 펜스를 생성하는 경우 드라이버의 DxgkDdiInterruptRoutine 함수가 트리거되어 메모리를 읽습니다. 그러나 드라이버가 데이터를 읽으려고 할 때 펜스의 데이터를 사용할 수 없는 경우(예: 결함이 있는 칩셋이 있는 경우) 인터럽트가 중지되지 않는 한 펜스는 일반적으로 다음 인터럽트에서 보고됩니다. 인터럽트 중지되고 DirectX 그래픽 커널 하위 시스템이 펜스에 대해 너무 오래 대기하는 경우 하위 시스템은 드라이버의 DxgkDdiQueryCurrentFence 함수를 호출하여 현재 펜스를 확인하고 누락되었을 수 있는 보류 중인 펜스를 확인합니다.

디스플레이 미니포트 드라이버가 DxgkDdiQueryCurrentFence 호출에서 반환되기 전에 최신 하드웨어 완성 제출 펜스 식별자가 아직 보고되지 않은 경우 드라이버는 DxgkCbNotifyInterrupt 함수를 호출하여 펜스를 보고해야 합니다. 이 기능을 구현하기 위해 드라이버는 다음을 수행합니다.

  1. 운영 체제에 마지막으로 보고된 펜스를 추적합니다.
  2. IRQL을 디바이스 인터럽트로 발생합니다. IRQL을 인터럽트 수준으로 올리기 위해 드라이버는 DxgkCbSynchronizeExecution 함수를 호출하여 DxgkDdiInterruptRoutine 함수와 동기화할 수 있습니다.
  3. 디바이스 인터럽트 IRQL에서 마지막으로 보고된 펜스를 최신 하드웨어 완성 펜스와 비교합니다.
  4. 디바이스 인터럽트 IRQL에서 최신 하드웨어 완료 펜스가 마지막으로 보고된 펜스보다 최신인 경우에만 DxgkCbNotifyInterrupt 를 호출합니다.
DxgkDdiQueryCurrentFence 를 페이징 가능으로 만들어야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
대상 플랫폼 데스크톱
머리글 d3dkmddi.h(D3dkmddi.h 포함)
IRQL PASSIVE_LEVEL

추가 정보

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine