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, &notifyInt);

    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.

Confira também

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice