/// <summary> /// Loads the specified function. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> /// <param name="field">The field that represents the function to load.</param> /// <param name="checkRequirements">A value indicating whether to check the function's requirements.</param> /// <returns>true if the function was loaded successfully, or wasn't loaded because its extension is not supported; otherwise, false.</returns> private static Boolean LoadFunction(IOpenGLInitializer initializer, FieldInfo field, Boolean checkRequirements = true) { var name = field.Name.StartsWith("gl") ? field.Name : "gl" + field.Name; var reqs = checkRequirements ? field.GetCustomAttributes(typeof(RequireAttribute), false).Cast <RequireAttribute>().FirstOrDefault() : null; // If this isn't a core function, attempt to load it as an extension. if (reqs != null && !reqs.IsCore(majorVersion, minorVersion, isGLES)) { if (!IsExtensionSupported(reqs.Extension)) { LoadDefaultDelegate(field, reqs); return(false); } name = reqs.ExtensionFunction ?? name; } // Load the function pointer from the OpenGL initializer. var fnptr = initializer.GetProcAddress(name); if (fnptr == IntPtr.Zero) { LoadDefaultDelegate(field, reqs); return(false); } var fndel = Marshal.GetDelegateForFunctionPointer(fnptr, field.FieldType); field.SetValue(null, fndel); return(true); }
/// <summary> /// Initializes OpenGL. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> public static void Initialize(IOpenGLInitializer initializer) { Contract.Require(initializer, nameof(initializer)); Contract.EnsureNot(initialized, GluonStrings.OpenGLAlreadyInitialized); initializing = true; LoadFunction(initializer, "glGetError", false); LoadFunction(initializer, "glGetIntegerv", false); LoadFunction(initializer, "glGetString", false); LoadFunction(initializer, "glGetStringi", false); LoadVersion(); LoadExtensions(); gl.InitializeDSA(); gl.IsTextureStorageAvailable = IsVersionAtLeast(4, 2) || IsExtensionSupported("GL_ARB_texture_storage"); gl.IsAnisotropicFilteringAvailable = IsExtensionSupported("GL_EXT_texture_filter_anisotropic"); var functions = GetOpenGLFunctionFields(); foreach (var function in functions) { if (!LoadFunction(initializer, function)) { VerboseLog(GluonStrings.CouldNotLoadFunction.Format(function)); } } Debug.WriteLine(GluonStrings.LoadedOpenGLVersion.Format(GetString(GL_VERSION), GetString(GL_VENDOR))); initializing = false; initialized = true; }
/// <summary> /// Initializes OpenGL. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> public static void Initialize(IOpenGLInitializer initializer) { Contract.Require(initializer, "initializer"); Contract.EnsureNot(initialized, GluonStrings.OpenGLAlreadyInitialized); initializing = true; LoadFunction(initializer, "glGetError", false); LoadFunction(initializer, "glGetIntegerv", false); LoadFunction(initializer, "glGetString", false); LoadFunction(initializer, "glGetStringi", false); LoadVersion(); LoadExtensions(); gl.InitializeDSA(); gl.IsTextureStorageAvailable = IsVersionAtLeast(4, 2) || IsExtensionSupported("GL_ARB_texture_storage"); gl.IsAnisotropicFilteringAvailable = IsExtensionSupported("GL_EXT_texture_filter_anisotropic"); var functions = GetOpenGLFunctionFields(); foreach (var function in functions) { if (!LoadFunction(initializer, function)) { VerboseLog(GluonStrings.CouldNotLoadFunction.Format(function)); } } Debug.WriteLine(GluonStrings.LoadedOpenGLVersion.Format(GetString(GL_VERSION), GetString(GL_VENDOR))); initializing = false; initialized = true; }
/// <summary> /// Loads the specified function. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> /// <param name="name">The name of the field that represents the function to load.</param> /// <param name="checkRequirements">A value indicating whether to check the function's requirements.</param> /// <returns>true if the function was loaded; otherwise, false.</returns> private static Boolean LoadFunction(IOpenGLInitializer initializer, String name, Boolean checkRequirements = true) { var field = typeof(gl).GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (field == null) { throw new MissingMethodException(name); } return(LoadFunction(initializer, field, checkRequirements)); }
/// <summary> /// Initializes OpenGL. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> public static void Initialize(IOpenGLInitializer initializer) { Contract.Require(initializer, nameof(initializer)); Contract.EnsureNot(initialized, GluonStrings.OpenGLAlreadyInitialized); initializing = true; initializer.Prepare(); LoadFunction(initializer, "glGetError", false); LoadFunction(initializer, "glGetIntegerv", false); LoadFunction(initializer, "glGetString", false); LoadFunction(initializer, "glGetStringi", false); LoadVersion(); LoadExtensions(); gl.InitializeDSA(); gl.IsTextureStorageAvailable = IsVersionAtLeast(4, 2) || IsExtensionSupported("GL_ARB_texture_storage"); gl.IsAnisotropicFilteringAvailable = IsExtensionSupported("GL_EXT_texture_filter_anisotropic"); gl.IsVertexAttribBindingAvailable = IsExtensionSupported("GL_ARB_vertex_attrib_binding"); var functions = GetOpenGLFunctionFields(); foreach (var function in functions) { if (!LoadFunction(initializer, function)) { VerboseLog(GluonStrings.CouldNotLoadFunction.Format(function)); } } gl.DefaultFramebuffer = (UInt32)gl.GetInteger(gl.GL_FRAMEBUFFER_BINDING); gl.ThrowIfError(); gl.DefaultRenderbuffer = (UInt32)gl.GetInteger(gl.GL_RENDERBUFFER_BINDING); gl.ThrowIfError(); Debug.WriteLine(GluonStrings.LoadedOpenGLVersion.Format(GetString(GL_VERSION), GetString(GL_VENDOR))); initializer.Cleanup(); initializing = false; initialized = true; }
/// <summary> /// Initializes OpenGL. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> public static void Initialize(IOpenGLInitializer initializer) { Contract.Require(initializer, nameof(initializer)); Contract.EnsureNot(initialized, BindingsStrings.OpenGLAlreadyInitialized); initializing = true; initializer.Prepare(); LoadFunction(initializer, "glGetError", false); LoadFunction(initializer, "glGetIntegerv", false); LoadFunction(initializer, "glGetString", false); LoadFunction(initializer, "glGetStringi", false); LoadVersion(); LoadExtensions(); gl.InitializeDSA(); gl.InitializeFeatureFlags(); var functions = GetOpenGLFunctionFields(); foreach (var function in functions) { if (!LoadFunction(initializer, function)) { VerboseLog(BindingsStrings.CouldNotLoadFunction.Format(function)); } } gl.DefaultFramebuffer = (UInt32)gl.GetInteger(gl.GL_FRAMEBUFFER_BINDING); gl.ThrowIfError(); gl.DefaultRenderbuffer = (UInt32)gl.GetInteger(gl.GL_RENDERBUFFER_BINDING); gl.ThrowIfError(); Debug.WriteLine(BindingsStrings.LoadedOpenGLVersion.Format(GetString(GL_VERSION), GetString(GL_VENDOR))); initializer.Cleanup(); initializing = false; initialized = true; }
/// <summary> /// Loads the specified function. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> /// <param name="field">The field that represents the function to load.</param> /// <param name="checkRequirements">A value indicating whether to check the function's requirements.</param> /// <returns>true if the function was loaded successfully, or wasn't loaded because its extension is not supported; otherwise, false.</returns> private static Boolean LoadFunction(IOpenGLInitializer initializer, FieldInfo field, Boolean checkRequirements = true) { var name = field.Name.StartsWith("gl") ? field.Name : "gl" + field.Name; var reqs = checkRequirements ? field.GetCustomAttributes(typeof(RequireAttribute), false).Cast<RequireAttribute>().FirstOrDefault() : null; // If this isn't a core function, attempt to load it as an extension. if (reqs != null && !reqs.IsCore(majorVersion, minorVersion, isGLES)) { if (!IsExtensionSupported(reqs.Extension)) { LoadDefaultDelegate(field, reqs); return false; } name = reqs.ExtensionFunction ?? name; } // Load the function pointer from the OpenGL initializer. var fnptr = initializer.GetProcAddress(name); if (fnptr == IntPtr.Zero) { LoadDefaultDelegate(field, reqs); return false; } var fndel = Marshal.GetDelegateForFunctionPointer(fnptr, field.FieldType); field.SetValue(null, fndel); return true; }
/// <summary> /// Loads the specified function. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> /// <param name="name">The name of the field that represents the function to load.</param> /// <param name="checkRequirements">A value indicating whether to check the function's requirements.</param> /// <returns>true if the function was loaded; otherwise, false.</returns> private static Boolean LoadFunction(IOpenGLInitializer initializer, String name, Boolean checkRequirements = true) { var field = typeof(gl).GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (field == null) throw new MissingMethodException(name); return LoadFunction(initializer, field, checkRequirements); }
/// <summary> /// Initializes OpenGL. /// </summary> /// <param name="initializer">The OpenGL initializer.</param> public static void Initialize(IOpenGLInitializer initializer) { Contract.Require(initializer, nameof(initializer)); Contract.EnsureNot(initialized, GluonStrings.OpenGLAlreadyInitialized); initializing = true; initializer.Prepare(); LoadFunction(initializer, "glGetError", false); LoadFunction(initializer, "glGetIntegerv", false); LoadFunction(initializer, "glGetString", false); LoadFunction(initializer, "glGetStringi", false); LoadVersion(); LoadExtensions(); gl.InitializeDSA(); gl.IsTextureStorageAvailable = IsVersionAtLeast(4, 2) || IsExtensionSupported("GL_ARB_texture_storage"); gl.IsAnisotropicFilteringAvailable = IsExtensionSupported("GL_EXT_texture_filter_anisotropic"); var functions = GetOpenGLFunctionFields(); foreach (var function in functions) { if (!LoadFunction(initializer, function)) { VerboseLog(GluonStrings.CouldNotLoadFunction.Format(function)); } } gl.DefaultFramebuffer = (UInt32)gl.GetInteger(gl.GL_FRAMEBUFFER_BINDING); gl.ThrowIfError(); gl.DefaultRenderbuffer = (UInt32)gl.GetInteger(gl.GL_RENDERBUFFER_BINDING); gl.ThrowIfError(); Debug.WriteLine(GluonStrings.LoadedOpenGLVersion.Format(GetString(GL_VERSION), GetString(GL_VENDOR))); initializer.Cleanup(); initializing = false; initialized = true; }