--- /dev/null
+/* $Id$
+
+This file is part of gldbg
+Copyright © 2010 Mikko Rasa, Mikkosoft Productions
+Distributed under the GPL
+*/
+
+#include <dlfcn.h>
+#include <X11/Xlib.h>
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include "arraysize.h"
+#include "functions.h"
+#include "glwrap.h"
+
+int in_begin_block = 0;
+GLenum cur_error = GL_NO_ERROR;
+
+static void check_error()
+{
+ GLenum (*orig_glGetError)() = 0;
+ GLenum code;
+
+ if(in_begin_block)
+ return;
+
+ if(!orig_glGetError)
+ orig_glGetError = glsym("glGetError");
+
+ code = orig_glGetError();
+ if(code!=GL_NO_ERROR)
+ {
+ begin_packet(FUNC_GLDERROR);
+ write_int(code);
+ send_packet();
+
+ if(cur_error==GL_NO_ERROR)
+ cur_error = code;
+ }
+}
+
+void APIENTRY glBegin(GLenum mode)
+{
+ static void (*orig)(GLenum);
+ if(!orig)
+ orig = glsym("glBegin");
+ orig(mode);
+
+ begin_packet(FUNC_GLBEGIN);
+ write_int(mode);
+ send_packet();
+
+ in_begin_block = 1;
+}
+
+void APIENTRY glEnd()
+{
+ static void (*orig)();
+ if(!orig)
+ orig = glsym("glEnd");
+ orig();
+
+ begin_packet(FUNC_GLEND);
+ send_packet();
+
+ in_begin_block = 0;
+ check_error();
+}
+
+GLenum APIENTRY glGetError()
+{
+ GLenum ret = GL_NO_ERROR;
+
+ if(in_begin_block)
+ {
+ if(cur_error==GL_NO_ERROR)
+ cur_error = GL_INVALID_OPERATION;
+ }
+ else
+ {
+ ret = cur_error;
+ cur_error = GL_NO_ERROR;
+ }
+
+ begin_packet(FUNC_GLGETERROR);
+ write_int(ret);
+ send_packet();
+
+ return ret;
+}
+
+void (*glXGetProcAddress(const GLubyte *procname))(void)
+{
+ void *handle = 0;
+ void (*ret)() = 0;
+
+ if(glsym((const char *)procname))
+ {
+ handle = dlopen(NULL, RTLD_LAZY);
+ ret = dlsym(handle, (const char *)procname);
+ }
+
+ begin_packet(FUNC_GLXGETPROCADDRESS);
+ write_pointer(ret);
+ write_string((const char *)procname);
+ send_packet();
+
+ return ret;
+}
+
+void (*glXGetProcAddressARB(const GLubyte *))(void) __attribute__((alias("glXGetProcAddress")));
+
+#include "gensrc/glwrap.funcs"