Load opengl32.dll before gdi32.dll
According to http://stackoverflow.com/questions/199016/wglcreatecontext-in-c-sharp-failing-but-not-in-managed-c, opengl32.dll must be loaded before gdi32.dll. Affect issue #19.
This commit is contained in:
parent
f4f793a5d3
commit
dd31b41f08
2 changed files with 22 additions and 15 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue