9 #include "breakpoint.h"
10 #include "functions.h"
14 #define UNUSED __attribute__((unused))
16 static unsigned char breakpoints[N_FUNCS] = { };
17 static char break_any = 0;
19 static char no_break = 0;
21 static const char *get_lib_names(void)
23 const char *env = getenv("GLWRAP_LIBS");
29 void *glsym(const char *name)
31 static void **gl_libs = NULL;
36 char *lib_names = strdup(get_lib_names());
40 for(i=0; lib_names[i]; ++i)
44 gl_libs = (void **)malloc((n_libs+1)*sizeof(void *));
49 if(lib_names[j]==':' || lib_names[j]==0)
51 int at_end = (lib_names[j]==0);
54 gl_libs[n_libs] = dlopen(lib_names+i, RTLD_NOW);
57 fprintf(stderr, "Could not open %s: %s\n", lib_names+i, dlerror());
73 for(i=0; gl_libs[i]; ++i)
75 void *sym = dlsym(gl_libs[i], name);
89 const char *var = getenv("GLWRAP_FD");
91 fd = strtol(var, NULL, 0);
94 var = getenv("GLWRAP_FILE");
97 fd = open(var, O_WRONLY|O_CREAT|O_TRUNC, 0644);
100 fprintf(stderr, "Couldn't open dumpfile %s for output: %s", var, strerror(errno));
118 const char *var = getenv("GLWRAP_CTRL_FD");
120 fd = strtol(var, NULL, 0);
128 static void receive_gldBreak(GlPacket *pkt)
131 unsigned char flags_set;
132 unsigned char flags_clr;
134 packet_read_short(pkt, (short *)&func);
135 packet_read_char(pkt, (char *)&flags_set);
136 packet_read_char(pkt, (char *)&flags_clr);
140 breakpoints[func] &= ~flags_clr;
141 breakpoints[func] |= flags_set;
144 break_any = flags_set;
147 static void receive_gldHold(GlPacket *pkt UNUSED)
152 static void receive_gldQueryViewport(GlPacket *pkt UNUSED)
157 glGetIntegerv(GL_VIEWPORT, viewport);
161 static void receive_gldReadPixels(GlPacket *pkt)
164 GLsizei width, height;
168 packet_read_int(pkt, &x);
169 packet_read_int(pkt, &y);
170 packet_read_int(pkt, &width);
171 packet_read_int(pkt, &height);
172 packet_read_int(pkt, (int *)&format);
173 packet_read_int(pkt, (int *)&type);
175 data = (char *)malloc(width*height*typesize(type)*formatsize(format));
177 glReadPixels(x, y, width, height, format, type, data);
182 static void receive(void)
186 while((pkt = packet_receive(get_in_fd())))
190 packet_read_short(pkt, (short *)&func);
193 case FUNC_GLDBREAK: receive_gldBreak(pkt); break;
194 case FUNC_GLDHOLD: receive_gldHold(pkt); break;
195 case FUNC_GLDQUERYVIEWPORT: receive_gldQueryViewport(pkt); break;
196 case FUNC_GLDREADPIXELS: receive_gldReadPixels(pkt); break;
202 void tracepoint(unsigned short func, int flag)
211 breakpoint = (breakpoints[func]|break_any)&flag;
212 if(breakpoint || hold)
218 pkt = packet_begin(FUNC_GLDBREAK);
219 packet_write_short(pkt, func);
220 packet_write_char(pkt, flag);
221 packet_send(pkt, get_out_fd());