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