비디오 캡처 및 기타 자식 디바이스 지원

디스플레이 미니포트 드라이버와 비디오 캡처 디바이스 또는 다른 자식 디바이스용 드라이버는 자식 드라이버가 부모 미니포트 드라이버를 통해 디바이스와 통신하는 데 사용할 수 있는 프라이빗 인터페이스를 상호 정의할 수 있습니다. 자식 비디오 캡처 드라이버는 부모 디스플레이 미니포트 드라이버에 단단히 결합되어야 합니다. 실제로 비디오 캡처는 디스플레이 미니포트 드라이버의 일부로 구현될 수 있습니다. 비디오 캡처 드라이버는 디스플레이 미니포트 드라이버와 함께 프라이빗 인터페이스를 사용하여 I2C 버스에 액세스하고 다른 용도로 액세스할 수 있습니다.

프라이빗 인터페이스를 초기화하기 위해 비디오 캡처 드라이버는 디스플레이 미니포트 드라이버의 디스플레이 포트 드라이버(Dxgkrnl.sys일부)에 IRP_MN_QUERY_INTERFACE 요청을 보냅니다. 디스플레이 포트 드라이버가 이러한 요청을 수신한 후 미니포트 드라이버의 DxgkDdiQueryInterface 함수를 호출하고 프라이빗 인터페이스를 초기화하는 정보가 포함된 QUERY_INTERFACE 구조에 포인터를 전달합니다.

참고 비디오 캡처가 디스플레이 미니포트 드라이버의 일부로 구현되는 경우 비디오 캡처는 DxgkDdiQueryInterface 를 직접 호출할 수 있습니다.

자식 디바이스의 각 드라이버(비디오 캡처 디바이스 포함)는 디바이스가 연결된 하드웨어를 나타내는 어댑터 GUID를 반환해야 합니다. 어댑터 GUID는 어댑터가 초기화될 때 전송되는 DxgkDdiStartDevice 함수의 DxgkStartInfo 매개 변수가 가리키는 DXGK_START_INFO 구조체의 AdapterGuid 멤버에 있는 디스플레이 미니포트 드라이버에 제공됩니다. 사용자 모드 캡처 구성 요소는 이후에 이 어댑터 GUID를 디스플레이 어댑터에 매핑할 수 있습니다.

Microsoft Windows 2000 디스플레이 드라이버 모델에서 비디오 캡처 애플리케이션은 시스템 메모리 캡처 버퍼를 커널 모드로 보냅니다. 그런 다음 커널 모드는 MDL(메모리 설명자 목록) 구조를 사용하여 시스템 메모리 버퍼를 설명하고 MDL을 비디오 캡처 드라이버로 보냅니다. Windows Vista 디스플레이 드라이버 모델은 시스템 메모리에 대한 캡처를 지원하는 것 외에도 비디오 메모리에 대한 캡처를 지원합니다. Direct3D 런타임은 DirectX Video Acceleration 2.0 형식 함수를 호출하여 GPU가 캡처 데이터에 대한 사후 처리를 수행하도록 지시합니다. 비디오 메모리 버퍼를 설명하기 위해 MDL을 보내는 대신 사용자 모드 표시 드라이버는 버퍼 할당을 캡처하기 위한 핸들인 D3DKMT_HANDLE 형식 값을 보냅니다. 따라서 비디오 캡처 드라이버 및 디스플레이 미니포트 드라이버 조합은 DxgkCbGetHandleData 와 같은 기존 콜백 함수를 사용하여 캡처 버퍼를 설명하는 프라이빗 데이터를 참조할 수 있습니다. 드라이버 조합은 DxgkCbGetCaptureAddress 콜백 함수를 사용하여 캡처 버퍼의 실제 주소를 반환할 수도 있습니다.

비디오 캡처 애플리케이션은 Direct3D 런타임을 호출하여 캡처 버퍼를 만듭니다. 런타임은 이후에 사용자 모드 표시 드라이버를 호출합니다. 런타임은 캡처 버퍼를 만들기 위해 D3DDDIARG_CREATERESOURCE 구조의 Flags 멤버에 설정된 CaptureBuffer 비트 필드 플래그를 사용하여 사용자 모드 표시 드라이버의 CreateResource 함수를 호출합니다. 또한 메모리 관리자가 디스플레이 미니포트 드라이버의 DxgkDdiCreateAllocation 함수를 호출하여 캡처 버퍼에 대한 할당을 만들 때 디스플레이 미니포트 드라이버는 비디오 메모리 관리자에 대한 캡처 비트 필드 플래그를 지정해야 합니다. 캡처 버퍼가 만들어지면 즉시 메모리에 고정되고 해제될 때까지 고정되지 않습니다. 캡처 스택은 캡처 버퍼에 대한 커널 모드 할당 핸들을 캡처 드라이버에 보내야 하므로 런타임은 사용자 모드 표시 드라이버의 GetCaptureAllocationHandle 함수를 호출하여 각 리소스 핸들을 해당 리소스의 커널 모드 할당 핸들에 매핑합니다.

캡처 드라이버는 시스템 메모리에 대한 캡처를 직접 지원하는지 여부를 보고할 수 있습니다. 캡처 드라이버가 시스템 메모리에 직접 캡처를 지원하는 경우 이를 위해 MDL이 캡처 드라이버로 전송됩니다. 캡처 드라이버가 시스템 메모리에 대한 직접 캡처를 지원하지 않는 경우 런타임은 비디오 메모리 캡처 버퍼를 만들고 캡처 드라이버는 이를 채워야 합니다. 캡처 버퍼의 내용을 시스템 메모리 화면에 복사하기 위해 사용자 모드 표시 드라이버의 CaptureToSysMem 함수가 호출됩니다. 런타임은 Blt 함수가 아닌 CaptureToSysMem을 사용하여 사용자 모드 표시 드라이버가 pfnRenderCb 함수를 호출할 필요가 없는 비트 블록 전송(비트블렛)에 특수 하드웨어를 활용할 수 있습니다.

AVStream은 비디오 캡처를 제어하기 때문에 DirectX 그래픽 커널 하위 시스템은 비디오 캡처가 발생하는 시기를 인식하지 않습니다. 그러나 그래픽 커널 하위 시스템은 캡처 버퍼로 사용되는 할당을 알고 있습니다. 캡처 버퍼가 제거될 때 그래픽 커널 하위 시스템은 디스플레이 미니포트 드라이버의 DxgkDdiStopCapture 함수를 호출하여 캡처 작업이 캡처 버퍼로 할당을 즉시 중지해야 함을 나타냅니다. 캡처 스택을 통해 캡처 작업이 이미 중지된 경우 드라이버는 호출을 안전하게 무시할 수 있습니다.