Como enumerar adaptadores

Este tópico mostra como usar a DXGI (Infraestrutura Gráfica do Microsoft DirectX) para enumerar os adaptadores gráficos disponíveis em um computador. O Direct3D 10 e 11 pode usar DXGI para enumerar adaptadores.

Geralmente, você precisa enumerar adaptadores por estes motivos:

  • Para determinar quantos adaptadores gráficos estão instalados em um computador.
  • Para ajudá-lo a escolher qual adaptador usar para criar um dispositivo Direct3D.
  • Para recuperar um objeto IDXGIAdapter que você pode usar para recuperar recursos do dispositivo.

Para enumerar adaptadores

  1. Crie um objeto IDXGIFactory chamando a função CreateDXGIFactory . O exemplo de código a seguir demonstra como inicializar um objeto IDXGIFactory .

    IDXGIFactory * pFactory = NULL;
    
    CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)
    
  2. Enumerar por meio de cada adaptador chamando o método IDXGIFactory::EnumAdapters . O parâmetro Adapter permite que você especifique um número de índice baseado em zero do adaptador para enumerar. Se nenhum adaptador estiver disponível no índice especificado, o método retornará DXGI_ERROR_NOT_FOUND.

    O exemplo de código a seguir demonstra como enumerar por meio dos adaptadores em um computador.

    for (UINT i = 0; 
         pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; 
         ++i) 
    { ... }
    

O exemplo de código a seguir demonstra como enumerar todos os adaptadores em um computador.

Observação

Para o Direct3D 11.0 e posterior, recomendamos que os aplicativos sempre usem IDXGIFactory1 e CreateDXGIFactory1 .

 

std::vector <IDXGIAdapter*> EnumerateAdapters(void)
{
    IDXGIAdapter * pAdapter; 
    std::vector <IDXGIAdapter*> vAdapters; 
    IDXGIFactory* pFactory = NULL; 
    

    // Create a DXGIFactory object.
    if(FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)))
    {
        return vAdapters;
    }


    for ( UINT i = 0;
          pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND;
          ++i )
    {
        vAdapters.push_back(pAdapter); 
    } 


    if(pFactory)
    {
        pFactory->Release();
    }

    return vAdapters;

}

Como usar o Direct3D 11