| 608 | #if PLATFORM_WINDOWS |
| 609 | |
| 610 | void GPUDeviceDX::UpdateOutputs(IDXGIAdapter* adapter) |
| 611 | { |
| 612 | PROFILE_CPU(); |
| 613 | uint32 outputIdx = 0; |
| 614 | ComPtr<IDXGIOutput> output; |
| 615 | DXGI_FORMAT backbufferFormat = RenderToolsDX::ToDxgiFormat(GPU_BACK_BUFFER_PIXEL_FORMAT); |
| 616 | Array<DXGI_MODE_DESC> modeDesc; |
| 617 | while (adapter->EnumOutputs(outputIdx, &output) != DXGI_ERROR_NOT_FOUND) |
| 618 | { |
| 619 | auto& outputDX11 = Outputs.AddOne(); |
| 620 | |
| 621 | outputDX11.Output = output; |
| 622 | output->GetDesc(&outputDX11.Desc); |
| 623 | |
| 624 | uint32 numModes = 0; |
| 625 | HRESULT hr = output->GetDisplayModeList(backbufferFormat, 0, &numModes, nullptr); |
| 626 | if (FAILED(hr)) |
| 627 | { |
| 628 | LOG(Warning, "Error while enumerating adapter output video modes."); |
| 629 | continue; |
| 630 | } |
| 631 | |
| 632 | modeDesc.Resize(numModes, false); |
| 633 | hr = output->GetDisplayModeList(backbufferFormat, 0, &numModes, modeDesc.Get()); |
| 634 | if (FAILED(hr)) |
| 635 | { |
| 636 | LOG(Warning, "Error while enumerating adapter output video modes."); |
| 637 | continue; |
| 638 | } |
| 639 | |
| 640 | for (auto& mode : modeDesc) |
| 641 | { |
| 642 | bool foundVideoMode = false; |
| 643 | for (auto& videoMode : outputDX11.VideoModes) |
| 644 | { |
| 645 | if (videoMode.Width == mode.Width && |
| 646 | videoMode.Height == mode.Height && |
| 647 | videoMode.RefreshRate.Numerator == mode.RefreshRate.Numerator && |
| 648 | videoMode.RefreshRate.Denominator == mode.RefreshRate.Denominator) |
| 649 | { |
| 650 | foundVideoMode = true; |
| 651 | break; |
| 652 | } |
| 653 | } |
| 654 | if (!foundVideoMode) |
| 655 | { |
| 656 | outputDX11.VideoModes.Add(mode); |
| 657 | VideoOutputModes.Add({ mode.Width, mode.Height, mode.RefreshRate.Numerator / (float)mode.RefreshRate.Denominator, VideoOutputs.Count() }); |
| 658 | } |
| 659 | } |
| 660 | |
| 661 | // Get desktop display mode |
| 662 | HMONITOR hMonitor = outputDX11.Desc.Monitor; |
| 663 | MONITORINFOEX monitorInfo; |
| 664 | monitorInfo.cbSize = sizeof(MONITORINFOEX); |
| 665 | GetMonitorInfo(hMonitor, &monitorInfo); |
| 666 | |
| 667 | Windows::DEVMODEW devMode; |