Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
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.