Archived
1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
skcblitz/gl_loader.h
2025-09-02 14:43:36 +02:00

195 lines
7.8 KiB
C

#ifdef GLFNC_DEBUG
void gl_check_error(const char *name);
#define OGL_NNAME(f) gl_debug_ ## f
#define OGL_DFUNCV(f, t, u) void gl_checked_ ## f t { OGL_NNAME(f)u; gl_check_error(STRINGIZE(f)); }
#define OGL_DFUNCR(r, f, t, u) r gl_checked_ ## f t { r ret; ret = OGL_NNAME(f)u; gl_check_error(STRINGIZE(f)); return ret; }
#else
void sys_panic(const char *error, const char *fmt, ...);
#define OGL_DEFINE(r, f, z) r (*OGL_NNAME(f))z;
#define OGL_CHECKPTR(f) sys_assert(OGL_NNAME(f)); logt(LOG_GFX, "%s -> $%llx", STRINGIZE(f), OGL_NNAME(f)); cnt++;
#define OGL_ISETPTR(r, f, z) OGL_NNAME(f) = (r (*)z)(load(STRINGIZE(f))); OGL_CHECKPTR(f)
#define OGL_NNAME(f) f
#define OGL_DFUNCV(f, t, u)
#define OGL_DFUNCR(r, f, t, u)
#endif
#ifdef GLFNC_DEBUG
#define OGL_SETPTR(r, f, z) OGL_ISETPTR(r, f, z) f = gl_checked_ ## f;
#else
#define OGL_SETPTR(r, f, z) OGL_ISETPTR(r, f, z)
#endif
#define OGL_DEF(f) OGL_DEFINE(void, f, ()) \
OGL_DFUNCV(f, (), ())
#define OGL_DEFR(r, f) OGL_DEFINE(r, f, ()) \
OGL_DFUNCR(r, f, (), ())
#define OGL_DEF1(f, p1) OGL_DEFINE(void, f, (p1)) \
OGL_DFUNCV(f, (p1 v1), (v1))
#define OGL_DEFR1(r, f, p1) OGL_DEFINE(r, f, (p1)) \
OGL_DFUNCR(r, f, (p1 v1), (v1))
#define OGL_DEF2(f, p1, p2) OGL_DEFINE(void, f, (p1, p2)) \
OGL_DFUNCV(f, (p1 v1, p2 v2), (v1, v2))
#define OGL_DEFR2(r, f, p1, p2) OGL_DEFINE(r, f, (p1, p2)) \
OGL_DFUNCR(r, f, (p1 v1, p2 v2), (v1, v2))
#define OGL_DEF3(f, p1, p2, p3) OGL_DEFINE(void, f, (p1, p2, p3)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3), (v1, v2, v3))
#define OGL_DEFR3(r, f, p1, p2, p3) OGL_DEFINE(r, f, (p1, p2, p3)) \
OGL_DFUNCR(r, f, (p1 v1, p2 v2, p3 v3), (v1, v2, v3))
#define OGL_DEF4(f, p1, p2, p3, p4) OGL_DEFINE(void, f, (p1, p2, p3, p4)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4), (v1, v2, v3, v4))
#define OGL_DEFR4(r, f, p1, p2, p3, p4) OGL_DEFINE(r, f, (p1, p2, p3, p4)) \
OGL_DFUNCR(r, f, (p1 v1, p2 v2, p3 v3, p4 v4), (v1, v2, v3, v4))
#define OGL_DEF5(f, p1, p2, p3, p4, p5) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5), (v1, v2, v3, v4, v5))
#define OGL_DEF6(f, p1, p2, p3, p4, p5, p6) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6), (v1, v2, v3, v4, v5, v6))
#define OGL_DEF7(f, p1, p2, p3, p4, p5, p6, p7) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7), (v1, v2, v3, v4, v5, v6, v7))
#define OGL_DEF8(f, p1, p2, p3, p4, p5, p6, p7, p8) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8), (v1, v2, v3, v4, v5, v6, v7, v8))
#define OGL_DEFR8(r, f, p1, p2, p3, p4, p5, p6, p7, p8) OGL_DEFINE(r, f, (p1, p2, p3, p4, p5, p6, p7, p8)) \
OGL_DFUNCR(r, f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8), (v1, v2, v3, v4, v5, v6, v7, v8))
#define OGL_DEF9(f, p1, p2, p3, p4, p5, p6, p7, p8, p9) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8, p9 v9), (v1, v2, v3, v4, v5, v6, v7, v8, v9))
#define OGL_DEF10(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8, p9 v9, p10 v10), (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10))
#define OGL_DEF11(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8, p9 v9, p10 v10, p11 v11), (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11))
#define OGL_DEF12(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8, p9 v9, p10 v10, p11 v11, p12 v12), (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12))
#define OGL_DEF15(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) OGL_DEFINE(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)) \
OGL_DFUNCV(f, (p1 v1, p2 v2, p3 v3, p4 v4, p5 v5, p6 v6, p7 v7, p8 v8, p9 v9, p10 v10, p11 v11, p12 v12, p13 v13, p14 v14, p15 v15), (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15))
#include "gl_functions.h"
#undef OGL_DEF
#undef OGL_DEFR
#undef OGL_DEF1
#undef OGL_DEFR1
#undef OGL_DEF2
#undef OGL_DEFR2
#undef OGL_DEF3
#undef OGL_DEFR3
#undef OGL_DEF4
#undef OGL_DEFR4
#undef OGL_DEF5
#undef OGL_DEF6
#undef OGL_DEF7
#undef OGL_DEF8
#undef OGL_DEFR8
#undef OGL_DEF9
#undef OGL_DEF10
#undef OGL_DEF11
#undef OGL_DEF12
#undef OGL_DEF15
#ifdef GLFNC_DEBUG
#define OGL_TESTERROR OGL_NNAME(glGetError)
void gl_check_error(const char *name) {
uint error;
if((error = OGL_TESTERROR()) != GL_NO_ERROR) {
loge(LOG_GFX, STR_OGL_ERR, error, name);
}
}
#endif
#define OGL_DEF(f) OGL_SETPTR(void, f, ())
#define OGL_DEFR(r, f) OGL_SETPTR(r, f, ())
#define OGL_DEF1(f, p1) OGL_SETPTR(void, f, (p1))
#define OGL_DEFR1(r, f, p1) OGL_SETPTR(r, f, (p1))
#define OGL_DEF2(f, p1, p2) OGL_SETPTR(void, f, (p1, p2))
#define OGL_DEFR2(r, f, p1, p2) OGL_SETPTR(r, f, (p1, p2))
#define OGL_DEF3(f, p1, p2, p3) OGL_SETPTR(void, f, (p1, p2, p3))
#define OGL_DEFR3(r, f, p1, p2, p3) OGL_SETPTR(r, f, (p1, p2, p3))
#define OGL_DEF4(f, p1, p2, p3, p4) OGL_SETPTR(void, f, (p1, p2, p3, p4))
#define OGL_DEFR4(r, f, p1, p2, p3, p4) OGL_SETPTR(r, f, (p1, p2, p3, p4))
#define OGL_DEF5(f, p1, p2, p3, p4, p5) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5))
#define OGL_DEF6(f, p1, p2, p3, p4, p5, p6) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6))
#define OGL_DEF7(f, p1, p2, p3, p4, p5, p6, p7) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7))
#define OGL_DEF8(f, p1, p2, p3, p4, p5, p6, p7, p8) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8))
#define OGL_DEFR8(r, f, p1, p2, p3, p4, p5, p6, p7, p8) OGL_SETPTR(r, f, (p1, p2, p3, p4, p5, p6, p7, p8))
#define OGL_DEF9(f, p1, p2, p3, p4, p5, p6, p7, p8, p9) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9))
#define OGL_DEF10(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
#define OGL_DEF11(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11))
#define OGL_DEF12(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12))
#define OGL_DEF15(f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) OGL_SETPTR(void, f, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15))
int
#ifdef GLFNC_DEBUG
gl_load_dbg_funcs
#else
gl_load_functions
#endif
(void * (*load)(const char *)) {
int cnt = 0;
#include "gl_functions.h"
logd(LOG_GFX, STR_OGL_LOADED, cnt);
return cnt;
}
#undef OGL_DEF
#undef OGL_DEFR
#undef OGL_DEF1
#undef OGL_DEFR1
#undef OGL_DEF2
#undef OGL_DEFR2
#undef OGL_DEF3
#undef OGL_DEFR3
#undef OGL_DEF4
#undef OGL_DEFR4
#undef OGL_DEF5
#undef OGL_DEF6
#undef OGL_DEF7
#undef OGL_DEF8
#undef OGL_DEFR8
#undef OGL_DEF9
#undef OGL_DEF10
#undef OGL_DEF11
#undef OGL_DEF12
#undef OGL_DEF15
#ifdef GLFNC_DEBUG
#define OGL_TESTSTRING OGL_NNAME(glGetString)
byte gl_init(void * (*load)(const char *), byte debug) {
int major, minor;
const char* version;
OGL_TESTSTRING = (const byte * (*)(uint))(load("glGetString"));
if((OGL_TESTSTRING == NULL) || !(version = OGL_TESTSTRING(GL_VERSION))) {
loge(LOG_GFX, STR_OGL_LOADER_ERR);
return 0;
}
if(!strncmp(version, "OpenGL ES", 9) || (sscanf(version, "%d.%d", &major, &minor) != 2)) {
loge(LOG_GFX, STR_OGL_COMPAT, version);
return 0;
}
if(major < 4 || ((major == 4) && (minor < 6))) {
loge(LOG_GFX, STR_OGL_OLD, major, minor);
return 0;
}
if(debug)
gl_load_dbg_funcs(load);
else
gl_load_functions(load);
return 1;
}
#undef GLFNC_DEBUG
#else
#define GLFNC_DEBUG
#endif
#undef OGL_NNAME
#undef OGL_DFUNCV
#undef OGL_DFUNCR
#undef OGL_SETPTR