DXGKCB_NOTIFY_INTERRUPT回呼函式 (d3dkmddi.h)
核心模式顯示迷你埠驅動程式會呼叫 DXGKCB_NOTIFY_INTERRUPT ,以通知 GPU (GPU) 排程器有關中斷服務例程 (ISR) 時間的圖形硬體更新。
語法
DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;
void DxgkcbNotifyInterrupt(
[in] IN_CONST_HANDLE hAdapter,
[in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}
參數
[in] hAdapter
GPU 之配接器物件的句柄。 驅動程式會在呼叫其 DxgkDdiStartDevice 函式時,從DXGKRNL_INTERFACE結構的 DeviceHandle 成員接收句柄。
[in] unnamedParam2
包含中斷通知資訊的 DXGKARGCB_NOTIFY_INTERRUPT_DATA 結構的指標。
傳回值
無
備註
顯示迷你埠驅動程式會呼叫 DXGKCB_NOTIFY_INTERRUPT 函式,以報告 DXGK_INTERRUPT_TYPE 列舉類型所定義的圖形硬體中斷。
一般而言, DXGKCB_NOTIFY_INTERRUPT 是從顯示器迷你埠驅動程式的 DxgkDdiInterruptRoutine 函式 (ISR) 呼叫,這會在圖形硬體中斷發生時呼叫。 DXGKCB_NOTIFY_INTERRUPT 通知 GPU 排程器透過直接記憶體存取 (DMA) 串流至圖形硬體的柵欄更新。
如果顯示迷你埠驅動程式使用多個對應至多個 IRQL 的中斷處理程式,驅動程式不得以重新進入的方式呼叫 DXGKCB_NOTIFY_INTERRUPT 。 因此,在此情況下,顯示迷你埠驅動程序應該一律從中斷處理程式的固定層級呼叫 DXGKCB_NOTIFY_INTERRUPT 。
同樣地,如果使用訊息訊號中斷,顯示迷你埠驅動程式可以從對應至固定訊息號碼的中斷處理程式呼叫 DXGKCB_NOTIFY_INTERRUPT 。 當DXGKQAITYPE_DRIVERCAPS列舉DXGKARG_QUERYADAPTERINFO值是在呼叫驅動程式的 DxgkDdiQueryAdapterInfo 函式時,驅動程式必須報告用於DXGK_DRIVERCAPS結構之 InterruptMessageNumber 成員中通知的訊息號碼。
在顯示迷你埠驅動程式呼叫 DXGKCB_NOTIFY_INTERRUPT ,但在驅動程序結束其ISR之前,驅動程式必須使用 DxgkCbQueueDpc 函式,將延遲過程調用排入佇列 (DPC) 。 此 DPC 必須排入佇列,因為當驅動程式的 DPC 回呼例程在 DPC 時間呼叫 DXGKCB_NOTIFY_DPC 函式時,GPU 排程器也必須收到通知。 與圖形硬體事件相關的特定處理數量只能由操作系統在 DPC 時間執行。
如果顯示迷你埠驅動程序判斷硬體中觸發了多個中斷,而且驅動程式必須針對每個中斷呼叫 DXGKCB_NOTIFY_INTERRUPT ,才能向操作系統報告中斷,驅動程式應該在CRTC類型中斷之前回報 DMA 類型中斷。 如需中斷類型的詳細資訊,請參閱 DXGK_INTERRUPT_TYPE。
DXGKCB_NOTIFY_INTERRUPT呼叫端會在中斷層級 (執行,也就是 DIRQL,這是DISPATCH_LEVEL與PROFILE_LEVEL之間的一些 IRQL,不包含) 。
DXGKCB_XXX 函式是由 Dxgkrnl 實作。 若要使用此回呼函式,請透過 DXGKRNL_INTERFACE 呼叫 DxgkCbNotifyInterrupt。
範例
下列程式代碼範例顯示軟體引擎程序代碼,可監視軟體佇列,並通知 GPU 排程器封包完成。
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;
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Vista (WDDM 1.0) |
目標平台 | 桌面 |
標頭 | d3dkmddi.h (包含 D3dkmddi.h) |
IRQL | 請參閱一節。 |