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


функция обратного вызова 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 , содержащую сведения об уведомлении для прерывания.

Возвращаемое значение

None

Remarks

Драйвер мини-порта дисплея вызывает функцию DXGKCB_NOTIFY_INTERRUPT , чтобы сообщить о прерывании графического оборудования, определенное типом перечисления DXGK_INTERRUPT_TYPE.

Как правило, DXGKCB_NOTIFY_INTERRUPT вызывается из функции DxgkDdiInterruptRoutine драйвера дисплея miniport, которая вызывается при прерывании работы графического оборудования. DXGKCB_NOTIFY_INTERRUPT информирует планировщик GPU об обновлении ограждения с помощью потока прямого доступа к памяти (DMA) к графическому оборудованию.

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

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

См. также раздел

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice