DXGKCB_NOTIFY_INTERRUPT コールバック関数 (d3dkmddi.h)
カーネル モードディスプレイ ミニポート ドライバーは 、 割り込みサービス ルーチン (ISR) 時にグラフィックス ハードウェアの更新プログラムについてグラフィックス処理装置 (GPU) スケジューラに通知するDXGKCB_NOTIFY_INTERRUPTを呼び出します。
構文
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 構造体へのポインター。
戻り値
なし
解説
ディスプレイ ミニポート ドライバーは 、DXGK_INTERRUPT_TYPE 列挙型が定義するグラフィックス ハードウェア割り込みを報告する DXGKCB_NOTIFY_INTERRUPT 関数を呼び出します。
通常、 DXGKCB_NOTIFY_INTERRUPT は、ディスプレイ ミニポート ドライバーの DxgkDdiInterruptRoutine 関数 (ISR) から呼び出されます。これは、グラフィックス ハードウェアの割り込みが発生したときに呼び出されます。 DXGKCB_NOTIFY_INTERRUPT は、グラフィックス ハードウェアへのダイレクト メモリ アクセス (DMA) ストリームを介したフェンスの更新について GPU スケジューラに通知します。
ディスプレイ ミニポート ドライバーが複数の IRQL に対応する複数の割り込みハンドラーを使用する場合、ドライバーは再入可能な方法で DXGKCB_NOTIFY_INTERRUPT を呼び出す必要があります。 したがって、この場合、ディスプレイ ミニポート ドライバーは常に割り込みハンドラーの固定レベルから DXGKCB_NOTIFY_INTERRUPT を呼び出す必要があります。
同様に、メッセージシグナル割り込みが使用されている場合、ディスプレイ ミニポート ドライバーは、固定メッセージ番号に対応する割り込みハンドラーから DXGKCB_NOTIFY_INTERRUPT を呼び出すことができます。 ドライバーは、ドライバーの DxgkDdiQueryAdapterInfo 関数の呼び出しでDXGKARG_QUERYADAPTERINFO構造体の Type メンバーにDXGKQAITYPE_DRIVERCAPS列挙値が指定されている場合、DXGK_DRIVERCAPS構造体の InterruptMessageNumber メンバーで通知に使用されるメッセージ番号を報告する必要があります。
ディスプレイ ミニポート ドライバーが DXGKCB_NOTIFY_INTERRUPT を呼び出した後、ドライバーが ISR を終了する前に、ドライバーは DxgkCbQueueDpc 関数を使用して遅延プロシージャ 呼び出し (DPC) をキューに登録する必要があります。 ドライバーの DPC コールバック ルーチンが DPC 時に同じイベントについて DXGKCB_NOTIFY_DPC 関数を呼び出すときに、GPU スケジューラも通知する必要があるため、この DPC はキューに入る必要があります。 グラフィックス ハードウェア イベントに関連する一定量の処理は、オペレーティング システムが 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) |
対象プラットフォーム | デスクトップ |
Header | d3dkmddi.h (D3dkmddi.h を含む) |
IRQL | 「解説」を参照してください。 |