3 This file is part of gldbg
4 Copyright © 2009-2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
15 #include "arraysize.h"
16 #include "breakpoint.h"
17 #include "functions.h"
21 #define UNUSED __attribute__((unused))
23 static unsigned char breakpoints[N_FUNCS] = { };
24 static char break_any = 0;
26 static char no_break = 0;
28 static const char *get_lib_names(void)
30 const char *env = getenv("GLWRAP_LIBS");
36 void *glsym(const char *name)
38 static void **gl_libs = NULL;
43 char *lib_names = strdup(get_lib_names());
47 for(i=0; lib_names[i]; ++i)
51 gl_libs = (void **)malloc((n_libs+1)*sizeof(void *));
56 if(lib_names[j]==':' || lib_names[j]==0)
58 int at_end = (lib_names[j]==0);
61 gl_libs[n_libs] = dlopen(lib_names+i, RTLD_NOW);
64 fprintf(stderr, "Could not open %s: %s\n", lib_names+i, dlerror());
80 for(i=0; gl_libs[i]; ++i)
82 void *sym = dlsym(gl_libs[i], name);
96 const char *var = getenv("GLWRAP_FD");
98 fd = strtol(var, NULL, 0);
101 var = getenv("GLWRAP_FILE");
104 fd = open(var, O_WRONLY|O_CREAT|O_TRUNC, 0644);
107 fprintf(stderr, "Couldn't open dumpfile %s for output: %s", var, strerror(errno));
125 const char *var = getenv("GLWRAP_CTRL_FD");
127 fd = strtol(var, NULL, 0);
135 static void receive_gldBreak(GlPacket *pkt)
138 unsigned char flags_set;
139 unsigned char flags_clr;
141 packet_read_short(pkt, (short *)&func);
142 packet_read_char(pkt, (char *)&flags_set);
143 packet_read_char(pkt, (char *)&flags_clr);
147 breakpoints[func] &= ~flags_clr;
148 breakpoints[func] |= flags_set;
151 break_any = flags_set;
154 static void receive_gldHold(GlPacket *pkt UNUSED)
159 static void receive_gldQueryViewport(GlPacket *pkt UNUSED)
164 glGetIntegerv(GL_VIEWPORT, viewport);
168 static void receive_gldReadPixels(GlPacket *pkt)
171 GLsizei width, height;
175 packet_read_int(pkt, &x);
176 packet_read_int(pkt, &y);
177 packet_read_int(pkt, &width);
178 packet_read_int(pkt, &height);
179 packet_read_int(pkt, (int *)&format);
180 packet_read_int(pkt, (int *)&type);
182 data = (char *)malloc(width*height*typesize(type)*formatsize(format));
184 glReadPixels(x, y, width, height, format, type, data);
189 static void receive(void)
193 while((pkt = packet_receive(get_in_fd())))
197 packet_read_short(pkt, (short *)&func);
200 case FUNC_GLDBREAK: receive_gldBreak(pkt); break;
201 case FUNC_GLDHOLD: receive_gldHold(pkt); break;
202 case FUNC_GLDQUERYVIEWPORT: receive_gldQueryViewport(pkt); break;
203 case FUNC_GLDREADPIXELS: receive_gldReadPixels(pkt); break;
209 void tracepoint(unsigned short func, int flag)
218 breakpoint = (breakpoints[func]|break_any)&flag;
219 if(breakpoint || hold)
225 pkt = packet_begin(FUNC_GLDBREAK);
226 packet_write_short(pkt, func);
227 packet_write_char(pkt, flag);
228 packet_send(pkt, get_out_fd());