* Graphics/ES10/Helper.cs:

* Graphics/ES11/Helper.cs:
* Graphics/ES20/Helper.cs:
* Graphics/BindingsBase.cs:
* Platform/X11/GlxHelper.cs:
* Graphics/OpenGL/GLHelper.cs:
* Platform/X11/X11GLContext.cs: Modified BindingsBase to define
  abstract GetAddress method (reason: removes OpenTK.Graphics-specific
  code from BindingsBase and allows it to be used in different
  bindings).
Implemented GraphicsBindingsBase and modified the OpenGL and OpenGL|ES
  bindings to use this.
Modified the GLX bindings to inherit from BindingsBase (reason:
  reduces code duplication for extension loading).
This commit is contained in:
the_fiddler 2009-10-07 10:44:45 +00:00
parent 99aab2fa2e
commit 672b3cf774
7 changed files with 39 additions and 16 deletions

View file

@ -32,10 +32,10 @@ using System.Reflection;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace OpenTK.Graphics
namespace OpenTK
{
/// <summary>
/// Provides a common foundation for all flat API classes.
/// Provides a common foundation for all flat API bindings and implements the extension loading interface.
/// </summary>
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<string, MethodInfo>(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<string, MethodInfo>(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);
}
}
}

View file

@ -7,7 +7,7 @@ namespace OpenTK.Graphics.ES10
/// <summary>
/// Provides access to OpenGL ES 1.0 methods.
/// </summary>
public sealed partial class GL : BindingsBase
public sealed partial class GL : GraphicsBindingsBase
{
const string Library = "libGLES.dll";
}

View file

@ -9,7 +9,7 @@ namespace OpenTK.Graphics.ES11
/// <summary>
/// Provides access to OpenGL ES 1.1 methods.
/// </summary>
public sealed partial class GL : BindingsBase
public sealed partial class GL : GraphicsBindingsBase
{
const string Library = "libGLES.dll";
}

View file

@ -7,7 +7,7 @@ namespace OpenTK.Graphics.ES20
/// <summary>
/// Provides access to OpenGL ES 2.0 methods.
/// </summary>
public sealed partial class GL : BindingsBase
public sealed partial class GL : GraphicsBindingsBase
{
const string Library = "libGLESv2.dll";
}

View file

@ -46,7 +46,7 @@ namespace OpenTK.Graphics.OpenGL
/// </para>
/// </remarks>
/// <see href="http://opengl.org/registry/"/>
public sealed partial class GL : BindingsBase
public sealed partial class GL : GraphicsBindingsBase
{
#region --- Fields ---

View file

@ -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)
/// <summary>
@ -83,5 +89,6 @@ namespace OpenTK.Platform.X11
}
#endregion
#endif
}
}

View file

@ -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);
}