Compartilhar via


Enviando um buffer de comando

A seguinte sequência de operações deve ser executada para passar um buffer de comando por meio da pilha de gráficos do Windows Vista:

  1. O driver de exibição do modo de usuário iniciará um envio de buffer de comando se o runtime do Direct3D chamar uma das seguintes funções de driver de exibição do modo de usuário 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 Lock para bloquear um recurso, que é usado no lote de comandos atual.

    Observe que o driver de exibição do modo de usuário também sempre inicia um envio de buffer de comando sempre que o buffer de comando está cheio.

  2. O driver de exibição no modo de usuário chama a função pfnRenderCb do runtime do Direct3D para enviar o buffer de comando para o runtime.

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

  4. O gerenciador de memória de vídeo chama a função DxgkDdiBuildPagingBuffer do driver de miniporta de exibição 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 Paginando recursos de memória de vídeo.

  5. O agendador de GPU chama a função DxgkDdiPatch do driver de miniporto de exibição 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 do buffer de paginação foram passados e atribuídos durante a chamada DxgkDdiBuildPagingBuffer .

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

  7. O agendador de GPU chama a função DxgkDdiSubmitCommand do driver de miniporta de exibição para solicitar que o driver enfileira o buffer 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 driver de miniporto de exibição é notificado sobre a interrupção em sua função DxgkDdiInterruptRoutine . O driver de miniporto de exibição deve ler, da GPU, o identificador de cerca do buffer de DMA que acabou de ser concluído.

  9. O driver de miniporto de exibição deve chamar a função DxgkCbNotifyInterrupt para notificar o agendador de GPU que o buffer DMA concluiu.

  10. O driver de miniporto de exibição deve chamar a função DxgkCbQueueDpc para enfileirar uma DPC (chamada de procedimento adiado).

  11. O DPC do driver de miniporto de exibição é notificado para lidar com a maior parte do processamento do buffer de DMA.