Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O modelo de preempção de GPU foi atualizado no Windows 8 (WDDM 1.2). No modelo atualizado, o sistema operacional:
- Não permite que o driver de exibição no modo kernel (KMD) desabilite a preempção de pacotes DMA de GPU.
- Garante que as solicitações de preempção sejam enviadas para a GPU antes de iniciar um processo de TDR (Detecção e Recuperação de Tempo Limite ).
| Requisito | Descrição |
|---|---|
| Implementação do driver – gráficos completos e somente renderização | Obrigatório |
| Requisitos e testes do WHLK | Device.Graphics... Teste de Preempção, Device.Graphics... FlipOnVSyncMmIo |
Se o sistema operacional não conseguir interromper com êxito pacotes de longa execução, então:
- O trabalho de GPU de alta prioridade (como o trabalho exigido pelo DWM (Gerenciador de Janelas da Área de Trabalho)) pode ser atrasado. Esse atraso resulta em falhas durante transições de janela e animações.
- O processo TDR pode redefinir repetidamente a GPU e, eventualmente, fazer com que uma verificação de bug do sistema ocorra.
Todos os KMDM do WDDM 1.2 devem dar suporte ao modelo de preempção do Windows 8. No entanto, quando em operação, os drivers do WDDM 1.2 também podem rejeitar o modelo de preempção do Windows 8 e manter o comportamento do Windows 7 pelo agendador Dxgkrnl (subsistema de kernel gráfico) do DirectX.
Interface de preempção de GPU
O KMD pode usar os DDIs a seguir para implementar o modelo de preempção de GPU do Windows 8.
- DxgkCbCreateContextAllocation
- DxgkCbDestroyContextAllocation
- pfnSetPriorityCb
- Dxgkrnl Interface
- DXGKRNL_INTERFACE
- D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY
- D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY
- D3DKMDT_PREEMPTION_CAPS
- D3DKMT_QUERYADAPTERINFO
- DXGK_DRIVERCAPS
- DXGK_SUBMITCOMMANDFLAGS
- DXGK_VIDSCHCAPS
- DXGKARGCB_CREATECONTEXTALLOCATION
Etapas de implementação do driver
Siga estas etapas gerais para implementar o modelo de preempção de GPU do Windows 8 em seu KMD:
- Compile seu driver usando cabeçalhos que têm DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
- Declare suporte para o modelo de preempção de GPU do Windows 8 definindo os membros PreemptionAware e MultiEngineAware da estrutura DXGK_VIDSCHCAPS como 1. Para dar suporte ao modelo de preempção do Windows 7, defina PreemptionAware como zero.
- Especifique o nível de granularidade de preempção com suporte na estrutura D3DKMDT_PREEMPTION_CAPS, que usa valores constantes das enumerações D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY e D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY.
- Se o hardware suportar a comutação de contexto preguiçosa, envie um buffer de comprimento zero para a função DxgkDdiSubmitCommand e defina o membro pSubmitCommand->Flags->ContextSwitch como 1. Consulte a discussão no membro ContextSwitch da estrutura DXGK_SUBMITCOMMANDFLAGS.
- Defina alocações de contexto de GPU e alocações de contexto do dispositivo chamando a função DxgkCbCreateContextAllocation . Observe as instruções e restrições específicas fornecidas em Comentários para a função.
- Chame a função DxgkCbDestroyContextAllocation para destruir alocações de contexto de GPU e alocações de contexto de dispositivo que foram criadas com DxgkCbCreateContextAllocation.
- Ao preparar o buffer de DMA em resposta a uma chamada para a função DxgkDdiBuildPagingBuffer , inicialize o recurso de contexto preenchendo a estrutura interna InitContextResource dentro da estrutura DXGKARG_BUILDPAGINGBUFFER . Se os recursos de contexto forem removidos ou realocados, o gerenciador de memória de vídeo preservará o conteúdo dos recursos de contexto.
- O driver deve dar suporte à inversão de E/S mapeada por memória na próxima sincronização vertical. No Windows 8, o agendador de GPU tenta preempir o hardware mesmo que as inversões estejam pendentes. Portanto, para evitar cortes e artefatos de renderização, o driver deve suportar o modelo de alternância de E/S mapeada por memória e deve definir o membro FlipOnVSyncMmIo da estrutura DXGK_FLIPCAPS como 1 e suportar as operações descritas em FlipOnVSyncMmIo.
Considerações de mapeamento de memória em sua implementação
Siga estas diretrizes para criar um driver robusto que dê suporte ao modelo de preempção de GPU do Windows 8 e forneça uma experiência de usuário de qualidade:
- Solicite a preempção de buffer de DMA médio da GPU quando o agendador Dxgkrnl enviar um comando de preempção. Os dispositivos de hardware que têm uma granularidade mais fina na preempção de buffers durante operações intermediárias de DMA devem proporcionar uma melhor experiência do usuário.
- Permitir que os IDs de barreira de comando de paginação sejam reutilizados: se uma solicitação de preempção fizer com que comandos de paginação sejam interrompidos na fila de hardware, o agendador Dxgkrnl reenviará os comandos de paginação preemptados com os mesmos IDs de barreira que foram originalmente usados e os comandos de paginação serão agendados antes de quaisquer outros comandos nesse mecanismo. Os comandos de nãopaging serão reenviados com IDs de cerca recém-atribuídas.
- Forneça uma lista de localização de patches para buffers de DMA divididos. Para obter mais informações, consulte Divisão de um buffer de DMA.
- Um modo de verificação, chamado detecção de vazamento de vínculo, está disponível. Esse modo de verificação percorre a lista de locais do patch e rejeita pacotes que não desassociam ou que não reprogramam alocações para cada pacote dividido. Alguns hardwares dão suporte a endereços virtuais, permitindo um nível extra de indireção que pode tornar essa verificação desnecessária. Nesse caso, para indicar que o driver opta por sair do modo de verificação, defina o membro NoDmaPatching da estrutura DXGK_VIDSCHCAPS como 1.
- No Windows 7, o agendador Dxgkrnl garante que todos os pacotes DMA divididos que correspondem ao mesmo comando de renderização sejam executados sequencialmente sem alternar para outro contexto de renderização. No modelo de preempção do Windows 8, o agendador pode executar pacotes de renderização de um contexto diferente entre dois pacotes divididos que correspondem ao mesmo comando de renderização. Como consequência, os drivers que estão cientes da preempção devem lidar com um envio de pacote de DMA dividido/parcial da mesma forma que um envio de pacote completo regular. Em particular, o estado de GPU deve ser salvo ou restaurado no limite para esses envios.
- Um driver com reconhecimento de preempção não deve alterar o conteúdo de um buffer de DMA dividido quando é transmitido para vários adaptadores no modo LDA (adaptador de exibição vinculado), em que várias GPUs físicas são vinculadas para formar uma GPU virtual única e mais rápida. No modelo de preempção do Windows 8, o agendador Dxgkrnl não garante mais a execução síncrona de uma sequência de pacotes divididos sem alternar para outro contexto. Um driver que alterou o conteúdo de um pacote DMA dividido comprometeria a integridade dos dados do pacote. Especificamente, se o pacote foi executado em outro mecanismo, ele operaria na mesma cópia dos dados do buffer de DMA.
- No modelo de preempção de GPU do Windows 8, o agendador Dxgkrnl habilita a preempção para pacotes que têm primitivos de sincronização associados ao "sinal no envio". Se um dispositivo usa primitivos de sincronização "sinal ao submeter" com estados de espera baseados em hardware, ele deve dar suporte à capacidade de preemptar uma instrução de espera antes que a condição de espera seja atendida.
Requisitos de certificação de hardware
Para obter informações sobre os requisitos que os dispositivos de hardware devem atender ao implementar esse recurso, consulte a documentação relevante do WHLK em Device.Graphics... Teste de preempção e Device.Graphics... FlipOnVSyncMmIo.