#region --- License --- /* Copyright (c) 2006, 2007 Stefanos Apostolopoulos * See license.txt for license info */ #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Runtime.InteropServices; using System.Diagnostics; using OpenTK.Graphics; namespace OpenTK.Platform.X11 { static partial class Glx { const string Library = "libGL.so.1"; // Disable BeforeFieldInit optimization. static Glx() { } #region static Delegate LoadDelegate(string name, Type signature) /// /// Creates a System.Delegate that can be used to call an OpenGL function, core or extension. /// /// The name of the Wgl function (eg. "wglNewList") /// The signature of the OpenGL function. /// /// 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. /// 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) /// /// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function. /// /// The name of the OpenGL function (eg. "glNewList") /// The signature of the OpenGL function. /// /// 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. /// 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 public static void LoadAll() { OpenTK.Platform.Utilities.LoadExtensions(typeof(Glx)); } #endregion } }