diff --git a/Source/OpenTK/Graphics/BindingsBase.cs b/Source/OpenTK/Graphics/BindingsBase.cs index a9f97b7d..9d166f8e 100644 --- a/Source/OpenTK/Graphics/BindingsBase.cs +++ b/Source/OpenTK/Graphics/BindingsBase.cs @@ -32,10 +32,10 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Diagnostics; -namespace OpenTK.Graphics +namespace OpenTK { /// - /// Provides a common foundation for all flat API classes. + /// Provides a common foundation for all flat API bindings and implements the extension loading interface. /// public abstract class BindingsBase { @@ -70,11 +70,14 @@ namespace OpenTK.Graphics DelegatesClass = this.GetType().GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic); CoreClass = this.GetType().GetNestedType("Core", BindingFlags.Static | BindingFlags.NonPublic); - MethodInfo[] methods = CoreClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic); - CoreFunctionMap = new SortedList(methods.Length); - foreach (MethodInfo m in methods) + if (CoreClass != null) { - CoreFunctionMap.Add(m.Name, m); + MethodInfo[] methods = CoreClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic); + CoreFunctionMap = new SortedList(methods.Length); // Avoid resizing + foreach (MethodInfo m in methods) + { + CoreFunctionMap.Add(m.Name, m); + } } } @@ -91,6 +94,8 @@ namespace OpenTK.Graphics set { rebuildExtensionList = value; } } + protected abstract IntPtr GetAddress(string funcname); + #endregion #region Internal Members @@ -176,10 +181,10 @@ namespace OpenTK.Graphics #region GetExtensionDelegate // Creates a System.Delegate that can be used to call a dynamically exported OpenGL function. - internal static Delegate GetExtensionDelegate(string name, Type signature) + internal Delegate GetExtensionDelegate(string name, Type signature) { - IntPtr address = (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress(name); - + IntPtr address = GetAddress(name); + if (address == IntPtr.Zero || address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions. @@ -197,3 +202,14 @@ namespace OpenTK.Graphics #endregion } } + +namespace OpenTK.Graphics +{ + public class GraphicsBindingsBase : BindingsBase + { + protected override IntPtr GetAddress(string funcname) + { + return (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress(funcname); + } + } +} diff --git a/Source/OpenTK/Graphics/ES10/Helper.cs b/Source/OpenTK/Graphics/ES10/Helper.cs index a59a983a..da2d4947 100644 --- a/Source/OpenTK/Graphics/ES10/Helper.cs +++ b/Source/OpenTK/Graphics/ES10/Helper.cs @@ -7,7 +7,7 @@ namespace OpenTK.Graphics.ES10 /// /// Provides access to OpenGL ES 1.0 methods. /// - public sealed partial class GL : BindingsBase + public sealed partial class GL : GraphicsBindingsBase { const string Library = "libGLES.dll"; } diff --git a/Source/OpenTK/Graphics/ES11/Helper.cs b/Source/OpenTK/Graphics/ES11/Helper.cs index f02ad274..eab6d123 100644 --- a/Source/OpenTK/Graphics/ES11/Helper.cs +++ b/Source/OpenTK/Graphics/ES11/Helper.cs @@ -9,7 +9,7 @@ namespace OpenTK.Graphics.ES11 /// /// Provides access to OpenGL ES 1.1 methods. /// - public sealed partial class GL : BindingsBase + public sealed partial class GL : GraphicsBindingsBase { const string Library = "libGLES.dll"; } diff --git a/Source/OpenTK/Graphics/ES20/Helper.cs b/Source/OpenTK/Graphics/ES20/Helper.cs index 6b91813e..7c62aac9 100644 --- a/Source/OpenTK/Graphics/ES20/Helper.cs +++ b/Source/OpenTK/Graphics/ES20/Helper.cs @@ -7,7 +7,7 @@ namespace OpenTK.Graphics.ES20 /// /// Provides access to OpenGL ES 2.0 methods. /// - public sealed partial class GL : BindingsBase + public sealed partial class GL : GraphicsBindingsBase { const string Library = "libGLESv2.dll"; } diff --git a/Source/OpenTK/Graphics/OpenGL/GLHelper.cs b/Source/OpenTK/Graphics/OpenGL/GLHelper.cs index a7a8ecb6..5fdc8ccb 100644 --- a/Source/OpenTK/Graphics/OpenGL/GLHelper.cs +++ b/Source/OpenTK/Graphics/OpenGL/GLHelper.cs @@ -46,7 +46,7 @@ namespace OpenTK.Graphics.OpenGL /// /// /// - public sealed partial class GL : BindingsBase + public sealed partial class GL : GraphicsBindingsBase { #region --- Fields --- diff --git a/Source/OpenTK/Platform/X11/GlxHelper.cs b/Source/OpenTK/Platform/X11/GlxHelper.cs index b2de144d..2094509b 100644 --- a/Source/OpenTK/Platform/X11/GlxHelper.cs +++ b/Source/OpenTK/Platform/X11/GlxHelper.cs @@ -15,13 +15,19 @@ using OpenTK.Graphics; namespace OpenTK.Platform.X11 { - static partial class Glx + partial class Glx : BindingsBase { const string Library = "libGL.so.1"; // Disable BeforeFieldInit optimization. static Glx() { } + protected override IntPtr GetAddress (string funcname) + { + return Glx.GetProcAddress(funcname); + } + +#if false #region static Delegate LoadDelegate(string name, Type signature) /// @@ -83,5 +89,6 @@ namespace OpenTK.Platform.X11 } #endregion +#endif } } diff --git a/Source/OpenTK/Platform/X11/X11GLContext.cs b/Source/OpenTK/Platform/X11/X11GLContext.cs index 714b6de4..7c3fec27 100644 --- a/Source/OpenTK/Platform/X11/X11GLContext.cs +++ b/Source/OpenTK/Platform/X11/X11GLContext.cs @@ -59,7 +59,7 @@ namespace OpenTK.Platform.X11 if (ctx != IntPtr.Zero) { - Glx.LoadAll(); + new Glx().LoadAll(); Glx.MakeCurrent(currentWindow.Display, IntPtr.Zero, IntPtr.Zero); //Glx.DestroyContext(currentWindow.Display, ctx); glx_loaded = true; @@ -271,7 +271,7 @@ namespace OpenTK.Platform.X11 public override void LoadAll() { new OpenTK.Graphics.OpenGL.GL().LoadAll(); - Glx.LoadAll(); + new Glx().LoadAll(); vsync_supported = this.GetAddress("glXSwapIntervalSGI") != IntPtr.Zero; Debug.Print("Context supports vsync: {0}.", vsync_supported); }