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