summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mapi/glapi/glapi.h8
-rw-r--r--src/mapi/glapi/glapi_dispatch.c80
-rw-r--r--src/mesa/drivers/dri/common/dri_test.c12
-rw-r--r--src/mesa/main/context.c24
-rw-r--r--src/mesa/main/context.h3
-rw-r--r--src/mesa/main/debug.c6
-rw-r--r--src/mesa/main/dlist.c8
-rw-r--r--src/mesa/main/mtypes.h3
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
};