gallium: Conditional debugging output.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Tue, 11 Mar 2008 12:03:11 +0000 (12:03 +0000)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 12 Mar 2008 00:27:52 +0000 (00:27 +0000)
Generalize the conditional debugging output code found trhought the gallium
drivers.

src/gallium/auxiliary/util/p_debug.c
src/gallium/include/pipe/p_debug.h

index 93bfaea393980df1e7328397b6f01b993fd8beeb..04e55dd91decc8c3fd92c6fdc19abcc9e0ccdea1 100644 (file)
@@ -103,3 +103,37 @@ void debug_assert_fail(const char *expr, const char *file, unsigned line)
    debug_printf("%s:%i: Assertion `%s' failed.\n", file, line, expr);
    debug_break();
 }
+
+
+#define DEBUG_MASK_TABLE_SIZE 256
+
+
+/**
+ * Mask hash table.
+ * 
+ * For now we just take the lower bits of the key, and do no attempt to solve
+ * collisions. Use a proper hash table when we have dozens of drivers. 
+ */
+static uint32_t debug_mask_table[DEBUG_MASK_TABLE_SIZE];
+
+
+void debug_mask_set(uint32_t uuid, uint32_t mask) 
+{
+   unsigned hash = uuid & (DEBUG_MASK_TABLE_SIZE - 1);
+   debug_mask_table[hash] = mask;
+}
+
+
+uint32_t debug_mask_get(uint32_t uuid)
+{
+   unsigned hash = uuid & (DEBUG_MASK_TABLE_SIZE - 1);
+   return debug_mask_table[hash];
+}
+
+
+void debug_mask_vprintf(uint32_t uuid, uint32_t what, const char *format, va_list ap)
+{
+   uint32_t mask = debug_mask_get(uuid);
+   if(mask & what)
+      debug_vprintf(format, ap);
+}
index a14a1fc5f6cf6953c839004f176ec3df21bd831d..f45363f3558705eb5590be4aa1bb38abecdb4260 100644 (file)
@@ -41,6 +41,8 @@
 
 #include <stdarg.h>
 
+#include "p_compiler.h"
+
 
 #ifdef __cplusplus
 extern "C" {
@@ -93,6 +95,68 @@ void debug_assert_fail(const char *expr, const char *file, unsigned line);
 #define assert(expr) debug_assert(expr)
 
 
+/**
+ * Set a channel's debug mask.
+ * 
+ * uuid is just a random 32 bit integer that uniquely identifies the debugging 
+ * channel. 
+ * 
+ * @note Due to current implementation issues, make sure the lower 8 bits of 
+ * UUID are unique.
+ */
+void debug_mask_set(uint32_t uuid, uint32_t mask);
+
+
+uint32_t debug_mask_get(uint32_t uuid);
+
+
+/**
+ * Conditional debug output. 
+ * 
+ * This is just a generalization of the debug filtering mechanism used 
+ * throughout Gallium.
+ * 
+ * You use this function as:
+ * 
+ * @code
+ * #define MYDRIVER_UUID 0x12345678 // random 32 bit identifier
+ * 
+ * static inline mydriver_debug(uint32_t what, const char *format, ...)
+ * {
+ * #ifdef DEBUG
+ *    va_list ap;
+ *    va_start(ap, format);
+ *    debug_mask_vprintf(MYDRIVER_UUID, what, format, ap);
+ *    va_end(ap);
+ * #endif
+ * }
+ * 
+ * ...
+ * 
+ *    debug_mask_set(MYDRIVER_UUID, 
+ *                   MYDRIVER_DEBUG_THIS | 
+ *                   MYDRIVER_DEBUG_THAT |
+ *                   ... );
+ * 
+ * ...
+ * 
+ *    mydriver_debug(MYDRIVER_DEBUG_THIS,
+ *                   "this and this happened\n");
+ *
+ *    mydriver_debug(MYDRIVER_DEBUG_THAT,
+ *                   "that = %f\n", that);
+ * ...
+ * @endcode     
+ * 
+ * You can also define several variants of mydriver_debug, with hardcoded what. 
+ * Note that although macros with variable number of arguments would accomplish 
+ * more in less code, they are not portable. 
+ */
+void debug_mask_vprintf(uint32_t uuid, 
+                        uint32_t what, 
+                        const char *format, 
+                        va_list ap);
+
 #ifdef __cplusplus
 }
 #endif