9494#define GL_MAX_TEXTURE_COORDS 0x8871
9595
9696typedef char GLchar ;
97- typedef int GLsizei ;
97+ typedef int GLsizei ;
9898typedef ptrdiff_t GLintptr ;
9999typedef 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__);
197199PROCS
@@ -201,24 +203,17 @@ PROCS
201203PROCS
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