Added LoadDelegate method.
This commit is contained in:
parent
e4d7c3f8b3
commit
ebb10c5424
1 changed files with 55 additions and 0 deletions
|
@ -7,6 +7,8 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace OpenTK.Platform.X11
|
||||
{
|
||||
|
@ -17,6 +19,59 @@ namespace OpenTK.Platform.X11
|
|||
// Disable BeforeFieldInit optimization.
|
||||
static Glx() { }
|
||||
|
||||
#region static Delegate LoadDelegate(string name, Type signature)
|
||||
|
||||
/// <summary>
|
||||
/// Creates a System.Delegate that can be used to call an OpenGL function, core or extension.
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the Wgl function (eg. "wglNewList")</param>
|
||||
/// <param name="signature">The signature of the OpenGL function.</param>
|
||||
/// <returns>
|
||||
/// A System.Delegate that can be used to call this OpenGL function, or null if the specified
|
||||
/// function name did not correspond to an OpenGL function.
|
||||
/// </returns>
|
||||
static Delegate LoadDelegate(string name, Type signature)
|
||||
{
|
||||
Delegate d;
|
||||
string realName = name.StartsWith("glx") ? name.Substring(3) : name;
|
||||
|
||||
if (typeof(Glx).GetMethod(realName,
|
||||
BindingFlags.NonPublic | BindingFlags.Static) != null)
|
||||
d = GetExtensionDelegate(name, signature) ??
|
||||
Delegate.CreateDelegate(signature, typeof(Glx), realName);
|
||||
else
|
||||
d = GetExtensionDelegate(name, signature);
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region private static Delegate GetExtensionDelegate(string name, Type signature)
|
||||
|
||||
/// <summary>
|
||||
/// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function.
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
|
||||
/// <param name="signature">The signature of the OpenGL function.</param>
|
||||
/// <returns>
|
||||
/// A System.Delegate that can be used to call this OpenGL function or null
|
||||
/// if the function is not available in the current OpenGL context.
|
||||
/// </returns>
|
||||
private static Delegate GetExtensionDelegate(string name, Type signature)
|
||||
{
|
||||
IntPtr address = Glx.GetProcAddress(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.
|
||||
return null;
|
||||
else
|
||||
return Marshal.GetDelegateForFunctionPointer(address, signature);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region internal static void LoadAll
|
||||
|
||||
internal static void LoadAll()
|
||||
|
|
Loading…
Reference in a new issue