Cómo: Enumerar adaptadores

En este tema se muestra cómo usar microsoft DirectX Graphics Infrastructure (DXGI) para enumerar los adaptadores de gráficos disponibles en un equipo. Direct3D 10 y 11 pueden usar DXGI para enumerar adaptadores.

Por lo general, debe enumerar adaptadores por estos motivos:

  • Para determinar cuántos adaptadores de gráficos se instalan en un equipo.
  • Para ayudarle a elegir qué adaptador usar para crear un dispositivo Direct3D.
  • Para recuperar un objeto IDXGIAdapter que puede usar para recuperar las funcionalidades del dispositivo.

Para enumerar adaptadores

  1. Cree un objeto IDXGIFactory llamando a la función CreateDXGIFactory . En el ejemplo de código siguiente se muestra cómo inicializar un objeto IDXGIFactory .

    IDXGIFactory * pFactory = NULL;
    
    CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)
    
  2. Para enumerar a través de cada adaptador, llame al método IDXGIFactory::EnumAdapters . El parámetro Adapter permite especificar un número de índice de base cero del adaptador que se va a enumerar. Si no hay ningún adaptador disponible en el índice especificado, el método devuelve DXGI_ERROR_NOT_FOUND.

    En el ejemplo de código siguiente se muestra cómo enumerar los adaptadores de un equipo.

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

En el ejemplo de código siguiente se muestra cómo enumerar todos los adaptadores de un equipo.

Nota:

Para Direct3D 11.0 y versiones posteriores, se recomienda que las aplicaciones siempre usen IDXGIFactory1 y CreateDXGIFactory1 en su lugar.

 

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;

}

Cómo usar Direct3D 11