dlib/opengl/opengl.d
2026-05-17 15:43:10 +10:00

144 lines
6.4 KiB
D

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;
}