diff --git a/Source/OpenTK/OpenGL/GLHelper.cs b/Source/OpenTK/OpenGL/GLHelper.cs index 79962efe..922f9fcf 100644 --- a/Source/OpenTK/OpenGL/GLHelper.cs +++ b/Source/OpenTK/OpenGL/GLHelper.cs @@ -68,6 +68,9 @@ namespace OpenTK.OpenGL /// public static partial class GL { + static StringBuilder sb = new StringBuilder(); + static object gl_lock = new object(); + static GL() { assembly = Assembly.GetExecutingAssembly();//Assembly.Load("OpenTK.OpenGL"); @@ -117,19 +120,18 @@ namespace OpenTK.OpenGL public static bool SupportsExtension(string name) { if (rebuildExtensionList) - { BuildExtensionList(); - } - // Search the cache for the string. Note that the cache substitutes - // strings "1.0" to "2.1" with "GL_VERSION_1_0" to "GL_VERSION_2_1" - if (AvailableExtensions.ContainsKey(name)) + lock (gl_lock) { - //return AvailableExtensions[name]; - return true; + sb.Remove(0, sb.Length); + if (!name.StartsWith("GL_")) + sb.Append("gl_"); + sb.Append(name.ToLower()); + + // Search the cache for the string. + return AvailableExtensions.ContainsKey(sb.ToString()); } - - return false; } #endregion @@ -153,53 +155,57 @@ namespace OpenTK.OpenGL if (version.StartsWith("1.2")) { - AvailableExtensions.Add("VERSION_1_2", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); } else if (version.StartsWith("1.3")) { - AvailableExtensions.Add("VERSION_1_2", true); - AvailableExtensions.Add("VERSION_1_3", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); + AvailableExtensions.Add("gl_version_1_3", true); } else if (version.StartsWith("1.4")) { - AvailableExtensions.Add("VERSION_1_2", true); - AvailableExtensions.Add("VERSION_1_3", true); - AvailableExtensions.Add("VERSION_1_4", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); + AvailableExtensions.Add("gl_version_1_3", true); + AvailableExtensions.Add("gl_version_1_4", true); } else if (version.StartsWith("1.5")) { - AvailableExtensions.Add("VERSION_1_2", true); - AvailableExtensions.Add("VERSION_1_3", true); - AvailableExtensions.Add("VERSION_1_4", true); - AvailableExtensions.Add("VERSION_1_5", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); + AvailableExtensions.Add("gl_version_1_3", true); + AvailableExtensions.Add("gl_version_1_4", true); + AvailableExtensions.Add("gl_version_1_5", true); } else if (version.StartsWith("2.0")) { - AvailableExtensions.Add("VERSION_1_2", true); - AvailableExtensions.Add("VERSION_1_3", true); - AvailableExtensions.Add("VERSION_1_4", true); - AvailableExtensions.Add("VERSION_1_5", true); - AvailableExtensions.Add("VERSION_2_0", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); + AvailableExtensions.Add("gl_version_1_3", true); + AvailableExtensions.Add("gl_version_1_4", true); + AvailableExtensions.Add("gl_version_1_5", true); + AvailableExtensions.Add("gl_version_2_0", true); } else if (version.StartsWith("2.1")) { - AvailableExtensions.Add("VERSION_1_2", true); - AvailableExtensions.Add("VERSION_1_3", true); - AvailableExtensions.Add("VERSION_1_4", true); - AvailableExtensions.Add("VERSION_1_5", true); - AvailableExtensions.Add("VERSION_2_0", true); - AvailableExtensions.Add("VERSION_2_1", true); + AvailableExtensions.Add("gl_version_1_1", true); + AvailableExtensions.Add("gl_version_1_2", true); + AvailableExtensions.Add("gl_version_1_3", true); + AvailableExtensions.Add("gl_version_1_4", true); + AvailableExtensions.Add("gl_version_1_5", true); + AvailableExtensions.Add("gl_version_2_0", true); + AvailableExtensions.Add("gl_version_2_1", true); } string extension_string = GL.GetString(Enums.StringName.Extensions); if (String.IsNullOrEmpty(extension_string)) return; // no extensions are available - string[] extensions = extension_string.Split(' '); + string[] extensions = extension_string.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (string ext in extensions) - { - AvailableExtensions.Add(ext, true); - } + AvailableExtensions.Add(ext.ToLower(), true); rebuildExtensionList = false; } @@ -329,6 +335,103 @@ namespace OpenTK.OpenGL #endregion + #region public static bool SupportsFunction(string function) + + /// + /// Checks if a given OpenGL function is supported by the current context + /// + /// The name of the OpenGL function (i.e. glShaderSource) + /// True if the function is supported, false otherwise + public static bool SupportsFunction(string function) + { + lock (gl_lock) + { + if (function == null) + throw new ArgumentNullException("function"); + + sb.Remove(0, sb.Length); + if (!function.StartsWith("gl")) + sb.Append("gl"); + sb.Append(function); + FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + return f.GetValue(null) != null; + } + } + + #endregion + + #region public static bool SupportsFunction(string function, string extension) + + /// + /// Checks if a given OpenGL function is supported by the current context + /// + /// The name of the OpenGL function (e.g. glShaderSource) + /// The name of the extension catagory (e.g. ARB, EXT, ATI, ...) + /// True if the function is supported, false otherwise + public static bool SupportsFunction(string function, string extension) + { + lock (gl_lock) + { + if (function == null) + throw new ArgumentNullException("function"); + if (extension == null) + throw new ArgumentNullException("extension"); + + sb.Remove(0, sb.Length); + if (!function.StartsWith("gl")) + sb.Append("gl"); + sb.Append(function); + if (!function.EndsWith(extension)) + sb.Append(extension); + + FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + return f.GetValue(null) != null; + } + } + + #endregion + + #region public static bool SupportsFunction(Type function) + + /// + /// Checks if a given OpenGL function is supported by the current context + /// + /// The name of the OpenGL function (e.g. glShaderSource) + /// The name of the extension catagory (e.g. ARB, EXT, ATI, ...) + /// True if the function is supported, false otherwise + public static bool SupportsFunction(MethodInfo method) + { + lock (gl_lock) + { + /* + if (function == null) + throw new ArgumentNullException("function"); + + sb.Remove(0, sb.Length); + if (!function.Name.StartsWith("gl")) + sb.Append("gl"); + sb.Append(function); + //if (!function.EndsWith(extension)) + // sb.Append(extension); + + FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + return f.GetValue(null) != null; + */ + return false; + } + } + + #endregion + #region --- GetProcAddress --- private static IGetProcAddress getProcAddress;