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

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

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

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

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

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

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