3 This file is part of gldbg
4 Copyright © 2009 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
16 #include "arraysize.h"
17 #include "functions.h"
19 static inline void *glsym(const char *sym)
21 static void *libgl = NULL;
24 const char *libgl_name = getenv("GLWRAP_LIBGL");
26 libgl_name = "libGL.so";
27 libgl = dlopen(libgl_name, RTLD_NOW);
30 fprintf(stderr, "Could not open %s: %s\n", libgl_name, dlerror());
35 return dlsym(libgl, sym);
38 static char *buffer = 0;
39 static char *write_pos;
40 static struct iovec *iovecs = 0;
41 static struct iovec *cur_vec;
42 static unsigned length;
44 static inline void next_vec()
46 if(write_pos!=cur_vec->iov_base)
48 cur_vec->iov_len = write_pos-(char *)cur_vec->iov_base;
49 length += cur_vec->iov_len;
51 cur_vec->iov_base = write_pos;
55 static inline void write_bytes(const char *ptr, unsigned size)
59 *write_pos++ = *ptr++;
62 static inline void write_char(char v)
67 static inline void write_short(short v)
69 write_bytes((char *)&v, sizeof(short));
72 static inline void write_int(int v)
74 write_bytes((char *)&v, sizeof(int));
77 static inline void write_long(long v)
79 write_bytes((char *)&v, sizeof(long));
82 static inline void write_long_long(long long v)
84 write_bytes((char *)&v, sizeof(long long));
87 static inline void write_float(float v)
89 write_bytes((char *)&v, sizeof(float));
92 static inline void write_double(double v)
94 write_bytes((char *)&v, sizeof(double));
97 static inline void write_pointer(const void *p)
99 write_bytes((char *)&p, sizeof(void *));
102 static inline void write_data(const void *data, unsigned size)
108 cur_vec->iov_base = (void *)data;
109 cur_vec->iov_len = size;
112 cur_vec->iov_base = write_pos;
118 static inline void write_string(const char *s)
120 write_data(s, strlen(s)+1);
123 static inline void write_string_array(const char **sa, unsigned size)
126 size /= sizeof(const char *);
128 for(i=0; i<size; ++i)
132 static inline void begin_packet(int func)
135 buffer = (char *)malloc(1024);
137 iovecs = (struct iovec *)malloc(16*sizeof(struct iovec));
140 cur_vec->iov_base = write_pos;
146 static inline void send_packet()
151 const char *var = getenv("GLWRAP_FD");
153 fd = strtol(var, NULL, 0);
160 writev(fd, iovecs, cur_vec-iovecs);
163 GLenum cur_error = GL_NO_ERROR;
165 static void check_error()
167 GLenum (*orig_glGetError)() = 0;
170 orig_glGetError = glsym("glGetError");
171 code = orig_glGetError();
172 if(code!=GL_NO_ERROR)
174 begin_packet(FUNC_GLDERROR);
177 if(cur_error==GL_NO_ERROR)
182 GLenum APIENTRY glGetError()
184 GLenum ret = cur_error;
185 cur_error = GL_NO_ERROR;
186 begin_packet(FUNC_GLGETERROR);
192 void (*glXGetProcAddress(const GLubyte *procname))(void)
197 if(glsym((const char *)procname))
199 handle = dlopen(NULL, RTLD_LAZY);
200 ret = dlsym(handle, (const char *)procname);
203 begin_packet(FUNC_GLXGETPROCADDRESS);
205 write_string((const char *)procname);
211 void (*glXGetProcAddressARB(const GLubyte *))(void) __attribute__((alias("glXGetProcAddress")));
213 #include "glwrap.funcs"