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 适配器对象的句柄。 驱动程序在其 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 计划程序有关围栏的更新。

如果显示微型端口驱动程序使用多个对应于多个 IRL 的中断处理程序,则驱动程序不得以可重入的方式调用 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)
目标平台 桌面
标头 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