Skip to content

Commit 4631d35

Browse files
authored
Merge pull request #50 from tsoding/48-gl-lazy-loading
Slop together rudimentary lazy loading of OpenGL functions
2 parents c710944 + 4b98731 commit 4631d35

File tree

3 files changed

+54
-61
lines changed

3 files changed

+54
-61
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
UNAMEOS = $(shell uname)
22

3-
COMMON_CFLAGS= -Wall -Wextra -std=c99 -pedantic -Ithirdparty -Ibuild
3+
COMMON_CFLAGS= -Wall -Wextra -ggdb -std=c99 -pedantic -Ithirdparty -Ibuild
44
SDL2_CFLAGS= `pkg-config --cflags sdl2` $(COMMON_CFLAGS)
55
RGFW_CFLAGS= $(COMMON_CFLAGS)
66
COMMON_LIBS= -lm

src/main_rgfw.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,6 @@ int main(int argc, char **argv)
238238
RGFW_rect win_rect = RGFW_RECT(0, 0, TEXT_WIDTH, TEXT_HEIGHT*2);
239239
RGFW_window* win = RGFW_createWindow("sowon (RGFW)", win_rect, 0);
240240

241-
if (RGL_loadGL3((RGLloadfunc)RGFW_getProcAddress)) return 1;
242-
243241
glEnable(GL_BLEND);
244242
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
245243

src/rglLoad.h

Lines changed: 53 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
#define GL_MAX_TEXTURE_COORDS 0x8871
9595

9696
typedef char GLchar;
97-
typedef int GLsizei;
97+
typedef int GLsizei;
9898
typedef ptrdiff_t GLintptr;
9999
typedef ptrdiff_t GLsizeiptr;
100100

@@ -110,11 +110,6 @@ typedef ptrdiff_t GLsizeiptr;
110110

111111
#include <stddef.h>
112112

113-
#define RGL_PROC_DEF(proc, name) name##SRC = (name##PROC)proc(#name)
114-
115-
typedef void (*RGLapiproc)(void);
116-
typedef RGLapiproc (*RGLloadfunc)(const char *name);
117-
118113
#define PROCS \
119114
PROC(void, glShaderSource, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) \
120115
PROC(GLuint, glCreateShader, GLenum type) \
@@ -154,44 +149,51 @@ typedef RGLapiproc (*RGLloadfunc)(const char *name);
154149
PROC(void, glUniform4f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
155150
PROC(void, glUniform1i, GLint location, GLint v0)
156151

152+
static inline RGFW_proc load_proc_or_die(const char *name, RGFW_proc *proc);
153+
154+
// Each lazy loaded OpenGL function call might be slighty slower due to an additional condition check, but
155+
// this is not a performance critical application. Change this to something better when performance issues
156+
// occur.
157+
#define LAZY_LOAD_PROC(name) (name##SRC ? name##SRC : (name##PROC)load_proc_or_die(#name, (RGFW_proc*)&name##SRC))
158+
157159
// I wish I could generate these defines with the X-macro too...
158-
#define glShaderSource glShaderSourceSRC
159-
#define glCreateShader glCreateShaderSRC
160-
#define glCompileShader glCompileShaderSRC
161-
#define glCreateProgram glCreateProgramSRC
162-
#define glAttachShader glAttachShaderSRC
163-
#define glBindAttribLocation glBindAttribLocationSRC
164-
#define glLinkProgram glLinkProgramSRC
165-
#define glBindBuffer glBindBufferSRC
166-
#define glBufferData glBufferDataSRC
167-
#define glEnableVertexAttribArray glEnableVertexAttribArraySRC
168-
#define glVertexAttribPointer glVertexAttribPointerSRC
169-
#define glDisableVertexAttribArray glDisableVertexAttribArraySRC
170-
#define glDeleteBuffers glDeleteBuffersSRC
171-
#define glDeleteVertexArrays glDeleteVertexArraysSRC
172-
#define glUseProgram glUseProgramSRC
173-
#define glDetachShader glDetachShaderSRC
174-
#define glDeleteShader glDeleteShaderSRC
175-
#define glDeleteProgram glDeleteProgramSRC
176-
#define glBufferSubData glBufferSubDataSRC
177-
#define glGetShaderiv glGetShaderivSRC
178-
#define glGetShaderInfoLog glGetShaderInfoLogSRC
179-
#define glGetProgramiv glGetProgramivSRC
180-
#define glGetProgramInfoLog glGetProgramInfoLogSRC
181-
#define glGenVertexArrays glGenVertexArraysSRC
182-
#define glGenBuffers glGenBuffersSRC
183-
#define glBindVertexArray glBindVertexArraySRC
184-
#define glGetUniformLocation glGetUniformLocationSRC
185-
#define glUniformMatrix4fv glUniformMatrix4fvSRC
186-
#define glTexImage2D glTexImage2DSRC
187-
#define glActiveTexture glActiveTextureSRC
188-
#define glDebugMessageCallback glDebugMessageCallbackSRC
189-
#define glDrawElements glDrawElementsSRC
190-
#define glClear glClearSRC
191-
#define glClearColor glClearColorSRC
192-
#define glUniform2f glUniform2fSRC
193-
#define glUniform4f glUniform4fSRC
194-
#define glUniform1i glUniform1iSRC
160+
#define glShaderSource LAZY_LOAD_PROC(glShaderSource)
161+
#define glCreateShader LAZY_LOAD_PROC(glCreateShader)
162+
#define glCompileShader LAZY_LOAD_PROC(glCompileShader)
163+
#define glCreateProgram LAZY_LOAD_PROC(glCreateProgram)
164+
#define glAttachShader LAZY_LOAD_PROC(glAttachShader)
165+
#define glBindAttribLocation LAZY_LOAD_PROC(glBindAttribLocation)
166+
#define glLinkProgram LAZY_LOAD_PROC(glLinkProgram)
167+
#define glBindBuffer LAZY_LOAD_PROC(glBindBuffer)
168+
#define glBufferData LAZY_LOAD_PROC(glBufferData)
169+
#define glEnableVertexAttribArray LAZY_LOAD_PROC(glEnableVertexAttribArray)
170+
#define glVertexAttribPointer LAZY_LOAD_PROC(glVertexAttribPointer)
171+
#define glDisableVertexAttribArray LAZY_LOAD_PROC(glDisableVertexAttribArray)
172+
#define glDeleteBuffers LAZY_LOAD_PROC(glDeleteBuffers)
173+
#define glDeleteVertexArrays LAZY_LOAD_PROC(glDeleteVertexArrays)
174+
#define glUseProgram LAZY_LOAD_PROC(glUseProgram)
175+
#define glDetachShader LAZY_LOAD_PROC(glDetachShader)
176+
#define glDeleteShader LAZY_LOAD_PROC(glDeleteShader)
177+
#define glDeleteProgram LAZY_LOAD_PROC(glDeleteProgram)
178+
#define glBufferSubData LAZY_LOAD_PROC(glBufferSubData)
179+
#define glGetShaderiv LAZY_LOAD_PROC(glGetShaderiv)
180+
#define glGetShaderInfoLog LAZY_LOAD_PROC(glGetShaderInfoLog)
181+
#define glGetProgramiv LAZY_LOAD_PROC(glGetProgramiv)
182+
#define glGetProgramInfoLog LAZY_LOAD_PROC(glGetProgramInfoLog)
183+
#define glGenVertexArrays LAZY_LOAD_PROC(glGenVertexArrays)
184+
#define glGenBuffers LAZY_LOAD_PROC(glGenBuffers)
185+
#define glBindVertexArray LAZY_LOAD_PROC(glBindVertexArray)
186+
#define glGetUniformLocation LAZY_LOAD_PROC(glGetUniformLocation)
187+
#define glUniformMatrix4fv LAZY_LOAD_PROC(glUniformMatrix4fv)
188+
#define glTexImage2D LAZY_LOAD_PROC(glTexImage2D)
189+
#define glActiveTexture LAZY_LOAD_PROC(glActiveTexture)
190+
#define glDebugMessageCallback LAZY_LOAD_PROC(glDebugMessageCallback)
191+
#define glDrawElements LAZY_LOAD_PROC(glDrawElements)
192+
#define glClear LAZY_LOAD_PROC(glClear)
193+
#define glClearColor LAZY_LOAD_PROC(glClearColor)
194+
#define glUniform2f LAZY_LOAD_PROC(glUniform2f)
195+
#define glUniform4f LAZY_LOAD_PROC(glUniform4f)
196+
#define glUniform1i LAZY_LOAD_PROC(glUniform1i)
195197

196198
#define PROC(ret, name, ...) typedef ret (*name##PROC)(__VA_ARGS__);
197199
PROCS
@@ -201,24 +203,17 @@ PROCS
201203
PROCS
202204
#undef PROC
203205

204-
int RGL_loadGL3(RGLloadfunc proc);
205-
206206
#endif // RGL_H
207207

208208
#ifdef RGL_LOAD_IMPLEMENTATION
209-
int RGL_loadGL3(RGLloadfunc proc) {
210-
#define PROC(ret, name, ...) \
211-
name##SRC = (name##PROC)proc(#name); \
212-
if (name##SRC == NULL) return 1;
213-
PROCS
214-
#undef PROC
215-
216-
GLuint vao;
217-
glGenVertexArraysSRC(1, &vao);
218209

219-
if (vao == 0) return 1;
220-
221-
glDeleteVertexArraysSRC(1, &vao);
222-
return 0;
210+
static inline RGFW_proc load_proc_or_die(const char *name, RGFW_proc *proc)
211+
{
212+
printf("INFO: loading OpenGL function %s\n", name);
213+
*proc = RGFW_getProcAddress(name);
214+
if (*proc) return *proc;
215+
fprintf(stderr, "ERROR: could not load OpenGL function %s\n", name);
216+
abort();
223217
}
218+
224219
#endif // RGL_LOAD_IMPLEMENTATION

0 commit comments

Comments
 (0)