浏览代码

Slop together rudimentary lazy loading of OpenGL functions

rexim 4 天之前
父节点
当前提交
4b98731dd0
共有 3 个文件被更改,包括 54 次插入61 次删除
  1. 1 1
      Makefile
  2. 0 2
      src/main_rgfw.c
  3. 53 58
      src/rglLoad.h

+ 1 - 1
Makefile

@@ -1,6 +1,6 @@
 UNAMEOS = $(shell uname)
 
-COMMON_CFLAGS=		-Wall -Wextra -std=c99 -pedantic -Ithirdparty -Ibuild
+COMMON_CFLAGS=		-Wall -Wextra -ggdb -std=c99 -pedantic -Ithirdparty -Ibuild
 SDL2_CFLAGS=		`pkg-config --cflags sdl2` $(COMMON_CFLAGS)
 RGFW_CFLAGS=		$(COMMON_CFLAGS)
 COMMON_LIBS=		-lm

+ 0 - 2
src/main_rgfw.c

@@ -238,8 +238,6 @@ int main(int argc, char **argv)
     RGFW_rect win_rect = RGFW_RECT(0, 0, TEXT_WIDTH, TEXT_HEIGHT*2);
     RGFW_window* win = RGFW_createWindow("sowon (RGFW)", win_rect, 0);
 
-    if (RGL_loadGL3((RGLloadfunc)RGFW_getProcAddress)) return 1;
-
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 

+ 53 - 58
src/rglLoad.h

@@ -94,7 +94,7 @@
 #define GL_MAX_TEXTURE_COORDS             0x8871
 
 typedef char GLchar;
-typedef int	 GLsizei;
+typedef int GLsizei;
 typedef ptrdiff_t GLintptr;
 typedef ptrdiff_t GLsizeiptr;
 
@@ -110,11 +110,6 @@ typedef ptrdiff_t GLsizeiptr;
 
 #include <stddef.h>
 
-#define RGL_PROC_DEF(proc, name) name##SRC = (name##PROC)proc(#name)
-
-typedef void (*RGLapiproc)(void);
-typedef RGLapiproc (*RGLloadfunc)(const char *name);
-
 #define PROCS \
     PROC(void, glShaderSource, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) \
     PROC(GLuint, glCreateShader, GLenum type) \
@@ -154,44 +149,51 @@ typedef RGLapiproc (*RGLloadfunc)(const char *name);
     PROC(void, glUniform4f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
     PROC(void, glUniform1i, GLint location, GLint v0)
 
+static inline RGFW_proc load_proc_or_die(const char *name, RGFW_proc *proc);
+
+// Each lazy loaded OpenGL function call might be slighty slower due to an additional condition check, but
+// this is not a performance critical application. Change this to something better when performance issues
+// occur.
+#define LAZY_LOAD_PROC(name) (name##SRC ? name##SRC : (name##PROC)load_proc_or_die(#name, (RGFW_proc*)&name##SRC))
+
 // I wish I could generate these defines with the X-macro too...
-#define glShaderSource glShaderSourceSRC
-#define glCreateShader glCreateShaderSRC
-#define glCompileShader glCompileShaderSRC
-#define glCreateProgram glCreateProgramSRC
-#define glAttachShader glAttachShaderSRC
-#define glBindAttribLocation glBindAttribLocationSRC
-#define glLinkProgram glLinkProgramSRC
-#define glBindBuffer glBindBufferSRC
-#define glBufferData glBufferDataSRC
-#define glEnableVertexAttribArray glEnableVertexAttribArraySRC
-#define glVertexAttribPointer glVertexAttribPointerSRC
-#define glDisableVertexAttribArray glDisableVertexAttribArraySRC
-#define glDeleteBuffers glDeleteBuffersSRC
-#define glDeleteVertexArrays glDeleteVertexArraysSRC
-#define glUseProgram glUseProgramSRC
-#define glDetachShader glDetachShaderSRC
-#define glDeleteShader glDeleteShaderSRC
-#define glDeleteProgram glDeleteProgramSRC
-#define glBufferSubData glBufferSubDataSRC
-#define glGetShaderiv glGetShaderivSRC
-#define glGetShaderInfoLog glGetShaderInfoLogSRC
-#define glGetProgramiv glGetProgramivSRC
-#define glGetProgramInfoLog glGetProgramInfoLogSRC
-#define glGenVertexArrays glGenVertexArraysSRC
-#define glGenBuffers glGenBuffersSRC
-#define glBindVertexArray glBindVertexArraySRC
-#define glGetUniformLocation glGetUniformLocationSRC
-#define glUniformMatrix4fv glUniformMatrix4fvSRC
-#define glTexImage2D glTexImage2DSRC
-#define glActiveTexture glActiveTextureSRC
-#define glDebugMessageCallback glDebugMessageCallbackSRC
-#define glDrawElements glDrawElementsSRC
-#define glClear glClearSRC
-#define glClearColor glClearColorSRC
-#define glUniform2f glUniform2fSRC
-#define glUniform4f glUniform4fSRC
-#define glUniform1i glUniform1iSRC
+#define glShaderSource             LAZY_LOAD_PROC(glShaderSource)
+#define glCreateShader             LAZY_LOAD_PROC(glCreateShader)
+#define glCompileShader            LAZY_LOAD_PROC(glCompileShader)
+#define glCreateProgram            LAZY_LOAD_PROC(glCreateProgram)
+#define glAttachShader             LAZY_LOAD_PROC(glAttachShader)
+#define glBindAttribLocation       LAZY_LOAD_PROC(glBindAttribLocation)
+#define glLinkProgram              LAZY_LOAD_PROC(glLinkProgram)
+#define glBindBuffer               LAZY_LOAD_PROC(glBindBuffer)
+#define glBufferData               LAZY_LOAD_PROC(glBufferData)
+#define glEnableVertexAttribArray  LAZY_LOAD_PROC(glEnableVertexAttribArray)
+#define glVertexAttribPointer      LAZY_LOAD_PROC(glVertexAttribPointer)
+#define glDisableVertexAttribArray LAZY_LOAD_PROC(glDisableVertexAttribArray)
+#define glDeleteBuffers            LAZY_LOAD_PROC(glDeleteBuffers)
+#define glDeleteVertexArrays       LAZY_LOAD_PROC(glDeleteVertexArrays)
+#define glUseProgram               LAZY_LOAD_PROC(glUseProgram)
+#define glDetachShader             LAZY_LOAD_PROC(glDetachShader)
+#define glDeleteShader             LAZY_LOAD_PROC(glDeleteShader)
+#define glDeleteProgram            LAZY_LOAD_PROC(glDeleteProgram)
+#define glBufferSubData            LAZY_LOAD_PROC(glBufferSubData)
+#define glGetShaderiv              LAZY_LOAD_PROC(glGetShaderiv)
+#define glGetShaderInfoLog         LAZY_LOAD_PROC(glGetShaderInfoLog)
+#define glGetProgramiv             LAZY_LOAD_PROC(glGetProgramiv)
+#define glGetProgramInfoLog        LAZY_LOAD_PROC(glGetProgramInfoLog)
+#define glGenVertexArrays          LAZY_LOAD_PROC(glGenVertexArrays)
+#define glGenBuffers               LAZY_LOAD_PROC(glGenBuffers)
+#define glBindVertexArray          LAZY_LOAD_PROC(glBindVertexArray)
+#define glGetUniformLocation       LAZY_LOAD_PROC(glGetUniformLocation)
+#define glUniformMatrix4fv         LAZY_LOAD_PROC(glUniformMatrix4fv)
+#define glTexImage2D               LAZY_LOAD_PROC(glTexImage2D)
+#define glActiveTexture            LAZY_LOAD_PROC(glActiveTexture)
+#define glDebugMessageCallback     LAZY_LOAD_PROC(glDebugMessageCallback)
+#define glDrawElements             LAZY_LOAD_PROC(glDrawElements)
+#define glClear                    LAZY_LOAD_PROC(glClear)
+#define glClearColor               LAZY_LOAD_PROC(glClearColor)
+#define glUniform2f                LAZY_LOAD_PROC(glUniform2f)
+#define glUniform4f                LAZY_LOAD_PROC(glUniform4f)
+#define glUniform1i                LAZY_LOAD_PROC(glUniform1i)
 
 #define PROC(ret, name, ...) typedef ret (*name##PROC)(__VA_ARGS__);
 PROCS
@@ -201,24 +203,17 @@ PROCS
 PROCS
 #undef PROC
 
-int RGL_loadGL3(RGLloadfunc proc);
-
 #endif // RGL_H
 
 #ifdef RGL_LOAD_IMPLEMENTATION
-int RGL_loadGL3(RGLloadfunc proc) {
-    #define PROC(ret, name, ...) \
-        name##SRC = (name##PROC)proc(#name); \
-        if (name##SRC == NULL) return 1;
-    PROCS
-    #undef PROC
-
-    GLuint vao;
-    glGenVertexArraysSRC(1, &vao);
 
-    if (vao == 0) return 1;
-
-    glDeleteVertexArraysSRC(1, &vao);
-    return 0;
+static inline RGFW_proc load_proc_or_die(const char *name, RGFW_proc *proc)
+{
+    printf("INFO: loading OpenGL function %s\n", name);
+    *proc = RGFW_getProcAddress(name);
+    if (*proc) return *proc;
+    fprintf(stderr, "ERROR: could not load OpenGL function %s\n", name);
+    abort();
 }
+
 #endif  // RGL_LOAD_IMPLEMENTATION