WDDM 1.3은 Windows 8.1 Miracast 무선 디스플레이를 지원하는 미니포트 드라이버 작업을 표시합니다.

참고

Windows 10(WDDM 2.0)부터 운영 체제는 모든 GPU에서 작동할 수 있는 기본 제공 Miracast 스택과 함께 제공됩니다. Microsoft Miracast 스택 및 Windows 10 Miracast 디스플레이를 지원하기 위한 드라이버 및 하드웨어 요구 사항에 대한 자세한 내용은 다음 설명서를 참조하세요.

드라이버 개발자는 더 이상 사용자 지정 Miracast 스택을 구현하지 않아야 합니다. Microsoft는 이후 버전의 Windows에서 사용자 지정 Miracast 스택에 대한 지원을 제거할 수 있습니다.

Windows 8.1 Miracast 무선 디스플레이를 지원하려면 커널 모드에서 실행되는 WDDM 1.3 디스플레이 미니포트 드라이버에서 다음 작업을 수행해야 합니다.

Miracast 인터페이스 지원

WDDM 8.1 디스플레이 미니포트 드라이버가 Miracast 디스플레이를 지원하는 경우 Microsoft DirectX 그래픽 커널 하위 시스템이 DxgkDdiQueryInterface 함수를 호출할 때 드라이버 구현 Miracast 함수에 대한 포인터가 있는 DXGK_MIRACAST_DISPLAY_INTERFACE 구조를 보고해야 합니다.

운영 체제의 DirectX 그래픽 커널 하위 시스템(Dxgkrnl.sys)이 DxgkDdiQueryInterface 함수를 호출하여 Miracast 디스플레이 인터페이스를 쿼리하지 않는 경우 Miracast 무선 디스플레이를 지원하지 않으며 디스플레이 미니포트 드라이버는 Miracast 대상을 보고해서는 안 됩니다.

드라이버가 전체 WDDM 그래픽 디바이스에서 둘 이상의 Miracast 대상을 보고하면 안 됩니다. 그렇지 않으면 운영 체제에서 어댑터를 시작하지 못합니다.

Dxgkrnl이 DxgkDdiQueryInterface를 호출하여 Miracast 표시 인터페이스를 쿼리한 후 Dxgkrnl이 DxgkDdiQueryChildRelations 함수를 호출할 때 드라이버가 디바이스 초기화 중에 대상 유형을 D3DKMDT_VOT_MIRACAST 보고할 수 있습니다.

Miracast 대상은 Dxgkrnl이 Miracast 연결된 세션을 시작할 때까지 연결이 끊어진 상태로 유지되어야 합니다. Miracast 세션이 시작되고 모니터가 Miracast 싱크에 연결되거나 새 모니터가 Miracast 싱크에 연결되었기 때문에 드라이버가 Miracast 사용자 모드 드라이버로부터 I/O 요청을 받으면 디스플레이 미니포트 드라이버는 DxgkCbIndicateChildStatus 함수를 호출하여 모니터 도착 HPD(핫 플러그 감지) 인식 값을 운영 체제에 보고해야 합니다. 이 호출에서 드라이버는 DXGK_CHILD_STATUS 구조에서 다음 값을 설정해야 합니다.

멤버
형식 DXGK_CHILD_STATUS_TYPE 열거형의 StatusMiracast 상수 값
미라캐스트. 연결 TRUE
미라캐스트. MiracastMonitorType 연결 형식을 나타내는 값입니다. Miracast 싱크가 모니터 또는 TV에 포함된 경우 이 멤버는 D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY 열거형의 D3DKMDT_VOT_MIRACAST 상수 값으로 설정해야 합니다.

다음 표에서는 WDDM 1.3 디스플레이 미니포트 드라이버가 구현하는 Miracast 함수를 나열합니다.

함수 Description
DxgkDdiMiracastCreateContext Miracast 디스플레이 디바이스의 커널 모드 instance 시작하는 컨텍스트를 만듭니다.
DxgkDdiMiracastDestroyContext Miracast 디스플레이 디바이스의 커널 모드 instance 시작하는 컨텍스트를 만듭니다.
DxgkDdiMiracastIoControl MiracastIoControl에 대한 Miracast 사용자 모드 드라이버 호출에서 시작된 동기 I/O 요청을 처리합니다.
DxgkDdiMiracastQueryCaps 현재 디스플레이 어댑터의 Miracast 기능을 쿼리합니다.

Miracast 세션 시작

Miracast 세션이 시작되면 운영 체제에서 DxgkDdiQueryChildStatus 함수를 호출합니다. 디스플레이 미니포트 드라이버는 DXGK_CHILD_STATUS 설정해야 합니다. StatusMiracast 값을 입력하고 DXGK_CHILD_STATUSMiracast 자식 구조를 사용해야 합니다. 모니터가 Miracast 싱크에 연결된 경우 드라이버는 Miracast를 설정해야 합니다. D3DKMDT_VOT_MIRACAST연결되었습니다.

드라이버는 D3DKMDT_VIDEO_SIGNAL_INFO 값을 지정해야 합니다. VsyncFreqDivider- Miracast 연결된 세션을 통해 Miracast 싱크의 VSync 속도에 표시되는 모니터의 VSync 속도 비율입니다. 예를 들어 Miracast 싱크 세로 새로 고침 속도가 240Hz이고 연결된 디스플레이의 VSync 인터럽트 빈도가 30Hz인 경우 드라이버는 VsyncFreqDivider 를 8로 설정해야 합니다.

완료된 인코딩 청크에 대한 인터럽트 처리

무선 Miracast 연결을 통해 전송되는 단일 프레임에 대한 데이터는 하나 이상의 인코딩 청크로 나눌 수 있습니다. GPU가 이러한 청크 중 하나의 인코딩을 완료할 때마다 인터럽트를 생성해야 합니다. 이 인터럽트에 대한 응답으로 디스플레이 미니포트 드라이버는 DxgkCbNotifyInterrupt 함수를 호출하고 DXGK_INTERRUPT_TYPE 인터럽트 유형을 DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE 설정하는 것을 포함하여 DXGKARGCB_NOTIFY_INTERRUPT_DATA 구조에서 MiracastEncodeChunkCompleted 자식 구조를 완료해야 합니다.

인터럽트 처리의 일부로 드라이버는 필요에 따라 MiracastEncodeChunkCompleted를 지정할 수 있습니다. DXGKARGCB_NOTIFY_INTERRUPT_DATA 구조의pPrivateDriverDataPrivateDataDriverSize 멤버입니다. 사용자 모드 드라이버는 MIRACAST_CHUNK_DATA 이 프라이빗 드라이버 데이터에 액세스할 수 있습니다. PrivateDriverData 멤버입니다.

일정 기간 동안 디스플레이 미니포트 드라이버가 사용자 모드 디스플레이 드라이버에서 사용하는 것보다 청크 데이터로 더 많은 패킷을 생성하는 경우 새 청크에 사용 가능한 사용 가능한 메모리 공간이 부족할 수 있습니다. 이 경우 디스플레이 미니포트 드라이버는 MiracastEncodeChunkCompleted에서 STATUS_NO_MEMORY 반환합니다. 상태이며 DxgkCbNotifyDpc 함수를 호출하여 운영 체제의 GPU 스케줄러에 오류 조건을 알려야 합니다. GetNextChunkData 함수를 호출하면 STATUS_CONNECTION_RESET 상태 코드가 반환되고, 후속 호출은 다시 설정 작업 후에 제출된 청크를 수신하기 시작합니다. 일부 청크가 손실되었으므로 드라이버는 새 I 프레임을 생성하고 전송해야 합니다.

원본 모드에 대한 제한 사항

픽셀 파이프라인의 제약 조건을 처리하기 위해 WDDM 1.3 디스플레이 미니포트 드라이버는 일반적으로 운영 체제에 노출되는 소스 모드를 제한합니다. 드라이버는 원본 모드 목록을 픽셀 파이프라인이 지원하는 모니터에 의해 노출되는 모드로만 채워서 수행합니다. 예를 들어 드라이버는 픽셀 파이프라인 제약 조건에 따라 EDID를 수정하지 않습니다.

마찬가지로 Miracast 디스플레이의 경우 디스플레이 미니포트 드라이버는 원본 및 대상 모드 집합을 열거할 때 운영 체제에 노출되는 소스 모드 집합을 제한합니다. Miracast의 경우 GPU 인코딩 기능, 네트워크 속성 및 싱크 디코딩 기능을 표시하면 Miracast 픽셀 파이프라인이 지원할 수 있는 원본 모드 수를 줄일 수 있습니다.

디스플레이 미니포트 드라이버가 DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode 함수를 호출하여 Miracast 대상에 연결된 소스에 3차원 스테레오 모드를 추가하려고 하면 함수 호출이 실패합니다.

운영 체제 제공 콜백 함수 호출

운영 체제는 다음 Miracast 커널 모드 콜백 함수를 제공합니다.

함수 Description
DxgkCbMiracastSendMessage 사용자 모드 표시 드라이버에 비동기 메시지를 보냅니다.
DxgkCbMiracastSendMessageCallback DxgkCbMiracastSendMessage 호출에서 완료된 IRP에 대한 IO_STATUS_BLOCK 구조를 지정하는 데 사용됩니다.
DxgkCbReportChunkInfo
인코딩 청크에 대한 정보를 보고합니다.

커널 모드에서 사용자 모드로 비동기적으로 메시지 보내기

DxgkCbMiracastSendMessage 호출을 통해 디스플레이 미니포트 드라이버가 연결된 사용자 모드 드라이버에 보내는 모든 메시지는 Miracast 연결된 세션이 시작될 때까지 배달되지 않습니다. 따라서 사용자 모드 드라이버의 StartMiracastSession 함수가 아직 호출되지 않은 경우 보낸 메시지는 StartMiracastSession 이 반환될 때까지 지연됩니다. StopMiracastSession 함수가 호출된 후 메시지가 전송되면 운영 체제에서 메시지를 삭제하고 pIoStatusBlock-Status>에 설정된 오류 상태 함께 DxgkCbMiracastSendMessageCallback 함수가 호출됩니다.

Miracast 디스플레이를 지원하도록 기존 디스플레이 미니포트 드라이버 수정

DxgkDdiStartDevice 함수가 호출되면 디스플레이 미니포트 드라이버는 새 Miracast 대상을 추가해야 하며, 운영 체제가 이 대상을 폴링하지 않도록 대상의 HPD(핫 플러그 검색) 인식 값을 HpdAwarenessInterruptible로 표시해야 합니다. 또한 DxgkDdiQueryChildRelations 함수가 호출되면 드라이버는 D3DKMDT_VOT_MIRACAST 연결 형식으로 보고해야 합니다.

드라이버는 전체 WDDM 그래픽 디바이스에서 둘 이상의 Miracast 대상을 보고해서는 안 됩니다. 드라이버가 둘 이상의 Miracast 대상을 보고하는 경우 운영 체제가 어댑터의 시작에 실패합니다. 또한 Miracast 연결된 세션이 시작되지 않은 경우 드라이버는 이 대상에 대한 모니터를 보고하지 않아야 합니다.

또한 DirectX 그래픽 커널 하위 시스템이DxgkDdiQueryInterface 함수를 호출할 때 드라이버는 커널 모드 주소 공간에 있는 함수에 대한 포인터를 사용하여 올바른 DXGK_MIRACAST_DISPLAY_INTERFACE 구조를 보고해야 합니다.

Miracast 세션이 시작되고 모니터가 Miracast 싱크에 연결되면 디스플레이 미니포트 드라이버가 DXGK_CHILD_STATUS 설정해야 합니다. StatusMiracast 상수 값에 멤버를 입력하고 DXGK_CHILD_STATUS 설정해야 합니다. 미라캐스트. TRUE연결하여 운영 체제에 모니터 도착 HPD를 보고합니다. 드라이버는 DXGK_CHILD_STATUS 설정해야 합니다. 미라캐스트. 싱크에 연결된 올바른 모니터 유형에 대한 MiracastMonitorType 멤버입니다. 싱크가 모니터의 일부인 경우 이 멤버를 D3DKMDT_VOT_MIRACAST 설정해야 합니다.

드라이버가 모니터의 EDID를 알고 있는 경우 운영 체제에서 DxgkDdiQueryDeviceDescriptor 함수를 호출할 때 이 EDID를 보고해야 합니다.

하드웨어 기능, Miracast 싱크 모드 목록 및 네트워크 대역폭에 따라 드라이버는 올바른 소스 모드, 대상 모드, 회전 모드 및 크기 조정 모드를 보고해야 합니다. 대상 모드의 경우 드라이버는 D3DKMDT_VIDEO_SIGNAL_INFO 올바른 VSyncFreqDivider 멤버 값을 보고해야 합니다. 운영 체제는 대상 모드를 모니터 모드와 일치시키고 모니터가 지원하지 않는 모드를 정리합니다.