Compatibilidad con la captura de vídeo y otros dispositivos secundarios
Un controlador de minipuerto de pantalla y el controlador para un dispositivo de captura de vídeo u otro dispositivo secundario pueden definir mutuamente una interfaz privada que el controlador secundario puede usar para comunicarse con su dispositivo a través del controlador de miniporte primario. Un controlador de captura de vídeo secundario debe estar estrechamente acoplado al controlador de miniporte de pantalla principal. De hecho, la captura de vídeo podría implementarse como parte del controlador de minipuerto de pantalla. Un controlador de captura de vídeo puede usar la interfaz privada con el controlador de minipuerto de pantalla para acceder al bus I2C y para otros fines.
Para inicializar la interfaz privada, el controlador de captura de vídeo envía una solicitud de IRP_MN_QUERY_INTERFACE al controlador de puerto de pantalla (parte de Dxgkrnl.sys) para el controlador de minipuerto de pantalla. Una vez que el controlador de puerto de visualización recibe esta solicitud, llama a la función DxgkDdiQueryInterface del controlador de miniporte y pasa un puntero a una estructura de QUERY_INTERFACE que contiene información para inicializar la interfaz privada.
Nota Si la captura de vídeo se implementa como parte del controlador de miniporte de pantalla, la captura de vídeo podría llamar directamente a DxgkDdiQueryInterface .
Cada controlador de un dispositivo secundario (incluidos los dispositivos de captura de vídeo) debe devolver el GUID del adaptador que indica el hardware al que está asociado el dispositivo. El GUID del adaptador se proporciona al controlador de minipuerto de pantalla en el miembro AdapterGuid de la estructura DXGK_START_INFO a la que apunta el parámetro DxgkStartInfo de la función DxgkDdiStartDevice que se envía cuando se inicializa el adaptador. Los componentes de captura en modo de usuario pueden asignar posteriormente este GUID de adaptador a un adaptador de pantalla.
En el modelo de controlador de pantalla de Microsoft Windows 2000, las aplicaciones de captura de vídeo envían búferes de captura de memoria del sistema al modo kernel. A continuación, el modo kernel describe los búferes de memoria del sistema mediante estructuras de lista de descriptores de memoria (MDL) y envía las MDL al controlador de captura de vídeo. Además de admitir la captura en la memoria del sistema, el modelo de controlador de pantalla de Windows Vista admite la captura en memoria de vídeo. El tiempo de ejecución de Direct3D llama a las funciones de tipo DirectX Video Acceleration 2.0 para dirigir la GPU para realizar el procesamiento posterior en los datos de captura. En lugar de enviar MDL para describir los búferes de memoria de vídeo, el controlador de pantalla en modo de usuario enviará valores de tipo D3DKMT_HANDLE que son identificadores para capturar asignaciones de búfer. Por lo tanto, el controlador de captura de vídeo y la combinación de controladores de minipuerto de pantalla pueden usar funciones de devolución de llamada existentes como DxgkCbGetHandleData para hacer referencia a datos privados que describen el búfer de captura. La combinación de controladores también puede usar la función de devolución de llamada DxgkCbGetCaptureAddress para devolver la dirección física del búfer de captura.
Las aplicaciones de captura de vídeo llaman al tiempo de ejecución de Direct3D para crear búferes de captura; el tiempo de ejecución llama posteriormente al controlador de pantalla en modo de usuario. El runtime llama a la función CreateResource del controlador de visualización en modo de usuario con la marca de campo de bits CaptureBuffer establecida en el miembro Flags de la estructura D3DDDIARG_CREATERESOURCE para crear búferes de captura. El controlador de minipuerto de pantalla también debe especificar la marca capturar campo de bits para el administrador de memoria de vídeo cuando el administrador de memoria llama a la función DxgkDdiCreateAllocation del controlador de miniporte para crear asignaciones para los búferes de captura. Cuando se crean búferes de captura, se anclan inmediatamente en la memoria y no se desanclan hasta que se liberan. Dado que la pila de captura debe enviar identificadores de asignación en modo kernel para los búferes de captura al controlador de captura, el tiempo de ejecución llama a la función GetCaptureAllocationHandle del controlador de visualización del modo de usuario para asignar cada identificador de recursos al identificador de asignación en modo kernel para ese recurso.
El controlador de captura puede notificar si admite la captura en la memoria del sistema directamente. Si el controlador de captura admite la captura directamente en la memoria del sistema, las MDL se envían al controlador de captura para este fin. Si el controlador de captura no admite la captura directa en la memoria del sistema, el tiempo de ejecución crea búferes de captura de memoria de vídeo y el controlador de captura debe rellenarlos. Se llama a la función CaptureToSysMem del controlador de pantalla en modo de usuario para copiar el contenido de un búfer de captura en una superficie de memoria del sistema. El runtime puede usar CaptureToSysMem en lugar de la función Blt para aprovechar el hardware especial para transferencias de bloques de bits (bitblt) que no requieren que el controlador de pantalla en modo de usuario llame a la función pfnRenderCb .
Dado que AVStream controla la captura de vídeo, el subsistema del kernel de gráficos de DirectX no es consciente de cuándo se produce la captura de vídeo. Sin embargo, el subsistema del kernel de gráficos es consciente de las asignaciones que se usan como búferes de captura. Cuando se va a destruir un búfer de captura, el subsistema del kernel de gráficos llama a la función DxgkDdiStopCapture del controlador de miniporte para indicar que la operación de captura debe dejar de usar inmediatamente una asignación como búfer de captura. Si la operación de captura ya se ha detenido a través de la pila de capturas, el controlador puede omitir la llamada de forma segura.