BsD3D9VideoModeInfo.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //__________________________ Banshee Project - A modern game development toolkit _________________________________//
  2. //_____________________________________ www.banshee-project.com __________________________________________________//
  3. //________________________ Copyright (c) 2014 Marko Pintera. All rights reserved. ________________________________//
  4. #include "BsD3D9VideoModeInfo.h"
  5. #include "BsD3D9RenderSystem.h"
  6. #include "BsException.h"
  7. namespace BansheeEngine
  8. {
  9. D3D9VideoModeInfo::D3D9VideoModeInfo(IDirect3D9* d3d9device)
  10. {
  11. for (UINT32 i = 0; i < d3d9device->GetAdapterCount(); i++)
  12. {
  13. D3DADAPTER_IDENTIFIER9 adapterIdentifier;
  14. D3DCAPS9 d3dcaps9;
  15. d3d9device->GetAdapterIdentifier(i, 0, &adapterIdentifier);
  16. d3d9device->GetDeviceCaps(i, D3DDEVTYPE_HAL, &d3dcaps9);
  17. mOutputs.push_back(bs_new<D3D9VideoOutputInfo>(d3d9device, i));
  18. }
  19. }
  20. D3D9VideoOutputInfo::D3D9VideoOutputInfo(IDirect3D9* d3d9device, UINT32 adapterIdx)
  21. :mMonitorHandle(0)
  22. {
  23. IDirect3D9* pD3D = D3D9RenderSystem::getDirect3D9();
  24. D3DADAPTER_IDENTIFIER9 adapterIdentifier;
  25. pD3D->GetAdapterIdentifier(adapterIdx, 0, &adapterIdentifier);
  26. mName = adapterIdentifier.DeviceName;
  27. for (UINT32 i = 0; i < pD3D->GetAdapterModeCount(adapterIdx, D3DFMT_X8R8G8B8); i++)
  28. {
  29. D3DDISPLAYMODE displayMode;
  30. pD3D->EnumAdapterModes(adapterIdx, D3DFMT_X8R8G8B8, i, &displayMode);
  31. bool foundVideoMode = false;
  32. for (auto videoMode : mVideoModes)
  33. {
  34. D3D9VideoMode* d3d9videoMode = static_cast<D3D9VideoMode*>(videoMode);
  35. UINT32 intRefresh = Math::roundToInt(d3d9videoMode->mRefreshRate);
  36. if (d3d9videoMode->mWidth == displayMode.Width && d3d9videoMode->mHeight == displayMode.Height && intRefresh == displayMode.RefreshRate)
  37. {
  38. foundVideoMode = true;
  39. break;
  40. }
  41. }
  42. if (!foundVideoMode)
  43. {
  44. D3D9VideoMode* videoMode = bs_new<D3D9VideoMode>(displayMode.Width, displayMode.Height, (float)displayMode.RefreshRate, adapterIdx);
  45. mVideoModes.push_back(videoMode);
  46. }
  47. }
  48. // Get desktop display mode
  49. HMONITOR hMonitor = pD3D->GetAdapterMonitor(adapterIdx);
  50. MONITORINFOEX monitorInfo;
  51. monitorInfo.cbSize = sizeof(MONITORINFOEX);
  52. GetMonitorInfo(hMonitor, &monitorInfo);
  53. DEVMODE devMode;
  54. devMode.dmSize = sizeof(DEVMODE);
  55. devMode.dmDriverExtra = 0;
  56. EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
  57. D3D9VideoMode* desktopVideoMode = bs_new<D3D9VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, (float)devMode.dmDisplayFrequency, adapterIdx);
  58. mDesktopVideoMode = desktopVideoMode;
  59. }
  60. D3D9VideoMode::D3D9VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx)
  61. :VideoMode(width, height, refreshRate, outputIdx)
  62. { }
  63. }