X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglwrap.c;h=59bf1fb12cedc3333a77abf1e1a044edf26edc22;hb=be68706254c62406d4924fffa7f43d2b1c17f52e;hp=a33021a70a89f70c988ea0694ff9f7910ff9e702;hpb=9d1825d591a7261b1cff620ba535d333352984bf;p=gldbg.git diff --git a/source/glwrap.c b/source/glwrap.c index a33021a..59bf1fb 100644 --- a/source/glwrap.c +++ b/source/glwrap.c @@ -15,10 +15,10 @@ Distributed under the GPL static inline void *glsym(const char *sym) { - static void *libgl=NULL; + static void *libgl = NULL; if(!libgl) { - libgl=dlopen("libGL.so", RTLD_NOW); + libgl = dlopen("libGL.so", RTLD_NOW); if(!libgl) { fprintf(stderr, "Could not open libGL: %s\n", dlerror()); @@ -29,18 +29,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 +50,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 unsigned char *s) { - write_data(s, strlen(s)); - /*int len=strlen(s); - write_int(len); - write_bytes(s, len);*/ + write_data(s, strlen(s)+1); } static inline void begin_packet(int func) { if(!buffer) - buffer=(char *)malloc(1024); + buffer = (char *)malloc(1024); if(!iovecs) - iovecs=(struct iovec *)malloc(16*sizeof(struct iovec)); - write_pos=buffer; - cur_vec=iovecs; - cur_vec->iov_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); } @@ -228,4 +237,12 @@ static inline int mapsize(GLenum target) return 1; } +void (*glXGetProcAddress(const GLubyte *procname))(void) +{ + void *handle = dlopen(NULL, RTLD_LAZY); + return dlsym(handle, (const char *)procname); +} + +void (*glXGetProcAddressARB(const GLubyte *))(void) __attribute__((alias("glXGetProcAddress"))); + #include "glwrap.funcs"