X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglprint.c;h=01883e8e4786271bbea68edb9ac2d82fad33de7f;hb=a832996c884a0e0acc9a38ba4dd258edb75ec7af;hp=ec8d47e5f007c0a9b5ba4a61fd77dedad556314b;hpb=7c57338619688bc07f394ad82f75471aefbecc59;p=gldbg.git diff --git a/source/glprint.c b/source/glprint.c index ec8d47e..01883e8 100644 --- a/source/glprint.c +++ b/source/glprint.c @@ -1,24 +1,25 @@ -/* $Id$ - -This file is part of gldbg -Copyright © 2009 Mikko Rasa, Mikkosoft Productions -Distributed under the GPL -*/ - #include #include +#include +#include +#include "arraysize.h" #include "enums.h" #include "glprint.h" +#include "tmpalloc.h" + +#define UNUSED __attribute__((unused)) typedef struct sGlPrintData { char *buffer; unsigned bufsize; + int free_buf; } GlPrintData; static void init_print(GlDecoder *); -static void glprint_data_free(void *); +static void glprint_free(void *); static void print_gldError(void *, GLenum); +static void print_unhandled(void *, unsigned short); GlDecoder *glprint_new(char *buffer, unsigned bufsize) { @@ -28,18 +29,19 @@ GlDecoder *glprint_new(char *buffer, unsigned bufsize) gpd = (GlPrintData *)malloc(sizeof(GlPrintData)); gpd->buffer = buffer; gpd->bufsize = bufsize; + gpd->free_buf = 0; if(!gpd->buffer) { if(!gpd->bufsize) gpd->bufsize = 1024; gpd->buffer = (char *)malloc(gpd->bufsize); - dec = gldecoder_new(gpd, glprint_data_free); + gpd->free_buf = 1; } - else - dec = gldecoder_new(gpd, free); + dec = gldecoder_new(gpd, glprint_free); init_print(dec); dec->gldError = print_gldError; + dec->unhandled = print_unhandled; return dec; } @@ -49,17 +51,164 @@ char *glprint_get_buffer(GlDecoder *dec) return ((GlPrintData *)dec->user_data)->buffer; } -static void glprint_data_free(void *data) +static void glprint_free(void *data) { GlPrintData *gpd = (GlPrintData *)data; - free(gpd->buffer); - free(gpd); + if(gpd->free_buf) + { + free(gpd->buffer); + free(gpd); + } + tmpfree(); +} + +static const char *print_array(const char *fmt, const void *data, unsigned elem_size, unsigned count) +{ + const char *cptr; + char type = 0; + char *buffer; + unsigned buf_size; + char *ptr; + unsigned i; + + if(!data) + return "NULL"; + + for(cptr=fmt; (type<2 && *cptr); ++cptr) + { + if(*cptr=='%') + type = 1; + else if(type==1 && isalpha(*cptr)) + type = *cptr; + } + + count /= elem_size; + buf_size = count*20; + if(type=='s') + buf_size *= 50; + buffer = tmpalloc(buf_size); + ptr = buffer; + *ptr++ = '{'; + for(i=0; i0) + { + *ptr++ = ','; + *ptr++ = ' '; + } + memcpy(&element, (const char *)data+i*elem_size, elem_size); + if(type>='e' && type<='g' && elem_size==sizeof(float)) + *(double *)&element = *(float *)&element; + len = snprintf(ptr, buf_size, fmt, element); + ptr += len; + buf_size -= len; + } + *ptr++ = '}'; + *ptr = 0; + + return buffer; } +static const char *print_array_described(const char *(*describe)(GLenum, const char *), const char *categ, const void *data, unsigned elem_size, unsigned count) +{ + char *buffer; + unsigned buf_size; + char *ptr; + unsigned i; + + if(!data) + return NULL; + + count /= elem_size; + buf_size = count*50; + buffer = tmpalloc(buf_size); + ptr = buffer; + *ptr++ = '{'; + for(i=0; i0) + { + *ptr++ = ','; + *ptr++ = ' '; + } + memcpy(&element, (const char *)data+i*elem_size, elem_size); + len = snprintf(ptr, buf_size, "%s", describe(element, categ)); + ptr += len; + buf_size -= len; + } + *ptr++ = '}'; + *ptr = 0; + + return buffer; +} + +static const char *print_parameter(int pname, int param) +{ + char *buffer; + + // XXX Need to move the param names to flavor + switch(pname) + { + case GL_TEXTURE_MIN_FILTER: + case GL_TEXTURE_MAG_FILTER: + case GL_TEXTURE_WRAP_S: + case GL_TEXTURE_WRAP_T: + return describe_enum(param, ""); + } + + buffer = tmpalloc(11); + snprintf(buffer, 11, "%i", param); + return buffer; +} + +static const char *print_internal_format(int fmt) +{ + char *buffer; + + if(fmt>4) + return describe_enum(fmt, "PixelFormat"); + + buffer = tmpalloc(2); + snprintf(buffer, 2, "%i", fmt); + return buffer; +} + +static const char *print_data(const void *data, unsigned size) +{ + if(!data) + return "NULL"; + else if((unsigned long)data<0x100000) + { + char *buffer = tmpalloc(20); + snprintf(buffer, 20, "%p", data); + return buffer; + } + else if(!size) + return "/* data */"; + else + { + char *buffer = tmpalloc(50); + snprintf(buffer, 50, "/* data: %d bytes */", size); + return buffer; + } +} + +#include "gensrc/glprint.funcs" + 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" +static void print_unhandled(void *user_data, unsigned short func UNUSED) +{ + GlPrintData *gpd = (GlPrintData *)user_data; + gpd->buffer[0] = 0; +}