| 482 | } |
| 483 | |
| 484 | VideoAdapterDescriptor DXGetVideoAdapterDesc(IDXGIAdapter* adapter) |
| 485 | { |
| 486 | ComPtr<IDXGIOutput> output; |
| 487 | |
| 488 | /* Query adapter description */ |
| 489 | DXGI_ADAPTER_DESC desc; |
| 490 | adapter->GetDesc(&desc); |
| 491 | |
| 492 | /* Setup adapter information */ |
| 493 | VideoAdapterDescriptor videoAdapterDesc; |
| 494 | |
| 495 | videoAdapterDesc.name = std::wstring(desc.Description); |
| 496 | videoAdapterDesc.vendor = GetVendorByID(desc.VendorId); |
| 497 | videoAdapterDesc.videoMemory = static_cast<uint64_t>(desc.DedicatedVideoMemory); |
| 498 | |
| 499 | /* Enumerate over all adapter outputs */ |
| 500 | for (UINT j = 0; adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND; ++j) |
| 501 | { |
| 502 | /* Get output description */ |
| 503 | DXGI_OUTPUT_DESC desc; |
| 504 | output->GetDesc(&desc); |
| 505 | |
| 506 | /* Query number of display modes */ |
| 507 | UINT numModes = 0; |
| 508 | output->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, nullptr); |
| 509 | |
| 510 | /* Query display modes */ |
| 511 | std::vector<DXGI_MODE_DESC> modeDesc(numModes); |
| 512 | |
| 513 | auto hr = output->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, modeDesc.data()); |
| 514 | DXThrowIfFailed(hr, "failed to get display mode list with format DXGI_FORMAT_R8G8B8A8_UNORM"); |
| 515 | |
| 516 | /* Add output information to the current adapter */ |
| 517 | VideoOutputDescriptor videoOutput; |
| 518 | |
| 519 | for (UINT i = 0; i < numModes; ++i) |
| 520 | { |
| 521 | DisplayModeDescriptor displayMode; |
| 522 | { |
| 523 | displayMode.resolution.width = modeDesc[i].Width; |
| 524 | displayMode.resolution.height = modeDesc[i].Height; |
| 525 | displayMode.refreshRate = (modeDesc[i].RefreshRate.Denominator > 0 ? modeDesc[i].RefreshRate.Numerator / modeDesc[i].RefreshRate.Denominator : 0); |
| 526 | } |
| 527 | videoOutput.displayModes.push_back(displayMode); |
| 528 | } |
| 529 | |
| 530 | /* Remove duplicate display modes */ |
| 531 | std::sort(videoOutput.displayModes.begin(), videoOutput.displayModes.end(), CompareSWO); |
| 532 | |
| 533 | videoOutput.displayModes.erase( |
| 534 | std::unique(videoOutput.displayModes.begin(), videoOutput.displayModes.end()), |
| 535 | videoOutput.displayModes.end() |
| 536 | ); |
| 537 | |
| 538 | /* Add output to the list and release handle */ |
| 539 | videoAdapterDesc.outputs.push_back(videoOutput); |
| 540 | |
| 541 | output.Reset(); |