Aprimoramentos na depuração de TDR
Para ajudar na análise de TDR (detecção de tempo-limite e recuperação), o sistema operacional historicamente chamou o retorno de chamada DxgkddiCollectDbgInfo do driver de modo kernel para permitir que o driver grave sua própria carga no relatório de TDR que o sistema carrega da máquina do cliente.
Os aprimoramentos na depuração de TDR, descritos neste artigo, estão disponíveis a partir do Windows 11, versão 24H2 (WDDM 3.2). Os desenvolvedores de drivers gráficos devem estar familiarizados com a detecção e a recuperação do tempo-limite da GPU no Windows, conforme descrito em Detecção de tempo-limite e recuperação e TDR no Windows 8 e posterior.
Alterações de DDI
DxgkddiCollectDbgInfo2
DxgkddiCollectDbgInfo2 é adicionado como uma extensão de depuração de TDR. Esse retorno de chamada permite que o sistema operacional passe informações mais detalhadas para o KMD sobre a causa raiz de TDR. O driver de modo kernel (KMD), por sua vez, pode salvar o estado que é relevante para a parte da GPU responsável pelo TDR.
DxgkddiCollectDbgInfo2 é um superconjunto para o DxgkddiCollectDbgInfo existente.
Um driver do WDDM 3.2 não é necessário para implementar DxgkddiCollectDbgInfo2, caso em que o sistema operacional chama DxgkddiCollectDbgInfo.
Se o KMD implementar DxgkddiCollectDbgInfo2, o sistema operacional o invocará em vez de DxgkddiCollectDbgInfo em todos os casos.
A estrutura DRIVER_INITIALIZATION_DATA é estendida para incluir um ponteiro para DxgkddiCollectDbgInfo2.
DXGKARG_COLLECTDBGINFO2
O sistema operacional passa a estrutura DXGKARG_COLLECTDBGINFO2 adicionada para DxgkddiCollectDbgInfo2.
O layout de DXGKARG_COLLECTDBGINFO2 é compatível com as versões anteriores da estrutura DXGKARG_COLLECTDBGINFO para permitir que a implementação DxgkDdiCollectDbgInfo2 reutilize os auxiliares DxgkDdiCollectDbgInfo existentes, conforme necessário. Por esse motivo, os campos Reason, pBuffer, BufferSize e pExtension têm a mesma semântica.
Os outros campos a seguir estão em DXGKARG_COLLECTDBGINFO2, mas não em DXGKARG_COLLECTDBGINFO.
- TdrType
- TdrPayloadSize
- TdrPayload
Para alguns tipos de TDR, o sistema operacional fornece informações adicionais no buffer TdrPayload de bytes TdrPayloadSize. Ele pode ser NULL, e espera-se que o driver lide com esse caso sem falhar.
Quando a carga não é NULL, ela pode ser convertida em uma estrutura que corresponda ao tipo TDR. O sistema operacional pode aumentar essas estruturas de maneira compatível com versões anteriores, adicionando novos campos no final. O driver deve verificar TdrPayloadSize antes de acessar os campos TdrPayload para garantir que o sistema operacional implemente a versão da carga desejada ou posterior.
A memória para a qual TdrPayload aponta só é válida durante a chamada DxgkddiCollectDbgInfo2. O driver não deve armazenar um ponteiro para TdrPayload após o final da chamada DxgkddiCollectDbgInfo2.
A partir do WDDM 3.2, as seguintes estruturas de carga são adicionadas como possíveis cargas para TdrPayload apontar.
DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT para uma carga de tempo-limite do mecanismo (TdrType é igual a DXGK_TDR_TYPE_ENGINE_TIMEOUT).
DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT para uma carga de tempo-limite do VSync (TdrType é igual a DXGK_TDR_TYPE_VSYNC_TIMEOUT).