Compartilhar via


Sincronização de thread e TDR

A figura a seguir mostra como a sincronização de thread funciona para o driver de miniporta de exibição no WDDM (Modelo de Driver de Vídeo do Windows).

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

Se ocorrer um tempo limite de hardware, o processo de TDR (Detecção e Recuperação de Tempo Limite) será iniciado. O agendador de GPU chama a função DxgkDdiResetFromTimeout do driver, que redefine a GPU. DxgkDdiResetFromTimeout é chamado de forma síncrona com qualquer outra função de driver de miniporta de exibição, exceto pelas funções de gerenciamento de energia de runtime DxgkDdiSetPowerComponentFState e DxgkDdiPowerRuntimeControlRequest. Ou seja, nenhum outro thread é executado no driver enquanto o thread DxgkDdiResetFromTimeout é executado. O sistema operacional também garante que nenhum acesso ao buffer de quadros possa ocorrer de qualquer aplicativo durante a chamada para DxgkDdiResetFromTimeout; Portanto, o driver pode redefinir um PLL (loop bloqueado) de fase do controlador de memória e assim por diante.

Enquanto o thread de recuperação executa DxgkDdiResetFromTimeout, as interrupções e as DPCs (chamadas de procedimento adiado) 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 de driver pode ser chamada novamente e o sistema operacional começa a limpo 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á sendo removida.

    Por exemplo, se a alocação tiver sido paginada em um segmento de memória, a função DxgkDdiBuildPagingBuffer do driver será 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. Observe que nenhuma transferência de conteúdo está envolvida porque o conteúdo foi perdido durante a redefinição.

    Se a alocação tiver sido paginada em um segmento de abertura, a função DxgkDdiBuildPagingBuffer do driver será chamada com o membro Operation de DXGKARG_BUILDPAGINGBUFFER definido como DXGK_OPERATION_UNMAP_APERTURE_SEGMENT para informar o driver para desmapear a alocação da abertura.

  • A função DxgkDdiReleaseSwizzlingRange do driver é chamada para liberar uma abertura deswizzling 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.

Depois que o período de limpeza terminar, o sistema operacional chamará a função DxgkDdiRestartFromTimeout do driver para informar ao driver que a limpeza foi concluída e que o sistema operacional será retomado usando o adaptador para renderização.