u_debug.h revision fbeab4cbcea98db161aa5067c0bcef9ea44cb0de
18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**************************************************************************
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * All Rights Reserved.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * copy of this software and associated documentation files (the
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * "Software"), to deal in the Software without restriction, including
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish,
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribute, sub license, and/or sell copies of the Software, and to
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the following conditions:
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The above copyright notice and this permission notice (including the
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * next paragraph) shall be included in all copies or substantial portions
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * of the Software.
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **************************************************************************/
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * @file
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Cross-platform debugging helpers.
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * For now it just has assert and printf replacements, but it might be extended
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * with stack trace reports and more advanced logging in the near future.
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef U_DEBUG_H_
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define U_DEBUG_H_
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "os/os_misc.h"
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef	__cplusplus
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern "C" {
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__GNUC__)
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _util_printf_format(fmt, list) __attribute__ ((format (printf, fmt, list)))
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _util_printf_format(fmt, list)
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid _debug_vprintf(const char *format, va_list ap);
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic INLINE void
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project_debug_printf(const char *format, ...)
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_list ap;
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_start(ap, format);
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_vprintf(format, ap);
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_end(ap);
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Print debug messages.
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The actual channel used to output debug message is platform specific. To
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * avoid misformating or truncation, follow these rules of thumb:
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * - output whole lines
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * - avoid outputing large strings (512 bytes is the current maximum length
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * that is guaranteed to be printed in all platforms)
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if !defined(PIPE_OS_HAIKU)
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic INLINE void
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_printf(const char *format, ...) _util_printf_format(1,2);
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic INLINE void
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_printf(const char *format, ...)
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_list ap;
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_start(ap, format);
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_vprintf(format, ap);
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   va_end(ap);
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (void) format; /* silence warning */
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* !PIPE_OS_HAIKU */
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * ... isn't portable so we need to pass arguments in parentheses.
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * usage:
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    debug_printf_once(("awnser: %i\n", 42));
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_printf_once(args) \
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   do { \
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      static boolean once = TRUE; \
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      if (once) { \
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project         once = FALSE; \
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project         debug_printf args; \
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      } \
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   } while (0)
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap)
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_vprintf(_format, _ap) ((void)0)
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Dump a blob in hex to the same place that debug_printf sends its
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * messages.
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_print_blob( const char *name, const void *blob, unsigned size );
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Print a message along with a prettified format string
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_print_format(const char *msg, unsigned fmt );
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_print_blob(_name, _blob, _size) ((void)0)
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_print_format(_msg, _fmt) ((void)0)
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Hard-coded breakpoint.
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_break() os_break()
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else /* !DEBUG */
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_break() ((void)0)
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* !DEBUG */
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlong
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_num_option(const char *name, long dfault);
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid _debug_assert_fail(const char *expr,
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                        const char *file,
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                        unsigned line,
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                        const char *function);
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Assert macro
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Do not expect that the assert call terminates -- errors must be handled
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * regardless of assert behavior.
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * For non debug builds the assert macro will expand to a no-op, so do not
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * call functions with side effects in the assert expression.
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__))
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_assert(expr) do { } while (0 && (expr))
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/** Override standard assert macro */
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef assert
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#undef assert
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define assert(expr) debug_assert(expr)
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Output the current function name.
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_checkpoint() \
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_printf("%s\n", __FUNCTION__)
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_checkpoint() \
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   ((void)0)
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Output the full source code position.
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_checkpoint_full() \
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__)
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_checkpoint_full() \
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   ((void)0)
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Output a warning message. Muted on release version.
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_warning(__msg) \
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_warning(__msg) \
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   ((void)0)
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Output an error message. Not muted on release version.
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_error(__msg) \
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_error(__msg) \
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   _debug_printf("error: %s\n", __msg)
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Used by debug_dump_enum and debug_dump_flags to describe symbols.
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct debug_named_value
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   const char *name;
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   unsigned long value;
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   const char *desc;
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Some C pre-processor magic to simplify creating named values.
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Example:
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * @code
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * static const debug_named_value my_names[] = {
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X),
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y),
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z),
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    DEBUG_NAMED_VALUE_END
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * };
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    ...
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    debug_printf("%s = %s\n",
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *                 name,
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *                 debug_dump_enum(my_names, my_value));
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    ...
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * @endcode
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_NAMED_VALUE(__symbol) DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, NULL)
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, __desc) {#__symbol, (unsigned long)__symbol, __desc}
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_NAMED_VALUE_END {NULL, 0, NULL}
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Convert a enum value to a string.
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectconst char *
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_dump_enum(const struct debug_named_value *names,
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                unsigned long value);
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectconst char *
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_dump_enum_noprefix(const struct debug_named_value *names,
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                         const char *prefix,
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                         unsigned long value);
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Convert binary flags value to a string.
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectconst char *
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_dump_flags(const struct debug_named_value *names,
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                 unsigned long value);
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Get option.
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * It is an alias for getenv on Linux.
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * On Windows it reads C:\gallium.cfg, which is a text file with CR+LF line
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * endings with one option per line as
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *   NAME=value
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * This file must be terminated with an extra empty line.
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectconst char *
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_option(const char *name, const char *dfault);
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectboolean
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_bool_option(const char *name, boolean dfault);
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlong
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_num_option(const char *name, long dfault);
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned long
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_flags_option(const char *name,
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                       const struct debug_named_value *flags,
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                       unsigned long dfault);
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_GET_ONCE_BOOL_OPTION(sufix, name, dfault) \
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic boolean \
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_option_ ## sufix (void) \
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ \
3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static boolean first = TRUE; \
3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static boolean value; \
3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   if (first) { \
3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      first = FALSE; \
3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      value = debug_get_bool_option(name, dfault); \
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   } \
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   return value; \
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_GET_ONCE_NUM_OPTION(sufix, name, dfault) \
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic long \
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_option_ ## sufix (void) \
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ \
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static boolean first = TRUE; \
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static long value; \
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   if (first) { \
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      first = FALSE; \
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      value = debug_get_num_option(name, dfault); \
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   } \
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   return value; \
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEBUG_GET_ONCE_FLAGS_OPTION(sufix, name, flags, dfault) \
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic unsigned long \
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_get_option_ ## sufix (void) \
3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ \
3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static boolean first = TRUE; \
3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   static unsigned long value; \
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   if (first) { \
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      first = FALSE; \
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      value = debug_get_flags_option(name, flags, dfault); \
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   } \
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   return value; \
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned long
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_memory_begin(void);
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdebug_memory_end(unsigned long beginning);
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef DEBUG
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct pipe_context;
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct pipe_surface;
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct pipe_transfer;
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct pipe_resource;
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_image(const char *prefix,
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                      unsigned format, unsigned cpp,
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                      unsigned width, unsigned height,
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                      unsigned stride,
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                      const void *data);
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_surface(struct pipe_context *pipe,
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			const char *prefix,
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                        struct pipe_surface *surface);
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_texture(struct pipe_context *pipe,
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			const char *prefix,
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                        struct pipe_resource *texture);
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_surface_bmp(struct pipe_context *pipe,
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                            const char *filename,
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                            struct pipe_surface *surface);
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_transfer_bmp(struct pipe_context *pipe,
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                             const char *filename,
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                             struct pipe_transfer *transfer);
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid debug_dump_float_rgba_bmp(const char *filename,
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                               unsigned width, unsigned height,
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                               float *rgba, unsigned stride);
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_dump_image(prefix, format, cpp, width, height, stride, data) ((void)0)
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_dump_surface(pipe, prefix, surface) ((void)0)
3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_dump_surface_bmp(pipe, filename, surface) ((void)0)
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_dump_transfer_bmp(filename, transfer) ((void)0)
3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define debug_dump_float_rgba_bmp(filename, width, height, rgba, stride) ((void)0)
3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef	__cplusplus
3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* U_DEBUG_H_ */
3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project