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.
A figura a seguir mostra como a sincronização de thread funciona para o driver de miniporte de exibição no modo de kernel no WDDM.
Se ocorrer um tempo limite de hardware, o sistema iniciará o processo de TDR (Detecção e Recuperação de Tempo Limite ). 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 KMD, exceto pelas funções de gerenciamento de energia de runtime DxgkDdiSetPowerComponentFState e DxgkDdiPowerRuntimeControlRequest. Ou seja, o sistema operacional garante que nenhum outro thread seja executado no driver enquanto o thread DxgkDdiResetFromTimeout está sendo 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 redefinir o loop bloqueado por fases (PLL) de um controlador de memória e assim por diante.
Enquanto o thread de recuperação executa DxgkDdiResetFromTimeout, as interrupções e as Chamadas de Procedimento Diferido (DPCs) podem continuar a ser chamadas. A função KeSynchronizeExecution pode ser usada para sincronizar partes do procedimento de redefinição com as 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 limpar os 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 sendo removida.
Por exemplo, se a alocação foi 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 evacuação. 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 configurado para 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 desordenada 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 está concluída e que o sistema operacional retomará usando o adaptador para renderização.