Browse Source

- In OpenGL primary window is always at 0 index
- VideoMode can now be created manually
- VideoMode contains a monitor index instead of a pointer to parent output info

Marko Pintera 11 years ago
parent
commit
772eefea5e

+ 1 - 2
CamelotCore/Include/CmRenderWindow.h

@@ -84,11 +84,10 @@ namespace BansheeEngine
 		* @brief	Switches the window to fullscreen mode. Child windows cannot go into fullscreen mode.
 		*
 		* @param	videoMode		Mode retrieved from VideoModeInfo in RenderSystem.
-		* @param	refreshRateIdx	Index of the refresh rate entry in the video mode object.
 		*
 		* @note		Core thread.
 		*/
-		virtual void setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx = 0) { }
+		virtual void setFullscreen(const VideoMode& mode) { }
 
 		/**
 		 * @brief	Switches the window to windowed mode.

+ 24 - 11
CamelotCore/Include/CmVideoModeInfo.h

@@ -5,12 +5,23 @@
 namespace BansheeEngine
 {
 	/**
-	 * @brief	Represents a video mode usable in full-screen windows.
+	 * @brief	Video mode contains information about how a render window
+	 *			presents its information to an output device like a monitor.
 	 */
 	class CM_EXPORT VideoMode
 	{
 	public:
-		VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* parentOutputInfo);
+		/**
+		 * @brief	Creates a new video mode.
+		 *
+		 * @param	width		Width of the frame buffer in pixels.
+		 * @param	height		Height of the frame buffer in pixels.
+		 * @param	refreshRate	How often should the output device refresh the output image in Hertz.
+		 * @param	outputIdx	Output index of the output device. Normally this means
+		 *						output monitor. 0th index always represents the primary device
+		 *						while order of others is undefined.
+		 */
+		VideoMode(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 outputIdx = 0);
 		virtual ~VideoMode();
 
 		VideoMode(const VideoMode&) = delete; // Make non-copyable
@@ -27,25 +38,27 @@ namespace BansheeEngine
 		UINT32 getHeight() const { return mHeight; }
 
 		/**
-		 * @brief	Returns the number of available refresh rates for this mode.
+		 * @brief	Returns a refresh rate in Hertz.
 		 */
-		UINT32 getNumRefreshRates() const { return (UINT32)mRefreshRates.size(); }
+		virtual float getRefreshRate() const { return mRefreshRate; }
 
 		/**
-		 * @brief	Returns a refresh rate in Hertz for the specified index.
+		 * @brief	Returns information about the parent output.
 		 */
-		virtual float getRefreshRate(UINT32 idx) const { return mRefreshRates.at(idx); }
+		UINT32 getOutputIdx() const { return mOutputIdx; }
 
 		/**
-		 * @brief	Returns information about the parent output.
+		 * @brief	Determines was video mode user created or provided by the API/OS.
+		 *			API/OS created video modes can contain additional information that allows
+		 *			the video mode to be used more accurately and you should use them when possible.
 		 */
-		const VideoOutputInfo& getParentOutput() const { return *mParentOutputInfo; }
+		bool isCustom() const { return mIsCustom;  }
 	protected:
 		UINT32 mWidth = 1280;
 		UINT32 mHeight = 720;
-		VideoOutputInfo* mParentOutputInfo = nullptr;
-
-		Vector<float> mRefreshRates;
+		float mRefreshRate = 60.0f;
+		UINT32 mOutputIdx = 0;
+		bool mIsCustom = true;
 	};
 
 	/**

+ 2 - 2
CamelotCore/Source/CmVideoModeInfo.cpp

@@ -2,8 +2,8 @@
 
 namespace BansheeEngine
 {
-	VideoMode::VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* parentOutputInfo)
-		:mWidth(width), mHeight(height), mParentOutputInfo(parentOutputInfo)
+	VideoMode::VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx)
+		:mWidth(width), mHeight(height), mRefreshRate(refreshRate), mOutputIdx(outputIdx), mIsCustom(true)
 	{
 
 	}

+ 2 - 2
CamelotD3D11RenderSystem/Include/CmD3D11RenderWindow.h

@@ -36,9 +36,9 @@ namespace BansheeEngine
 		void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0);
 
 		/**
-		 * @copydoc RenderWindow::setFullscreen(const VideoMode&, UINT32)
+		 * @copydoc RenderWindow::setFullscreen(const VideoMode&)
 		 */
-		void setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx = 0);
+		void setFullscreen(const VideoMode& mode);
 
 		/**
 		* @copydoc RenderWindow::setWindowed

+ 7 - 13
CamelotD3D11RenderSystem/Include/CmD3D11VideoModeInfo.h

@@ -10,27 +10,21 @@ namespace BansheeEngine
 	 */
 	class CM_D3D11_EXPORT D3D11VideoMode : public VideoMode
 	{
-		struct DX11Data
-		{
-			UINT32 refreshRateNumerator;
-			UINT32 refreshRateDenominator;
-			DXGI_MODE_DESC mode;
-		};
-
 	public:
-		D3D11VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo);
+		D3D11VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx, UINT32 refreshRateNumerator,
+			UINT32 refreshRateDenominator, DXGI_MODE_DESC mode);
 
 		/**
 		 * @brief	Returns an internal DXGI representation of this video mode.
-		 *
-		 * @param	idx		Index referencing which refresh rate to use.
 		 */
-		const DXGI_MODE_DESC& getDXGIModeDesc(UINT32 idx) const { return mD3D11Modes[idx].mode; }
+		const DXGI_MODE_DESC& getDXGIModeDesc() const { return mD3D11Mode; }
 
 	private:
 		friend class D3D11VideoOutputInfo;
 
-		Vector<DX11Data> mD3D11Modes; 
+		UINT32 refreshRateNumerator;
+		UINT32 refreshRateDenominator;
+		DXGI_MODE_DESC mD3D11Mode;
 	};
 
 	/**
@@ -39,7 +33,7 @@ namespace BansheeEngine
 	class CM_D3D11_EXPORT D3D11VideoOutputInfo : public VideoOutputInfo
 	{
 	public:
-		D3D11VideoOutputInfo(IDXGIOutput* output);
+		D3D11VideoOutputInfo(IDXGIOutput* output, UINT32 outputIdx);
 		~D3D11VideoOutputInfo();
 
 		/**

+ 16 - 3
CamelotD3D11RenderSystem/Source/CmD3D11RenderWindow.cpp

@@ -403,21 +403,34 @@ namespace BansheeEngine
 		mSwapChain->SetFullscreenState(true, outputInfo.getDXGIOutput()); 
 	}
 
-	void D3D11RenderWindow::setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx)
+	void D3D11RenderWindow::setFullscreen(const VideoMode& mode)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
 		if (mIsChild)
 			return;
 
+		if (mode.isCustom())
+		{
+			setFullscreen(mode.getWidth(), mode.getHeight(), mode.getRefreshRate(), mode.getOutputIdx());
+			return;
+		}
+
+		const D3D11VideoModeInfo& videoModeInfo = static_cast<const D3D11VideoModeInfo&>(RenderSystem::instance().getVideoModeInfo());
+		UINT32 numOutputs = videoModeInfo.getNumOutputs();
+		if (numOutputs == 0)
+			return;
+
+		UINT32 actualMonitorIdx = std::min(mode.getOutputIdx(), numOutputs - 1);
+		const D3D11VideoOutputInfo& outputInfo = static_cast<const D3D11VideoOutputInfo&>(videoModeInfo.getOutputInfo(actualMonitorIdx));
+
 		const D3D11VideoMode& videoMode = static_cast<const D3D11VideoMode&>(mode);
-		const D3D11VideoOutputInfo& outputInfo = static_cast<const D3D11VideoOutputInfo&>(mode.getParentOutput());
 
 		mIsFullScreen = true;
 		mWidth = mode.getWidth();
 		mHeight = mode.getHeight();
 
-		mSwapChain->ResizeTarget(&videoMode.getDXGIModeDesc(refreshRateIdx));
+		mSwapChain->ResizeTarget(&videoMode.getDXGIModeDesc());
 		mSwapChain->SetFullscreenState(true, outputInfo.getDXGIOutput());
 	}
 

+ 15 - 48
CamelotD3D11RenderSystem/Source/CmD3D11VideoModeInfo.cpp

@@ -10,11 +10,11 @@ namespace BansheeEngine
 		while (dxgiAdapter->EnumOutputs(outputIdx, &output) != DXGI_ERROR_NOT_FOUND)
 		{
 			outputIdx++;
-			mOutputs.push_back(cm_new<D3D11VideoOutputInfo>(output));
+			mOutputs.push_back(cm_new<D3D11VideoOutputInfo>(output, outputIdx));
 		}
 	}
 
-	D3D11VideoOutputInfo::D3D11VideoOutputInfo(IDXGIOutput* output)
+	D3D11VideoOutputInfo::D3D11VideoOutputInfo(IDXGIOutput* output, UINT32 outputIdx)
 		:mDXGIOutput(output)
 	{
 		DXGI_OUTPUT_DESC outputDesc;
@@ -50,29 +50,10 @@ namespace BansheeEngine
 			{
 				D3D11VideoMode* d3d11videoMode = static_cast<D3D11VideoMode*>(videoMode);
 
-				if (d3d11videoMode->mWidth == displayMode.Width && d3d11videoMode->mHeight == displayMode.Height)
+				if (d3d11videoMode->mWidth == displayMode.Width && d3d11videoMode->mHeight == displayMode.Height &&
+					d3d11videoMode->refreshRateNumerator == displayMode.RefreshRate.Numerator &&
+					d3d11videoMode->refreshRateDenominator == displayMode.RefreshRate.Denominator)
 				{
-					bool foundRefreshRate = false;
-					for (auto refreshRate : d3d11videoMode->mD3D11Modes)
-					{
-						if (refreshRate.refreshRateNumerator == displayMode.RefreshRate.Numerator &&
-							refreshRate.refreshRateDenominator == displayMode.RefreshRate.Denominator)
-						{
-							foundRefreshRate = true;
-							break;
-						}
-					}
-
-					if (!foundRefreshRate)
-					{
-						D3D11VideoMode::DX11Data refreshRate;
-						refreshRate.refreshRateNumerator = displayMode.RefreshRate.Numerator;
-						refreshRate.refreshRateDenominator = displayMode.RefreshRate.Denominator;
-
-						d3d11videoMode->mD3D11Modes.push_back(refreshRate);
-						d3d11videoMode->mRefreshRates.push_back(refreshRate.refreshRateNumerator / (float)refreshRate.refreshRateDenominator);
-					}
-
 					foundVideoMode = true;
 					break;
 				}
@@ -80,15 +61,9 @@ namespace BansheeEngine
 
 			if (!foundVideoMode)
 			{
-				D3D11VideoMode* videoMode = cm_new<D3D11VideoMode>(displayMode.Width, displayMode.Height, this);
-
-				D3D11VideoMode::DX11Data d3d11data;
-				d3d11data.refreshRateNumerator = displayMode.RefreshRate.Numerator;
-				d3d11data.refreshRateDenominator = displayMode.RefreshRate.Denominator;
-				d3d11data.mode = displayMode;
-
-				videoMode->mD3D11Modes.push_back(d3d11data);
-				videoMode->mRefreshRates.push_back(d3d11data.refreshRateNumerator / (float)d3d11data.refreshRateDenominator);
+				float refreshRate = displayMode.RefreshRate.Numerator / (float)displayMode.RefreshRate.Denominator;
+				D3D11VideoMode* videoMode = cm_new<D3D11VideoMode>(displayMode.Width, displayMode.Height, refreshRate,
+					displayMode.RefreshRate.Numerator, displayMode.RefreshRate.Denominator, displayMode, this);
 
 				mVideoModes.push_back(videoMode);
 			}
@@ -122,19 +97,9 @@ namespace BansheeEngine
 
 		output->FindClosestMatchingMode(&currentMode, &nearestMode, nullptr);
 
-		D3D11VideoMode* desktopVideoMode = cm_new<D3D11VideoMode>(nearestMode.Width, nearestMode.Height, this);;
-		
-		{
-			D3D11VideoMode::DX11Data d3d11data;
-			d3d11data.refreshRateNumerator = nearestMode.RefreshRate.Numerator;
-			d3d11data.refreshRateDenominator = nearestMode.RefreshRate.Denominator;
-			d3d11data.mode = nearestMode;
-
-			desktopVideoMode->mD3D11Modes.push_back(d3d11data);
-			desktopVideoMode->mRefreshRates.push_back(d3d11data.refreshRateNumerator / (float)d3d11data.refreshRateDenominator);
-		}
-
-		mDesktopVideoMode = desktopVideoMode;
+		float refreshRate = nearestMode.RefreshRate.Numerator / (float)nearestMode.RefreshRate.Denominator;
+		mDesktopVideoMode = cm_new<D3D11VideoMode>(nearestMode.Width, nearestMode.Height, refreshRate, 
+			outputIdx, nearestMode.RefreshRate.Numerator, nearestMode.RefreshRate.Denominator, nearestMode);
 	}
 
 	D3D11VideoOutputInfo::~D3D11VideoOutputInfo()
@@ -142,7 +107,9 @@ namespace BansheeEngine
 		SAFE_RELEASE(mDXGIOutput);
 	}
 
-	D3D11VideoMode::D3D11VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo)
-		:VideoMode(width, height, outputInfo)
+	D3D11VideoMode::D3D11VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx, 
+		UINT32 refreshRateNumerator, UINT32 refreshRateDenominator, DXGI_MODE_DESC mode)
+		:VideoMode(width, height, refreshRate, outputIdx), refreshRateNumerator(refreshRateNumerator),
+		refreshRateDenominator(refreshRateDenominator), mD3D11Mode(mode)
 	{ }
 }

+ 2 - 2
CamelotD3D9Renderer/Include/CmD3D9RenderWindow.h

@@ -17,9 +17,9 @@ namespace BansheeEngine
 		void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0);
 
 		/**
-		 * @copydoc RenderWindow::setFullscreen(const VideoMode&, UINT32)
+		 * @copydoc RenderWindow::setFullscreen(const VideoMode&)
 		 */
-		void setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx = 0);
+		void setFullscreen(const VideoMode& mode);
 
 		/**
 		* @copydoc RenderWindow::setWindowed

+ 1 - 1
CamelotD3D9Renderer/Include/CmD3D9VideoModeInfo.h

@@ -11,7 +11,7 @@ namespace BansheeEngine
 	class CM_D3D9_EXPORT D3D9VideoMode : public VideoMode
 	{
 	public:
-		D3D9VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo);
+		D3D9VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx);
 
 	private:
 		friend class D3D9VideoOutputInfo;

+ 2 - 13
CamelotD3D9Renderer/Source/CmD3D9RenderWindow.cpp

@@ -302,22 +302,11 @@ namespace BansheeEngine
 		mDevice->acquire();
 	}
 
-	void D3D9RenderWindow::setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx)
+	void D3D9RenderWindow::setFullscreen(const VideoMode& mode)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
-		const VideoOutputInfo& outputInfo = mode.getParentOutput();
-		UINT32 monitorIdx = 0;
-		for (UINT32 i = 0; i < outputInfo.getNumVideoModes(); i++)
-		{
-			if (&outputInfo.getVideoMode(i) == &mode)
-			{
-				monitorIdx = i;
-				break;
-			}
-		}
-
-		setFullscreen(mode.getWidth(), mode.getHeight(), mode.getRefreshRate(refreshRateIdx), monitorIdx);
+		setFullscreen(mode.getWidth(), mode.getHeight(), mode.getRefreshRate(), mode.getOutputIdx());
 	}
 
 	void D3D9RenderWindow::setWindowed()

+ 6 - 24
CamelotD3D9Renderer/Source/CmD3D9VideoModeInfo.cpp

@@ -38,25 +38,9 @@ namespace BansheeEngine
 			{
 				D3D9VideoMode* d3d9videoMode = static_cast<D3D9VideoMode*>(videoMode);
 
-				if (d3d9videoMode->mWidth == displayMode.Width && d3d9videoMode->mHeight == displayMode.Height)
+				UINT32 intRefresh = Math::roundToInt(d3d9videoMode->mRefreshRate);
+				if (d3d9videoMode->mWidth == displayMode.Width && d3d9videoMode->mHeight == displayMode.Height && intRefresh == displayMode.RefreshRate)
 				{
-					bool foundRefreshRate = false;
-					for (auto refreshRate : d3d9videoMode->mRefreshRates)
-					{
-						UINT32 intRefresh = Math::roundToInt(refreshRate);
-
-						if (refreshRate == displayMode.RefreshRate)
-						{
-							foundRefreshRate = true;
-							break;
-						}
-					}
-
-					if (!foundRefreshRate)
-					{
-						d3d9videoMode->mRefreshRates.push_back((float)displayMode.RefreshRate);
-					}
-
 					foundVideoMode = true;
 					break;
 				}
@@ -64,8 +48,7 @@ namespace BansheeEngine
 
 			if (!foundVideoMode)
 			{
-				D3D9VideoMode* videoMode = cm_new<D3D9VideoMode>(displayMode.Width, displayMode.Height, this);
-				videoMode->mRefreshRates.push_back((float)displayMode.RefreshRate);
+				D3D9VideoMode* videoMode = cm_new<D3D9VideoMode>(displayMode.Width, displayMode.Height, (float)displayMode.RefreshRate, adapterIdx);
 
 				mVideoModes.push_back(videoMode);
 			}
@@ -82,13 +65,12 @@ namespace BansheeEngine
 		devMode.dmDriverExtra = 0;
 		EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
 
-		D3D9VideoMode* desktopVideoMode = cm_new<D3D9VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
-		desktopVideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
+		D3D9VideoMode* desktopVideoMode = cm_new<D3D9VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, (float)devMode.dmDisplayFrequency, adapterIdx);
 
 		mDesktopVideoMode = desktopVideoMode;
 	}
 
-	D3D9VideoMode::D3D9VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo)
-		:VideoMode(width, height, outputInfo)
+	D3D9VideoMode::D3D9VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx)
+		:VideoMode(width, height, refreshRate, outputIdx)
 	{ }
 }

+ 2 - 2
CamelotGLRenderer/Include/CmWin32VideoModeInfo.h

@@ -11,7 +11,7 @@ namespace BansheeEngine
 	class CM_RSGL_EXPORT Win32VideoMode : public VideoMode
 	{
 	public:
-		Win32VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo);
+		Win32VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx);
 
 	private:
 		friend class Win32VideoOutputInfo;
@@ -23,7 +23,7 @@ namespace BansheeEngine
 	class CM_RSGL_EXPORT Win32VideoOutputInfo : public VideoOutputInfo
 	{
 	public:
-		Win32VideoOutputInfo(HMONITOR monitorHandle);
+		Win32VideoOutputInfo(HMONITOR monitorHandle, UINT32 outputIdx);
 		~Win32VideoOutputInfo();
 
 		/**

+ 2 - 2
CamelotGLRenderer/Include/CmWin32Window.h

@@ -16,9 +16,9 @@ namespace BansheeEngine
 		void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0);
 
 		/**
-		 * @copydoc RenderWindow::setFullscreen(const VideoMode&, UINT32)
+		 * @copydoc RenderWindow::setFullscreen(const VideoMode&)
 		 */
-		void setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx = 0);
+		void setFullscreen(const VideoMode& mode);
 
 		/**
 		 * @copydoc RenderWindow::setWindowed

+ 44 - 28
CamelotGLRenderer/Source/CmWin32VideoModeInfo.cpp

@@ -6,18 +6,47 @@ namespace BansheeEngine
 {
 	BOOL CALLBACK monitorEnumCallback(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM lParam)
 	{
-		Vector<VideoOutputInfo*>* outputInfos = (Vector<VideoOutputInfo*>*)lParam;
-		outputInfos->push_back(cm_new<Win32VideoOutputInfo>(hMonitor));
+		Vector<HMONITOR>* outputInfos = (Vector<HMONITOR>*)lParam;
+		outputInfos->push_back(hMonitor);
 
 		return TRUE;
 	};
 
 	Win32VideoModeInfo::Win32VideoModeInfo()
 	{
-		EnumDisplayMonitors(0, nullptr, &monitorEnumCallback, (LPARAM)&mOutputs);
+		Vector<HMONITOR> handles;
+		EnumDisplayMonitors(0, nullptr, &monitorEnumCallback, (LPARAM)&handles);
+
+		// Sort so that primary is the first output
+		for (auto iter = handles.begin(); iter != handles.end(); ++iter)
+		{
+			MONITORINFOEX monitorInfo;
+
+			memset(&monitorInfo, 0, sizeof(MONITORINFOEX));
+			monitorInfo.cbSize = sizeof(MONITORINFOEX);
+			GetMonitorInfo(*iter, &monitorInfo);
+
+			if ((monitorInfo.dwFlags & MONITORINFOF_PRIMARY) != 0)
+			{
+				if (iter != handles.begin())
+				{
+					HMONITOR temp = handles[0];
+					handles[0] = *iter;
+					*iter = temp;
+				}
+
+				break;
+			}
+		}
+
+		UINT32 idx = 0;
+		for (auto& handle : handles)
+		{
+			mOutputs.push_back(cm_new<Win32VideoOutputInfo>(handle, idx++));
+		}
 	}
 
-	Win32VideoOutputInfo::Win32VideoOutputInfo(HMONITOR monitorHandle)
+	Win32VideoOutputInfo::Win32VideoOutputInfo(HMONITOR monitorHandle, UINT32 outputIdx)
 		:mMonitorHandle(monitorHandle)
 	{
 		MONITORINFOEX monitorInfo;
@@ -40,25 +69,10 @@ namespace BansheeEngine
 			{
 				Win32VideoMode* win32VideoMode = static_cast<Win32VideoMode*>(videoMode);
 
-				if (win32VideoMode->mWidth == devMode.dmPelsWidth && win32VideoMode->mHeight == devMode.dmPelsHeight)
+				UINT32 intRefresh = Math::roundToInt(win32VideoMode->mRefreshRate);
+				if (win32VideoMode->mWidth == devMode.dmPelsWidth && win32VideoMode->mHeight == devMode.dmPelsHeight
+					&& intRefresh == devMode.dmDisplayFrequency)
 				{
-					bool foundRefreshRate = false;
-					for (auto refreshRate : win32VideoMode->mRefreshRates)
-					{
-						UINT32 intRefresh = Math::roundToInt(refreshRate);
-
-						if (refreshRate == devMode.dmDisplayFrequency)
-						{
-							foundRefreshRate = true;
-							break;
-						}
-					}
-
-					if (!foundRefreshRate)
-					{
-						win32VideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
-					}
-
 					foundVideoMode = true;
 					break;
 				}
@@ -66,8 +80,9 @@ namespace BansheeEngine
 
 			if (!foundVideoMode)
 			{
-				Win32VideoMode* videoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
-				videoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
+				Win32VideoMode* videoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, 
+					(float)devMode.dmDisplayFrequency, outputIdx);
+				videoMode->mIsCustom = false;
 
 				mVideoModes.push_back(videoMode);
 			}
@@ -76,8 +91,9 @@ namespace BansheeEngine
 		// Get desktop display mode
 		EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
 
-		Win32VideoMode* desktopVideoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
-		desktopVideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
+		Win32VideoMode* desktopVideoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, 
+			(float)devMode.dmDisplayFrequency, outputIdx);
+		desktopVideoMode->mIsCustom = false;
 
 		mDesktopVideoMode = desktopVideoMode;
 	}
@@ -87,7 +103,7 @@ namespace BansheeEngine
 		CloseHandle(mMonitorHandle);
 	}
 
-	Win32VideoMode::Win32VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo)
-		:VideoMode(width, height, outputInfo)
+	Win32VideoMode::Win32VideoMode(UINT32 width, UINT32 height, float refreshRate, UINT32 outputIdx)
+		:VideoMode(width, height, refreshRate, outputIdx)
 	{ }
 }

+ 2 - 13
CamelotGLRenderer/Source/CmWin32Window.cpp

@@ -410,22 +410,11 @@ namespace BansheeEngine
 		SetWindowPos(mHWnd, HWND_TOPMOST, mLeft, mTop, width, height, SWP_NOACTIVATE);
 	}
 
-	void Win32Window::setFullscreen(const VideoMode& mode, UINT32 refreshRateIdx)
+	void Win32Window::setFullscreen(const VideoMode& mode)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
-		const VideoOutputInfo& outputInfo = mode.getParentOutput();
-		UINT32 monitorIdx = 0;
-		for (UINT32 i = 0; i < outputInfo.getNumVideoModes(); i++)
-		{
-			if (&outputInfo.getVideoMode(i) == &mode)
-			{
-				monitorIdx = i;
-				break;
-			}
-		}
-
-		setFullscreen(mode.getWidth(), mode.getHeight(), mode.getRefreshRate(refreshRateIdx), monitorIdx);
+		setFullscreen(mode.getWidth(), mode.getHeight(), mode.getRefreshRate(), mode.getOutputIdx());
 	}
 
 	void Win32Window::setWindowed()