Поделиться через


функция обратного вызова DXGKCB_NOTIFY_INTERRUPT (d3dkmddi.h)

В режиме ядра драйвер мини-порта вызывает вызовы DXGKCB_NOTIFY_INTERRUPT, чтобы сообщить планировщику графического модуля обработки графики (GPU) о обновлении графического оборудования во время подпрограммы службы прерываний (ISR).

Синтаксис

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) на графическое оборудование.

Если драйвер мини-порта дисплея использует несколько обработчиков прерываний, соответствующих нескольким irQLs, драйвер не должен вызывать DXGKCB_NOTIFY_INTERRUPT повторно. Поэтому в этом случае драйвер мини-порта отображения всегда должен вызывать DXGKCB_NOTIFY_INTERRUPT из фиксированного уровня обработчика прерываний.

Аналогичным образом, если используются прерывания, сигнальные сообщением, драйвер мини-порта отображения может вызывать DXGKCB_NOTIFY_INTERRUPT из обработчика прерываний, соответствующего фиксированному номеру сообщения. Драйвер должен сообщить номер сообщения, который используется для уведомления в элементе InterruptMessageNumber структуры DXGK_DRIVERCAPS, когда значение перечисления DXGKQAITYPE_DRIVERCAPS указано в элементе типа структуры DXGKARG_QUERYADAPTERINFO в вызове функции драйвера DxgkDdiQueryAdapterInfo.

После вызова драйвера мини-порта отображения DXGKCB_NOTIFY_INTERRUPT, но до выхода драйвера из isR драйвер должен очередью отложенного вызова процедуры (DPC) с помощью функции DxgkCbQueueDpc. Этот DPC должен быть помещен в очередь, так как планировщик GPU также должен быть уведомлен, когда подпрограмма обратного вызова DPC драйвера вызывает функцию DXGKCB_NOTIFY_DPC примерно то же событие во время DPC. Определенное количество обработки, связанной с событиями графического оборудования, может выполняться только операционной системой во время DPC.

Если драйвер минипорта дисплея определяет, что несколько прерываний активировались в оборудовании, и драйвер должен вызывать DXGKCB_NOTIFY_INTERRUPT для каждого прерывания, чтобы сообщить о прерывании операционной системы, драйвер должен сообщить о прерываниях типа DMA перед прерыванием типа CRTC. Дополнительные сведения о типах прерываний см. в DXGK_INTERRUPT_TYPE.

Вызывающие DXGKCB_NOTIFY_INTERRUPT выполняются на уровне прерываний (то есть DIRQL, который является частью IRQL между DISPATCH_LEVEL и PROFILE_LEVEL, а не включительно).

DXGKCB_XXX функции реализуются Dxgkrnl. Чтобы использовать эту функцию обратного вызова, вызовите DxgkCbNotifyInterrupt через DXGKRNL_INTERFACE.

Примеры

В следующем примере кода показан код подсистемы программного обеспечения, который отслеживает очередь программного обеспечения и уведомляет планировщик 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 (include D3dkmddi.h)
IRQL См. раздел "Примечания".

См. также

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice