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