From b1e857cf1471d1871a9396696b22fa531da98249 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sat, 23 Nov 2024 22:33:43 +0100 Subject: add projbase to repo --- project-base/src/linux/lib_loader.c | 154 ++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 project-base/src/linux/lib_loader.c (limited to 'project-base/src/linux/lib_loader.c') diff --git a/project-base/src/linux/lib_loader.c b/project-base/src/linux/lib_loader.c new file mode 100644 index 0000000..78bc521 --- /dev/null +++ b/project-base/src/linux/lib_loader.c @@ -0,0 +1,154 @@ +#include +#include + +#define __load_lib(_var, _name) _var = dlopen(_name, RTLD_LAZY); +#define __load_lib_or_exit(_var, _name) _var = dlopen(_name, RTLD_LAZY); if (!_var) { printf("Failed to load library %s\n", _name); exit(0); } +#define __load_fnc_or_exit(_ptr, _var) IMP_##_ptr = (DEF_##_ptr)dlsym(_var, #_ptr); if ((uintptr_t)NULL == (uintptr_t)IMP_##_ptr) { printf("Failed to load function %s\n", #_ptr); exit(0); } +#define __def_proc(_return, _name, _params) typedef _return (*DEF_##_name)_params; DEF_##_name IMP_##_name; + +__def_proc( Bool, glXMakeCurrent, (Display *dpy, GLXDrawable drawable, GLXContext ctx)) +//__def_proc( XVisualInfo*, glXChooseVisual, ( Display *dpy, int screen, int *attribList)) +__def_proc( GLXContext, glXCreateContext, ( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct)) +__def_proc( void, glXDestroyContext, (Display *dpy, GLXContext ctx )) +__def_proc( GLXFBConfig*, glXChooseFBConfig, ( Display *dpy, int screen, const int *attribList, int *nitems)) +__def_proc( int, glXGetFBConfigAttrib, (Display *dpy, GLXFBConfig config, int attribute, int *value)) +__def_proc( XVisualInfo*, glXGetVisualFromFBConfig, (Display *dpy, GLXFBConfig config)) +__def_proc( void, glXSwapBuffers, (Display *dpy, GLXDrawable drawable)) +__def_proc( void, glGetBooleanv, (GLenum,GLboolean*)); +__def_proc( void, glDepthMask, (GLboolean)); +__def_proc( void, glColorMask, (GLboolean,GLboolean,GLboolean,GLboolean)); +__def_proc( void, glDepthFunc, (GLenum)); +__def_proc( void, glEnable, (GLenum)); +__def_proc( void, glAlphaFunc, (GLenum,GLclampf)); +__def_proc( void, glBlendFunc, (GLenum,GLenum)); +__def_proc( void, glMatrixMode, (GLenum)); +__def_proc( void, glLoadIdentity, (void)); +__def_proc( void, glViewport, (GLint,GLint,GLsizei,GLsizei)); +__def_proc( void, glClearColor, (GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha)) +__def_proc( void, glClear, (GLbitfield mask)) +__def_proc( void, glRotatef, (GLfloat angle,GLfloat x,GLfloat y,GLfloat z)) +__def_proc( void, glBindTexture, (GLenum target,GLuint texture)) +__def_proc( void, glBegin, (GLenum mode)) +__def_proc( void, glColor4f, (GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha)) +__def_proc( void, glTexCoord2i, (GLint s,GLint t)) +__def_proc( void, glTexCoord2f, (GLfloat s,GLfloat t)) +__def_proc( void, glVertex3i, (GLint x,GLint y,GLint z)) +__def_proc( void, glEnd, (void)) +__def_proc( void, glDisable, (GLenum cap)) +__def_proc( void, glPixelStorei, (GLenum pname,GLint param)) +__def_proc( void, glScissor, (GLint x,GLint y,GLsizei width,GLsizei height)) +__def_proc( void, glGetIntegerv, (GLenum pname,GLint *params)) +__def_proc( void, glGenTextures, (GLsizei n,GLuint *textures)) +__def_proc( void, glTexImage2D, (GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const GLvoid *pixels)) +__def_proc( void, glTexParameteri, (GLenum target,GLenum pname,GLint param)) +__def_proc( void, glDeleteTextures, (GLsizei n,const GLuint *textures)) +__def_proc( void, glTranslatef, (GLfloat x,GLfloat y,GLfloat z)) +__def_proc( void, glOrtho, (GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar)) +__def_proc( void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height)) +__def_proc( void, glFinish, (void)) +__def_proc( void, glLineWidth, (GLfloat)) +__def_proc( void, glPushMatrix, ()) +__def_proc( void, glPopMatrix, ()) + +__def_proc( XRRCrtcInfo*, XRRGetCrtcInfo, (Display *dpy, XRRScreenResources *resources, RRCrtc crtc)) +__def_proc( void, XRRFreeCrtcInfo, (XRRCrtcInfo *crtcInfo)) +__def_proc( void, XRRFreeScreenResources, (XRRScreenResources *resources)) +__def_proc( XRRScreenResources*, XRRGetScreenResources, (Display *dpy, Window window)) + +__def_proc( int, pthread_create, (pthread_t *__restrict __newthread, const pthread_attr_t *__restrict __attr, void *(*__start_routine) (void *), void *__restrict __arg)) +__def_proc( void, pthread_exit, (void *__retval)) +__def_proc( int, pthread_join, (pthread_t __th, void **__thread_return)) +__def_proc( int, pthread_tryjoin_np, (pthread_t __th, void **__thread_return)) +__def_proc( int, pthread_detach, (pthread_t __th)) +__def_proc( int, pthread_mutexattr_init, (pthread_mutexattr_t *__attr)) +__def_proc( int, pthread_mutexattr_destroy, (pthread_mutexattr_t *__attr)) +__def_proc( int, pthread_mutexattr_settype, (pthread_mutexattr_t *__attr, int __kind)) + +__def_proc( int, pthread_attr_init, (pthread_attr_t *__attr)) +__def_proc( int, pthread_attr_destroy, (pthread_attr_t *__attr)) +__def_proc( int, pthread_cancel, (pthread_t __th)) +__def_proc( int, pthread_mutex_init, (pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr)) +__def_proc( int, pthread_mutex_lock, (pthread_mutex_t *__mutex)) +__def_proc( int, pthread_mutex_trylock, (pthread_mutex_t *__mutex)) +__def_proc( int, pthread_mutex_unlock, (pthread_mutex_t *__mutex)) +__def_proc( int, pthread_mutex_destroy, (pthread_mutex_t *__mutex)) + +void _lib_loader_init() +{ + void* libGL = 0; + void* libXRandr = 0; + void* libpthread = 0; + + __load_lib(libGL, "libGL.so"); + if (!libGL) { + __load_lib_or_exit(libGL, "libGL.so.1"); + } + __load_fnc_or_exit(glXMakeCurrent, libGL); + __load_fnc_or_exit(glXCreateContext, libGL); + __load_fnc_or_exit(glXDestroyContext, libGL); + __load_fnc_or_exit(glXChooseFBConfig, libGL); + __load_fnc_or_exit(glXGetFBConfigAttrib, libGL); + __load_fnc_or_exit(glXGetVisualFromFBConfig, libGL); + __load_fnc_or_exit(glXSwapBuffers, libGL); + __load_fnc_or_exit(glDepthMask, libGL); + __load_fnc_or_exit(glColorMask, libGL); + __load_fnc_or_exit(glDepthFunc, libGL); + __load_fnc_or_exit(glEnable, libGL); + __load_fnc_or_exit(glAlphaFunc, libGL); + __load_fnc_or_exit(glBlendFunc, libGL); + __load_fnc_or_exit(glMatrixMode, libGL); + __load_fnc_or_exit(glLoadIdentity, libGL); + __load_fnc_or_exit(glViewport, libGL); + __load_fnc_or_exit(glClearColor, libGL); + __load_fnc_or_exit(glClear, libGL); + __load_fnc_or_exit(glRotatef, libGL); + __load_fnc_or_exit(glBindTexture, libGL); + __load_fnc_or_exit(glBegin, libGL); + __load_fnc_or_exit(glColor4f, libGL); + __load_fnc_or_exit(glTexCoord2i, libGL); + __load_fnc_or_exit(glTexCoord2f, libGL); + __load_fnc_or_exit(glVertex3i, libGL); + __load_fnc_or_exit(glEnd, libGL); + __load_fnc_or_exit(glDisable, libGL); + __load_fnc_or_exit(glPixelStorei, libGL); + __load_fnc_or_exit(glScissor, libGL); + __load_fnc_or_exit(glGetIntegerv, libGL); + __load_fnc_or_exit(glGenTextures, libGL); + __load_fnc_or_exit(glTexImage2D, libGL); + __load_fnc_or_exit(glTexParameteri, libGL); + __load_fnc_or_exit(glDeleteTextures, libGL); + __load_fnc_or_exit(glTranslatef, libGL); + __load_fnc_or_exit(glOrtho, libGL); + __load_fnc_or_exit(glViewport, libGL); + __load_fnc_or_exit(glFinish, libGL); + __load_fnc_or_exit(glLineWidth, libGL); + __load_fnc_or_exit(glPushMatrix, libGL); + __load_fnc_or_exit(glPopMatrix, libGL); + + __load_lib_or_exit(libXRandr, "libXrandr.so"); + __load_fnc_or_exit(XRRGetCrtcInfo, libXRandr); + __load_fnc_or_exit(XRRFreeCrtcInfo, libXRandr); + __load_fnc_or_exit(XRRFreeScreenResources, libXRandr); + __load_fnc_or_exit(XRRGetScreenResources, libXRandr); + + __load_lib(libpthread, "libpthread.so"); + if (!libpthread) { + __load_lib_or_exit(libpthread, "libpthread.so.0"); + } + __load_fnc_or_exit(pthread_create, libpthread); + __load_fnc_or_exit(pthread_exit, libpthread); + __load_fnc_or_exit(pthread_join, libpthread); + __load_fnc_or_exit(pthread_tryjoin_np, libpthread); + __load_fnc_or_exit(pthread_detach, libpthread); + __load_fnc_or_exit(pthread_mutexattr_init, libpthread); + __load_fnc_or_exit(pthread_mutexattr_destroy, libpthread); + __load_fnc_or_exit(pthread_mutexattr_settype, libpthread); + __load_fnc_or_exit(pthread_attr_init, libpthread); + __load_fnc_or_exit(pthread_attr_destroy, libpthread); + __load_fnc_or_exit(pthread_cancel, libpthread); + __load_fnc_or_exit(pthread_mutex_init, libpthread); + __load_fnc_or_exit(pthread_mutex_lock, libpthread); + __load_fnc_or_exit(pthread_mutex_trylock, libpthread); + __load_fnc_or_exit(pthread_mutex_unlock, libpthread); + __load_fnc_or_exit(pthread_mutex_destroy, libpthread); +} \ No newline at end of file -- cgit v1.2.3-70-g09d2