функция обратного вызова 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, ¬ifyInt);
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 | См. раздел "Примечания". |