import dlib.aliases; import dlib.util; import dlib.alloc; static if(NativeTarget) { import dlibincludes; public import opengl_native; } else { public import opengl_wasm; } public import glenum; __gshared bool FUNCS_LOADED = false; version(linux) { alias GLLoadFunc = glXGetProcAddressARB; } else static assert(false, "GL function loader alias not set for platform"); bool GLLoadFuncs() { glDeleteRenderbuffers = cast(typeof(glDeleteRenderbuffers))GLLoadFunc(cast(u8*)"glDeleteRenderbuffers".ptr); glGenRenderbuffers = cast(typeof(glGenRenderbuffers))GLLoadFunc(cast(u8*)"glGenRenderbuffers".ptr); glGenVertexArrays = cast(typeof(glGenVertexArrays))GLLoadFunc(cast(u8*)"glGenVertexArrays".ptr); glDeleteVertexArrays = cast(typeof(glDeleteVertexArrays))GLLoadFunc(cast(u8*)"glDeleteVertexArrays".ptr); glGenBuffers = cast(typeof(glGenBuffers))GLLoadFunc(cast(u8*)"glGenBuffers".ptr); glCompileShader = cast(typeof(glCompileShader))GLLoadFunc(cast(u8*)"glCompileShader".ptr); glUseProgram = cast(typeof(glUseProgram))GLLoadFunc(cast(u8*)"glUseProgram".ptr); glValidateProgram = cast(typeof(glValidateProgram))GLLoadFunc(cast(u8*)"glValidateProgram".ptr); glBindBufferBase = cast(typeof(glBindBufferBase))GLLoadFunc(cast(u8*)"glBindBufferBase".ptr); glGetUniformBlockIndex = cast(typeof(glGetUniformBlockIndex))GLLoadFunc(cast(u8*)"glGetUniformBlockIndex".ptr); glEnableVertexAttribArray = cast(typeof(glEnableVertexAttribArray))GLLoadFunc(cast(u8*)"glEnableVertexAttribArray".ptr); glDisableVertexAttribArray = cast(typeof(glDisableVertexAttribArray))GLLoadFunc(cast(u8*)"glDisableVertexAttribArray".ptr); glBlendFuncSeparate = cast(typeof(glBlendFuncSeparate))GLLoadFunc(cast(u8*)"glBlendFuncSeparate".ptr); glBindVertexArray = cast(typeof(glBindVertexArray))GLLoadFunc(cast(u8*)"glBindVertexArray".ptr); glBindBuffer = cast(typeof(glBindBuffer))GLLoadFunc(cast(u8*)"glBindBuffer".ptr); glBufferData = cast(typeof(glBufferData))GLLoadFunc(cast(u8*)"glBufferData".ptr); glBufferSubData = cast(typeof(glBufferSubData))GLLoadFunc(cast(u8*)"glBufferSubData".ptr); glVertexAttribDivisor = cast(typeof(glVertexAttribDivisor))GLLoadFunc(cast(u8*)"glVertexAttribDivisor".ptr); glVertexAttribPointer = cast(typeof(glVertexAttribPointer))GLLoadFunc(cast(u8*)"glVertexAttribPointer".ptr); glDrawArraysInstanced = cast(typeof(glDrawArraysInstanced))GLLoadFunc(cast(u8*)"glDrawArraysInstanced".ptr); glDrawElementsInstanced = cast(typeof(glDrawElementsInstanced))GLLoadFunc(cast(u8*)"glDrawElementsInstanced".ptr); glGetUniformLocation = cast(typeof(glGetUniformLocation))GLLoadFunc(cast(u8*)"glGetUniformLocation".ptr); glUniform1f = cast(typeof(glUniform1f))GLLoadFunc(cast(u8*)"glUniform1f".ptr); glUniform2f = cast(typeof(glUniform2f))GLLoadFunc(cast(u8*)"glUniform2f".ptr); glUniform3f = cast(typeof(glUniform3f))GLLoadFunc(cast(u8*)"glUniform3f".ptr); glUniform4f = cast(typeof(glUniform4f))GLLoadFunc(cast(u8*)"glUniform4f".ptr); glUniform1i = cast(typeof(glUniform1i))GLLoadFunc(cast(u8*)"glUniform1i".ptr); glUniform2i = cast(typeof(glUniform2i))GLLoadFunc(cast(u8*)"glUniform2i".ptr); glUniform3i = cast(typeof(glUniform3i))GLLoadFunc(cast(u8*)"glUniform3i".ptr); glUniform4i = cast(typeof(glUniform4i))GLLoadFunc(cast(u8*)"glUniform4i".ptr); glCreateProgram = cast(typeof(glCreateProgram))GLLoadFunc(cast(u8*)"glCreateProgram".ptr); glCreateShader = cast(typeof(glCreateShader))GLLoadFunc(cast(u8*)"glCreateShader".ptr); glDeleteFramebuffers = cast(typeof(glDeleteFramebuffers))GLLoadFunc(cast(u8*)"glDeleteFramebuffers".ptr); glDeleteProgram = cast(typeof(glDeleteProgram))GLLoadFunc(cast(u8*)"glDeleteProgram".ptr); glDeleteShader = cast(typeof(glDeleteShader))GLLoadFunc(cast(u8*)"glDeleteShader".ptr); glShaderSource = cast(typeof(glShaderSource))GLLoadFunc(cast(u8*)"glShaderSource".ptr); glGetProgramiv = cast(typeof(glGetProgramiv))GLLoadFunc(cast(u8*)"glGetProgramiv".ptr); glGetProgramInfoLog = cast(typeof(glGetProgramInfoLog))GLLoadFunc(cast(u8*)"glGetProgramInfoLog".ptr); glGetShaderiv = cast(typeof(glGetShaderiv))GLLoadFunc(cast(u8*)"glGetShaderiv".ptr); glGetShaderInfoLog = cast(typeof(glGetShaderInfoLog))GLLoadFunc(cast(u8*)"glGetShaderInfoLog".ptr); glAttachShader = cast(typeof(glAttachShader))GLLoadFunc(cast(u8*)"glAttachShader".ptr); glLinkProgram = cast(typeof(glLinkProgram))GLLoadFunc(cast(u8*)"glLinkProgram".ptr); static if(!__traits(compiles, { glActiveTexture(0x84C0); })) { glActiveTexture = cast(typeof(glActiveTexture))GLLoadFunc(cast(u8*)"glActiveTexture".ptr); } return glDeleteRenderbuffers != null; } u32 GLCreateShader(GLEnum shader_type, string[] shader_src) { i32[32] src_lengths; immutable(char)*[32] src_ptrs; for(usize i = 0; i < shader_src.length; i += 1) { src_ptrs[i] = shader_src[i].ptr; src_lengths[i] = cast(i32)shader_src[i].length; } u32 shader = glCreateShader(shader_type); glShaderSource(shader, cast(u32)shader_src.length, src_ptrs.ptr, src_lengths.ptr); i32 success; glGetShaderiv(shader, GLE.COMPILE_STATUS, &success); if(!success) { char[512] info_log; i32 log_length; glGetShaderInfoLog(shader, cast(u32)info_log.length, &log_length, info_log.ptr); Errf("Error compiling shader: %s", Str(info_log[0 .. log_length])); shader = 0; } return shader; } u32 GLCreateProgramFromSources(string[] vertex_src, string[] fragment_src) { u32 program; u32 vertex_shader = GLCreateShader(GLE.VERTEX_SHADER, vertex_src); u32 fragment_shader = GLCreateShader(GLE.FRAGMENT_SHADER, fragment_src); if(vertex_shader && fragment_shader) { program = glCreateProgram(); glAttachShader(program, vertex_shader); glAttachShader(program, fragment_shader); glLinkProgram(program); i32 success; glGetProgramiv(program, GLE.LINK_STATUS, &success); if(!success) { char[512] info_log; i32 log_length; glGetProgramInfoLog(program, cast(u32)info_log.length, &log_length, info_log.ptr); Errf("Error compiling program: %s", Str(info_log[0 .. log_length])); program = 0; } } if(!program) { Errf("Failed to create program!"); } return program; }