3 This file is part of gldbg
4 Copyright © 2009 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
16 #include "functions.h"
18 static inline void *glsym(const char *sym)
20 static void *libgl = NULL;
23 libgl = dlopen("libGL.so", RTLD_NOW);
26 fprintf(stderr, "Could not open libGL: %s\n", dlerror());
31 return dlsym(libgl, sym);
34 static char *buffer = 0;
35 static char *write_pos;
36 static struct iovec *iovecs = 0;
37 static struct iovec *cur_vec;
38 static unsigned length;
40 static inline void next_vec()
42 if(write_pos!=cur_vec->iov_base)
44 cur_vec->iov_len = write_pos-(char *)cur_vec->iov_base;
45 length += cur_vec->iov_len;
47 cur_vec->iov_base = write_pos;
51 static inline void write_bytes(const char *ptr, unsigned size)
55 *write_pos++ = *ptr++;
58 static inline void write_char(char v)
63 static inline void write_short(short v)
65 write_bytes((char *)&v, sizeof(short));
68 static inline void write_int(int v)
70 write_bytes((char *)&v, sizeof(int));
73 static inline void write_long(long v)
75 write_bytes((char *)&v, sizeof(long));
78 static inline void write_ulong(unsigned long v)
80 write_bytes((char *)&v, sizeof(unsigned long));
83 static inline void write_longlong(long long v)
85 write_bytes((char *)&v, sizeof(long long));
88 static inline void write_float(float v)
90 write_bytes((char *)&v, sizeof(float));
93 static inline void write_double(double v)
95 write_bytes((char *)&v, sizeof(double));
98 static inline void write_pointer(const void *p)
100 write_bytes((char *)&p, sizeof(void *));
103 static inline void write_data(const void *data, unsigned size)
109 cur_vec->iov_base = (void *)data;
110 cur_vec->iov_len = size;
113 cur_vec->iov_base = write_pos;
119 static inline void write_string(const unsigned char *s)
121 write_data(s, strlen(s)+1);
124 static inline void begin_packet(int func)
127 buffer = (char *)malloc(1024);
129 iovecs = (struct iovec *)malloc(16*sizeof(struct iovec));
132 cur_vec->iov_base = write_pos;
138 static inline void send_packet()
143 const char *var = getenv("GLWRAP_FD");
145 fd = strtol(var, NULL, 0);
152 writev(fd, iovecs, cur_vec-iovecs);
155 static inline int typesize(GLenum type)
159 case GL_BYTE: return sizeof(GLbyte);
160 case GL_SHORT: return sizeof(GLshort);
161 case GL_INT: return sizeof(GLint);
162 case GL_UNSIGNED_BYTE: return sizeof(GLubyte);
163 case GL_UNSIGNED_SHORT: return sizeof(GLushort);
164 case GL_UNSIGNED_INT: return sizeof(GLuint);
165 case GL_FLOAT: return sizeof(GLfloat);
166 case GL_DOUBLE: return sizeof(GLdouble);
167 // Short and byte packed types are broken
172 static inline int formatsize(GLenum format)
176 case GL_COLOR_INDEX: return 1;
177 case GL_STENCIL_INDEX: return 1;
178 case GL_DEPTH_COMPONENT: return 1;
179 case GL_RED: return 1;
180 case GL_GREEN: return 1;
181 case GL_BLUE: return 1;
182 case GL_ALPHA: return 1;
183 case GL_RGB: return 3;
184 case GL_RGBA: return 4;
185 case GL_BGR: return 3;
186 case GL_BGRA: return 4;
187 case GL_LUMINANCE: return 1;
188 case GL_LUMINANCE_ALPHA: return 2;
193 static inline int paramsize(GLenum pname)
197 // Lighting and material
198 case GL_AMBIENT: return 4;
199 case GL_DIFFUSE: return 4;
200 case GL_AMBIENT_AND_DIFFUSE: return 4;
201 case GL_SPECULAR: return 4;
202 case GL_EMISSION: return 4;
203 case GL_SHININESS: return 1;
204 case GL_COLOR_INDEXES: return 3;
205 case GL_POSITION: return 4;
206 case GL_SPOT_DIRECTION: return 3;
207 case GL_SPOT_EXPONENT: return 1;
208 case GL_SPOT_CUTOFF: return 1;
209 case GL_CONSTANT_ATTENUATION: return 1;
210 case GL_LINEAR_ATTENUATION: return 1;
211 case GL_QUADRATIC_ATTENUATION: return 1;
212 case GL_LIGHT_MODEL_AMBIENT: return 4;
213 case GL_LIGHT_MODEL_LOCAL_VIEWER: return 1;
214 case GL_LIGHT_MODEL_TWO_SIDE: return 1;
215 case GL_LIGHT_MODEL_COLOR_CONTROL: return 1;
218 case GL_TEXTURE_WRAP_S: return 1;
219 case GL_TEXTURE_WRAP_T: return 1;
220 case GL_TEXTURE_WRAP_R: return 1;
221 case GL_TEXTURE_MIN_FILTER: return 1;
222 case GL_TEXTURE_MAG_FILTER: return 1;
223 case GL_TEXTURE_BORDER_COLOR: return 4;
224 case GL_TEXTURE_MIN_LOD: return 1;
225 case GL_TEXTURE_MAX_LOD: return 1;
226 case GL_TEXTURE_BASE_LEVEL: return 1;
227 case GL_TEXTURE_MAX_LEVEL: return 1;
228 case GL_TEXTURE_LOD_BIAS: return 1;
229 case GL_DEPTH_TEXTURE_MODE: return 1;
230 case GL_TEXTURE_COMPARE_MODE: return 1;
231 case GL_TEXTURE_COMPARE_FUNC: return 1;
232 case GL_GENERATE_MIPMAP: return 1;
237 static inline int mapsize(GLenum target)
242 void (*glXGetProcAddress(const GLubyte *procname))(void)
244 void *handle = dlopen(NULL, RTLD_LAZY);
245 return dlsym(handle, (const char *)procname);
248 void (*glXGetProcAddressARB(const GLubyte *))(void) __attribute__((alias("glXGetProcAddress")));
250 #include "glwrap.funcs"