DXGKCB_NOTIFY_INTERRUPT 콜백 함수(d3dkmddi.h)
커널 모드 디스플레이 미니포트 드라이버는 DXGKCB_NOTIFY_INTERRUPT 호출하여 GPU(그래픽 처리 장치) 스케줄러에 ISR(인터럽트 서비스 루틴) 시간에 그래픽 하드웨어 업데이트에 대해 알릴 수 있습니다.
구문
DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;
void DxgkcbNotifyInterrupt(
[in] IN_CONST_HANDLE hAdapter,
[in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}
매개 변수
[in] hAdapter
GPU의 어댑터 개체에 대한 핸들입니다. 드라이버는 DxgkDdiStartDevice 함수를 호출하여 DXGKRNL_INTERFACE 구조체의 DeviceHandle 멤버로부터 핸들을 받습니다.
[in] unnamedParam2
인터럽트 알림 정보를 포함하는 DXGKARGCB_NOTIFY_INTERRUPT_DATA 구조체에 대한 포인터입니다.
반환 값
없음
설명
디스플레이 미니포트 드라이버는 DXGKCB_NOTIFY_INTERRUPT 함수를 호출하여 DXGK_INTERRUPT_TYPE 열거형 형식이 정의하는 그래픽 하드웨어 인터럽트 보고
일반적으로 DXGKCB_NOTIFY_INTERRUPT 그래픽 하드웨어 인터럽트가 발생할 때 호출되는 디스플레이 미니포트 드라이버의 DxgkDdiInterruptRoutine 함수(ISR)에서 호출됩니다. DXGKCB_NOTIFY_INTERRUPT 그래픽 하드웨어에 대한 DMA(직접 메모리 액세스) 스트림을 통해 펜스에 대한 업데이트에 대해 GPU 스케줄러에 알릴 수 있습니다.
디스플레이 미니포트 드라이버가 여러 IRQL에 해당하는 여러 인터럽트 처리기를 사용하는 경우 드라이버는 재진입 방식으로 DXGKCB_NOTIFY_INTERRUPT 호출해서는 안 됩니다. 따라서 이 경우 디스플레이 미니포트 드라이버는 항상 고정된 수준의 인터럽트 처리기에서 DXGKCB_NOTIFY_INTERRUPT 호출해야 합니다.
마찬가지로 메시지 신호 인터럽트를 사용하는 경우 디스플레이 미니포트 드라이버는 고정된 메시지 번호에 해당하는 인터럽트 처리기에서 DXGKCB_NOTIFY_INTERRUPT 호출할 수 있습니다. 드라이버의 DxgkDdiQueryAdapterInfo 함수 호출에서 DXGKQAITYPE_DRIVERCAPS 열거형 값이 DXGKARG_QUERYADAPTERINFO 구조체의 Type 멤버에 지정된 경우 드라이버는 DXGK_DRIVERCAPS 구조체의 InterruptMessageNumber 멤버에서 알림에 사용되는 메시지 번호를 보고해야 합니다.
디스플레이 미니포트 드라이버가 DXGKCB_NOTIFY_INTERRUPT 호출한 후 드라이버가 ISR을 종료하기 전에 드라이버는 DxgkCbQueueDpc 함수를 사용하여 DPC(지연 프로시저 호출)를 큐에 대기해야 합니다. 드라이버의 DPC 콜백 루틴이 DPC 시간에 거의 동일한 이벤트인 DXGKCB_NOTIFY_DPC 함수를 호출할 때 GPU 스케줄러에도 알림을 받아야 하므로 이 DPC는 큐에 대기해야 합니다. 그래픽 하드웨어 이벤트와 관련된 특정 처리량은 DPC 시간에 운영 체제에서만 수행할 수 있습니다.
디스플레이 미니포트 드라이버가 하드웨어에서 둘 이상의 인터럽트가 트리거되었다고 판단하고 드라이버가 운영 체제에 인터럽트를 보고하기 위해 각 인터럽트에 대해 DXGKCB_NOTIFY_INTERRUPT 호출해야 하는 경우 드라이버는 CRTC 형식 인터럽트 전에 DMA 형식 인터럽트를 보고해야 합니다. 인터럽트 유형에 대한 자세한 내용은 DXGK_INTERRUPT_TYPE.
DXGKCB_NOTIFY_INTERRUPT 호출자는 인터럽트 수준에서 실행됩니다(즉, DISPATCH_LEVEL 및 PROFILE_LEVEL 사이의 일부 IRQL인 DIRQL은 포함되지 않음).
DXGKCB_XXX 함수는 Dxgkrnl에 의해 구현됩니다. 이 콜백 함수를 사용하려면 DXGKRNL_INTERFACE 통해 DxgkCbNotifyInterrupt를 호출합니다.
예제
다음 코드 예제에서는 소프트웨어 큐를 모니터링하고 GPU 스케줄러에 패킷 완료에 대해 알 수 있도록 하는 소프트웨어 엔진 코드를 보여 줍니다.
typedef struct _SubmitParams {
HW_DEVICE_EXTENSION *pHwDeviceExtension;
UINT NodeOrdinal;
UINT FenceID;
UINT PreemptionFenceID;
} SubmitParams;
BOOLEAN R200TEST_SWNode_SynchronizeVidSchNotifyInt(PVOID* params)
{
SubmitParams *pSchNotifyParams = (SubmitParams*)params;
DXGKCB_NOTIFY_INTERRUPT DxgkCbNotifyInterrupt;
DXGKARGCB_NOTIFY_INTERRUPT_DATA notifyInt = {0};
DxgkCbNotifyInterrupt = (DXGKCB_NOTIFY_INTERRUPT)pSchNotifyParams->pHwDeviceExtension->pVidSchINTCB;
if(!DxgkCbNotifyInterrupt) {
return FALSE;
}
if(pSchNotifyParams->PreemptionFenceID) {
notifyInt.InterruptType = DXGK_INTERRUPT_DMA_PREEMPTED;
notifyInt.DmaPreempted.PreemptionFenceId = pSchNotifyParams->PreemptionFenceID;
notifyInt.DmaPreempted.LastCompletedFenceId = pSchNotifyParams->FenceID;
notifyInt.DmaPreempted.NodeOrdinal = pSchNotifyParams->NodeOrdinal;
}
else {
notifyInt.InterruptType = DXGK_INTERRUPT_DMA_COMPLETED;
notifyInt.DmaCompleted.SubmissionFenceId = pSchNotifyParams->FenceID;
notifyInt.DmaCompleted.NodeOrdinal = pSchNotifyParams->NodeOrdinal;
}
DxgkCbNotifyInterrupt(pSchNotifyParams->pHwDeviceExtension->DeviceHandle, ¬ifyInt);
pSchNotifyParams->pHwDeviceExtension->PrevSubmitFenceIDArray[pSchNotifyParams->NodeOrdinal] = pSchNotifyParams->FenceID;
if(pSchNotifyParams->PreemptionFenceID) {
pSchNotifyParams->pHwDeviceExtension->PrevPreemptFenceIDArray[pSchNotifyParams->NodeOrdinal] = pSchNotifyParams->PreemptionFenceID;
}
return TRUE;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista(WDDM 1.0) |
대상 플랫폼 | 데스크톱 |
머리글 | d3dkmddi.h(D3dkmddi.h 포함) |
IRQL | 설명 섹션을 참조하십시오. |