Depuración de controladores de pantalla indirectos
Los controladores de pantallas indirectas (IDD) son controladores UMDF. Es un buen punto de partida empezar con la documentación sobre depuración de UMDF, como Cuáles son las razones por las que el controlador UMDF no se puede cargar o el dispositivo UMDF no se puede iniciar. En esta página se da toda la información sobre la depuración específica de controladores de pantalla indirectos.
Control del Registro
La Indirect Display Driver Class eXtension (IddCx) tiene algunos parámetros de registro que se pueden usar para depurar controladores de pantalla indirectos. Todos los valores del Registro se encuentran en la clave HKLM\System\CurrentControlSet\Control\GraphicsDrivers.
Nombre del valor | Detalles |
---|---|
TerminateIndirectOnStall | Con un valor cero, se deshabilita el guardián que finaliza el proceso del controlador si no procesa ningún fotograma en 10 segundos a partir de que el fotograma esté disponible. Cualquier otro valor hace que se habilite el guardián. |
IddCxDebugCtrl | Campo de bits que habilita diferentes aspectos de la depuración de IddCx. Consulte la tabla siguiente. |
Nota
Si se usa el valor de registro TerminateIndirectOnStall para deshabilitar el guardián, las pruebas de HLK no se completarán.
Valores IddCxDebugCtrl
Bit en IddCxDebugCtrl | Significado |
---|---|
0x0001 | Entrar en el depurador cuando IddCx detecta un error |
0x0002 | Entrar en el depurador cuando se ha cargado el IddCx |
0x0004 | Entrar en el depurador cuando no se ha cargado el IddCx |
0x0008 | Entrar en el depurador cuando se llama a DriverEntry en IddCx |
0x0010 | Entrar en el depurador cuando se llama a la conexión del controlador |
0x0020 | Entrar en el depurador cuando se llama al inicio del controlador |
0x0040 | Entrar en el depurador cuando se llama a la desconexión del controlador |
0x0080 | Deshabilita el guardián de DDI que hace que termine el proceso del controlador si tarda mucho tiempo en la llamada de DDI. |
0x0100 | No usado |
0x0200 | Habilitar la superposición de la depuración; consulte la nota siguiente |
0x0400 | Superponer caja alfa de color sobre rectángulos sucios en el fotograma; se debe usar 0x0200 |
0x0800 | Superponer estadísticas de rendimiento en el cuadro |
0x2000 | IddCx consultará los valores de registro de fotogramas de captura en cada fotograma; se debe usar 0x0200. |
Nota
Para que cualquiera de las funciones de superposición funcione, el dispositivo Direct3D creado por el controlador y pasado a IddCxSwapChainSetDevice debe crearse con el indicador D3D11_CREATE_DEVICE_BGRA_SUPPORT.
Seguimientos de WPP en IddCx
Iddcx usa la infraestructura de WPP para registrar la información de depuración. La información de WPP se puede capturar en un archivo y, mientras que esta captura está en curso, se puede mostrar en el depurador de kernel.
Captura de seguimiento de WPP en IddCx
Hay varias maneras de habilitar el seguimiento de WPP. Una forma cómoda consiste n utilizar el programa integrado en logman.exe. Si copia las siguientes líneas en un archivo por lotes y lo ejecuta a través del símbolo del sistema con privilegios elevados, recopilará los seguimientos de WPP en IddCx en el archivo 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
Control de lo que se captura
El parámetro Flags de logman.exe (0x4f4 en este caso) controla los mensajes de WPP que registra IddCx. El significado de las Flags ha cambiado en la versión 19041 de Windows y en posteriores.
Marcas que significan para la compilación 19041 de Windows y versiones posteriores
El parámetro Flags es un campo de bits, donde cada bit controla si se captura ese tipo de mensaje.
Bit de flags | Tipo de mensaje capturado |
---|---|
0x001 | No usado |
0x002 | No usado |
0x004 | Errores |
0x008 | Errores leves, por ejemplo, cuando se habilitan las superposiciones de depuración sin crear D3D11_CREATE_DEVICE_BGRA_SUPPORT |
0x010 | Objetos IddCx |
0x020 | El marco de UMDF realiza llamadas a IddCx |
0x040 | Llamadas de DDI de IddCx al controlador |
0x080 | Llamadas de baja frecuencia del controlador a IddCx |
0x100 | Llamadas relacionadas con fotogramas de alta frecuencia del controlador a IddCx |
0x200 | Llamadas relacionadas con cursores de alta frecuencia del controlador a IddCx |
0x400 | Llamadas de kernel a IddCx |
0x800 | Llamadas de IddCx al kernel |
Lo más recomendable es registrar 0x0f4 como punto de partida. Si desea ver información por fotograma, 0x1f4 es un buen punto de partida.
Significado de las flags antes de la versión 19041 de Windows
Las flags se contemplaban por niveles. Cada nivel superior añadía un nuevo tipo de mensaje junto con todos los mensajes de los niveles anteriores.
Valor de nivel de flags | Tipo de mensaje capturado |
---|---|
1 | No se usa |
2 | Errores |
3 | Advertencias |
4 | Información |
5 | Verbose |
Descodificación de seguimiento de WPP en IddCx
Al igual que todos los seguimientos de WPP, la información de WPP se almacena en archivos pdb. Por lo tanto, es necesario acceder a los archivos pdb con esa información para decodificar. A partir de la compilación 19560 de Windows, el iddCx.pdb en el servidor de símbolos públicos contiene la información de WPP necesaria para descodificar mensajes de WPP. Antes de la versión 19560 de Windows, el IddCx.pdb en el servidor de símbolos públicos no* contenía la información de WPP necesaria para habilitar la descodificación de WPP.
Cualquiera de las herramientas de descodificación de WPP estándar se puede usar para descodificar y mostrar los mensajes.
Depuración de errores de IddCx
Al desarrollar un IDD, a menudo resulta útil obtener información adicional cuando IddCx detecta un error. Tal como se ha explicado anteriormente, puede configurar IddCx para que entre en el depurador al detectar un error, pero también sirve para mostrar el mensaje de error de IddCx en los mensajes de seguimiento más recientes y así conocer el contexto del error.
En la sección anterior, puede habilitar el seguimiento de WPP mediante logman.exe y con la siguiente información se muestra el búfer de WPP en memoria en el depurador del kernel en el momento del error.
Nota
Para que funcione, debe usar un depurador de kernel (no un depurador en modo de usuario) y Windows la compilación 19560 o posterior para que el depurador obtenga el IddCx.pdb que contiene la información de descodificación de WPP.
En el ejemplo siguiente, un IDD llama a IddCxMonitorArrival. Como parte del procesamiento, IddCx llama al DDI EvtIddCxMonitorQueryTargetModes del controlador. En este ejemplo, el controlador devolvió un modo con DISPLAYCONFIG_VIDEO_SIGNAL_INFO. AdditionalSignalInfo.vSyncFreqDivider establecido en cero que no es válido y produce un error.
Esta es una lista de los comandos del depurador que se utilizan:
Get-Help | Significado |
---|---|
!wmitrace.bufdump | Aquí figuran todos los búferes de registro junto con el nombre; IddCx es el nombre del nuestro, que procede de la línea de comandos logman.exe. |
!wmitrace.logdump LogBufferName | Descodifica y muestra el contenido del búfer de registro especificado, que es IddCx en el ejemplo siguiente. |
Este es el resultado del depurador para este ejemplo:
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
La última línea proporciona el motivo del error.
Funcionalidad de depuración de captura de pantalla indirecta
A partir de la versión 25164 de Windows, IddCx tiene la capacidad de volcar el fotograma de escritorio que IddCx pasa al controlador. Esta funcionalidad se puede usar para depurar problemas visuales. Se puede combinar con las superposiciones de depuración, como el sombreado de regiones sucias de un fotograma.
IddCx busca, en cada fotograma, cambios en la configuración del registro de depuración para la captura de fotogramas. Por lo tanto, hay un valor de control maestro en IddCxDebugCtrl que controla este comportamiento. Esta configuración garantiza que no haya ninguna penalización de rendimiento cuando esté deshabilitada.
Nota
Esta funcionalidad está deshabilitada cuando la interfaz de OPM está activa para el controlador.
Valores del Registro que controlan la captura
Los siguientes valores del Registro se encuentran en HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture. Esta carpeta del Registro debe crearse antes de establecer el valor IddCxDebugCtrl.
Nombre | Valor predeterminado si no está disponible | Significado |
---|---|---|
TriggerUniqueness | 0 | Cuando se llama a cada cadena de intercambio IddCx para adquirir un nuevo marco, leerá este valor. Si TriggerUniqueness es distinto de cero y diferente del valor leído anteriormente, se leerán los valores siguientes y se habilitará la captura de fotogramas. |
TargetMask | 0xffff | Máscara de bits, un bit para cada índice de destino en el adaptador que controla si la cadena de intercambio de ese destino debe formar parte de esta secuencia de captura. |
CaptureCount | 10 | Número de fotogramas que cada cadena de intercambio IddCx habilitada para captura debe capturar. |
SkipFrames | 0 | Número de fotogramas que se van a omitir entre cada fotograma capturado. |
CaptureSessionID | 0 | Sesión en la que se habilitará la captura de fotogramas. El valor de cero siempre significa la sesión de la consola. |
ScaleFactor | 100 | Controla el factor de escala usado para decidir cuáles son las dimensiones del archivo capturado, valores válidos 1-100 |
CaptureFolder | c:\IddCxImages | Carpeta donde se escribirán los archivos de captura. Se creará una carpeta c:\IddCxImages si no existe. |
Los parámetros de captura se almacenan por destino, lo que permite que una sesión de captura abarque un cambio de modo en un destino determinado.
Si se detecta un nuevo valor distinto de cero TriggerUniqueness mientras un objeto de monitor sigue capturando fotogramas de una captura anterior, se detendrá la captura actual y comenzará la recién activada.
Uso de archivos REG para controlar la captura de fotogramas
Los archivos REG son una buena manera de controlar las capturas de fotogramas. Un archivo puede establecer los valores iniciales y otro puede actualizar TriggerUniqueness.
Archivo REG para establecer valores iniciales
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
Archivo REG para actualizar TriggerUniqueness
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:1
Nombre y formato de archivo
Los marcos capturados están en formato de archivo PNG con el siguiente formato de nombre de archivo:
S<ID de sesión, cero para consola>_Ad<Valor hexadecimal de LUID de adaptador de ID>_T<Valor hexadecimal de Idx de destino de ID>_Frame<Número de fotograma de IDDCX_METADATA.PresentationFrameNumber>_<Fecha en formato mm/dd/aa>_<Hora en hh/mm/ss>.png
A continuación se muestran algunos nombres de archivo de ejemplo:
- S0_Ad8ade_T3_Frame2343_020422_173434.png
- S0_Ad8ade_T3_Frame2344_020422_173434.png
- S0_Ad8ade_T3_Frame2345_020422_173435.png
Registro del WPP
En cada nueva sesión de captura que se inicie, se registrarán mensajes de WPP por cada valor leído del registro o establecido por defecto.
Cada vez que se captura y se escribe un fotograma en un archivo, IddCx agrega un mensaje WPP que contiene el nombre de archivo completo de la imagen.
Configuración de captura de ejemplo
Captura de fotogramas desde el momento en que un monitor está conectado por primera vez
A continuación se muestran los valores del Registro necesarios para capturar los primeros 20 fotogramas de cuando se conecta por primera vez cualquier monitor, seguido del archivo REG.
Entrada del Registro | Valor | Notas |
---|---|---|
CaptureCount | 20 | Establecer 20 fotogramas en lugar de los 10 predeterminados |
TriggerUniqueness | 1 | Cualquier valor distinto de cero funciona siempre que el objeto de destino comience con cero para garantizar la unicidad del almacenamiento. |
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"TriggerUniqueness"=dword:00000001
Iniciar captura mientras el monitor está activo
Dado que las cadenas de intercambio comprueban si hay un nuevo valor exclusivo cuando el controlador recibe cada fotograma, debe pasar la entrada TriggerUniqueness al final para asegurarse de que se lean todos los parámetros de la forma prevista. En el ejemplo siguiente también se reduce la resolución de archivos para ahorrar espacio y se escriben los archivos de captura en la carpeta c:\frames.
Entrada del Registro | Valor | Notas |
---|---|---|
CantidadDeCapturas | 100 | Establecer 100 fotogramas en lugar de los 10 predeterminados |
ScaleFactor | 50 | Establecer la resolución de 50% para ahorrar espacio |
CaptureFolder | c:\frames | Establecer carpeta de salida |
TriggerUniqueness | 1 | Cualquier valor distinto de cero es válido ya que el objeto de destino comienza con un valor cero, indicando la unicidad del almacén. |
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 fotogramas del segundo destino en la sesión remota 3 con 5 fotogramas entre cada captura
Esta captura también usa la superposición de depuración para resaltar las regiones sucias de cada uno de los fotogramas.
Entrada del Registro | Valor | Notas |
---|---|---|
IddCxDebugCtrl | También se usa el bit 0x0400 | 0x0400 permite que se resalten las regiones sucias y también se deben usar los bits 0x2200. |
CaptureSessionID | 3 | Habilita la captura en la sesión remota 3 |
TargetMask | 0x2 | Bit 1 corresponde al Idx 1 de destino |
OmitirCuadros | 5 | Omitir la captura de cinco fotogramas entre cada captura |
TriggerUniqueness | 1 | Cualquier valor distinto de cero funciona siempre que el objeto de destino comience con cero como identificador único. |
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