Enumerando dispositivos filho de um adaptador de exibição
A sequência de etapas a seguir descreve como o driver de porta de exibição, o driver de miniporto de exibição e o gerenciador de VidPN (rede presente em vídeo) colaboram no momento da inicialização para enumerar dispositivos filho de um adaptador de exibição.
O driver de porta de exibição chama a função DxgkDdiStartDevice do driver de miniport de exibição. DxgkDdiStartDevice retorna (no parâmetro NumberOfChildren ) o número de dispositivos que são (ou podem se tornar por encaixe) filhos do adaptador de exibição. DxgkDdiStartDevice também retorna (no parâmetro NumberOfVideoPresentSources ) o número N de fontes presentes de vídeo compatíveis com o adaptador de exibição. Essas fontes de vídeo presentes serão identificadas posteriormente pelos números 0, 1, ... N -1.
O driver de porta de exibição chama a função DxgkDdiQueryChildRelations do driver de miniporta de exibição, que enumera dispositivos filho do adaptador de exibição. DxgkDdiQueryChildRelations preenche uma matriz de estruturas DXGK_CHILD_DESCRIPTOR : uma para cada dispositivo filho. Observe que todos os dispositivos filho do adaptador de exibição estão a bordo: monitores e outros dispositivos externos que se conectam ao adaptador de exibição não são considerados dispositivos filho. Para obter mais informações, consulte Dispositivos filho do adaptador de exibição. DxgkDdiQueryChildRelations deve enumerar possíveis dispositivos filho, bem como os dispositivos filho que estão fisicamente presentes no momento da inicialização. Por exemplo, se conectar um computador laptop a uma estação de encaixe resultará na aparência de uma nova saída de vídeo, DxgkDdiQueryChildRelations deverá enumerar essa saída de vídeo, independentemente de o computador estar encaixado no momento da inicialização. Além disso, se conectar um dongle a um conector de saída de vídeo permitirá que vários monitores compartilhem o conector, DxgkDdiQueryChildRelations deverá enumerar um dispositivo filho para cada branch do dongle, independentemente de o dongle estar conectado no momento da inicialização.
Para cada dispositivo filho (enumerado conforme descrito na Etapa 1) que tem um valor de reconhecimento HPD da função HpdAwarenessInterruptible ou HpdAwarenessPolled, o driver de porta de exibição chama a função DxgkDdiQueryChildStatus do driver de miniporto de exibição para determinar se o dispositivo filho tem um dispositivo externo conectado a ele.
O driver de porta de exibição cria um PDO para cada dispositivo filho que atende a uma das seguintes condições:
- O dispositivo filho tem um valor de reconhecimento hpd de HpdAwarenessAlwaysConnected.
- O dispositivo filho tem um valor de reconhecimento hpd de HpdAwarenessPolled ou HpdAwarenessInterruptible, e o sistema operacional sabe de uma consulta ou notificação anterior que o dispositivo filho tem um dispositivo externo conectado.
O driver de porta de exibição chama a função DxgkDdiQueryDeviceDescriptor do driver de visor para cada dispositivo filho que atenda a uma das seguintes condições:
- O dispositivo filho é conhecido por ter um dispositivo externo conectado.
- Supõe-se que o dispositivo filho tenha um dispositivo externo conectado.
- O dispositivo filho tem um tipo de TypeOther.
DxgkDdiQueryDeviceDescriptor retornará um bloco EDID (Dados de Informações de Exibição Estendida) se o monitor conectado (ou outro dispositivo de exibição) der suporte a descritores EDID.
Observação: durante a inicialização, o driver de porta de exibição chama DxgkDdiQueryDeviceDescriptor para cada monitor obter o primeiro bloco de 128 bytes do EDID do monitor. Isso fornece ao driver de porta de exibição o que ele precisa no momento da inicialização: ID de hardware PnP, ID da instância, IDs compatíveis e texto do dispositivo. Posteriormente, o driver de função da classe monitor (Monitor.sys) chama DxgkDdiQueryDeviceDescriptor para cada monitor para obter o primeiro bloco EDID de 128 bytes e blocos de extensão EDID adicionais de 128 bytes. Isso significa que o driver de miniporto de exibição será chamado duas vezes para fornecer o primeiro bloco de 128 bytes do EDID de cada monitor.
O gerenciador VidPN obtém identificadores para todas as fontes presentes no vídeo e os destinos de vídeo presentes com suporte do adaptador de exibição. As fontes presentes do vídeo são identificadas pelos números 0, 1, ... N – 1, em que N é o número de fontes retornadas pela função DxgkDdiStartDevice do driver de miniport. Os destinos presentes no vídeo têm identificadores inteiros exclusivos que foram criados anteriormente pelo driver de miniporto de exibição durante DxgkDdiQueryChildRelations. Cada dispositivo filho do tipo TypeVideoOutput está associado a um destino presente em vídeo e o membro ChildUid da estrutura DXGK_CHILD_DESCRIPTOR do dispositivo filho é usado como o identificador para o destino presente do vídeo.
O gerenciador VidPN usa o procedimento a seguir para criar um VidPN inicial.
Se um último bom VidPN conhecido for registrado no registro, use-o como o VidPN inicial.
Caso contrário, chame a função DxgkDdiRecommendFunctionalVidPn do driver de miniport de exibição para obter um VidPN inicial.
Se DxgkDdiRecommendFunctionalVidPn não retornar um VidPN funcional aceitável, crie um VidPN simples que contenha um caminho de vídeo presente; ou seja, um par (origem, destino). Chame a função DxgkDdiIsSupportedVidPn do driver de miniport de exibição para verificar se o VidPN proposto funcionará. Se DxgkDdiIsSupportedVidPn relatar que o VidPN proposto não funcionará, continue tentando até que um VidPN adequado seja encontrado.
Chame a função DxgkDdiEnumVidPnCofuncModality do driver de miniporta de exibição para determinar os modos de origem e destino disponíveis para o VidPN.