디스플레이 어댑터의 자식 디바이스 열거

다음 단계 시퀀스는 디스플레이 포트 드라이버, 디스플레이 미니포트 드라이버 및 VidPN(비디오 프레젠테이션 네트워크) 관리자가 초기화 시 협업하여 디스플레이 어댑터의 자식 디바이스를 열거하는 방법을 설명합니다.

  1. 디스플레이 포트 드라이버는 디스플레이 미니포트 드라이버의 DxgkDdiStartDevice 함수를 호출합니다. DxgkDdiStartDevice 는 표시 어댑터의 자식(또는 도킹에 의해 될 수 있음)의 디바이스 수를 NumberOfChildren 매개 변수에 반환합니다. 또한 DxgkDdiStartDevice는 디스플레이 어댑터에서 지원하는 비디오 현재 원본의 수 N을 반환합니다( NumberOfVideoPresentSources 매개 변수에서). 이러한 비디오 제공 소스는 이후에 숫자 0, 1, ... N -1.

  2. 디스플레이 포트 드라이버는 디스플레이 미니포트 드라이버의 DxgkDdiQueryChildRelations 함수를 호출하여 디스플레이 어댑터의 자식 디바이스를 열거합니다. DxgkDdiQueryChildRelations 는 각 자식 디바이스에 대해 하나씩 DXGK_CHILD_DESCRIPTOR 구조의 배열을 채웁니다. 디스플레이 어댑터의 모든 자식 디바이스는 온보드됩니다. 모니터 및 디스플레이 어댑터에 연결되는 기타 외부 디바이스는 자식 디바이스로 간주되지 않습니다. 자세한 내용은 디스플레이 어댑터의 자식 디바이스를 참조하세요. DxgkDdiQueryChildRelations 는 초기화 시 물리적으로 존재하는 자식 디바이스뿐만 아니라 잠재적인 자식 디바이스를 열거해야 합니다. 예를 들어 노트북 컴퓨터를 도킹 스테이션에 연결하면 새 비디오 출력이 나타나는 경우 DxgkDdiQueryChildRelations 는 초기화 시 컴퓨터가 도킹되었는지 여부에 관계없이 해당 비디오 출력을 열거해야 합니다. 또한 동글을 비디오 출력 커넥터에 연결하면 여러 모니터가 커넥터를 공유할 수 있는 경우 DxgkDdiQueryChildRelations 는 초기화 시 동글이 연결되어 있는지 여부에 관계없이 동글의 각 분기에 대해 자식 디바이스를 열거해야 합니다.

  3. HpdAwarenessInterruptible 또는 HpdAwarenessPolled의 HPD 인식 값이 있는 각 자식 디바이스(1단계에서 설명한 대로 열거됨)에 대해 디스플레이 포트 드라이버는 디스플레이 미니포트 드라이버의 DxgkDdiQueryChildStatus 함수를 호출하여 자식 디바이스에 연결된 외부 디바이스가 있는지 여부를 확인합니다.

  4. 디스플레이 포트 드라이버는 다음 조건 중 하나를 충족하는 각 자식 디바이스에 대한 PDO를 만듭니다.

    • 자식 디바이스에는 HpdAwarenessAlwaysConnected의 HPD 인식 값이 있습니다.
    • 자식 디바이스에는 HpdAwarenessPolled 또는 HpdAwarenessInterruptible의 HPD 인식 값이 있으며 운영 체제는 이전 쿼리 또는 알림에서 자식 디바이스에 외부 디바이스가 연결되어 있음을 알고 있습니다.
  5. 디스플레이 포트 드라이버는 다음 조건 중 하나를 충족하는 각 자식 디바이스에 대해 디스플레이 미니포트 드라이버의 DxgkDdiQueryDeviceDescriptor 함수를 호출합니다.

    • 자식 디바이스에 외부 디바이스가 연결된 것으로 알려져 있습니다.
    • 자식 디바이스는 외부 디바이스가 연결된 것으로 간주됩니다.
    • 자식 디바이스에는 TypeOther 유형이 있습니다.

    연결된 모니터(또는 기타 디스플레이 디바이스)가 EDID 설명자를 지원하는 경우 DxgkDdiQueryDeviceDescriptor는 EDID(확장 표시 정보 데이터) 블록을 반환합니다.

    참고: 초기화하는 동안 디스플레이 포트 드라이버는 각 모니터에 대해 DxgkDdiQueryDeviceDescriptor 를 호출하여 모니터의 EDID의 처음 128바이트 블록을 가져옵니다. 이렇게 하면 초기화 시 필요한 PnP 하드웨어 ID, instance ID, 호환 ID 및 디바이스 텍스트가 표시 포트 드라이버에 제공됩니다. 나중에 모니터 클래스 함수 드라이버(Monitor.sys)는 각 모니터에 대해 DxgkDdiQueryDeviceDescriptor 를 호출하여 첫 번째 128바이트 EDID 블록과 128바이트 EDID 확장 블록을 추가로 가져옵니다. 즉, 디스플레이 미니포트 드라이버가 두 번 호출되어 각 모니터의 EDID의 처음 128 바이트 블록을 제공합니다.

  6. VidPN 관리자는 디스플레이 어댑터에서 지원하는 모든 비디오 현재 원본 및 비디오 프레젠테이션 대상에 대한 식별자를 가져옵니다. 비디오 현재 원본은 숫자 0, 1, ... 로 식별됩니다. N - 1. 여기서 N은 디스플레이 미니포트 드라이버의 DxgkDdiStartDevice 함수에서 반환되는 원본 수입니다. 비디오 프레젠테이션 대상에는 DxgkDdiQueryChildRelations 중에 디스플레이 미니포트 드라이버에서 이전에 만든 고유한 정수 식별자가 있습니다. TypeVideoOutput 유형의 각 자식 디바이스는 비디오 프레젠테이션 대상과 연결되며 자식 디바이스의 DXGK_CHILD_DESCRIPTOR 구조의 ChildUid 멤버는 비디오 현재 대상의 식별자로 사용됩니다.

  7. VidPN 관리자는 다음 절차를 사용하여 초기 VidPN을 빌드합니다.

    • 마지막으로 알려진 좋은 VidPN이 레지스트리에 기록되면 초기 VidPN으로 사용합니다.

    • 그렇지 않으면 디스플레이 미니포트 드라이버의 DxgkDdiRecommendFunctionalVidPn 함수를 호출하여 초기 VidPN을 가져옵니다.

    • DxgkDdiRecommendFunctionalVidPn이 허용되는 기능적 VidPN을 반환하지 못하는 경우 하나의 비디오 현재 경로가 포함된 간단한 VidPN을 만듭니다. 즉, 하나의 (원본, 대상) 쌍입니다. 디스플레이 미니포트 드라이버의 DxgkDdiIsSupportedVidPn 함수를 호출하여 제안된 VidPN이 작동하는지 확인합니다. DxgkDdiIsSupportedVidPn에서 제안된 VidPN이 작동하지 않는다고 보고하는 경우 적절한 VidPN이 발견될 때까지 계속 시도하세요.

    • 디스플레이 미니포트 드라이버의 DxgkDdiEnumVidPnCofuncModality 함수를 호출하여 VidPN에 사용할 수 있는 원본 및 대상 모드를 확인합니다.