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, &notifyInt);

    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 설명 섹션을 참조하십시오.

추가 정보

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice