Partilhar via


Sincronização de threads e TDR

A figura a seguir mostra como a sincronização de threads funciona para o driver de miniporta de exibição (KMD) no modo kernel no WDDM.

Diagrama que mostra a sincronização de threads no WDDM.

Se ocorrer um tempo limite de hardware, o sistema iniciará o processo Deteção e Recuperação de Timeout (TDR). O agendador da GPU chama a função DxgkDdiResetFromTimeout do driver, que redefine a GPU:

  • DxgkDdiResetFromTimeout é chamado de forma síncrona com qualquer outra função KMD, exceto para as funções de gerenciamento de energia em tempo de execução DxgkDdiSetPowerComponentFState e DxgkDdiPowerRuntimeControlRequest. Ou seja, o sistema operacional garante que nenhum outro thread seja executado no driver enquanto o thread DxgkDdiResetFromTimeout é executado.
  • O sistema operacional também garante que os aplicativos não possam acessar o buffer de quadros durante a chamada para DxgkDdiResetFromTimeout. Portanto, o driver pode reinicializar um circuito de bloqueio de fase do controlador de memória (PLL) e assim por diante.

Enquanto o thread de recuperação executa DxgkDdiResetFromTimeout, interrupções e chamadas de procedimento adiado (DPCs) podem continuar a ser chamadas. A função KeSynchronizeExecution pode ser usada para sincronizar partes do procedimento de redefinição com interrupções do dispositivo.

Depois que o driver retorna de DxgkDdiResetFromTimeout, a maioria das funções do driver pode ser chamada novamente e o sistema operacional começa a limpar recursos que não são mais necessários. Durante o período de limpeza, as seguintes funções de driver são chamadas pelos motivos indicados:

  • O driver é chamado para notificar sobre uma alocação que está a ser desalocada.

    Por exemplo, se a alocação foi paginada em um segmento de memória, a função DxgkDdiBuildPagingBuffer do driver é chamada com o membro Operation da estrutura DXGKARG_BUILDPAGINGBUFFER definido como DXGK_OPERATION_TRANSFER e com o membro Transfer.Size definido como zero para informar o driver sobre a remoção. Nenhuma transferência de conteúdo está envolvida porque o conteúdo foi perdido durante a redefinição.

    Se a alocação foi paginada num segmento de aperture, a função DxgkDdiBuildPagingBuffer do driver é chamada com o membro Operation de DXGKARG_BUILDPAGINGBUFFER definido como DXGK_OPERATION_UNMAP_APERTURE_SEGMENT, com o objetivo de informar o driver a desmapear a alocação da aperture.

  • A função DxgkDdiReleaseSwizzlingRange do motorista é chamada para liberar uma abertura sem oscilação e intervalos de abertura de segmento.

O driver não deve acessar a GPU durante as chamadas anteriores, a menos que seja absolutamente necessário.

Após o término do período de limpeza, o sistema operacional chama a função DxgkDdiRestartFromTimeout do driver para informar ao driver que a limpeza foi concluída e que o sistema operacional continuará usando o adaptador para renderização.