BsD3D9VideoModeInfo.cpp 2.6 KB

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