Поделиться через


Практическое руководство. Перечисление адаптеров

В этом разделе показано, как использовать инфраструктуру графики Microsoft DirectX (DXGI) для перечисления доступных графических адаптеров на компьютере. Direct3D 10 и 11 может использовать DXGI для перечисления адаптеров.

Обычно по этим причинам необходимо перечислить адаптеры:

  • Чтобы определить, сколько графических адаптеров установлено на компьютере.
  • Чтобы помочь выбрать адаптер, используемый для создания устройства Direct3D.
  • Чтобы получить объект IDXGIAdapter, который можно использовать для получения возможностей устройства.

Перечисление адаптеров

  1. Создайте объект IDXGIFactory путем вызова функции CreateDXGIFactory. В следующем примере кода показано, как инициализировать объект IDXGIFactory.

    IDXGIFactory * pFactory = NULL;
    
    CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)
    
  2. Перечислите каждый адаптер, вызвав метод IDXGIFactory::EnumAdapters. Параметр адаптера позволяет указать отсчитываемый от нуля номер индекса адаптера. Если адаптер недоступен по указанному индексу, метод возвращает DXGI_ERROR_NOT_FOUND.

    В следующем примере кода показано, как перечислить адаптеры на компьютере.

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

В следующем примере кода показано, как перечислить все адаптеры на компьютере.

Заметка

Для Direct3D 11.0 и более поздних версий рекомендуется, чтобы приложения всегда использовали IDXGIFactory1 и 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;

}

Использование Direct3D 11