Compartilhar via


Depurando drivers de exibição indiretos

Os IDDs (drivers de vídeo indiretos) são drivers UMDF, portanto, a documentação de depuração do UMDF, como Determinar por que o driver UMDF falha ao carregar ou o dispositivo UMDF falha ao iniciar, é um bom ponto de partida. Esta página fornece informações de depuração indiretos específicas à exibição.

Controle do Registro

A Classe de Driver de Exibição Indireta (IccDx) tem algumas configurações do Registro que podem ser usadas para auxiliar na depuração de IDDs. Todos os valores do Registro estão localizados na chave do Registro HKLM\System\CurrentControlSet\Control\GraphicsDrivers .

Nome do valor Detalhes
TerminateIndirectOnStall Um valor zero desabilitará o watchdog que encerra o driver se ele não processar um quadro dentro de 10 segundos após o quadro estar disponível. Qualquer outro valor deixará o watchdog habilitado.
IddCxDebugCtrl Campo de bits que habilitou diferentes aspectos de depuração do IddCx. Veja a tabela abaixo.

Observação

Se o valor do Registro TerminateIndirectOnStall for usado para desabilitar o watchdog, os testes HLK falharão.

Valores de IddCxDebugCtrl

Bit em IddCxDebugCtrl Significado
0x0001 Interrompa o depurador quando o IddCx detectar um erro
0x0002 Interrompa o depurador quando iddCx for carregado
0x0004 Interrompa o depurador quando IddCx for descarregado
0x0008 Interrompa o depurador quando IddCx DriverEntry for chamado
0x0010 Interrompa o depurador quando a associação de driver for chamada
0x0020 Interrompa o depurador quando a inicialização do driver for chamada
0x0040 Interrompa o depurador quando a desassociação do driver for chamada
0x0080 Desabilita o watchdog DDI que encerra o driver leva muito tempo na chamada DDI
0x0100 Não usado
0x0200 Habilitar a sobreposição de depuração, veja abaixo
0x0400 Sobrepor caixa alfa colorida sobre sujo rects no quadro; requer que 0x0200 seja definido
0x0800 Sobrepor estatísticas de pref em quadro
0x2000 O IddCx consultará os valores do registro de quadro de captura a cada quadro; requer que 0x0200 seja definido

Observação

Para que qualquer uma das funções de sobreposição funcione, o dispositivo Direct3D criado pelo driver e passado para IddCxSwapChainSetDevice deve ser criado com o sinalizador D3D11_CREATE_DEVICE_BGRA_SUPPORT .

Rastreamentos WPP IddCx

O Iddcx usa a infraestrutura do WPP para registrar informações de depuração. As informações do WPP podem ser capturadas em um arquivo e, embora essa captura esteja em andamento, elas podem ser exibidas no depurador de kernel.

Capturando o rastreamento WPP do IddCx

Há várias maneiras de habilitar o rastreamento do WPP. Uma maneira conveniente é usar o build em logman.exe programa. Se você copiar a linha a seguir para um arquivo em lote e executar em um prompt de comandos com privilégios elevados, ele coletará rastreamentos WPP IddCx no arquivo IddCx.etl .

@echo off  
echo Starting WPP tracing....
logman create trace IddCx -o IddCx.etl -ets -ow -mode sequential -p  {D92BCB52-FA78-406F-A9A5-2037509FADEA} 0x4f4 0xFF
echo Tracing enabled
pause
echo Stopping WPP tracing....
logman -stop IddCx -ets

Controlando o que é capturado

O parâmetro Flags de logman.exe (0x4f4 nesse caso) controla quais logs IddCx de mensagens WPP. O valor de significado disso foi alterado no Windows build 19041 e superior.

Sinalizadores de significado para o Windows build 19041 e superior

Os Sinalizadores são um campo de bits, em que cada bit controla se esse tipo de mensagem é capturado.

Bit de sinalizadores Tipo de mensagem capturado
0x001 Não usado
0x002 Não usado
0x004 Errors
0x008 Erros benignos, por exemplo, quando a sobreposição de depuração está habilitada sem D3D11_CREATE_DEVICE_BGRA_SUPPORT definido
0x010 Objetos IddCx
0x020 Chamadas de estrutura UMDF para IddCx
0x040 Chamadas DDI de IddCx para o driver
0x080 Chamadas de baixa frequência de driver para IddCx
0x100 Chamadas relacionadas ao quadro de alta frequência de driver para IddCx
0x200 Chamadas relacionadas ao cursor de alta frequência de driver para IddCx
0x400 Chamadas de kernel para IddCx
0x800 Chamadas de IddCx para kernel

Um cenário de registro em log normal de 0x0f4 é um bom ponto de partida. Se você quiser exibir informações por quadro, 0x1f4 será um bom ponto de partida.

Sinalizadores que significam antes do windows build 19041

Os sinalizadores foram tratados como um nível, cada nível crescente adicionou um novo tipo de mensagem junto com todas as mensagens dos níveis anteriores.

Valor de nível de sinalizadores Tipo de mensagem capturado
1 Não usado
2 Errors
3 Warnings
4 Informações
5 Detalhado

Decodificação do rastreamento WPP do IddCx

Como todos os rastreamentos do WPP, as informações do WPP são armazenadas em arquivos pdb e, portanto, o acesso aos pdbs com essas informações são necessários para decodificar. A partir do Build 19560 do Windows, o IddCx.pdb no servidor de símbolos público contém as informações do WPP necessárias para decodificar mensagens WPP. Antes do Build 19560 do Windows, o IddCx.pdb no servidor de símbolos públicos não contém as informações necessárias do WPP para habilitar a decodificação do WPP.

Qualquer uma das ferramentas de decodificação padrão do WPP pode ser usada para decodificar e exibir as mensagens.

Erros de IddCx de depuração

Ao desenvolver um driver de Exibição Indireto, geralmente é útil obter informações adicionais quando idCx detecta um erro. Conforme descrito acima, você pode configurar o IddCx para invadir o depurador quando o IddCx detectar um erro, mas também é útil exibir a mensagem de erro IddCx nas últimas mensagens de rastreamento para entender o contexto do erro.

Usando a seção acima, você pode habilitar o rastreamento do WPP usando logman.exe e, com as informações a seguir, exiba o buffer WPP na memória no depurador de kernel no ponto da falha.

Observação

Para que isso funcione, você precisa usar um depurador de kernel (não um depurador de modo de usuário) e o windows build 19560 ou superior para que o depurador obtenha o IddCx.pdb que contém as informações de decodificação do WPP.

No exemplo a seguir, um driver de Exibição Indireta chama IddCxMonitorArrival. Como parte do processamento, o IddCx chama o DDI EvtIddCxMonitorQueryTargetModes do driver. Neste exemplo, o driver retornou um modo com DISPLAYCONFIG_VIDEO_SIGNAL_INFO. AdditionalSignalInfo.vSyncFreqDivider definido como zero, o que é inválido e causa um erro.

Aqui está uma lista dos comandos do depurador usados:

Comando Significado
!wmitrace.bufdump Listar todo o buffer de log junto com o nome, IddCx é o nome nosso, vem da linha de comando logman.exe
!wmitrace.logdump LogBufferName Decodifica e exibe o conteúdo do buffer de log especificado, que é IddCx no exemplo abaixo

Aqui está a saída do depurador para este exemplo:

0: kd> !wmitrace.bufdump
(WmiTrace) BufDump
    LoggerContext Array @ 0xFFFFE6055EB0AC40 [64 Elements]

 Logger Context  Number Available   Size    NPP Usage   PP Usage
================ ====== ========= ======== =========== ==========
ffffe6055ee6c800      4         2     4096       16384             Circular Kernel Context Logger
ffffe6055eaa8640      2         2    65536      131072             Eventlog-Security
ffffe6055eb83a00      2         1    65536      131072             DefenderApiLogger
ffffe6055ebb6a00      2         2    65536      131072             DefenderAuditLogger
ffffe6055eb74040      2         1    16384       32768             DiagLog
ffffe6055eb74640      4         2    65536      262144             Diagtrack-Listener
ffffe6055eaa8040      2         2    65536                 131072  EventLog-Application
ffffe6055eb7c040      2         1    65536      131072             EventLog-System
ffffe6055eb7c640      5         3    65536      327680             LwtNetLog
ffffe6055eb85040      4         2    65536      262144             Microsoft-Windows-Rdp-Graphics-RdpIdd-Trace
ffffe6055eb85680      8         6   131072     1048576             NetCore
ffffe6055eb89040      4         4     4096       16384             NtfsLog
ffffe6055eb89640      8         6   131072     1048576             RadioMgr
ffffe605683ef040      3         2     4096                  12288  WindowsUpdate_trace_log
ffffe6055eb8f640      2         2     2048        4096             UBPM
ffffe6055eb108c0      4         2    16384       65536             WdiContextLog
ffffe6055eb968c0      4         2    81920      327680             WiFiSession
ffffe60567e8a6c0      5         3     8192       40960             IddCx
ffffe605658379c0     10         9     3072       30720             umstartup
ffffe605659d4840     10         9   131072     1310720             SCM
ffffe605655af9c0      2         1    65536      131072             UserNotPresentTraceSession
ffffe605659d6840      2         1     4096        8192             COM
ffffe60565925080     10         8    20480      204800             Terminal-Services-LSM
ffffe60565956080     10         9    20480      204800             Terminal-Services-RCM
ffffe6055eba39c0     50        49     3072      153600             UserMgr
ffffe60567388280      2         2    32768       65536             WFP-IPsec Diagnostics
ffffe605678a3040      5         3     4096       20480             MpWppTracing-20200424-092923-00000003-ffffffff
ffffe60567e35080      2         1    65536      131072             ScreenOnPowerStudyTraceSession
ffffe605655e0a00      5         3     4096       20480             SHS-04242020-092951-7-7f
ffffe605692054c0      4         4     8192       32768             RdpIdd
ffffe60567f597c0      4         3    65536      262144             SgrmEtwSession
ffffe605678a9a00      4         4     8192       32768             DispBrok-DeskSrv
ffffe60569286680      4         4     8192       32768             DispBrok-Desk
ffffe605668026c0      4         4     8192       32768             DispBrok
================ ====== ========= ======== =========== ==========
                    195       159             6651904     143360

0: kd> !wmitrace.logdump IddCx
(WmiTrace) LogDump for Logger Id 0x13
Found Buffers: 5 Messages: 537, sorting entries
[1]0EF8.0CF0::04/24/2020-09:43:36.894 [cx][IddCx]DriverEntry: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Exit
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]DriverEntry: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.911 [cx][IddCx]IddCxImplDeviceInitialize: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: New IddDevice 0x000001642F5E0770 created
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?Init@IddAdapter@@QEAAXPEAUIDDCX_ADAPTER__@@PEAVIddDevice@@PEAUIDDCX_ADAPTER_CAPS@@@Z: New IddAdapter 0x000001642F5E77D0 created, API object 0xFFFFFE9BD0A18978, IddDevice 0x000001642F5E0770
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?SendUserModeMessage@IddAdapter@@QEAAJIPEAXI0W4DXGK_IDD_ESCAPE_CODE@@PEAI@Z: Sending escape 0x0 to kernel
Unknown( 76): GUID=ac5ec775-ccdb-3c2c-6150-28b4eacacbc4 (No Format Information found).
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Exit, status=STATUS_SUCCESS
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, processing command START_ADAPTER_COMPLETE from KMD
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, Successful adapter start, Wddm Luid = 0xe6e90, Adapter caps 0x0, Session Id 0, Terminal Luid 0x0
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: Exit
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]<lambda_e42696d61f3ea0fd0d39fdb90d856b7b>::operator(): DDI: Calling EvtIddCxAdapterInitFinished DDI, IddAdapter 0xFFFFFE9BD0A18978
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: New IddMonitor 0x000001642F5EF720 created, API object 0xFFFFFE9BD0A11A38, IddAdapter 0x000001642F5E77D0
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Exit, status=STATUS_SUCCESS
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorArrival: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get mode count, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get mode count, mode count 23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get modes, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get modes
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddMonitorModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, parseMonitorDescription returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI for mode count, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI, mode count = 0x23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI to get modes, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddTargetModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, queryTargetModes returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:55.341 [cx][IddCx] Throwing error (Status 0xc000000d(STATUS_INVALID_PARAMETER)) from function Validate in onecoreuap\windows\core\dxkernel\indirectdisplays\classext\cx\ddivalidation.cpp:412, Msg DISPLAYCONFIG_VIDEO_SIGNAL_INFO.AdditionalSignalInfo.vSyncFreqDivider cannot be zero for target mode
Total of 537 Messages from 5 Buffers

A última linha fornece o motivo da falha.

Funcionalidade de depuração de captura de tela de exibição indireta

A partir do Build 25164 do Windows, o IddCx tem a capacidade de despejar o quadro da área de trabalho que o IddCx passa para o driver. Essa funcionalidade pode ser usada para depurar problemas visuais. Ele pode ser combinado com as sobreposições de depuração, como sombreamento sujo regiões de um quadro.

Como o IddCx procurará alterações na configuração do registro de depuração para captura de quadro em cada quadro, há um valor de controle master em IddCxDebugCtrl que controla se o IddCx marcar o valor do registro de captura de cada quadro. Isso garante que não haja nenhuma penalidade de desempenho quando desabilitado.

Observação

Essa funcionalidade é desabilitada quando a interface do OPM está ativa para o driver.

Valores do Registro que controlam a captura

Os valores do registro a seguir estão localizados em HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture. Essa pasta do Registro deve ser criada antes que o valor IddCxDebugCtrl seja definido.

Nome Padrão se estiver ausente Significado
TriggerUniqueness 0 Quando cada swapchain IddCx for chamado para adquirir um novo quadro, ele lerá esse valor. Se TriggerUniqueness não for zero e diferente do valor lido anteriormente, os valores abaixo serão lidos e a captura de quadros será habilitada.
TargetMask 0xffff Máscara de bits, um bit para cada índice de destino no adaptador que controla se a cadeia de troca para esse destino deve fazer parte dessa sequência de captura.
CaptureCount 10 Número de quadros que cada IddCx swapchain habilitado para captura deve capturar.
SkipFrames 0 Número de quadros a serem pulados entre cada quadro capturado.
CaptureSessionID 0 A sessão na qual a captura de quadros será habilitada. Um valor igual a zero sempre significa a sessão do console.
Scalefactor 100 Controla o fator de escala usado para decidir quais são as dimensões do arquivo capturado, valores válidos de 1 a 100
CaptureFolder c:\IddCxImages Pasta em que os arquivos de captura serão gravados. Uma pasta c:\IddCxImages será criada se ela não existir.

Os parâmetros de captura são armazenados por destino, o que permite que uma sessão de captura abrange uma alteração de modo em um determinado destino.

Se um novo valor TriggerUniqueness diferente de zero for detectado enquanto um objeto monitor ainda estiver capturando quadros de uma captura anterior, ele interromperá a captura atual e iniciará a recém-disparada.

Usando arquivos REG para controlar a captura de quadros

Os arquivos REG são uma boa maneira de controlar as capturas de quadro. Um arquivo pode definir os valores iniciais e outro pode atualizar TriggerUniqueness.

Arquivo REG para definir valores iniciais

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
"IddCxDebugCtrl"=dword:2200

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:0

Arquivo REG para atualizar TriggerUniqueness

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:1

Nome e formato do arquivo

Os quadros capturados estarão no formato de arquivo PNG com o seguinte formato de nome de arquivo:

ID da Sessão S<, zero para console>_Ad<valor Hex do adaptador de ID LUID>_T<Valor Hex de Idx> de destino de ID_Frame<Número de quadro de IDDCX_METADATA. PresentationFrameNumber>_<Date in mmddyy format>_<Time in hhmmss>.png

Veja a seguir alguns nomes de arquivo de exemplo:

  • S0_Ad8ade_T3_Frame2343_020422_173434.png
  • S0_Ad8ade_T3_Frame2344_020422_173434.png
  • S0_Ad8ade_T3_Frame2345_020422_173435.png

Registro em log do WPP

Para cada nova sessão de captura iniciada, as mensagens WPP serão registradas para cada valor lido no registro ou definido por padrão.

Sempre que um quadro for capturado e gravado no arquivo, o IddCx adicionará uma mensagem WPP que contém o nome de arquivo completo do arquivo de imagem.

Configuração de captura de exemplo

Capturar quadros de quando um monitor é conectado pela primeira vez

Veja a seguir os valores do Registro necessários para capturar os primeiros 20 quadros de quando qualquer monitor é conectado pela primeira vez, seguido pelo arquivo REG.

Entrada de registro Valor Observações
CaptureCount 20 Definir 20 quadros em vez do padrão 10
TriggerUniqueness 1 Qualquer valor diferente de zero funcionará como objeto de destino começa com zero como exclusividade do repositório
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"TriggerUniqueness"=dword:00000001

Iniciar a captura enquanto o monitor estiver ativo

Considerando que os swapchains marcar para um novo valor de exclusividade quando o driver adquire cada quadro, você deve definir a entrada TriggerUniqueness por último para garantir que todos os parâmetros sejam lidos conforme o esperado. O exemplo a seguir também reduz pela metade a resolução de arquivos para economizar espaço e grava os arquivos de captura na pasta c:\frames .

Entrada de registro Valor Observações
CaptureCount 100 Definir 100 quadros em vez do padrão 10
Scalefactor 50 Definir resolução de 50% para economizar espaço
CaptureFolder c:\frames Definir pasta de saída
TriggerUniqueness 1 Qualquer valor diferente de zero funcionará quando o objeto de destino começar com zero como exclusividade do repositório
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"CaptureFolder"="c:\\frames"
"ScaleFactor"=dword:00000032
"TriggerUniqueness"=dword:00000001

Capturar 10 quadros do segundo destino na sessão remota 3 com 5 quadros entre cada captura

Essa captura também usa a sobreposição de depuração para realçar as sujo regiões para cada um dos quadros.

Entrada de registro Valor Observações
IddCxDebugCtrl Bit 0x0400 também definido 0x0400 habilita o realce sujo região, 0x2200 bits também necessários
CaptureSessionID 3 Habilita a captura na sessão remota 3
TargetMask 0x2 O bit 1 corresponde ao Idx 1 de destino
SkipFrames 5 Ignorar a captura de 5 quadros entre cada captura
TriggerUniqueness 1 Qualquer valor diferente de zero funcionará quando o objeto de destino começar com zero como exclusividade do repositório
Windows Registry Editor Version 5.00  

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]  
"IddCxDebugCtrl"=dword:2600

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureSessionID"=dword:00000003
"TargetMask"=dword:00000002
"SkipFrames"=dword:00000005    
"TriggerUniqueness"=dword:00000001