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, ¬ifyInt);
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. |