aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main/imports.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main/imports.c')
-rw-r--r--src/mesa/main/imports.c213
1 files changed, 184 insertions, 29 deletions
diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c
index 40c02c246c1..dbe88a9724e 100644
--- a/src/mesa/main/imports.c
+++ b/src/mesa/main/imports.c
@@ -1,4 +1,4 @@
-/* $Id: imports.c,v 1.14 2002/06/18 08:35:25 joukj Exp $ */
+/* $Id: imports.c,v 1.15 2002/06/29 19:48:16 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -26,31 +26,24 @@
/*
- * Imports are functions which the device driver or window system or
+ * Imports are services which the device driver or window system or
* operating system provides to the core renderer. The core renderer (Mesa)
* will call these functions in order to do memory allocation, simple I/O,
* etc.
*
- * Some drivers will want to provide a specialed __GLimport object, but
- * most Mesa drivers will be able to call _mesa_init_default_imports()
- * and go with that.
+ * Some drivers will want to override/replace this file with something
+ * specialized, but most Mesa drivers will be able to call
+ *_mesa_init_default_imports() and go with what's here.
*
- * A server-side GL renderer will likely not use these functions since
- * the renderer should use the XFree86-wrapped system calls.
- */
-
-/*
- * XXX when we fully implement the __GLimports mechanism in Mesa, that
- * should mean that we can remove <stdio.h>, <stdlib.h>, etc, from
- * glheader.h. Strictly speaking, all system includes should be done
- * from this file, and not glheader to ensure that core Mesa has no
- * dependencies on external libraries. Someday...
+ * Eventually, I'd like to move most of the stuff in glheader.h and mem.[ch]
+ * into imports.[ch]. Then we'll really have one, single place where
+ * all OS-related dependencies are isolated.
*/
-
#include "glheader.h"
#include "mtypes.h"
+#include "context.h"
#include "imports.h"
#include "mem.h"
@@ -79,46 +72,49 @@ _mesa_Free(__GLcontext *gc, void *addr)
FREE(addr);
}
+
/* Must be before '#undef getenv' for inclusion in XFree86.
*/
static char * CAPI
_mesa_getenv(__GLcontext *gc, const char *var)
{
(void) gc;
+/* Whacko XFree86 macro:
+ */
+#ifdef getenv
+#undef getenv
+#endif
return getenv(var);
}
+
static void
-_mesa_warning(__GLcontext *gc, char *str)
+warning(__GLcontext *gc, char *str)
{
GLboolean debug;
#ifdef DEBUG
debug = GL_TRUE;
#else
-/* Whacko XFree86 macro:
- */
-#ifdef getenv
-#undef getenv
-#endif
- if (gc->imports.getenv(gc, "MESA_DEBUG")) {
+ if (_mesa_getenv(gc "MESA_DEBUG"))
debug = GL_TRUE;
- }
- else {
+ else
debug = GL_FALSE;
- }
#endif
if (debug) {
fprintf(stderr, "Mesa warning: %s\n", str);
}
}
-static void
+
+void
_mesa_fatal(__GLcontext *gc, char *str)
{
+ (void) gc;
fprintf(stderr, "%s\n", str);
abort();
}
+
static int CAPI
_mesa_atoi(__GLcontext *gc, const char *str)
{
@@ -126,7 +122,8 @@ _mesa_atoi(__GLcontext *gc, const char *str)
return atoi(str);
}
-static int CAPI
+
+int CAPI
_mesa_sprintf(__GLcontext *gc, char *str, const char *fmt, ...)
{
int r;
@@ -137,18 +134,21 @@ _mesa_sprintf(__GLcontext *gc, char *str, const char *fmt, ...)
return r;
}
+
static void * CAPI
_mesa_fopen(__GLcontext *gc, const char *path, const char *mode)
{
return fopen(path, mode);
}
+
static int CAPI
_mesa_fclose(__GLcontext *gc, void *stream)
{
return fclose((FILE *) stream);
}
+
static int CAPI
_mesa_fprintf(__GLcontext *gc, void *stream, const char *fmt, ...)
{
@@ -160,6 +160,7 @@ _mesa_fprintf(__GLcontext *gc, void *stream, const char *fmt, ...)
return r;
}
+
/* XXX this really is driver-specific and can't be here */
static __GLdrawablePrivate *
_mesa_GetDrawablePrivate(__GLcontext *gc)
@@ -168,6 +169,160 @@ _mesa_GetDrawablePrivate(__GLcontext *gc)
}
+
+void
+_mesa_warning(__GLcontext *gc, const char *fmtString, ...)
+{
+ char str[1000];
+ va_list args;
+ va_start( args, fmtString );
+ (void) vsprintf( str, fmtString, args );
+ va_end( args );
+ warning(gc, str);
+}
+
+
+/*
+ * This function is called when the Mesa user has stumbled into a code
+ * path which may not be implemented fully or correctly.
+ */
+void
+_mesa_problem( const GLcontext *ctx, const char *s )
+{
+ if (ctx) {
+ ctx->imports.fprintf((GLcontext *) ctx, stderr, "Mesa implementation error: %s\n", s);
+#ifdef XF86DRI
+ ctx->imports.fprintf((GLcontext *) ctx, stderr, "Please report to the DRI bug database at dri.sourceforge.net\n");
+#else
+ ctx->imports.fprintf((GLcontext *) ctx, stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
+#endif
+ }
+ else {
+ /* what can we do if we don't have a context???? */
+ fprintf( stderr, "Mesa implementation error: %s\n", s );
+#ifdef XF86DRI
+ fprintf( stderr, "Please report to the DRI bug database at dri.sourceforge.net\n");
+#else
+ fprintf( stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
+#endif
+ }
+}
+
+
+/*
+ * If in debug mode, print error message to stdout.
+ * Also, record the error code by calling _mesa_record_error().
+ * Input: ctx - the GL context
+ * error - the error value
+ * fmtString - printf-style format string, followed by optional args
+ */
+void
+_mesa_error( GLcontext *ctx, GLenum error, const char *fmtString, ... )
+{
+ const char *debugEnv;
+ GLboolean debug;
+
+ debugEnv = _mesa_getenv(ctx, "MESA_DEBUG");
+
+#ifdef DEBUG
+ if (debugEnv && strstr(debugEnv, "silent"))
+ debug = GL_FALSE;
+ else
+ debug = GL_TRUE;
+#else
+ if (debugEnv)
+ debug = GL_TRUE;
+ else
+ debug = GL_FALSE;
+#endif
+
+ if (debug) {
+ va_list args;
+ char where[1000];
+ const char *errstr;
+
+ va_start( args, fmtString );
+ vsprintf( where, fmtString, args );
+ va_end( args );
+
+ switch (error) {
+ case GL_NO_ERROR:
+ errstr = "GL_NO_ERROR";
+ break;
+ case GL_INVALID_VALUE:
+ errstr = "GL_INVALID_VALUE";
+ break;
+ case GL_INVALID_ENUM:
+ errstr = "GL_INVALID_ENUM";
+ break;
+ case GL_INVALID_OPERATION:
+ errstr = "GL_INVALID_OPERATION";
+ break;
+ case GL_STACK_OVERFLOW:
+ errstr = "GL_STACK_OVERFLOW";
+ break;
+ case GL_STACK_UNDERFLOW:
+ errstr = "GL_STACK_UNDERFLOW";
+ break;
+ case GL_OUT_OF_MEMORY:
+ errstr = "GL_OUT_OF_MEMORY";
+ break;
+ case GL_TABLE_TOO_LARGE:
+ errstr = "GL_TABLE_TOO_LARGE";
+ break;
+ default:
+ errstr = "unknown";
+ break;
+ }
+ _mesa_debug(ctx, "Mesa user error: %s in %s\n", errstr, where);
+ }
+
+ _mesa_record_error(ctx, error);
+}
+
+
+/*
+ * Call this to report debug information. Uses stderr.
+ */
+void
+_mesa_debug( const GLcontext *ctx, const char *fmtString, ... )
+{
+ char s[1000];
+ va_list args;
+ va_start(args, fmtString);
+ vsprintf(s, fmtString, args);
+ if (ctx)
+ (void) ctx->imports.fprintf( (__GLcontext *) ctx, stderr, s );
+ else
+ fprintf( stderr, s );
+ va_end(args);
+}
+
+
+/*
+ * A wrapper for printf. Uses stdout.
+ */
+void
+_mesa_printf( const GLcontext *ctx, const char *fmtString, ... )
+{
+ char s[1000];
+ va_list args;
+ va_start( args, fmtString );
+ vsprintf(s, fmtString, args);
+ if (ctx)
+ (void) ctx->imports.fprintf( (__GLcontext *) ctx, stdout, s );
+ else
+ printf( s );
+ va_end( args );
+}
+
+
+/*
+ * Initialize a __GLimports object to point to the functions in
+ * this file. This is to be called from device drivers.
+ * Input: imports - the object to init
+ * driverCtx - pointer to device driver-specific data
+ */
void
_mesa_init_default_imports(__GLimports *imports, void *driverCtx)
{
@@ -175,7 +330,7 @@ _mesa_init_default_imports(__GLimports *imports, void *driverCtx)
imports->calloc = _mesa_Calloc;
imports->realloc = _mesa_Realloc;
imports->free = _mesa_Free;
- imports->warning = _mesa_warning;
+ imports->warning = warning;
imports->fatal = _mesa_fatal;
imports->getenv = _mesa_getenv;
imports->atoi = _mesa_atoi;