次の方法で共有


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, &notifyInt);

    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 「解説」を参照してください。

こちらもご覧ください

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice