Selaa lähdekoodia

rglLoad: compress code duplication with an X-macro

rexim 5 päivää sitten
vanhempi
commit
6f577f07d0
1 muutettua tiedostoa jossa 59 lisäystä ja 152 poistoa
  1. 59 152
      rglLoad.h

+ 59 - 152
rglLoad.h

@@ -115,82 +115,46 @@ typedef ptrdiff_t GLsizeiptr;
 typedef void (*RGLapiproc)(void);
 typedef RGLapiproc (*RGLloadfunc)(const char *name);
 
-typedef void (*glShaderSourcePROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
-typedef GLuint (*glCreateShaderPROC) (GLenum type);
-typedef void (*glCompileShaderPROC) (GLuint shader);
-typedef GLuint (*glCreateProgramPROC) (void);
-typedef void (*glAttachShaderPROC) (GLuint program, GLuint shader);
-typedef void (*glBindAttribLocationPROC) (GLuint program, GLuint index, const GLchar *name);
-typedef void (*glLinkProgramPROC) (GLuint program);
-typedef void (*glBindBufferPROC) (GLenum target, GLuint buffer);
-typedef void (*glBufferDataPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-typedef void (*glEnableVertexAttribArrayPROC) (GLuint index);
-typedef void (*glVertexAttribPointerPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-typedef void (*glDisableVertexAttribArrayPROC) (GLuint index);
-typedef void (*glDeleteBuffersPROC) (GLsizei n, const GLuint *buffers);
-typedef void (*glDeleteVertexArraysPROC) (GLsizei n, const GLuint *arrays);
-typedef void (*glUseProgramPROC) (GLuint program);
-typedef void (*glDetachShaderPROC) (GLuint program, GLuint shader);
-typedef void (*glDeleteShaderPROC) (GLuint shader);
-typedef void (*glDeleteProgramPROC) (GLuint program);
-typedef void (*glBufferSubDataPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
-typedef void (*glGetShaderivPROC)(GLuint shader, GLenum pname, GLint *params);
-typedef void (*glGetShaderInfoLogPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (*glGetProgramivPROC)(GLuint program, GLenum pname, GLint *params);
-typedef void (*glGetProgramInfoLogPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (*glGenVertexArraysPROC)(GLsizei n, GLuint *arrays);
-typedef void (*glGenBuffersPROC)(GLsizei n, GLuint *buffers);
-typedef void (*glBindVertexArrayPROC)(GLuint array);
-typedef GLint (*glGetUniformLocationPROC)(GLuint program, const GLchar *name);
-typedef void (*glUniformMatrix4fvPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (*glTexImage2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-typedef void (*glActiveTexturePROC) (GLenum texture);
-typedef void (*glDebugMessageCallbackPROC)(void* callback, const void*);
-typedef void (*glDrawElementsPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices);
-typedef void (*glClearPROC)(GLbitfield mask);
-typedef void (*glClearColorPROC)(GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (*glUniform2fPROC)(GLint location, GLfloat v0, GLfloat v1);
-typedef void (*glUniform4fPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (*glUniform1iPROC)(GLint location, GLint v0);
-
-glShaderSourcePROC glShaderSourceSRC = NULL;
-glCreateShaderPROC glCreateShaderSRC = NULL;
-glCompileShaderPROC glCompileShaderSRC = NULL;
-glCreateProgramPROC glCreateProgramSRC = NULL;
-glAttachShaderPROC glAttachShaderSRC = NULL;
-glBindAttribLocationPROC glBindAttribLocationSRC = NULL;
-glLinkProgramPROC glLinkProgramSRC = NULL;
-glBindBufferPROC glBindBufferSRC = NULL;
-glBufferDataPROC glBufferDataSRC = NULL;
-glEnableVertexAttribArrayPROC glEnableVertexAttribArraySRC = NULL;
-glVertexAttribPointerPROC glVertexAttribPointerSRC = NULL;
-glDisableVertexAttribArrayPROC glDisableVertexAttribArraySRC = NULL;
-glDeleteBuffersPROC glDeleteBuffersSRC = NULL;
-glDeleteVertexArraysPROC glDeleteVertexArraysSRC = NULL;
-glUseProgramPROC glUseProgramSRC = NULL;
-glDetachShaderPROC glDetachShaderSRC = NULL;
-glDeleteShaderPROC glDeleteShaderSRC = NULL;
-glDeleteProgramPROC glDeleteProgramSRC = NULL;
-glBufferSubDataPROC glBufferSubDataSRC = NULL;
-glGetShaderivPROC glGetShaderivSRC = NULL;
-glGetShaderInfoLogPROC glGetShaderInfoLogSRC = NULL;
-glGetProgramivPROC glGetProgramivSRC = NULL;
-glGetProgramInfoLogPROC glGetProgramInfoLogSRC = NULL;
-glGenVertexArraysPROC glGenVertexArraysSRC = NULL;
-glGenBuffersPROC glGenBuffersSRC = NULL;
-glBindVertexArrayPROC glBindVertexArraySRC = NULL;
-glGetUniformLocationPROC glGetUniformLocationSRC = NULL;
-glUniformMatrix4fvPROC glUniformMatrix4fvSRC = NULL;
-glActiveTexturePROC glActiveTextureSRC = NULL;
-glDebugMessageCallbackPROC glDebugMessageCallbackSRC = NULL;
-glDrawElementsPROC glDrawElementsSRC = NULL;
-glClearPROC glClearSRC = NULL;
-glClearColorPROC glClearColorSRC = NULL;
-glUniform4fPROC glUniform4fSRC = NULL;
-glUniform2fPROC glUniform2fSRC = NULL;
-glUniform1iPROC glUniform1iSRC = NULL;
-
-#define glActiveTexture glActiveTextureSRC
+#define PROCS \
+    PROC(void, glShaderSource, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) \
+    PROC(GLuint, glCreateShader, GLenum type) \
+    PROC(void, glCompileShader, GLuint shader) \
+    PROC(GLuint, glCreateProgram, void) \
+    PROC(void, glAttachShader, GLuint program, GLuint shader) \
+    PROC(void, glBindAttribLocation, GLuint program, GLuint index, const GLchar *name) \
+    PROC(void, glLinkProgram, GLuint program) \
+    PROC(void, glBindBuffer, GLenum target, GLuint buffer) \
+    PROC(void, glBufferData, GLenum target, GLsizeiptr size, const void *data, GLenum usage) \
+    PROC(void, glEnableVertexAttribArray, GLuint index) \
+    PROC(void, glVertexAttribPointer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) \
+    PROC(void, glDisableVertexAttribArray, GLuint index) \
+    PROC(void, glDeleteBuffers, GLsizei n, const GLuint *buffers) \
+    PROC(void, glDeleteVertexArrays, GLsizei n, const GLuint *arrays) \
+    PROC(void, glUseProgram, GLuint program) \
+    PROC(void, glDetachShader, GLuint program, GLuint shader) \
+    PROC(void, glDeleteShader, GLuint shader) \
+    PROC(void, glDeleteProgram, GLuint program) \
+    PROC(void, glBufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const void *data) \
+    PROC(void, glGetShaderiv, GLuint shader, GLenum pname, GLint *params) \
+    PROC(void, glGetShaderInfoLog, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+    PROC(void, glGetProgramiv, GLuint program, GLenum pname, GLint *params) \
+    PROC(void, glGetProgramInfoLog, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+    PROC(void, glGenVertexArrays, GLsizei n, GLuint *arrays) \
+    PROC(void, glGenBuffers, GLsizei n, GLuint *buffers) \
+    PROC(void, glBindVertexArray, GLuint array) \
+    PROC(GLint, glGetUniformLocation, GLuint program, const GLchar *name) \
+    PROC(void, glUniformMatrix4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \
+    PROC(void, glTexImage2D, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) \
+    PROC(void, glActiveTexture, GLenum texture) \
+    PROC(void, glDebugMessageCallback, void* callback, const void*) \
+    PROC(void, glDrawElements, GLenum mode, GLsizei count, GLenum type, const void * indices) \
+    PROC(void, glClear, GLbitfield mask) \
+    PROC(void, glClearColor, GLfloat, GLfloat, GLfloat, GLfloat) \
+    PROC(void, glUniform2f, GLint location, GLfloat v0, GLfloat v1) \
+    PROC(void, glUniform4f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
+    PROC(void, glUniform1i, GLint location, GLint v0)
+
+// I wish I could generate these defines with the X-macro too...
 #define glShaderSource glShaderSourceSRC
 #define glCreateShader glCreateShaderSRC
 #define glCompileShader glCompileShaderSRC
@@ -219,99 +183,42 @@ glUniform1iPROC glUniform1iSRC = NULL;
 #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 glUniform4f glUniform4fSRC
 #define glUniform2f glUniform2fSRC
+#define glUniform4f glUniform4fSRC
 #define glUniform1i glUniform1iSRC
 
-extern int RGL_loadGL3(RGLloadfunc proc);
+#define PROC(ret, name, ...) typedef ret (*name##PROC)(__VA_ARGS__);
+PROCS
+#undef PROC
+
+#define PROC(ret, name, ...) name##PROC name##SRC = NULL;
+PROCS
+#undef PROC
 
-#include <stdio.h>
+int RGL_loadGL3(RGLloadfunc proc);
 
-const GLubyte * gluErrorString(	GLenum error);
+#endif // RGL_H
 
 #ifdef RGL_LOAD_IMPLEMENTATION
 int RGL_loadGL3(RGLloadfunc proc) {
-    RGL_PROC_DEF(proc, glShaderSource);
-    RGL_PROC_DEF(proc, glCreateShader);
-    RGL_PROC_DEF(proc, glCompileShader);
-    RGL_PROC_DEF(proc, glCreateProgram);
-    RGL_PROC_DEF(proc, glAttachShader);
-    RGL_PROC_DEF(proc, glBindAttribLocation);
-    RGL_PROC_DEF(proc, glLinkProgram);
-    RGL_PROC_DEF(proc, glBindBuffer);
-    RGL_PROC_DEF(proc, glBufferData);
-    RGL_PROC_DEF(proc, glEnableVertexAttribArray);
-    RGL_PROC_DEF(proc, glVertexAttribPointer);
-    RGL_PROC_DEF(proc, glDisableVertexAttribArray);
-    RGL_PROC_DEF(proc, glDeleteBuffers);
-    RGL_PROC_DEF(proc, glDeleteVertexArrays);
-    RGL_PROC_DEF(proc, glUseProgram);
-    RGL_PROC_DEF(proc, glDetachShader);
-    RGL_PROC_DEF(proc, glDeleteShader);
-    RGL_PROC_DEF(proc, glDeleteProgram);
-    RGL_PROC_DEF(proc, glBufferSubData);
-    RGL_PROC_DEF(proc, glGetShaderiv);
-    RGL_PROC_DEF(proc, glGetShaderInfoLog);
-    RGL_PROC_DEF(proc, glGetProgramiv);
-    RGL_PROC_DEF(proc, glGetProgramInfoLog);
-    RGL_PROC_DEF(proc, glGenVertexArrays);
-    RGL_PROC_DEF(proc, glGenBuffers);
-    RGL_PROC_DEF(proc, glBindVertexArray);
-    RGL_PROC_DEF(proc, glGetUniformLocation);
-    RGL_PROC_DEF(proc, glUniformMatrix4fv);
-    RGL_PROC_DEF(proc, glActiveTexture);
-    RGL_PROC_DEF(proc, glDebugMessageCallback);
-    RGL_PROC_DEF(proc, glDrawElements);
-    RGL_PROC_DEF(proc, glClear);
-    RGL_PROC_DEF(proc, glClearColor);
-    RGL_PROC_DEF(proc, glUniform2f);
-    RGL_PROC_DEF(proc, glUniform4f);
-    RGL_PROC_DEF(proc, glUniform1i);
-
-    if (
-        glShaderSourceSRC == NULL ||
-        glCreateShaderSRC == NULL ||
-        glCompileShaderSRC == NULL ||
-        glCreateProgramSRC == NULL ||
-        glAttachShaderSRC == NULL ||
-        glBindAttribLocationSRC == NULL ||
-        glLinkProgramSRC == NULL ||
-        glBindBufferSRC == NULL ||
-        glBufferDataSRC == NULL ||
-        glEnableVertexAttribArraySRC == NULL ||
-        glVertexAttribPointerSRC == NULL ||
-        glDisableVertexAttribArraySRC == NULL ||
-        glDeleteBuffersSRC == NULL ||
-        glDeleteVertexArraysSRC == NULL ||
-        glUseProgramSRC == NULL ||
-        glDetachShaderSRC == NULL ||
-        glDeleteShaderSRC == NULL ||
-        glDeleteProgramSRC == NULL ||
-        glBufferSubDataSRC == NULL ||
-        glGetShaderivSRC == NULL ||
-        glGetShaderInfoLogSRC == NULL ||
-        glGetProgramivSRC == NULL ||
-        glGetProgramInfoLogSRC == NULL ||
-        glGenVertexArraysSRC == NULL ||
-        glGenBuffersSRC == NULL ||
-        glBindVertexArraySRC == NULL ||
-        glGetUniformLocationSRC == NULL ||
-        glUniformMatrix4fvSRC == NULL
-    )
-        return 1;
+    #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;
+    if (vao == 0) return 1;
 
     glDeleteVertexArraysSRC(1, &vao);
     return 0;
 }
-#endif
-#endif
+#endif  // RGL_LOAD_IMPLEMENTATION