Removed the various GetProcAddress methods (now handled by IGraphicsContextInternal).
Removed Imports nested class.
This commit is contained in:
parent
e4f1c956c9
commit
521c1211d3
1 changed files with 17 additions and 111 deletions
|
@ -52,9 +52,6 @@ namespace OpenTK.Graphics.OpenGL
|
|||
/// <seealso cref="GL.Load"/>
|
||||
public static partial class GL
|
||||
{
|
||||
delegate void VoidGLDelegate(object @class, object[] parameters);
|
||||
delegate object ObjectGLDelegate(object @class, object[] parameters);
|
||||
|
||||
#region --- Fields ---
|
||||
|
||||
internal const string Library = "opengl32.dll";
|
||||
|
@ -67,7 +64,9 @@ namespace OpenTK.Graphics.OpenGL
|
|||
|
||||
private static Type glClass;
|
||||
private static Type delegatesClass;
|
||||
private static Type importsClass;
|
||||
private static Type importsClass;
|
||||
|
||||
readonly static SortedList<string, MethodInfo> FunctionMap = new SortedList<string, MethodInfo>();
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -77,24 +76,13 @@ namespace OpenTK.Graphics.OpenGL
|
|||
{
|
||||
glClass = typeof(GL);
|
||||
delegatesClass = glClass.GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
importsClass = glClass.GetNestedType("Imports", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- Imports ---
|
||||
|
||||
internal static partial class Imports
|
||||
{
|
||||
internal static SortedList<string, MethodInfo> FunctionMap; // This is faster than either Dictionary or SortedDictionary
|
||||
static Imports()
|
||||
{
|
||||
MethodInfo[] methods = importsClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);
|
||||
FunctionMap = new SortedList<string, MethodInfo>(methods.Length);
|
||||
foreach (MethodInfo m in methods)
|
||||
{
|
||||
FunctionMap.Add(m.Name, m);
|
||||
}
|
||||
importsClass = glClass.GetNestedType("Imports", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
|
||||
MethodInfo[] methods = importsClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);
|
||||
FunctionMap = new SortedList<string, MethodInfo>(methods.Length);
|
||||
foreach (MethodInfo m in methods)
|
||||
{
|
||||
FunctionMap.Add(m.Name, m);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,13 +176,10 @@ namespace OpenTK.Graphics.OpenGL
|
|||
/// </remarks>
|
||||
public static void LoadAll()
|
||||
{
|
||||
//TODO: Route GameWindow context creation through GraphicsContext.
|
||||
//if (GraphicsContext.CurrentContext == null)
|
||||
// throw new InvalidOperationException("You must create an OpenGL context before using the GL class.");
|
||||
if (GraphicsContext.CurrentContext != null)
|
||||
OpenTK.Platform.Utilities.LoadExtensions(glClass);
|
||||
else
|
||||
throw new InvalidOperationException("No GraphicsContext available in the calling thread.");
|
||||
if (GraphicsContext.CurrentContext == null)
|
||||
throw new GraphicsContextMissingException();
|
||||
|
||||
OpenTK.Platform.Utilities.LoadExtensions(glClass);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -258,7 +243,7 @@ namespace OpenTK.Graphics.OpenGL
|
|||
MethodInfo m;
|
||||
return
|
||||
GetExtensionDelegate(name, signature) ??
|
||||
(Imports.FunctionMap.TryGetValue((name.Substring(2)), out m) ?
|
||||
(FunctionMap.TryGetValue((name.Substring(2)), out m) ?
|
||||
Delegate.CreateDelegate(signature, m) : null);
|
||||
}
|
||||
|
||||
|
@ -468,65 +453,7 @@ namespace OpenTK.Graphics.OpenGL
|
|||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- GetProcAddress ---
|
||||
|
||||
private static IGetProcAddress getProcAddress;
|
||||
|
||||
internal interface IGetProcAddress
|
||||
{
|
||||
IntPtr GetProcAddress(string function);
|
||||
}
|
||||
|
||||
internal class GetProcAddressWindows : IGetProcAddress
|
||||
{
|
||||
[System.Runtime.InteropServices.DllImport(Library, EntryPoint = "wglGetProcAddress", ExactSpelling = true)]
|
||||
private static extern IntPtr wglGetProcAddress(String lpszProc);
|
||||
|
||||
public IntPtr GetProcAddress(string function)
|
||||
{
|
||||
return wglGetProcAddress(function);
|
||||
}
|
||||
}
|
||||
|
||||
internal class GetProcAddressX11 : IGetProcAddress
|
||||
{
|
||||
[DllImport(Library, EntryPoint = "glXGetProcAddress")]
|
||||
private static extern IntPtr glxGetProcAddress([MarshalAs(UnmanagedType.LPTStr)] string procName);
|
||||
|
||||
public IntPtr GetProcAddress(string function)
|
||||
{
|
||||
return glxGetProcAddress(function);
|
||||
}
|
||||
}
|
||||
|
||||
internal class GetProcAddressOSX : IGetProcAddress
|
||||
{
|
||||
private const string Library = "libdl.dylib";
|
||||
|
||||
[DllImport(Library, EntryPoint = "NSIsSymbolNameDefined")]
|
||||
private static extern bool NSIsSymbolNameDefined(string s);
|
||||
[DllImport(Library, EntryPoint = "NSLookupAndBindSymbol")]
|
||||
private static extern IntPtr NSLookupAndBindSymbol(string s);
|
||||
[DllImport(Library, EntryPoint = "NSAddressOfSymbol")]
|
||||
private static extern IntPtr NSAddressOfSymbol(IntPtr symbol);
|
||||
|
||||
public IntPtr GetProcAddress(string function)
|
||||
{
|
||||
string fname = "_" + function;
|
||||
if (!NSIsSymbolNameDefined(fname))
|
||||
return IntPtr.Zero;
|
||||
|
||||
IntPtr symbol = NSLookupAndBindSymbol(fname);
|
||||
if (symbol != IntPtr.Zero)
|
||||
symbol = NSAddressOfSymbol(symbol);
|
||||
|
||||
return symbol;
|
||||
}
|
||||
}
|
||||
|
||||
#region private static IntPtr GetAddress(string function)
|
||||
#region GetAddress
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves the entry point for a dynamically exported OpenGL function.
|
||||
|
@ -548,28 +475,7 @@ namespace OpenTK.Graphics.OpenGL
|
|||
/// </remarks>
|
||||
private static IntPtr GetAddress(string function)
|
||||
{
|
||||
if (getProcAddress == null)
|
||||
{
|
||||
if (Configuration.RunningOnWindows)
|
||||
{
|
||||
getProcAddress = new GetProcAddressWindows();
|
||||
}
|
||||
else if (Configuration.RunningOnMacOS)
|
||||
{
|
||||
getProcAddress = new GetProcAddressOSX();
|
||||
}
|
||||
else if (Configuration.RunningOnX11)
|
||||
{
|
||||
getProcAddress = new GetProcAddressX11();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new PlatformNotSupportedException(
|
||||
"Extension loading is only supported under Mac OS X, X11 and Windows. We are sorry for the inconvience.");
|
||||
}
|
||||
}
|
||||
|
||||
return getProcAddress.GetProcAddress(function);
|
||||
return (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress(function);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
Loading…
Reference in a new issue