X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglwrap.c;h=bf05214b8a09d7ee844d5567626b395b2066f1db;hb=ca49785159e6a7cfd2d999a99041fa1567575a24;hp=a33021a70a89f70c988ea0694ff9f7910ff9e702;hpb=9d1825d591a7261b1cff620ba535d333352984bf;p=gldbg.git diff --git a/source/glwrap.c b/source/glwrap.c index a33021a..bf05214 100644 --- a/source/glwrap.c +++ b/source/glwrap.c @@ -10,18 +10,24 @@ Distributed under the GPL #include #include #include +#include #include +#include +#include "arraysize.h" #include "functions.h" static inline void *glsym(const char *sym) { - static void *libgl=NULL; + static void *libgl = NULL; if(!libgl) { - libgl=dlopen("libGL.so", RTLD_NOW); + const char *libgl_name = getenv("GLWRAP_LIBGL"); + if(!libgl_name) + libgl_name = "libGL.so"; + libgl = dlopen(libgl_name, RTLD_NOW); if(!libgl) { - fprintf(stderr, "Could not open libGL: %s\n", dlerror()); + fprintf(stderr, "Could not open %s: %s\n", libgl_name, dlerror()); abort(); } } @@ -29,18 +35,20 @@ static inline void *glsym(const char *sym) return dlsym(libgl, sym); } -char *buffer=0; -char *write_pos; -struct iovec *iovecs=0; -struct iovec *cur_vec; +static char *buffer = 0; +static char *write_pos; +static struct iovec *iovecs = 0; +static struct iovec *cur_vec; +static unsigned length; static inline void next_vec() { if(write_pos!=cur_vec->iov_base) { - cur_vec->iov_len=write_pos-(char *)cur_vec->iov_base; + cur_vec->iov_len = write_pos-(char *)cur_vec->iov_base; + length += cur_vec->iov_len; ++cur_vec; - cur_vec->iov_base=write_pos; + cur_vec->iov_base = write_pos; } } @@ -48,12 +56,12 @@ static inline void write_bytes(const char *ptr, unsigned size) { unsigned i; for(i=0; iiov_base=(void *)data; - cur_vec->iov_len=size; - ++cur_vec; - cur_vec->iov_base=write_pos; + if(data) + { + write_int(size); + next_vec(); + cur_vec->iov_base = (void *)data; + cur_vec->iov_len = size; + length += size; + ++cur_vec; + cur_vec->iov_base = write_pos; + } + else + write_int(0); +} + +static inline void write_string(const char *s) +{ + write_data(s, strlen(s)+1); } -static inline void write_string(const unsigned char *s) +static inline void write_string_array(const char **sa, unsigned size) { - write_data(s, strlen(s)); - /*int len=strlen(s); - write_int(len); - write_bytes(s, len);*/ + unsigned i; + size /= sizeof(const char *); + write_int(size); + for(i=0; iiov_base=write_pos; + iovecs = (struct iovec *)malloc(16*sizeof(struct iovec)); + write_pos = buffer; + cur_vec = iovecs; + cur_vec->iov_base = write_pos; + length = 0; + write_int(0); write_short(func); } static inline void send_packet() { - static int fd=-1; + static int fd = -1; if(fd<0) { - const char *var=getenv("GLWRAP_FD"); + const char *var = getenv("GLWRAP_FD"); if(var) - fd=strtol(var, NULL, 0); + fd = strtol(var, NULL, 0); else - fd=2; + fd = 2; } next_vec(); + write_pos = buffer; + write_int(length); writev(fd, iovecs, cur_vec-iovecs); } -static inline int typesize(GLenum type) +GLenum cur_error = GL_NO_ERROR; + +static void check_error() { - switch(type) + GLenum (*orig_glGetError)() = 0; + GLenum code; + if(!orig_glGetError) + orig_glGetError = glsym("glGetError"); + code = orig_glGetError(); + if(code!=GL_NO_ERROR) { - case GL_BYTE: return sizeof(GLbyte); - case GL_SHORT: return sizeof(GLshort); - case GL_INT: return sizeof(GLint); - case GL_UNSIGNED_BYTE: return sizeof(GLubyte); - case GL_UNSIGNED_SHORT: return sizeof(GLushort); - case GL_UNSIGNED_INT: return sizeof(GLuint); - case GL_FLOAT: return sizeof(GLfloat); - case GL_DOUBLE: return sizeof(GLdouble); - // Short and byte packed types are broken - default: return 1; + begin_packet(FUNC_GLDERROR); + write_int(code); + send_packet(); + if(cur_error==GL_NO_ERROR) + cur_error = code; } } -static inline int formatsize(GLenum format) +GLenum APIENTRY glGetError() { - switch(format) - { - case GL_COLOR_INDEX: return 1; - case GL_STENCIL_INDEX: return 1; - case GL_DEPTH_COMPONENT: return 1; - case GL_RED: return 1; - case GL_GREEN: return 1; - case GL_BLUE: return 1; - case GL_ALPHA: return 1; - case GL_RGB: return 3; - case GL_RGBA: return 4; - case GL_BGR: return 3; - case GL_BGRA: return 4; - case GL_LUMINANCE: return 1; - case GL_LUMINANCE_ALPHA: return 2; - default: return 1; - } + GLenum ret = cur_error; + cur_error = GL_NO_ERROR; + begin_packet(FUNC_GLGETERROR); + write_int(ret); + send_packet(); + return ret; } -static inline int paramsize(GLenum pname) +void (*glXGetProcAddress(const GLubyte *procname))(void) { - switch(pname) + void *handle = 0; + void (*ret)() = 0; + + if(glsym((const char *)procname)) { - // Lighting and material - case GL_AMBIENT: return 4; - case GL_DIFFUSE: return 4; - case GL_AMBIENT_AND_DIFFUSE: return 4; - case GL_SPECULAR: return 4; - case GL_EMISSION: return 4; - case GL_SHININESS: return 1; - case GL_COLOR_INDEXES: return 3; - case GL_POSITION: return 4; - case GL_SPOT_DIRECTION: return 3; - case GL_SPOT_EXPONENT: return 1; - case GL_SPOT_CUTOFF: return 1; - case GL_CONSTANT_ATTENUATION: return 1; - case GL_LINEAR_ATTENUATION: return 1; - case GL_QUADRATIC_ATTENUATION: return 1; - case GL_LIGHT_MODEL_AMBIENT: return 4; - case GL_LIGHT_MODEL_LOCAL_VIEWER: return 1; - case GL_LIGHT_MODEL_TWO_SIDE: return 1; - case GL_LIGHT_MODEL_COLOR_CONTROL: return 1; - - // Texture - case GL_TEXTURE_WRAP_S: return 1; - case GL_TEXTURE_WRAP_T: return 1; - case GL_TEXTURE_WRAP_R: return 1; - case GL_TEXTURE_MIN_FILTER: return 1; - case GL_TEXTURE_MAG_FILTER: return 1; - case GL_TEXTURE_BORDER_COLOR: return 4; - case GL_TEXTURE_MIN_LOD: return 1; - case GL_TEXTURE_MAX_LOD: return 1; - case GL_TEXTURE_BASE_LEVEL: return 1; - case GL_TEXTURE_MAX_LEVEL: return 1; - case GL_TEXTURE_LOD_BIAS: return 1; - case GL_DEPTH_TEXTURE_MODE: return 1; - case GL_TEXTURE_COMPARE_MODE: return 1; - case GL_TEXTURE_COMPARE_FUNC: return 1; - case GL_GENERATE_MIPMAP: return 1; - default: return 1; + handle = dlopen(NULL, RTLD_LAZY); + ret = dlsym(handle, (const char *)procname); } -} -static inline int mapsize(GLenum target) -{ - return 1; + begin_packet(FUNC_GLXGETPROCADDRESS); + write_pointer(ret); + write_string((const char *)procname); + send_packet(); + + return ret; } +void (*glXGetProcAddressARB(const GLubyte *))(void) __attribute__((alias("glXGetProcAddress"))); + #include "glwrap.funcs"