Partilhar via


Enviando um buffer de comando

A seguinte sequência de operações deve ser executada para passar um buffer de comandos através da pilha de gráficos do Windows:

  1. O driver de vídeo em modo de utilizador (UMD) inicia a submissão de um buffer de comandos se o runtime do Direct3D chamar uma das seguintes funções UMD para realizar a operação especificada:

    • A função Present para exibir gráficos.
    • A função Flush para enviar comandos de hardware.
    • A função Bloquear para bloquear um recurso, que é usada no lote de comandos atual.

    O UMD também inicia um envio de buffer de comando sempre que o buffer de comando está cheio.

  2. O UMD chama a função pfnRenderCb do tempo de execução do Direct3D para submeter o buffer de comandos ao tempo de execução.

  3. O subsistema do kernel de gráficos DirectX (Dxgkrnl) chama a função DxgkDdiRender ou DxgkDdiRenderKm do driver de miniporta de exibição no modo kernel (KMD) para validar o buffer de comandos, escrever um buffer DMA no formato do hardware e produzir uma lista de alocação que descreve as superfícies usadas. Observe que o buffer DMA ainda não foi corrigido (ou seja, endereços físicos atribuídos). Observação Se o tempo de execução iniciou o envio do buffer de comandos chamando a função Present do UMD, o subsistema gráfico chamará a função DxgkDdiPresent do KMD, em vez de DxgkDdiRender ou DxgkDdiRenderKm.

  4. O gerenciador de memória de vídeo chama a função DxgkDdiBuildPagingBuffer do KMD para criar buffers DMA de finalidade especial, conhecidos como buffers de paginação, que movem as alocações especificadas na lista de alocação que acompanha o buffer DMA de e para a memória acessível por GPU. Para obter mais informações, consulte Recursos de memória de vídeo de paginação.

  5. O agendador de GPU chama a função DxgkDdiPatch do KMD para atribuir endereços físicos aos recursos no buffer DMA. No entanto, o agendador não é obrigado a chamar DxgkDdiPatch para atribuir endereços físicos ao buffer de paginação porque os endereços físicos para o buffer de paginação foram passados e atribuídos durante a chamada DxgkDdiBuildPagingBuffer .

  6. O agendador da GPU chama a função DxgkDdiSubmitCommand do KMD para solicitar que o driver enfileire o buffer de paginação para a unidade de execução da GPU.

  7. O agendador da GPU chama a função DxgkDdiSubmitCommand do KMD para solicitar que o driver enfileire o buffer DMA para a unidade de execução da GPU. Cada buffer DMA enviado à GPU contém um identificador de cerca. Depois que a GPU termina de processar o buffer DMA, a GPU gera uma interrupção.

  8. O KMD é notificado da interrupção em sua função DxgkDdiInterruptRoutine . O KMD deve ler, da GPU, o identificador de barreira do buffer DMA que foi concluído há pouco.

  9. O KMD deve chamar a função DxgkCbNotifyInterrupt para notificar o agendador da GPU de que o buffer DMA foi concluído.

  10. O KMD deve chamar a função DxgkCbQueueDpc para enfileirar uma chamada de procedimento adiada (DPC).

  11. O DPC do KMD é notificado para lidar com a maior parte do processamento do buffer DMA.