// OpenGL 3.3 Core — runtime-loaded function pointers // No #library needed — caller provides a loader (e.g. SDL_GL_GetProcAddress) // Constants GL_FALSE :s32: 0; GL_TRUE :s32: 1; GL_DEPTH_TEST :u32: 0x0B71; GL_CULL_FACE :u32: 0x0B44; GL_BLEND :u32: 0x0BE2; GL_TRIANGLES :u32: 4; GL_LINES :u32: 1; GL_FLOAT :u32: 0x1406; GL_UNSIGNED_INT :u32: 0x1405; GL_VERTEX_SHADER :u32: 0x8B31; GL_FRAGMENT_SHADER :u32: 0x8B30; GL_COMPILE_STATUS :u32: 0x8B81; GL_LINK_STATUS :u32: 0x8B82; GL_ARRAY_BUFFER :u32: 0x8892; GL_ELEMENT_ARRAY_BUFFER :u32: 0x8893; GL_STATIC_DRAW :u32: 0x88E4; GL_COLOR_BUFFER_BIT :u32: 0x4000; GL_DEPTH_BUFFER_BIT :u32: 0x0100; GL_FRONT_AND_BACK :u32: 0x0408; GL_LINE :u32: 0x1B01; GL_FILL :u32: 0x1B02; // Function pointer variables (mutable, loaded at runtime) glClearColor : (f32, f32, f32, f32) -> void = ---; glClear : (u32) -> void = ---; glEnable : (u32) -> void = ---; glDisable : (u32) -> void = ---; glViewport : (s32, s32, s32, s32) -> void = ---; glDrawArrays : (u32, s32, s32) -> void = ---; glPolygonMode : (u32, u32) -> void = ---; glLineWidth : (f32) -> void = ---; glCreateShader : (u32) -> u32 = ---; glShaderSource : (u32, s32, *[:0]u8, *s32) -> void = ---; glCompileShader : (u32) -> void = ---; glGetShaderiv : (u32, u32, *s32) -> void = ---; glGetShaderInfoLog : (u32, s32, *s32, [*]u8) -> void = ---; glCreateProgram : () -> u32 = ---; glAttachShader : (u32, u32) -> void = ---; glLinkProgram : (u32) -> void = ---; glGetProgramiv : (u32, u32, *s32) -> void = ---; glGetProgramInfoLog : (u32, s32, *s32, [*]u8) -> void = ---; glUseProgram : (u32) -> void = ---; glDeleteShader : (u32) -> void = ---; glGenVertexArrays : (s32, *u32) -> void = ---; glGenBuffers : (s32, *u32) -> void = ---; glBindVertexArray : (u32) -> void = ---; glBindBuffer : (u32, u32) -> void = ---; glBufferData : (u32, s64, *void, u32) -> void = ---; glVertexAttribPointer : (u32, s32, u32, u8, s32, *void) -> void = ---; glEnableVertexAttribArray : (u32) -> void = ---; glGetUniformLocation : (u32, [:0]u8) -> s32 = ---; glUniformMatrix4fv : (s32, s32, u8, [16]f32) -> void = ---; glUniform3f : (s32, f32, f32, f32) -> void = ---; glDepthFunc : (u32) -> void = ---; glUniform1f : (s32, f32) -> void = ---; GL_LESS :u32: 0x0201; GL_LEQUAL :u32: 0x0203; // Loader: call once after creating GL context // Pass in a proc loader (e.g. SDL_GL_GetProcAddress) load_gl :: (get_proc: ([:0]u8) -> *void) { glClearColor = xx get_proc("glClearColor"); glClear = xx get_proc("glClear"); glEnable = xx get_proc("glEnable"); glDisable = xx get_proc("glDisable"); glViewport = xx get_proc("glViewport"); glDrawArrays = xx get_proc("glDrawArrays"); glPolygonMode = xx get_proc("glPolygonMode"); glLineWidth = xx get_proc("glLineWidth"); glCreateShader = xx get_proc("glCreateShader"); glShaderSource = xx get_proc("glShaderSource"); glCompileShader = xx get_proc("glCompileShader"); glGetShaderiv = xx get_proc("glGetShaderiv"); glGetShaderInfoLog = xx get_proc("glGetShaderInfoLog"); glCreateProgram = xx get_proc("glCreateProgram"); glAttachShader = xx get_proc("glAttachShader"); glLinkProgram = xx get_proc("glLinkProgram"); glGetProgramiv = xx get_proc("glGetProgramiv"); glGetProgramInfoLog = xx get_proc("glGetProgramInfoLog"); glUseProgram = xx get_proc("glUseProgram"); glDeleteShader = xx get_proc("glDeleteShader"); glGenVertexArrays = xx get_proc("glGenVertexArrays"); glGenBuffers = xx get_proc("glGenBuffers"); glBindVertexArray = xx get_proc("glBindVertexArray"); glBindBuffer = xx get_proc("glBindBuffer"); glBufferData = xx get_proc("glBufferData"); glVertexAttribPointer = xx get_proc("glVertexAttribPointer"); glEnableVertexAttribArray = xx get_proc("glEnableVertexAttribArray"); glGetUniformLocation = xx get_proc("glGetUniformLocation"); glUniformMatrix4fv = xx get_proc("glUniformMatrix4fv"); glUniform3f = xx get_proc("glUniform3f"); glDepthFunc = xx get_proc("glDepthFunc"); glUniform1f = xx get_proc("glUniform1f"); }