#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