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