196 lines
7.8 KiB
C
196 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
|