DXGKCB_NOTIFY_INTERRUPT fonction de rappel (d3dkmddi.h)

Un pilote miniport d’affichage en mode noyau appelle DXGKCB_NOTIFY_INTERRUPT pour informer le planificateur de l’unité de traitement graphique (GPU) d’une mise à jour matérielle graphique à l’heure de la routine de service d’interruption (ISR).

Syntaxe

DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;

void DxgkcbNotifyInterrupt(
  [in] IN_CONST_HANDLE hAdapter,
  [in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}

Paramètres

[in] hAdapter

Handle de l’objet adaptateur pour le GPU. Un pilote reçoit le handle du membre DeviceHandle de la structure DXGKRNL_INTERFACE dans un appel à sa fonction DxgkDdiStartDevice .

[in] unnamedParam2

Pointeur vers une structure DXGKARGCB_NOTIFY_INTERRUPT_DATA qui contient des informations de notification pour une interruption.

Valeur de retour

None

Remarques

Un pilote de miniport d’affichage appelle la fonction DXGKCB_NOTIFY_INTERRUPT pour signaler une interruption de matériel graphique définie par le type d’énumération DXGK_INTERRUPT_TYPE .

En règle générale, DXGKCB_NOTIFY_INTERRUPT est appelée à partir de la fonction DxgkDdiInterruptRoutine (ISR) du pilote de miniport d’affichage, appelée lorsque des interruptions matérielles graphiques se produisent. DXGKCB_NOTIFY_INTERRUPT informe le planificateur GPU d’une mise à jour d’une clôture par le biais d’un flux d’accès direct à la mémoire (DMA) vers le matériel graphique.

Si le pilote de miniport d’affichage utilise plusieurs gestionnaires d’interruption qui correspondent à plusieurs IRQL, le pilote ne doit pas appeler DXGKCB_NOTIFY_INTERRUPT de manière réentrante. Par conséquent, dans ce cas, le pilote miniport d’affichage doit toujours appeler DXGKCB_NOTIFY_INTERRUPT à partir d’un niveau fixe du gestionnaire d’interruptions.

De même, si des interruptions signalées par un message sont utilisées, le pilote miniport d’affichage peut appeler DXGKCB_NOTIFY_INTERRUPT à partir d’un gestionnaire d’interruptions qui correspond à un numéro de message fixe. Le pilote doit signaler le numéro de message utilisé pour la notification dans le membre InterruptMessageNumber de la structure DXGK_DRIVERCAPS , lorsque la valeur d’énumération DXGKQAITYPE_DRIVERCAPS est spécifiée dans le membre Type de la structure DXGKARG_QUERYADAPTERINFO dans un appel à la fonction DxgkDdiQueryAdapterInfo du pilote.

Une fois que le pilote de miniport d’affichage a appelé DXGKCB_NOTIFY_INTERRUPT , mais avant que le pilote ne quitte son ISR, le pilote doit mettre en file d’attente un appel de procédure différée (DPC) à l’aide de la fonction DxgkCbQueueDpc . Ce DPC doit être mis en file d’attente, car le planificateur GPU doit également être averti lorsque la routine de rappel DPC du pilote appelle la fonction DXGKCB_NOTIFY_DPC , à peu près le même événement au moment de la DPC. Une certaine quantité de traitement liée aux événements matériels graphiques ne peut être effectuée que par le système d’exploitation au moment de la DPC.

Si le pilote de miniport d’affichage détermine que plusieurs interruptions ont été déclenchées dans le matériel et que le pilote doit appeler DXGKCB_NOTIFY_INTERRUPT pour chaque interruption pour signaler l’interruption au système d’exploitation, le pilote doit signaler les interruptions de type DMA avant une interruption de type CRTC. Pour plus d’informations sur les types d’interruption, consultez DXGK_INTERRUPT_TYPE.

Les appelants de DXGKCB_NOTIFY_INTERRUPT s’exécutent au niveau de l’interruption (c’est-à-dire, DIRQL, qui est un certain IRQL entre DISPATCH_LEVEL et PROFILE_LEVEL, non inclus).

DXGKCB_XXX fonctions sont implémentées par Dxgkrnl. Pour utiliser cette fonction de rappel, appelez DxgkCbNotifyInterrupt via le DXGKRNL_INTERFACE.

Exemples

L’exemple de code suivant montre le code du moteur logiciel qui surveille une file d’attente logicielle et avertit le planificateur GPU de l’achèvement des paquets.

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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista (WDDM 1.0)
Plateforme cible Desktop (Expérience utilisateur)
En-tête d3dkmddi.h (include D3dkmddi.h)
IRQL Consultez la section Notes.

Voir aussi

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice