diff --git a/Source/OpenTK/Platform/Windows/WinFactory.cs b/Source/OpenTK/Platform/Windows/WinFactory.cs index b0fc8224..5435018c 100644 --- a/Source/OpenTK/Platform/Windows/WinFactory.cs +++ b/Source/OpenTK/Platform/Windows/WinFactory.cs @@ -34,6 +34,7 @@ namespace OpenTK.Platform.Windows { using Graphics; using OpenTK.Input; + using System.Runtime.InteropServices; class WinFactory : IPlatformFactory { @@ -41,6 +42,9 @@ namespace OpenTK.Platform.Windows readonly object SyncRoot = new object(); IInputDriver2 inputDriver; + internal static IntPtr OpenGLHandle { get; private set; } + const string OpenGLName = "OPENGL32.DLL"; + public WinFactory() { if (System.Environment.OSVersion.Version.Major <= 4) @@ -48,6 +52,11 @@ namespace OpenTK.Platform.Windows throw new PlatformNotSupportedException("OpenTK requires Windows XP or higher"); } + // Dynamically load opengl32.dll in order to use the extension loading capabilities of Wgl. + // Note: opengl32.dll must be loaded before gdi32.dll, otherwise strange failures may occur + // (such as "error: 2000" when calling wglSetPixelFormat or slowness/lag on specific GPUs). + LoadOpenGL(); + if (System.Environment.OSVersion.Version.Major >= 6) { if (Toolkit.Options.EnableHighResolution) @@ -60,6 +69,17 @@ namespace OpenTK.Platform.Windows } } + static void LoadOpenGL() + { + OpenGLHandle = Functions.LoadLibrary(OpenGLName); + if (OpenGLHandle == IntPtr.Zero) + { + throw new ApplicationException(String.Format("LoadLibrary(\"{0}\") call failed with code {1}", + OpenGLName, Marshal.GetLastWin32Error())); + } + Debug.WriteLine(String.Format("Loaded opengl32.dll: {0}", OpenGLHandle)); + } + #region IPlatformFactory Members public virtual INativeWindow CreateNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device) diff --git a/Source/OpenTK/Platform/Windows/WinGLContext.cs b/Source/OpenTK/Platform/Windows/WinGLContext.cs index a534d929..bfe4c9d1 100644 --- a/Source/OpenTK/Platform/Windows/WinGLContext.cs +++ b/Source/OpenTK/Platform/Windows/WinGLContext.cs @@ -30,9 +30,6 @@ namespace OpenTK.Platform.Windows static readonly object LoadLock = new object(); static readonly object SyncRoot = new object(); - static IntPtr opengl32Handle; - const string opengl32Name = "OPENGL32.DLL"; - bool vsync_supported; readonly WinGraphicsMode ModeSelector; @@ -43,16 +40,6 @@ namespace OpenTK.Platform.Windows { lock (LoadLock) { - // Dynamically load opengl32.dll in order to use the extension loading capabilities of Wgl. - if (opengl32Handle == IntPtr.Zero) - { - opengl32Handle = Functions.LoadLibrary(opengl32Name); - if (opengl32Handle == IntPtr.Zero) - throw new ApplicationException(String.Format("LoadLibrary(\"{0}\") call failed with code {1}", - opengl32Name, Marshal.GetLastWin32Error())); - Debug.WriteLine(String.Format("Loaded opengl32.dll: {0}", opengl32Handle)); - } - // We need to create a temp context in order to load // wgl extensions (e.g. for multisampling or GL3). // We cannot rely on OpenTK.Platform.Wgl until we @@ -341,7 +328,7 @@ namespace OpenTK.Platform.Windows IntPtr address = Wgl.GetProcAddress(function_string); if (!IsValid(address)) { - address = Functions.GetProcAddress(opengl32Handle, function_string); + address = Functions.GetProcAddress(WinFactory.OpenGLHandle, function_string); } return address; } @@ -351,7 +338,7 @@ namespace OpenTK.Platform.Windows IntPtr address = Wgl.GetProcAddress(function_string); if (!IsValid(address)) { - address = Functions.GetProcAddress(opengl32Handle, function_string); + address = Functions.GetProcAddress(WinFactory.OpenGLHandle, function_string); } return address; }