Freigeben über


DXGKCB_NOTIFY_INTERRUPT Rückruffunktion (d3dkmddi.h)

Ein Kernelmodusanzeige-Miniporttreiber ruft DXGKCB_NOTIFY_INTERRUPT auf, um den GPU-Zeitplan (Graphics Processing Unit) über ein Grafikhardwareupdate zur Unterbrechung der Dienstroutine (ISR) zu informieren.

Syntax

DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;

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

Parameter

[in] hAdapter

Ein Handle für das Adapterobjekt für die GPU. Ein Treiber empfängt das Handle vom DeviceHandle Member der DXGKRNL_INTERFACE-Struktur in einem Aufruf der DxgkDdiStartDevice--Funktion.

[in] unnamedParam2

Zeigen Sie auf eine DXGKARGCB_NOTIFY_INTERRUPT_DATA Struktur, die Benachrichtigungsinformationen für einen Interrupt enthält.

Rückgabewert

Nichts

Bemerkungen

Ein Anzeigeminiporttreiber ruft die DXGKCB_NOTIFY_INTERRUPT-Funktion auf, um eine Grafikhardware zu melden, die vom DXGK_INTERRUPT_TYPE Enumerationstyp definiert wird.

In der Regel wird DXGKCB_NOTIFY_INTERRUPT aus der DxgkDdiInterruptRoutine-Funktion (ISR) des Anzeigeminiporttreibers aufgerufen, die aufgerufen wird, wenn Grafikhardware unterbrochen wird. DXGKCB_NOTIFY_INTERRUPT informiert den GPU-Scheduler über ein Update auf einen Zaun über einen direkten Speicherzugriffsdatenstrom (Direct Memory Access, DMA) auf die Grafikhardware.

Wenn der Miniporttreiber für die Anzeige mehrere Interrupthandler verwendet, die mehreren IRQLs entsprechen, darf der Treiber DXGKCB_NOTIFY_INTERRUPT nicht erneut aufrufen. Daher sollte der Display-Miniporttreiber in diesem Fall immer DXGKCB_NOTIFY_INTERRUPT von einer festen Ebene des Interrupthandlers aufrufen.

Ebenso kann der Anzeigeminiporttreiber DXGKCB_NOTIFY_INTERRUPT von einem Interrupthandler aufrufen, der einer festen Nachrichtennummer entspricht, wenn Nachrichtenunterbruchunterbrechungen verwendet werden. Der Treiber muss die Nachrichtennummer melden, die für die Benachrichtigung im InterruptMessageNumber Member der DXGK_DRIVERCAPS-Struktur verwendet wird, wenn der DXGKQAITYPE_DRIVERCAPS Enumerationswert im Type Member der DXGKARG_QUERYADAPTERINFO-Struktur in einem Aufruf der DxgkDdiQueryAdapterInfo Funktion des Treibers angegeben wird.

Nachdem der Miniporttreiber DXGKCB_NOTIFY_INTERRUPT aufruft, aber bevor der Treiber seinen ISR verlässt, muss der Treiber einen verzögerten Prozeduraufruf (DPC) mit der DxgkCbQueueDpc-Funktion in die Warteschlange stellen. Dieser DPC muss in die Warteschlange gestellt werden, da der GPU-Scheduler auch benachrichtigt werden muss, wenn die DPC-Rückrufroutine des Treibers die DXGKCB_NOTIFY_DPC-Funktion aufruft, etwa zum gleichen Ereignis zur DPC-Zeit. Eine bestimmte Verarbeitung, die sich auf Grafikhardwareereignisse bezieht, kann nur von dem Betriebssystem zur DPC-Zeit ausgeführt werden.

Wenn der Anzeige-Miniporttreiber feststellt, dass mehrere Unterbrechungen in der Hardware ausgelöst wurden, und der Treiber muss DXGKCB_NOTIFY_INTERRUPT aufrufen, damit jeder Interrupt den Interrupt an das Betriebssystem meldet, sollte der Treiber DMA-Typ-Interrupts vor einem CRTC-Typ-Interrupt melden. Weitere Informationen zu Interrupttypen finden Sie unter DXGK_INTERRUPT_TYPE.

Aufrufer von DXGKCB_NOTIFY_INTERRUPT auf Unterbrechungsebene ausgeführt werden (d. a. DIRQL, d. r. IRQL zwischen DISPATCH_LEVEL und PROFILE_LEVEL, nicht einschließlich).

DXGKCB_XXX Funktionen werden von Dxgkrnlimplementiert. Rufen Sie DxgkCbNotifyInterrupt über die DXGKRNL_INTERFACEauf, um diese Rückruffunktion zu verwenden.

Beispiele

Das folgende Codebeispiel zeigt Softwaremodulcode, der eine Softwarewarteschlange überwacht und den GPU-Scheduler über den Paketabschluss benachrichtigt.

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

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows Vista (WDDM 1.0)
Zielplattform- Desktop
Header- d3dkmddi.h (einschließlich D3dkmddi.h)
IRQL- Siehe Abschnitt "Hinweise".

Siehe auch

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice