]> git.tdb.fi Git - gldbg.git/commitdiff
Check for and report OpenGL errors after each function call
authorMikko Rasa <tdb@tdb.fi>
Tue, 27 Oct 2009 07:56:39 +0000 (07:56 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 27 Oct 2009 07:56:39 +0000 (07:56 +0000)
gl.files
source/functions.enum.t
source/gldecoder.c
source/gldecoder.funcs.t
source/gldecoder.struct.t
source/glprint.c
source/glwrap.c
source/glwrap.funcs.t

index 8be2a33866a68da9d1ebfa6cbe1dd65a565c62ab..d6631d845a3adcf2c634d9d4b39ed3131c2e0334 100644 (file)
--- a/gl.files
+++ b/gl.files
@@ -4,3 +4,4 @@ spec gl.spec
 prefix gl
 ignore category VERSION_3_2
 ignore category ARB_sync
+ignore function glGetError
index fc0987c3d6fbedf1da53c51d2fd6a807bc96d33a..ad1bc2de7c525c6a618f9d1c0696f7b1b0574713 100644 (file)
@@ -3,4 +3,5 @@
 :{
 :      FUNC_NONE,
 wl('   FUNC_%s,', func.name.upper())
+:      FUNC_GLDERROR = 0x8000
 :};
index e11d13c46d51ef0a064415eecf7933b7cb0e6b10..6e903736f726a5840c9252056858c52b910d0592 100644 (file)
@@ -12,7 +12,8 @@ Distributed under the GPL
 
 static unsigned read_short(short *, const char *);
 static unsigned read_int(int *, const char *);
-static int decode_func(GlDecoder *, short, const char *);
+static int decode_func(GlDecoder *, unsigned short, const char *);
+static int decode_gldfunc(GlDecoder *, unsigned short, const char *);
 
 GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *))
 {
@@ -37,7 +38,7 @@ int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
 {
        unsigned pos = 0;
        int pktlen;
-       short func;
+       unsigned short func;
        int ret;
 
        if(len<sizeof(int)+sizeof(short))
@@ -48,7 +49,10 @@ int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
        pos += read_short(&func, data+pos);
        if(dec)
        {
-               ret = decode_func(dec, func, data+pos);
+               if(func&0x8000)
+                       ret = decode_gldfunc(dec, func, data+pos);
+               else
+                       ret = decode_func(dec, func, data+pos);
                if(ret<0)
                        return -1;
        }
@@ -127,3 +131,22 @@ static unsigned read_string(const unsigned char **v, const char *data)
 }
 
 #include "gldecoder.funcs"
+
+static int decode_gldError(GlDecoder *dec, const char *data)
+{
+       unsigned pos = 0;
+       GLenum code;
+       pos += read_int(&code, data);
+       if(dec->gldError)
+               dec->gldError(dec->user_data, code);
+       return pos;
+}
+
+static int decode_gldfunc(GlDecoder *dec, unsigned short func, const char *data)
+{
+       switch(func)
+       {
+       case FUNC_GLDERROR: return decode_gldError(dec, data);
+       default: return -1;
+       }
+}
index 8d054b0ed85f600398c541a8b6f3e1b5923fe3ce..af820a46a8a5d4870be17a5521741e21346e50ab 100644 (file)
@@ -24,7 +24,7 @@ for p in params:
 wl(');')
 wl('   return pos;')
 wl('}')
-:static int decode_func(GlDecoder *dec, short func, const char *data)
+:static int decode_func(GlDecoder *dec, unsigned short func, const char *data)
 :{
 :      switch(func)
 :      {
index e05e910dc8fd4176d8910df8d62a6186bed0acce..5b46acafaf2ce13942b461a2ebeea3af72112f10 100644 (file)
@@ -9,4 +9,5 @@ if ret.ctype!="void":
 for p in params:
        w(', %s', p.ctype)
 wl(');')
+:      void (*gldError)(void *, GLenum);
 :} GlDecoder;
index 3c0755934331cb537e3c26eacde300c0bfbc907f..fbf6e0e07e35bceb47ecc824bb4552f25feb6d95 100644 (file)
@@ -18,6 +18,7 @@ typedef struct sGlPrintData
 
 static void init_print(GlDecoder *);
 static void glprint_data_free(void *);
+static void print_gldError(void *, GLenum);
 
 GlDecoder *glprint_new(char *buffer, unsigned bufsize)
 {
@@ -38,6 +39,7 @@ GlDecoder *glprint_new(char *buffer, unsigned bufsize)
                dec = gldecoder_new(gpd, free);
 
        init_print(dec);
+       dec->gldError = print_gldError;
 }
 
 char *glprint_get_buffer(GlDecoder *dec)
@@ -52,4 +54,10 @@ static void glprint_data_free(void *data)
        free(gpd);
 }
 
+static void print_gldError(void *user_data, GLenum code)
+{
+       GlPrintData *gpd = (GlPrintData *)user_data;
+       snprintf(gpd->buffer, gpd->bufsize, "ERROR: %s", describe_enum(code, "ErrorCode"));
+}
+
 #include "glprint.funcs"
index 224a0faacbfda31f33e75691d5674875aafa2302..0a22c3c1ce4b6677c0bb66cdb10d559294fbe160 100644 (file)
@@ -239,6 +239,32 @@ static inline int mapsize(GLenum target)
        return 1;
 }
 
+GLenum cur_error = GL_NO_ERROR;
+
+static void check_error()
+{
+       GLenum (*orig_glGetError)() = 0;
+       GLenum code;
+       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;
+       }
+}
+
+GLenum APIENTRY glGetError()
+{
+       GLenum ret = cur_error;
+       cur_error = GL_NO_ERROR;
+       return ret;
+}
+
 void (*glXGetProcAddress(const GLubyte *procname))(void)
 {
        void *handle = dlopen(NULL, RTLD_LAZY);
index decf22e9bb320196fbcc1ee9bce31dc431137b2d..a58a1c5288f96a01018c282280e02d052d6eab9f 100644 (file)
@@ -21,6 +21,8 @@ for p in params:
        else:
                wl('    write_pointer(%s);', p.name)
 wl('   send_packet();')
+if not func.name.startswith("glX"):
+       wl('    check_error();')
 if ret.ctype!='void':
        wl('    return ret;')
 wl('}')