Compartilhar via


Suporte à verificação de recursos de adaptador cruzado (CASO)

Desempenho pré-CASO (caminho de duas cópias)

A partir do Windows 8.1 (WDDM 1.3), os aplicativos D3D9 e DXGI foram capazes de usar o suporte à apresentação entre adaptadores em configurações de vários adaptadores, como sistemas híbridos. Com esse suporte, a renderização é feita em um adaptador de renderização (normalmente a GPU discreta) e, em seguida, duas cópias são feitas para obter o conteúdo para o adaptador de exibição (normalmente a GPU integrada) para verificação para a exibição.

  • A cópia 1 é do recurso do adaptador de renderização para um recurso de adaptador cruzado.
  • A cópia 2 é do recurso de adaptador cruzado para o recurso do adaptador de exibição.

Essas cópias podem limitar o desempenho de aplicativos, especialmente para aplicativos otimizados para baixa latência.

Usando o CASO para otimizar o modelo de apresentação de inversão (caminho de cópia única)

O Windows Server 2022 (WDDM 2.9) e os drivers posteriores podem declarar suporte para uma camada de recurso de adaptador cruzado apropriada, permitindo que a pilha de apresentação do sistema otimize os presentes entre adaptadores. Os drivers devem declarar suporte para esse recurso com base em sua própria funcionalidade de adaptador, independentemente da configuração do dispositivo, de modo que o valor do recurso seja dimensionado em todas as configurações de hardware aplicáveis. Esse dimensionamento inclui, mas não se limita a, um único dispositivo de GPU com anexação dinâmica de outras GPUs externas.

Se o adaptador de exibição der suporte ao CASO, o sistema fará apenas a primeira cópia da superfície do adaptador de renderização para a superfície do adaptador cruzado e, em seguida, examinará diretamente a superfície do adaptador cruzado. Esse recurso resulta em processamento reduzido, largura de banda, potência e latência.

O recurso CASO é implementado para o runtime DXGI para o modelo de apresentação de inversão.

Alterações e adições de DDI para CASO

Indicando suporte de camada para recursos de adaptador cruzado

O DXGI implementa três camadas de suporte para recursos de adaptador cruzado:

  1. Copiando de e para recursos de adaptador cruzado (camada mais baixa)
  2. Texutura de recursos de adaptador cruzado
  3. Verificação dos recursos do adaptador cruzado (camada mais alta)

Cada camada mais alta de suporte deve garantir o suporte das camadas abaixo dela. Por exemplo, para solicitar suporte para verificação de recursos de adaptador cruzado, o driver também deve dar suporte a texturização e cópia.

Os drivers declaram suporte para cada camada definindo os seguintes valores de campo de DXGK_VIDMMCAPS bits em DXGK_DRIVERCAPS. MemoryManagementCaps:

Camada Significado da camada Valor DXGK_VIDMMCAPS
Camada 1 Copiar suporte: copiar de e para recursos de adaptador cruzado CrossAdapterResource (exposto ao modo de usuário pelo kernel gráfico por meio do bit SupportCrossAdapterResource em D3DKMT_WDDM_1_3_CAPS
Camada 2 Suporte à textura: textura de recursos de adaptador cruzado) CrossAdapterResourceTexture (inclui suporte para exibição de recurso de sombreador, exibição de acesso não ordenado e destino de renderização)
Nível 3 Suporte ao CASO: verificação de recursos de adaptador cruzado CrossAdapterResourceScanout

O kernel gráfico falhará no início do adaptador se ele não indicar suporte de maneira superconjunta para as três camadas. Por exemplo, CrossAdapterResource deverá ser definido se CrossAdapterResourceTexture estiver definido.

Requisitos de suporte da camada 1

Os recursos de adaptador cruzado ainda são definidos da mesma forma, conforme usado para o suporte à cópia de camada 1.3 do WDDM 1.3.

Requisitos de suporte da camada 2

Os requisitos são semelhantes ao driver de modo de usuário D3D12 CrossAdapterRowMajorTextureSupported capability (cap); ou seja, o dispositivo dá suporte a exibições de recursos de sombreador, exibições de acesso não ordenadas e modos de exibição de destino de texturas de linhas principais do adaptador cruzado. No entanto, embora o CrossAdapterRowMajorTextureSupported da D3D12 exija suporte a todos os formatos de textura relevantes, esse limite de camada 2 requer suporte apenas nos formatos DisplayScanOut listados nos requisitos de suporte da Camada 3, no mínimo.

Como o limite de D3D12 é um superconjunto desse limite de camada 2, D3D12CreateDevice também verifica se o limite CrossAdapterResourceTexture do driver de kernel é definido se seu limite CrossAdapterRowMajorTextureSupported está definido e falha na criação do dispositivo se não estiver.

Requisitos de suporte da camada 3

O sistema deve ser capaz de executar os recursos de inversão com suporte, conforme declarado pelo driver em DXGK_FLIPCAPS, para recursos de adaptador cruzado das seguintes especificações mínimas:

  • Um tamanho de buffer primário de adaptador cruzado de 1920 x 1080 ou menor
  • Um formato de pixel de buffer de qualquer um dos formatos DisplayScanOut com suporte. A partir de Windows 10 versão 20H1, esses formatos são:
    • DXGI_FORMAT_R16G16B16A16_FLOAT
    • DXGI_FORMAT_R10G10B10A2_UNORM
    • DXGI_FORMAT_R8G8B8A8_UNORM
    • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
    • DXGI_FORMAT_B8G8R8A8_UNORM
    • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

Se o driver der suporte à verificação de recursos de adaptador cruzado de mais formatos de textura, ele também deverá dar suporte à texturização desses formatos, de acordo com os requisitos de suporte da camada.

Observação

O runtime do DXGI consulta o driver para o suporte a CrossAdapterResourceScanout . Se houver suporte, a pilha de apresentação descerá o caminho de uma cópia. Portanto, os drivers que declaram suporte para CrossAdapterResourceScanout são necessários para dar suporte à DDI DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 . Além disso, ele também deve dar suporte a todos os DDIs relacionados à apresentação relevantes para as primárias entre adaptadores das especificações mínimas acima. Alguns exemplos são: pfnCreateResource, pfnCheckMultiplaneOverlaySupport e pfnPresentMultiplaneOverlay/pfnPresent1. Para obter mais informações, consulte Suporte à sobreposição multiplano. Para obter mais informações sobre como sair do CASO, consulte DDIs de driver para otimização de apresentação.

Ambas as camadas têm testes HLK que acompanham a verificação.

Suporte ao sinalizador StaticCheck para DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3

O sinalizador StaticCheck foi adicionado ao DXGK_MULTIPLANE_OVERLAY_FLAGS no WDDM 3.0. Esse sinalizador expande o uso do DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI para suporte ao CASO. Esse sinalizador permite que DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 consultar um driver para determinar se o plano marcado com o sinalizador StaticCheck é capaz de fazer a verificação. Essa chamada é uma chamada única e não deve afetar o comportamento real da apresentação. Portanto, os drivers que executam qualquer cache de informações presentes de DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 não devem incluir as informações de chamadas DDI com um plano StaticCheck . Eles devem apenas executar a determinação de suporte de forma autônoma ou estática.

DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 com o conjunto de sinalizadores StaticCheck é garantido como:

  • Ter exatamente um plano marcado com o sinalizador
  • Não contém nenhuma informação do plano PostComposition

Uma chamada para DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 com o conjunto de sinalizadores StaticCheck é usada do processo de aplicativo do DXGI durante a criação do buffer, como durante a criação de conjunto de trocas ou ResizeBuffers, como uma melhor tentativa de esforço para determinar se o CASO tem suporte para a configuração de hardware atual.

Caso especial híbrido integrado

É importante observar que os drivers híbridos integrados foram projetados para ter suporte de verificação de camada 3. A partir do WDDM 3.0, os drivers híbridos integrados são necessários para declarar suporte para CrossAdapterResourceScanout. Um teste HLK verifica esse requisito.

As tampas híbridas existentes podem ser consideradas para substituição no futuro. Portanto, é fundamental que o limite CrossAdapterResourceScanout seja dissociado para permitir maior flexibilidade para evoluir nesse espaço daqui para frente. Portanto, mesmo os drivers que não são híbridos integrados podem definir a camada de suporte entre adaptadores conforme apropriado.

Alterações no kernel de elementos gráficos

A partir do WDDM 2.9, as seguintes adições/alterações foram feitas para suporte a recursos de adaptador cruzado:

Exemplo de uso:

D3DKMT_CROSSADAPTERRESOURCE_SUPPORT KernelSupport = {};
D3DKMT_QUERYADAPTERINFO QueryAdapterInfo;
QueryAdapterInfo.hAdapter = m_hAdapter;
QueryAdapterInfo.Type = KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT;
QueryAdapterInfo.pPrivateDriverData = &KernelSupport;
QueryAdapterInfo.PrivateDriverDataSize = sizeof( KernelSupport );
VERIFY_SUCCEEDED(D3DKMTQueryAdapterInfo(&QueryAdapterInfo));

// Use KernelSupport.SupportTier as appropriate

DDIs de driver para otimização de apresentação

Os drivers usam os seguintes DDIs para indicar se há suporte para verificação entre adaptadores:

  • DXGK_VIDMMCAPS::CrossAdapterResourceScanout cap

    O sistema consulta esse limite antecipadamente para determinar se o driver dá suporte à funcionalidade CASO.

    Se o driver der suporte ao CASO, o DXGI continuará com o caminho CASO de uma cópia; caso contrário, o DXGI retornará ao caminho de duas cópias.

  • pfnCreateResource DDI

    No caminho CASO de uma cópia, o DXGI cria o recurso de adaptador cruzado como primário no adaptador de exibição, por meio de pfnCreateResource. O driver deve ser avaliado com base nas propriedades do recurso se ele pode verificar a partir desse recurso.

    Se o driver der suporte à verificação com base nas propriedades do recurso, o DXGI continuará com o caminho CASO de uma cópia. Caso contrário, o driver deve recusar as verificações retornando DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT. Nesse caso, o DXGI volta para o caminho de duas cópias. Esse fallback só deverá ocorrer se as propriedades do recurso estiverem além dos requisitos mínimos, conforme listado nos requisitos de suporte da Camada 3.

  • pfnCheckMultiplaneOverlaySupport DDI

    De acordo com o comportamento atual, o DWM (Gerenciador de Windows da Área de Trabalho) chama a DDI pfnCheckMultiplaneOverlaySupport do driver de exibição para determinar com precisão se a superfície primária pode ser verificada. Se houver suporte do driver, a verificação ocorrerá. Caso contrário, o DWM retornará ao modo de composição do DWM.

    Observe que os presentes compostos por DWM provavelmente serão menos desejáveis do que o iFlip ( Independent Flip ) por meio do caminho de duas cópias ou do iFlip por meio do caminho CASO de uma cópia. Portanto, pode haver cenários de exibição comuns em que a largura de banda da apresentação é limitada, como vídeos girados ou vários, em que os drivers podem falhar consistentemente no suporte a pfnCheckMultiplaneOverlaySupport no DWM, provavelmente resultando em uma experiência mais ruim do que o caminho de duas cópias.

    Para atenuar a experiência de fallback negativa, o DXGI chama pfnCheckMultiplaneOverlaySupport durante a criação do buffer com o recurso de adaptador cruzado como um plano marcado com o sinalizador StaticCheck , para verificar com alta precisão se o driver pode executar a verificação considerando as características de largura de banda conhecidas existentes. Se houver suporte, o DXGI continuará com o caminho CASO de uma cópia; caso contrário, ele volta para o caminho de duas cópias.

Teste de HLK

Um requisito e um recurso do HLK do WDDM 3.0, com seus testes de HLK correspondentes, foram adicionados. Esse requisito está vinculado ao suporte DXGK_VIDMMCAPS que os drivers podem declarar; especificamente, CrossAdapterResourceTexture e CrossAdapterResourceScanout.

CrossAdapterResourceTexture

Um teste HLK foi adicionado para verificar as operações de SRV (exibição de recurso de sombreador) em recursos de adaptador cruzado.

  • Para D3D12, o teste HLK "D3D12 - Cross Adapter Resource DX12" existente para Device.Graphics.AdapterRender.D3D12Core.CoreRequirement foi adicionado a; especificamente, o caso de teste CrossAdapterResource::CrossAdapterTextureSRV.

    Adicionado a esse caso de teste HLK está a verificação da relação de superconjunto entre o limite KMD CrossAdapterResourceTexture e o limite D3D12 UMD CrossAdapterRowMajorTextureSupported . Da mesma forma, a lógica foi adicionada em D3D12CreateDevice para garantir que, se o limite umD estiver definido, o limite de driver da camada 2 do kernel também deverá ser definido e falhará na criação do dispositivo se não o fizer.

  • Para D3D11, o caso de teste acima foi adicionado ao teste HLK para Device.Graphics.WDDM30.Render.CrossAdapterScanOut; especificamente, D3DConf_11_CrossAdapterResource::CrossAdapterResourceSRV.

Verificação de recursos entre adaptadores

Os seguintes testes de HLK foram adicionados:

  • Device.Graphics.WDDM30.Render.CrossAdapterScanOut

    • Um teste HLK para verificar se os drivers podem criar recursos primários de adaptador cruzado com êxito sem recusar o comportamento de verificação por meio do sinalizador DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT .
    • Um teste de HLK para verificar se esses drivers dão suporte à DDI DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 .
    • Um teste HLK manual para um testador para verificar manualmente se:
      • A superfície de adaptador cruzado digitalizada está livre de danos visuais/artefatos ou de desinstalação inesperada
      • A superfície do adaptador cruzado é verificada diretamente sem nenhuma transformação interna ou cópias anteriores.

    Esses testes de ponta a ponta também verificam naturalmente se os DDIs CheckMultiplaneOverlaySupport e Present têm suporte para recursos de adaptador cruzado. O aplicativo de teste manual tem alguns requisitos de hardware específicos, como um monitor de alta resolução e alta taxa de atualização. Para obter mais informações, consulte o documento de referência que acompanha o teste.

  • Device.Graphics.WDDM30.Render.CoreRequirement

    • Um teste HLK para verificar se os drivers que declaram o limite Híbrido Integrado também declaram o limite CrossAdapterResourceScanout .
  • System.Fundamentals.Graphics.HybridGraphics.MultiGPU

    • Um teste HLK baseado em sistema para permitir que os OEMs executem esses testes em seus dispositivos híbridos capazes de exercer o caminho de cópia única do DXGI como parte da validação de sistema de ponta a ponta.