Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 4
0
        /// <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));
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 7
0
        /// <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;
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        /// <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;
        }