diff options
-rw-r--r-- | src/mapi/glapi/glapi.h | 8 | ||||
-rw-r--r-- | src/mapi/glapi/glapi_dispatch.c | 80 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/dri_test.c | 12 | ||||
-rw-r--r-- | src/mesa/main/context.c | 24 | ||||
-rw-r--r-- | src/mesa/main/context.h | 3 | ||||
-rw-r--r-- | src/mesa/main/debug.c | 6 | ||||
-rw-r--r-- | src/mesa/main/dlist.c | 8 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 3 |
8 files changed, 119 insertions, 25 deletions
diff --git a/src/mapi/glapi/glapi.h b/src/mapi/glapi/glapi.h index a0bb0781063..2fa580283e8 100644 --- a/src/mapi/glapi/glapi.h +++ b/src/mapi/glapi/glapi.h @@ -94,7 +94,7 @@ _GLAPI_EXPORT extern __thread void * _glapi_tls_Context _GLAPI_EXPORT extern const struct _glapi_table *_glapi_Dispatch; _GLAPI_EXPORT extern const void *_glapi_Context; -# define GET_DISPATCH() _glapi_tls_Dispatch +# define GET_DISPATCH(t) _glapi_tls_Dispatch # define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_tls_Context #else @@ -167,6 +167,12 @@ _glapi_get_proc_name(unsigned int offset); _GLAPI_EXPORT unsigned long _glthread_GetID(void); +_GLAPI_EXPORT int +_glapi_logging_available(void); + +_GLAPI_EXPORT void +_glapi_enable_logging(void (*func)(void *data, const char *fmt, ...), + void *data); /* * These stubs are kept so that the old DRI drivers still load. diff --git a/src/mapi/glapi/glapi_dispatch.c b/src/mapi/glapi/glapi_dispatch.c index 7421a36d35a..0d41c9499b5 100644 --- a/src/mapi/glapi/glapi_dispatch.c +++ b/src/mapi/glapi/glapi_dispatch.c @@ -41,7 +41,6 @@ #include "glapi/glapitable.h" #include "glapi/glapidispatch.h" - #if !(defined(USE_X86_ASM) || defined(USE_X86_64_ASM) || defined(USE_SPARC_ASM)) #if defined(WIN32) @@ -58,27 +57,12 @@ #define NAME(func) gl##func #endif -#if 0 /* Use this to log GL calls to stdout (for DEBUG only!) */ - -#define F stdout -#define DISPATCH(FUNC, ARGS, MESSAGE) \ - fprintf MESSAGE; \ - CALL_ ## FUNC(GET_DISPATCH(), ARGS); - -#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ - fprintf MESSAGE; \ - return CALL_ ## FUNC(GET_DISPATCH(), ARGS); - -#else - #define DISPATCH(FUNC, ARGS, MESSAGE) \ CALL_ ## FUNC(GET_DISPATCH(), ARGS); #define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ return CALL_ ## FUNC(GET_DISPATCH(), ARGS); -#endif /* logging */ - #ifndef GLAPIENTRY #define GLAPIENTRY @@ -91,3 +75,67 @@ #include "glapi/glapitemp.h" #endif /* USE_X86_ASM */ + + +#ifdef DEBUG + +static void *logger_data; +static void (*logger_func)(void *data, const char *fmt, ...); +static struct _glapi_table *real_dispatch; /* FIXME: This need to be TLS etc */ + +#define KEYWORD1 static +#define KEYWORD1_ALT static +#define KEYWORD2 +#define NAME(func) log_##func +#define F logger_data + +static void +log_Unused(void) +{ +} + +#define DISPATCH(FUNC, ARGS, MESSAGE) \ + logger_func MESSAGE; \ + CALL_ ## FUNC(real_dispatch, ARGS); + +#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ + logger_func MESSAGE; \ + return CALL_ ## FUNC(real_dispatch, ARGS); + +#define DISPATCH_TABLE_NAME __glapi_logging_table + +#define TABLE_ENTRY(func) (_glapi_proc) log_##func + +#include "glapi/glapitemp.h" + +int +_glapi_logging_available(void) +{ + return 1; +} + +void +_glapi_enable_logging(void (*func)(void *data, const char *fmt, ...), + void *data) +{ + real_dispatch = GET_DISPATCH(); + logger_func = func; + logger_data = data; + _glapi_set_dispatch(&__glapi_logging_table); +} + +#else + +int +_glapi_logging_available(void) +{ + return 0 +} + +void +_glapi_enable_logging(void (*func)(void *data, const char *fmt, ...), + void *data) +{ +} + +#endif diff --git a/src/mesa/drivers/dri/common/dri_test.c b/src/mesa/drivers/dri/common/dri_test.c index 793f0c37d79..8a47316bea6 100644 --- a/src/mesa/drivers/dri/common/dri_test.c +++ b/src/mesa/drivers/dri/common/dri_test.c @@ -82,6 +82,18 @@ _glthread_GetID(void) return 0; } +PUBLIC int +_glapi_logging_available(void) +{ + return 0; +} + +PUBLIC void +_glapi_enable_logging(void (*func)(void *data, const char *fmt, ...), + void *data) +{ +} + int main(int argc, char** argv) { void* p = __driDriverExtensions; diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 8e34ec4124f..73d96e8d212 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1367,6 +1367,26 @@ _mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height) } } +static void +dispatch_logger(void *data, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); +} + +void +_mesa_set_dispatch(void *table) +{ + if (table && (MESA_VERBOSE & VERBOSE_DISPATCH)) { + _glapi_set_dispatch(table); + _glapi_enable_logging(dispatch_logger, stderr); + } else { + _glapi_set_dispatch(table); + } +} /** * Bind the given context to the given drawBuffer and readBuffer and @@ -1411,10 +1431,10 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer, ASSERT(_mesa_get_current_context() == newCtx); if (!newCtx) { - _glapi_set_dispatch(NULL); /* none current */ + _mesa_set_dispatch(NULL); /* none current */ } else { - _glapi_set_dispatch(newCtx->CurrentDispatch); + _mesa_set_dispatch(newCtx->CurrentDispatch); if (drawBuffer && readBuffer) { /* TODO: check if newCtx and buffer's visual match??? */ diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h index c61da62826f..142243f5ee3 100644 --- a/src/mesa/main/context.h +++ b/src/mesa/main/context.h @@ -145,6 +145,9 @@ extern GLboolean _mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer, GLframebuffer *readBuffer ); +extern void +_mesa_set_dispatch(void *table); + extern GLboolean _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare); diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c index 526145aeccf..e5c313304d1 100644 --- a/src/mesa/main/debug.c +++ b/src/mesa/main/debug.c @@ -201,7 +201,8 @@ static void add_debug_flags( const char *debug ) { "lighting", VERBOSE_LIGHTING }, { "disassem", VERBOSE_DISASSEM }, { "draw", VERBOSE_DRAW }, - { "swap", VERBOSE_SWAPBUFFERS } + { "swap", VERBOSE_SWAPBUFFERS }, + { "dispatch", VERBOSE_DISPATCH } }; GLuint i; @@ -211,6 +212,9 @@ static void add_debug_flags( const char *debug ) MESA_VERBOSE |= debug_opt[i].flag; } + if ((MESA_VERBOSE & VERBOSE_DISPATCH) && !_glapi_logging_available()) + _mesa_debug(NULL, "dispatch logging not available in this buidl\n"); + /* Debug flag: */ if (strstr(debug, "flush")) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 6928d21a21e..0c4e3d51a9d 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -8062,7 +8062,7 @@ _mesa_NewList(GLuint name, GLenum mode) ctx->Driver.NewList(ctx, name, mode); ctx->CurrentDispatch = ctx->Save; - _glapi_set_dispatch(ctx->CurrentDispatch); + _mesa_set_dispatch(ctx->CurrentDispatch); } @@ -8109,7 +8109,7 @@ _mesa_EndList(void) ctx->CompileFlag = GL_FALSE; ctx->CurrentDispatch = ctx->Exec; - _glapi_set_dispatch(ctx->CurrentDispatch); + _mesa_set_dispatch(ctx->CurrentDispatch); } @@ -8143,7 +8143,7 @@ _mesa_CallList(GLuint list) /* also restore API function pointers to point to "save" versions */ if (save_compile_flag) { ctx->CurrentDispatch = ctx->Save; - _glapi_set_dispatch(ctx->CurrentDispatch); + _mesa_set_dispatch(ctx->CurrentDispatch); } } @@ -8195,7 +8195,7 @@ _mesa_CallLists(GLsizei n, GLenum type, const GLvoid * lists) /* also restore API function pointers to point to "save" versions */ if (save_compile_flag) { ctx->CurrentDispatch = ctx->Save; - _glapi_set_dispatch(ctx->CurrentDispatch); + _mesa_set_dispatch(ctx->CurrentDispatch); } } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 3e54656981d..96fd9141902 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3345,7 +3345,8 @@ enum _verbose VERBOSE_VERTS = 0x0800, VERBOSE_DISASSEM = 0x1000, VERBOSE_DRAW = 0x2000, - VERBOSE_SWAPBUFFERS = 0x4000 + VERBOSE_SWAPBUFFERS = 0x4000, + VERBOSE_DISPATCH = 0x8000 }; |