DXGKCB_NOTIFY_INTERRUPT Rückruffunktion (d3dkmddi.h)

Ein Display-Miniporttreiber im Kernelmodus ruft DXGKCB_NOTIFY_INTERRUPT auf, um den GPU-Planer (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 seiner DxgkDdiStartDevice-Funktion .

[in] unnamedParam2

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

Rückgabewert

Keine

Bemerkungen

Ein Display-Miniporttreiber ruft die DXGKCB_NOTIFY_INTERRUPT-Funktion auf, um einen Grafikhardwareunterbrechung zu melden, den der DXGK_INTERRUPT_TYPE-Enumerationstyp definiert.

In der Regel wird DXGKCB_NOTIFY_INTERRUPT über die DxgkDdiInterruptRoutine-Funktion (ISR) des Anzeigeminiporttreibers aufgerufen, die aufgerufen wird, wenn Grafikhardwareunterbrechungen auftreten. DXGKCB_NOTIFY_INTERRUPT informiert den GPU-Planer über ein Update an einen Zaun über einen DMA-Stream (Direct Memory Access) auf die Grafikhardware.

Wenn der Anzeigeminiporttreiber 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.

Analog dazu kann der Anzeigeminiporttreiber bei Verwendung von Interrupts mit Nachrichtensignalen DXGKCB_NOTIFY_INTERRUPT von einem Interrupthandler aufrufen, der einer festen Nachrichtennummer entspricht. 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-Element der DXGKARG_QUERYADAPTERINFO-Struktur in einem Aufruf der DxgkDdiQueryAdapterInfo-Funktion des Treibers angegeben wird.

Nachdem der Anzeige-Miniporttreiber DXGKCB_NOTIFY_INTERRUPT aufruft, aber bevor der Treiber seine ISR verlässt, muss der Treiber einen verzögerten Prozeduraufruf (DPC) mithilfe der DxgkCbQueueDpc-Funktion in die Warteschlange stellen. Dieser DPC muss in die Warteschlange eingereiht werden, da der GPU-Planer auch benachrichtigt werden muss, wenn die DPC-Rückrufroutine des Treibers die DXGKCB_NOTIFY_DPC-Funktion aufruft, etwa dasselbe Ereignis zum DPC-Zeitpunkt. Ein bestimmter Verarbeitungsaufwand, der im Zusammenhang mit Grafikhardwareereignissen steht, kann vom Betriebssystem nur zur DPC-Zeit ausgeführt werden.

Wenn der Anzeige-Miniporttreiber feststellt, dass mehr als ein Interrupt in der Hardware ausgelöst wurde und der Treiber für jeden Interrupt DXGKCB_NOTIFY_INTERRUPT aufrufen muss, um den Interrupt an das Betriebssystem zu melden, sollte der Treiber Unterbrechungen vom Typ DMA vor einem CRTC-Interrupt melden. Weitere Informationen zu Interrupttypen finden Sie unter DXGK_INTERRUPT_TYPE.

Aufrufer von DXGKCB_NOTIFY_INTERRUPT auf Interruptebene ausgeführt (d. a. DIRQL, d. r. IRQL zwischen DISPATCH_LEVEL und PROFILE_LEVEL, nicht inklusive).

DXGKCB_XXX Funktionen werden von Dxgkrnl implementiert. Um diese Rückruffunktion zu verwenden, rufen Sie DxgkCbNotifyInterrupt über die DXGKRNL_INTERFACE auf.

Beispiele

Das folgende Codebeispiel zeigt Software-Engine-Code, der eine Softwarewarteschlange überwacht und den GPU-Planer über die Paketvervollständigung 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
Unterstützte Mindestversion (Client) Windows Vista (WDDM 1.0)
Zielplattform Desktop
Kopfzeile d3dkmddi.h (einschließlich D3dkmddi.h)
IRQL Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.

Weitere Informationen

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice