public static void Initialize() { // glGetError and glGetString are used in our error handlers // so we want these to be available early. try { glGetError = Bind <GetError>("glGetError"); glGetStringInternal = Bind <GetString>("glGetString"); } catch (Exception) { throw new InvalidProgramException("Failed to initialize low-level OpenGL bindings. GPU information is not available"); } DetectGLFeatures(); if (!Features.HasFlag(GLFeatures.GL2OrGreater) || !Features.HasFlag(GLFeatures.FramebufferExt)) { WriteGraphicsLog("Unsupported OpenGL version: " + glGetString(GL_VERSION)); throw new InvalidProgramException("OpenGL Version Error: See graphics.log for details."); } else { Console.WriteLine("OpenGL version: " + glGetString(GL_VERSION)); } try { glFlush = Bind <Flush>("glFlush"); glViewport = Bind <Viewport>("glViewport"); glClear = Bind <Clear>("glClear"); glClearColor = Bind <ClearColor>("glClearColor"); glGetIntegerv = Bind <GetIntegerv>("glGetIntegerv"); glFinish = Bind <Finish>("glFinish"); glCreateProgram = Bind <CreateProgram>("glCreateProgram"); glUseProgram = Bind <UseProgram>("glUseProgram"); glGetProgramiv = Bind <GetProgramiv>("glGetProgramiv"); glCreateShader = Bind <CreateShader>("glCreateShader"); glShaderSource = Bind <ShaderSource>("glShaderSource"); glCompileShader = Bind <CompileShader>("glCompileShader"); glGetShaderiv = Bind <GetShaderiv>("glGetShaderiv"); glAttachShader = Bind <AttachShader>("glAttachShader"); glGetShaderInfoLog = Bind <GetShaderInfoLog>("glGetShaderInfoLog"); glLinkProgram = Bind <LinkProgram>("glLinkProgram"); glGetProgramInfoLog = Bind <GetProgramInfoLog>("glGetProgramInfoLog"); glGetUniformLocation = Bind <GetUniformLocation>("glGetUniformLocation"); glGetActiveUniform = Bind <GetActiveUniform>("glGetActiveUniform"); glUniform1i = Bind <Uniform1i>("glUniform1i"); glUniform1f = Bind <Uniform1f>("glUniform1f"); glUniform2f = Bind <Uniform2f>("glUniform2f"); glUniform1fv = Bind <Uniform1fv>("glUniform1fv"); glUniform2fv = Bind <Uniform2fv>("glUniform2fv"); glUniform3fv = Bind <Uniform3fv>("glUniform3fv"); glUniform4fv = Bind <Uniform4fv>("glUniform4fv"); glUniformMatrix4fv = Bind <UniformMatrix4fv>("glUniformMatrix4fv"); glGenBuffers = Bind <GenBuffers>("glGenBuffers"); glBindBuffer = Bind <BindBuffer>("glBindBuffer"); glBufferData = Bind <BufferData>("glBufferData"); glBufferSubData = Bind <BufferSubData>("glBufferSubData"); glDeleteBuffers = Bind <DeleteBuffers>("glDeleteBuffers"); glBindAttribLocation = Bind <BindAttribLocation>("glBindAttribLocation"); glVertexAttribPointer = Bind <VertexAttribPointer>("glVertexAttribPointer"); glEnableVertexAttribArray = Bind <EnableVertexAttribArray>("glEnableVertexAttribArray"); glDisableVertexAttribArray = Bind <DisableVertexAttribArray>("glDisableVertexAttribArray"); glDrawArrays = Bind <DrawArrays>("glDrawArrays"); glEnable = Bind <Enable>("glEnable"); glDisable = Bind <Disable>("glDisable"); glBlendEquation = Bind <BlendEquation>("glBlendEquation"); glBlendFunc = Bind <BlendFunc>("glBlendFunc"); glScissor = Bind <Scissor>("glScissor"); glPushClientAttrib = Bind <PushClientAttrib>("glPushClientAttrib"); glPopClientAttrib = Bind <PopClientAttrib>("glPopClientAttrib"); glPixelStoref = Bind <PixelStoref>("glPixelStoref"); glReadPixels = Bind <ReadPixels>("glReadPixels"); glGenTextures = Bind <GenTextures>("glGenTextures"); glDeleteTextures = Bind <DeleteTextures>("glDeleteTextures"); glBindTexture = Bind <BindTexture>("glBindTexture"); glActiveTexture = Bind <ActiveTexture>("glActiveTexture"); glTexImage2D = Bind <TexImage2D>("glTexImage2D"); glGetTexImage = Bind <GetTexImage>("glGetTexImage"); glTexParameteri = Bind <TexParameteri>("glTexParameteri"); glTexParameterf = Bind <TexParameterf>("glTexParameterf"); glGenFramebuffers = Bind <GenFramebuffers>("glGenFramebuffersEXT"); glBindFramebuffer = Bind <BindFramebuffer>("glBindFramebufferEXT"); glFramebufferTexture2D = Bind <FramebufferTexture2D>("glFramebufferTexture2DEXT"); glDeleteFramebuffers = Bind <DeleteFramebuffers>("glDeleteFramebuffersEXT"); glGenRenderbuffers = Bind <GenRenderbuffers>("glGenRenderbuffersEXT"); glBindRenderbuffer = Bind <BindRenderbuffer>("glBindRenderbufferEXT"); glRenderbufferStorage = Bind <RenderbufferStorage>("glRenderbufferStorageEXT"); glDeleteRenderbuffers = Bind <DeleteRenderbuffers>("glDeleteRenderbuffersEXT"); glFramebufferRenderbuffer = Bind <FramebufferRenderbuffer>("glFramebufferRenderbufferEXT"); glCheckFramebufferStatus = Bind <CheckFramebufferStatus>("glCheckFramebufferStatusEXT"); } catch (Exception e) { WriteGraphicsLog("Failed to initialize OpenGL bindings.\nInner exception was: {0}".F(e)); throw new InvalidProgramException("Failed to initialize OpenGL. See graphics.log for details."); } }
public static void Initialize() { try { // First set up the bindings we need for error handling glEnable = Bind <Enable>("glEnable"); glDisable = Bind <Disable>("glDisable"); glGetError = Bind <GetError>("glGetError"); glGetStringInternal = Bind <GetString>("glGetString"); glGetStringiInternal = Bind <GetStringi>("glGetStringi"); } catch (Exception e) { throw new InvalidProgramException("Failed to initialize low-level OpenGL bindings. GPU information is not available.", e); } DetectGLFeatures(); if (!Features.HasFlag(GLFeatures.Core)) { WriteGraphicsLog("Unsupported OpenGL version: " + glGetString(GL_VERSION)); throw new InvalidProgramException("OpenGL Version Error: See graphics.log for details."); } // Setup the debug message callback handler if (Features.HasFlag(GLFeatures.DebugMessagesCallback)) { try { glDebugMessageCallback = Bind <DebugMessageCallback>("glDebugMessageCallback"); glDebugMessageInsert = Bind <DebugMessageInsert>("glDebugMessageInsert"); glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); // Need to keep a reference to the callback so it doesn't get garbage collected DebugMessageHandle = DebugMessageHandler; glDebugMessageCallback(DebugMessageHandle, IntPtr.Zero); } catch (Exception e) { throw new InvalidProgramException("Failed to initialize an OpenGL debug message callback.", e); } } Console.WriteLine("OpenGL version: " + glGetString(GL_VERSION)); try { glFlush = Bind <Flush>("glFlush"); glViewport = Bind <Viewport>("glViewport"); glClear = Bind <Clear>("glClear"); glClearColor = Bind <ClearColor>("glClearColor"); glGetIntegerv = Bind <GetIntegerv>("glGetIntegerv"); glFinish = Bind <Finish>("glFinish"); glCreateProgram = Bind <CreateProgram>("glCreateProgram"); glUseProgram = Bind <UseProgram>("glUseProgram"); glGetProgramiv = Bind <GetProgramiv>("glGetProgramiv"); glCreateShader = Bind <CreateShader>("glCreateShader"); glShaderSource = Bind <ShaderSource>("glShaderSource"); glCompileShader = Bind <CompileShader>("glCompileShader"); glGetShaderiv = Bind <GetShaderiv>("glGetShaderiv"); glAttachShader = Bind <AttachShader>("glAttachShader"); glGetShaderInfoLog = Bind <GetShaderInfoLog>("glGetShaderInfoLog"); glLinkProgram = Bind <LinkProgram>("glLinkProgram"); glGetProgramInfoLog = Bind <GetProgramInfoLog>("glGetProgramInfoLog"); glGetUniformLocation = Bind <GetUniformLocation>("glGetUniformLocation"); glGetActiveUniform = Bind <GetActiveUniform>("glGetActiveUniform"); glUniform1i = Bind <Uniform1i>("glUniform1i"); glUniform1f = Bind <Uniform1f>("glUniform1f"); glUniform2f = Bind <Uniform2f>("glUniform2f"); glUniform3f = Bind <Uniform3f>("glUniform3f"); glUniform1fv = Bind <Uniform1fv>("glUniform1fv"); glUniform2fv = Bind <Uniform2fv>("glUniform2fv"); glUniform3fv = Bind <Uniform3fv>("glUniform3fv"); glUniform4fv = Bind <Uniform4fv>("glUniform4fv"); glUniformMatrix4fv = Bind <UniformMatrix4fv>("glUniformMatrix4fv"); glGenBuffers = Bind <GenBuffers>("glGenBuffers"); glBindBuffer = Bind <BindBuffer>("glBindBuffer"); glBufferData = Bind <BufferData>("glBufferData"); glBufferSubData = Bind <BufferSubData>("glBufferSubData"); glDeleteBuffers = Bind <DeleteBuffers>("glDeleteBuffers"); glGenVertexArrays = Bind <GenVertexArrays>("glGenVertexArrays"); glBindVertexArray = Bind <BindVertexArray>("glBindVertexArray"); glBindAttribLocation = Bind <BindAttribLocation>("glBindAttribLocation"); glBindFragDataLocation = Bind <BindFragDataLocation>("glBindFragDataLocation"); glVertexAttribPointer = Bind <VertexAttribPointer>("glVertexAttribPointer"); glEnableVertexAttribArray = Bind <EnableVertexAttribArray>("glEnableVertexAttribArray"); glDisableVertexAttribArray = Bind <DisableVertexAttribArray>("glDisableVertexAttribArray"); glDrawArrays = Bind <DrawArrays>("glDrawArrays"); glBlendEquation = Bind <BlendEquation>("glBlendEquation"); glBlendEquationSeparate = Bind <BlendEquationSeparate>("glBlendEquationSeparate"); glBlendFunc = Bind <BlendFunc>("glBlendFunc"); glDepthFunc = Bind <DepthFunc>("glDepthFunc"); glScissor = Bind <Scissor>("glScissor"); glReadPixels = Bind <ReadPixels>("glReadPixels"); glGenTextures = Bind <GenTextures>("glGenTextures"); glDeleteTextures = Bind <DeleteTextures>("glDeleteTextures"); glIsTexture = Bind <IsTexture>("glIsTexture"); glBindTexture = Bind <BindTexture>("glBindTexture"); glActiveTexture = Bind <ActiveTexture>("glActiveTexture"); glTexImage2D = Bind <TexImage2D>("glTexImage2D"); glGetTexImage = Bind <GetTexImage>("glGetTexImage"); glTexParameteri = Bind <TexParameteri>("glTexParameteri"); glTexParameterf = Bind <TexParameterf>("glTexParameterf"); glGenFramebuffers = Bind <GenFramebuffers>("glGenFramebuffers"); glBindFramebuffer = Bind <BindFramebuffer>("glBindFramebuffer"); glFramebufferTexture2D = Bind <FramebufferTexture2D>("glFramebufferTexture2D"); glDeleteFramebuffers = Bind <DeleteFramebuffers>("glDeleteFramebuffers"); glGenRenderbuffers = Bind <GenRenderbuffers>("glGenRenderbuffers"); glBindRenderbuffer = Bind <BindRenderbuffer>("glBindRenderbuffer"); glRenderbufferStorage = Bind <RenderbufferStorage>("glRenderbufferStorage"); glDeleteRenderbuffers = Bind <DeleteRenderbuffers>("glDeleteRenderbuffers"); glFramebufferRenderbuffer = Bind <FramebufferRenderbuffer>("glFramebufferRenderbuffer"); glCheckFramebufferStatus = Bind <CheckFramebufferStatus>("glCheckFramebufferStatus"); } catch (Exception e) { WriteGraphicsLog("Failed to initialize OpenGL bindings.\nInner exception was: {0}".F(e)); throw new InvalidProgramException("Failed to initialize OpenGL. See graphics.log for details.", e); } }
public static void Initialize(bool preferLegacyProfile) { try { // First set up the bindings we need for error handling glEnable = Bind <Enable>("glEnable"); glDisable = Bind <Disable>("glDisable"); glGetError = Bind <GetError>("glGetError"); glGetStringInternal = Bind <GetString>("glGetString"); glGetStringiInternal = Bind <GetStringi>("glGetStringi"); glGetIntegerv = Bind <GetIntegerv>("glGetIntegerv"); } catch (Exception e) { throw new InvalidProgramException("Failed to initialize low-level OpenGL bindings. GPU information is not available.", e); } if (!DetectGLFeatures(preferLegacyProfile)) { WriteGraphicsLog("Unsupported OpenGL version: " + glGetString(GL_VERSION)); throw new InvalidProgramException("OpenGL Version Error: See graphics.log for details."); } // Allow users to force-disable the debug message callback feature to work around driver bugs if (Features.HasFlag(GLFeatures.DebugMessagesCallback) && Game.Settings.Graphics.DisableGLDebugMessageCallback) { Features ^= GLFeatures.DebugMessagesCallback; } // Force disable the debug message callback feature on Linux + AMD GPU to work around a startup freeze if (Features.HasFlag(GLFeatures.DebugMessagesCallback) && Platform.CurrentPlatform == PlatformType.Linux) { var renderer = glGetString(GL_RENDERER); if (renderer.Contains("AMD") || renderer.Contains("Radeon")) { Features ^= GLFeatures.DebugMessagesCallback; } } // Older Intel on Windows is broken too if (Features.HasFlag(GLFeatures.DebugMessagesCallback) && Platform.CurrentPlatform == PlatformType.Windows) { var renderer = glGetString(GL_RENDERER); if (renderer.Contains("HD Graphics") && !renderer.Contains("UHD Graphics")) { Features ^= GLFeatures.DebugMessagesCallback; } } // Setup the debug message callback handler if (Features.HasFlag(GLFeatures.DebugMessagesCallback)) { try { var suffix = Profile == GLProfile.Embedded ? "KHR" : ""; glDebugMessageCallback = Bind <DebugMessageCallback>("glDebugMessageCallback" + suffix); glDebugMessageInsert = Bind <DebugMessageInsert>("glDebugMessageInsert" + suffix); glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); // Need to keep a reference to the callback so it doesn't get garbage collected DebugMessageHandle = DebugMessageHandler; glDebugMessageCallback(DebugMessageHandle, IntPtr.Zero); } catch (Exception e) { throw new InvalidProgramException("Failed to initialize an OpenGL debug message callback.", e); } } Console.WriteLine("OpenGL renderer: " + glGetString(GL_RENDERER)); Console.WriteLine("OpenGL version: " + glGetString(GL_VERSION)); try { glFlush = Bind <Flush>("glFlush"); glViewport = Bind <Viewport>("glViewport"); glClear = Bind <Clear>("glClear"); glClearColor = Bind <ClearColor>("glClearColor"); glFinish = Bind <Finish>("glFinish"); glCreateProgram = Bind <CreateProgram>("glCreateProgram"); glUseProgram = Bind <UseProgram>("glUseProgram"); glGetProgramiv = Bind <GetProgramiv>("glGetProgramiv"); glCreateShader = Bind <CreateShader>("glCreateShader"); glShaderSource = Bind <ShaderSource>("glShaderSource"); glCompileShader = Bind <CompileShader>("glCompileShader"); glGetShaderiv = Bind <GetShaderiv>("glGetShaderiv"); glAttachShader = Bind <AttachShader>("glAttachShader"); glGetShaderInfoLog = Bind <GetShaderInfoLog>("glGetShaderInfoLog"); glLinkProgram = Bind <LinkProgram>("glLinkProgram"); glGetProgramInfoLog = Bind <GetProgramInfoLog>("glGetProgramInfoLog"); glGetUniformLocation = Bind <GetUniformLocation>("glGetUniformLocation"); glGetActiveUniform = Bind <GetActiveUniform>("glGetActiveUniform"); glUniform1i = Bind <Uniform1i>("glUniform1i"); glUniform1f = Bind <Uniform1f>("glUniform1f"); glUniform2f = Bind <Uniform2f>("glUniform2f"); glUniform3f = Bind <Uniform3f>("glUniform3f"); glUniform1fv = Bind <Uniform1fv>("glUniform1fv"); glUniform2fv = Bind <Uniform2fv>("glUniform2fv"); glUniform3fv = Bind <Uniform3fv>("glUniform3fv"); glUniform4fv = Bind <Uniform4fv>("glUniform4fv"); glUniformMatrix4fv = Bind <UniformMatrix4fv>("glUniformMatrix4fv"); glGenBuffers = Bind <GenBuffers>("glGenBuffers"); glBindBuffer = Bind <BindBuffer>("glBindBuffer"); glBufferData = Bind <BufferData>("glBufferData"); glBufferSubData = Bind <BufferSubData>("glBufferSubData"); glDeleteBuffers = Bind <DeleteBuffers>("glDeleteBuffers"); glBindAttribLocation = Bind <BindAttribLocation>("glBindAttribLocation"); glVertexAttribPointer = Bind <VertexAttribPointer>("glVertexAttribPointer"); glEnableVertexAttribArray = Bind <EnableVertexAttribArray>("glEnableVertexAttribArray"); glDisableVertexAttribArray = Bind <DisableVertexAttribArray>("glDisableVertexAttribArray"); glDrawArrays = Bind <DrawArrays>("glDrawArrays"); glBlendEquation = Bind <BlendEquation>("glBlendEquation"); glBlendEquationSeparate = Bind <BlendEquationSeparate>("glBlendEquationSeparate"); glBlendFunc = Bind <BlendFunc>("glBlendFunc"); glDepthFunc = Bind <DepthFunc>("glDepthFunc"); glScissor = Bind <Scissor>("glScissor"); glReadPixels = Bind <ReadPixels>("glReadPixels"); glGenTextures = Bind <GenTextures>("glGenTextures"); glDeleteTextures = Bind <DeleteTextures>("glDeleteTextures"); glIsTexture = Bind <IsTexture>("glIsTexture"); glBindTexture = Bind <BindTexture>("glBindTexture"); glActiveTexture = Bind <ActiveTexture>("glActiveTexture"); glTexImage2D = Bind <TexImage2D>("glTexImage2D"); glTexParameteri = Bind <TexParameteri>("glTexParameteri"); glTexParameterf = Bind <TexParameterf>("glTexParameterf"); if (Profile != GLProfile.Legacy) { if (Profile != GLProfile.Embedded) { glGetTexImage = Bind <GetTexImage>("glGetTexImage"); glBindFragDataLocation = Bind <BindFragDataLocation>("glBindFragDataLocation"); } else { glGetTexImage = null; glBindFragDataLocation = null; } glGenVertexArrays = Bind <GenVertexArrays>("glGenVertexArrays"); glBindVertexArray = Bind <BindVertexArray>("glBindVertexArray"); glGenFramebuffers = Bind <GenFramebuffers>("glGenFramebuffers"); glBindFramebuffer = Bind <BindFramebuffer>("glBindFramebuffer"); glFramebufferTexture2D = Bind <FramebufferTexture2D>("glFramebufferTexture2D"); glDeleteFramebuffers = Bind <DeleteFramebuffers>("glDeleteFramebuffers"); glGenRenderbuffers = Bind <GenRenderbuffers>("glGenRenderbuffers"); glBindRenderbuffer = Bind <BindRenderbuffer>("glBindRenderbuffer"); glRenderbufferStorage = Bind <RenderbufferStorage>("glRenderbufferStorage"); glDeleteRenderbuffers = Bind <DeleteRenderbuffers>("glDeleteRenderbuffers"); glFramebufferRenderbuffer = Bind <FramebufferRenderbuffer>("glFramebufferRenderbuffer"); glCheckFramebufferStatus = Bind <CheckFramebufferStatus>("glCheckFramebufferStatus"); } else { glGenVertexArrays = null; glBindVertexArray = null; glBindFragDataLocation = null; glGenFramebuffers = Bind <GenFramebuffers>("glGenFramebuffersEXT"); glBindFramebuffer = Bind <BindFramebuffer>("glBindFramebufferEXT"); glFramebufferTexture2D = Bind <FramebufferTexture2D>("glFramebufferTexture2DEXT"); glDeleteFramebuffers = Bind <DeleteFramebuffers>("glDeleteFramebuffersEXT"); glGenRenderbuffers = Bind <GenRenderbuffers>("glGenRenderbuffersEXT"); glBindRenderbuffer = Bind <BindRenderbuffer>("glBindRenderbufferEXT"); glRenderbufferStorage = Bind <RenderbufferStorage>("glRenderbufferStorageEXT"); glDeleteRenderbuffers = Bind <DeleteRenderbuffers>("glDeleteRenderbuffersEXT"); glFramebufferRenderbuffer = Bind <FramebufferRenderbuffer>("glFramebufferRenderbufferEXT"); glCheckFramebufferStatus = Bind <CheckFramebufferStatus>("glCheckFramebufferStatusEXT"); } } catch (Exception e) { WriteGraphicsLog("Failed to initialize OpenGL bindings.\nInner exception was: {0}".F(e)); throw new InvalidProgramException("Failed to initialize OpenGL. See graphics.log for details.", e); } }
public static void InitFramebuffers(OpenGLContext ctx) { glIsRenderbuffer = ctx.GetProc<IsRenderbuffer>("glIsRenderbuffer"); glBindRenderbuffer = ctx.GetProc<BindRenderbuffer>("glBindRenderbuffer"); glDeleteRenderbuffers = ctx.GetProc<DeleteRenderbuffers>("glDeleteRenderbuffers"); glGenRenderbuffers = ctx.GetProc<GenRenderbuffers>("glGenRenderbuffers"); glRenderbufferStorage = ctx.GetProc<RenderbufferStorage>("glRenderbufferStorage"); glGetRenderbufferParameteriv = ctx.GetProc<GetRenderbufferParameteriv>("glGetRenderbufferParameteriv"); glIsFramebuffer = ctx.GetProc<IsFramebuffer>("glIsFramebuffer"); glBindFramebuffer = ctx.GetProc<BindFramebuffer>("glBindFramebuffer"); glDeleteFramebuffers = ctx.GetProc<DeleteFramebuffers>("glDeleteFramebuffers"); glGenFramebuffers = ctx.GetProc<GenFramebuffers>("glGenFramebuffers"); glCheckFramebufferStatus = ctx.GetProc<CheckFramebufferStatus>("glCheckFramebufferStatus"); glFramebufferTexture1D = ctx.GetProc<FramebufferTexture1D>("glFramebufferTexture1D"); glFramebufferTexture2D = ctx.GetProc<FramebufferTexture2D>("glFramebufferTexture2D"); glFramebufferTexture3D = ctx.GetProc<FramebufferTexture3D>("glFramebufferTexture3D"); glFramebufferRenderbuffer = ctx.GetProc<FramebufferRenderbuffer>("glFramebufferRenderbuffer"); glGetFramebufferAttachmentParameteriv = ctx.GetProc<GetFramebufferAttachmentParameteriv>("glGetFramebufferAttachmentParameteriv"); glGenerateMipmap = ctx.GetProc<GenerateMipmap>("glGenerateMipmap"); glBlitFramebuffer = ctx.GetProc<BlitFramebuffer>("glBlitFramebuffer"); glRenderbufferStorageMultisample = ctx.GetProc<RenderbufferStorageMultisample>("glRenderbufferStorageMultisample"); glFramebufferTextureLayer = ctx.GetProc<FramebufferTextureLayer>("glFramebufferTextureLayer"); }