DXGKCB_NOTIFY_INTERRUPT função de retorno de chamada (d3dkmddi.h)
Um driver de miniporta de exibição no modo kernel chama DXGKCB_NOTIFY_INTERRUPT para informar o agendador da GPU (unidade de processamento gráfico) sobre uma atualização de hardware gráfico no horário isr (rotina de serviço de interrupção).
Sintaxe
DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;
void DxgkcbNotifyInterrupt(
[in] IN_CONST_HANDLE hAdapter,
[in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}
Parâmetros
[in] hAdapter
Um identificador para o objeto do adaptador para a GPU. Um driver recebe o identificador do membro DeviceHandle da estrutura DXGKRNL_INTERFACE em uma chamada para sua função DxgkDdiStartDevice .
[in] unnamedParam2
Ponteiro para uma estrutura DXGKARGCB_NOTIFY_INTERRUPT_DATA que contém informações de notificação para uma interrupção.
Retornar valor
Nenhum
Comentários
Um driver de miniporta de exibição chama a função DXGKCB_NOTIFY_INTERRUPT para relatar uma interrupção de hardware gráfico definida pelo tipo de enumeração DXGK_INTERRUPT_TYPE .
Normalmente, DXGKCB_NOTIFY_INTERRUPT é chamado da função DxgkDdiInterruptRoutine (ISR) do driver de miniporta de exibição, que é chamada quando ocorrem interrupções de hardware gráficas. DXGKCB_NOTIFY_INTERRUPT informa ao agendador de GPU sobre uma atualização para uma cerca por meio de um fluxo de DMA (acesso direto à memória) para o hardware gráfico.
Se o driver de miniporta de exibição usar vários manipuladores de interrupção que correspondem a várias IRQLs, o driver não deverá chamar DXGKCB_NOTIFY_INTERRUPT de maneira reentrante. Portanto, nesse caso, o driver de miniporta de exibição sempre deve chamar DXGKCB_NOTIFY_INTERRUPT de um nível fixo do manipulador de interrupção.
Da mesma forma, se forem usadas interrupções sinalizadas por mensagem, o driver de miniporto de exibição poderá chamar DXGKCB_NOTIFY_INTERRUPT de um manipulador de interrupção que corresponda a um número de mensagem fixo. O driver deve relatar o número da mensagem que é usado para notificação no membro InterruptMessageNumber da estrutura DXGK_DRIVERCAPS , quando o valor de enumeração DXGKQAITYPE_DRIVERCAPS é especificado no membro Type da estrutura DXGKARG_QUERYADAPTERINFO em uma chamada para a função DxgkDdiQueryAdapterInfo do driver.
Depois que o driver de miniporta de exibição chama DXGKCB_NOTIFY_INTERRUPT mas antes que o driver saia de seu ISR, o driver deve enfileirar uma DPC (chamada de procedimento adiado) usando a função DxgkCbQueueDpc . Esse DPC deve ser enfileirado porque o agendador de GPU também deve ser notificado, quando a rotina de retorno de chamada DPC do driver chama a função DXGKCB_NOTIFY_DPC , aproximadamente o mesmo evento no horário DPC. Uma determinada quantidade de processamento relacionada a eventos de hardware gráfico só pode ser executada pelo sistema operacional no momento do DPC.
Se o driver do miniporto de exibição determinar que mais de uma interrupção foi disparada no hardware e o driver precisar chamar DXGKCB_NOTIFY_INTERRUPT para cada interrupção relatar a interrupção para o sistema operacional, o driver deverá relatar interrupções do tipo DMA antes de uma interrupção do tipo CRTC. Para obter mais informações sobre tipos de interrupção, consulte DXGK_INTERRUPT_TYPE.
Os chamadores de DXGKCB_NOTIFY_INTERRUPT são executados no nível de interrupção (ou seja, DIRQL, que é algum IRQL entre DISPATCH_LEVEL e PROFILE_LEVEL, não inclusivo).
DXGKCB_XXX funções são implementadas por Dxgkrnl. Para usar essa função de retorno de chamada, chame DxgkCbNotifyInterrupt por meio do DXGKRNL_INTERFACE.
Exemplos
O exemplo de código a seguir mostra o código do mecanismo de software que monitora uma fila de software e notifica o agendador de GPU sobre a conclusão do pacote.
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;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows Vista (WDDM 1.0) |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | d3dkmddi.h (inclua D3dkmddi.h) |
IRQL | Consulte a seção Observações. |