DXGKCB_NOTIFY_INTERRUPT回调函数 (d3dkmddi.h)

内核模式显示微型端口驱动程序调用 DXGKCB_NOTIFY_INTERRUPT,以在中断服务例程(ISR)时间通知图形处理单元(GPU)计划程序有关图形硬件更新的信息。

语法

DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;

void DxgkcbNotifyInterrupt(
  [in] IN_CONST_HANDLE hAdapter,
  [in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}

参数

[in] hAdapter

GPU 适配器对象的句柄。 驱动程序从 DeviceHandle 成员接收 DXGKRNL_INTERFACE 结构的句柄,该 DxgkDdiStartDevice 函数的调用。

[in] unnamedParam2

指向包含中断通知信息的 DXGKARGCB_NOTIFY_INTERRUPT_DATA 结构的指针。

返回值

没有

言论

显示微型端口驱动程序调用 DXGKCB_NOTIFY_INTERRUPT 函数来报告 DXGK_INTERRUPT_TYPE 枚举类型定义的图形硬件中断。

通常,DXGKCB_NOTIFY_INTERRUPT 从显示微型端口驱动程序的 DxgkDdiInterruptRoutine 函数 (ISR)调用,当图形硬件中断发生时调用。 DXGKCB_NOTIFY_INTERRUPT 通知 GPU 计划程序通过直接内存访问(DMA)流更新到图形硬件的围栏。

如果显示微型端口驱动程序使用多个对应于多个 IRCL 的中断处理程序,则驱动程序不得以重新进入的方式调用 DXGKCB_NOTIFY_INTERRUPT。 因此,在这种情况下,显示微型端口驱动程序应始终从中断处理程序的固定级别调用 DXGKCB_NOTIFY_INTERRUPT

同样,如果使用消息信号中断,显示微型端口驱动程序可以从与固定消息编号相对应的中断处理程序调用 DXGKCB_NOTIFY_INTERRUPT。 驱动程序必须在调用驱动程序 DxgkDdiQueryAdapterInfo 函数的 TypeDXGK_DRIVERCAPSDXGKARG_QUERYADAPTERINFO 成员中指定 DXGKQAITYPE_DRIVERCAPS 枚举值时,在 的 InterruptMessageNumber 成员中报告用于通知的消息号。

在显示微型端口驱动程序调用 DXGKCB_NOTIFY_INTERRUPT 但驱动程序退出其 ISR 之前,驱动程序必须使用 DxgkCbQueueDpc 函数对延迟过程调用(DPC)进行排队。 此 DPC 必须排队,因为 GPU 计划程序还必须在驱动程序的 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)
目标平台 桌面
标头 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