Procedura: Enumerare adapter

Questo argomento illustra come usare Microsoft DirectX Graphics Infrastructure (DXGI) per enumerare le schede grafiche disponibili in un computer. Direct3D 10 e 11 può usare DXGI per enumerare schede.

In genere è necessario enumerare gli adattatori per questi motivi:

  • Per determinare il numero di schede grafiche installate in un computer.
  • Per scegliere quale adattatore usare per creare un dispositivo Direct3D.
  • Per recuperare un oggetto IDXGIAdapter che è possibile usare per recuperare le funzionalità del dispositivo.

Per enumerare gli adattatori

  1. Creare un oggetto IDXGIFactory chiamando la funzione CreateDXGIFactory . Nell'esempio di codice seguente viene illustrato come inizializzare un oggetto IDXGIFactory .

    IDXGIFactory * pFactory = NULL;
    
    CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)
    
  2. Enumerare attraverso ogni scheda chiamando il metodo IDXGIFactory::EnumAdapters . Il parametro Adapter consente di specificare un numero di indice in base zero dell'adapter da enumerare. Se non è disponibile alcuna scheda nell'indice specificato, il metodo restituisce DXGI_ERROR_NOT_FOUND.

    Nell'esempio di codice seguente viene illustrato come enumerare gli adapter in un computer.

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

Nell'esempio di codice seguente viene illustrato come enumerare tutte le schede in un computer.

Nota

Per Direct3D 11.0 e versioni successive, è consigliabile che le app usino sempre 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;

}

Come usare Direct3D 11