Compartilhar via


Enviar um buffer de comando

Para transmitir o buffer de comando através do stack gráfico do Windows, deve-se executar a seguinte sequência de operações:

  1. O driver de exibição no modo de usuário (UMD) inicia um envio de buffer de comando se o tempo de execução do Direct3D chamar uma das seguintes funções do UMD para executar 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 é usado no lote de comandos atual.

    O UMD também inicia o envio do buffer de comandos sempre que esse buffer está cheio.

  2. O UMD chama a função pfnRenderCb do runtime do Direct3D para enviar o buffer de comando para o runtime.

  3. O subsistema de kernel de gráficos DirectX (Dxgkrnl) chama a função de miniporto de driver de exibição em modo kernel (KMD) DxgkDdiRender ou DxgkDdiRenderKm para validar o buffer de comando, escrever um buffer DMA no formato do hardware e produzir uma lista de alocação que descreve as superfícies utilizadas. Observe que o buffer de DMA ainda não foi corrigido (isto é, os endereços físicos atribuídos). Nota Se o runtime iniciou o envio de buffer de comando chamando a função Present da 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 de 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 Paginação de recursos de memória de vídeo.

  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, não é necessário que o agendador chame 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 atribuídos e fornecidos durante a chamada de DxgkDdiBuildPagingBuffer.

  6. O agendador de 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 de GPU chama a função DxgkDdiSubmitCommand do KMD para solicitar que o driver enfileira o buffer de DMA para a unidade de execução da GPU. Cada buffer de DMA enviado à GPU contém um identificador de cerca. Depois que a GPU terminar de processar o buffer de DMA, a GPU gerará uma interrupção.

  8. O KMD é notificado sobre a interrupção em sua função DxgkDdiInterruptRoutine . O KMD deve ler, da GPU, o identificador de cerca do buffer de DMA que acabou de ser concluído.

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

  10. O KMD deve chamar a função DxgkCbQueueDpc para colocar em fila uma chamada de procedimento adiado (DPC).

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