CmD3D9VideoModeInfo.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "CmD3D9VideoModeInfo.h"
  2. #include "CmD3D9RenderSystem.h"
  3. #include "CmException.h"
  4. namespace BansheeEngine
  5. {
  6. D3D9VideoModeInfo::D3D9VideoModeInfo(IDirect3D9* d3d9device)
  7. {
  8. for (UINT32 i = 0; i < d3d9device->GetAdapterCount(); i++)
  9. {
  10. D3DADAPTER_IDENTIFIER9 adapterIdentifier;
  11. D3DCAPS9 d3dcaps9;
  12. d3d9device->GetAdapterIdentifier(i, 0, &adapterIdentifier);
  13. d3d9device->GetDeviceCaps(i, D3DDEVTYPE_HAL, &d3dcaps9);
  14. mOutputs.push_back(cm_new<D3D9VideoOutputInfo>(d3d9device, i));
  15. }
  16. }
  17. D3D9VideoOutputInfo::D3D9VideoOutputInfo(IDirect3D9* d3d9device, UINT32 adapterIdx)
  18. :mMonitorHandle(0)
  19. {
  20. IDirect3D9* pD3D = D3D9RenderSystem::getDirect3D9();
  21. D3DADAPTER_IDENTIFIER9 adapterIdentifier;
  22. pD3D->GetAdapterIdentifier(adapterIdx, 0, &adapterIdentifier);
  23. mName = adapterIdentifier.DeviceName;
  24. for (UINT32 i = 0; i < pD3D->GetAdapterModeCount(adapterIdx, D3DFMT_X8R8G8B8); i++)
  25. {
  26. D3DDISPLAYMODE displayMode;
  27. pD3D->EnumAdapterModes(adapterIdx, D3DFMT_X8R8G8B8, i, &displayMode);
  28. bool foundVideoMode = false;
  29. for (auto videoMode : mVideoModes)
  30. {
  31. D3D9VideoMode* d3d9videoMode = static_cast<D3D9VideoMode*>(videoMode);
  32. if (d3d9videoMode->mWidth == displayMode.Width && d3d9videoMode->mHeight == displayMode.Height)
  33. {
  34. bool foundRefreshRate = false;
  35. for (auto refreshRate : d3d9videoMode->mRefreshRates)
  36. {
  37. UINT32 intRefresh = Math::roundToInt(refreshRate);
  38. if (refreshRate == displayMode.RefreshRate)
  39. {
  40. foundRefreshRate = true;
  41. break;
  42. }
  43. }
  44. if (!foundRefreshRate)
  45. {
  46. d3d9videoMode->mRefreshRates.push_back((float)displayMode.RefreshRate);
  47. }
  48. foundVideoMode = true;
  49. break;
  50. }
  51. }
  52. if (!foundVideoMode)
  53. {
  54. D3D9VideoMode* videoMode = cm_new<D3D9VideoMode>(displayMode.Width, displayMode.Height, this);
  55. videoMode->mRefreshRates.push_back((float)displayMode.RefreshRate);
  56. mVideoModes.push_back(videoMode);
  57. }
  58. }
  59. // Get desktop display mode
  60. HMONITOR hMonitor = pD3D->GetAdapterMonitor(adapterIdx);
  61. MONITORINFOEX monitorInfo;
  62. monitorInfo.cbSize = sizeof(MONITORINFOEX);
  63. GetMonitorInfo(hMonitor, &monitorInfo);
  64. DEVMODE devMode;
  65. devMode.dmSize = sizeof(DEVMODE);
  66. devMode.dmDriverExtra = 0;
  67. EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
  68. D3D9VideoMode* desktopVideoMode = cm_new<D3D9VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
  69. desktopVideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
  70. mDesktopVideoMode = desktopVideoMode;
  71. }
  72. D3D9VideoMode::D3D9VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo)
  73. :VideoMode(width, height, outputInfo)
  74. { }
  75. }