1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cross-platform debugging helpers. 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For now it just has assert and printf replacements, but it might be extended 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with stack trace reports and more advanced logging in the near future. 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jrfonseca@tungstengraphics.com> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef U_DEBUG_H_ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define U_DEBUG_H_ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4299703ab948d16a83979d70d595e48cc5a0f06880mymax@amazon.com#include <assert.h> 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_misc.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _util_printf_format(fmt, list) __attribute__ ((format (printf, fmt, list))) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _util_printf_format(fmt, list) 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _debug_vprintf(const char *format, va_list ap); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_debug_printf(const char *format, ...) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_list ap; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_start(ap, format); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_vprintf(format, ap); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_end(ap); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print debug messages. 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The actual channel used to output debug message is platform specific. To 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * avoid misformating or truncation, follow these rules of thumb: 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - output whole lines 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - avoid outputing large strings (512 bytes is the current maximum length 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that is guaranteed to be printed in all platforms) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(PIPE_OS_HAIKU) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_printf(const char *format, ...) _util_printf_format(1,2); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_printf(const char *format, ...) 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_list ap; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_start(ap, format); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_vprintf(format, ap); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_end(ap); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) format; /* silence warning */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* is Haiku */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Haiku provides debug_printf in libroot with OS.h */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <OS.h> 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ... isn't portable so we need to pass arguments in parentheses. 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * usage: 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * debug_printf_once(("answer: %i\n", 42)); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_printf_once(args) \ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean once = TRUE; \ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (once) { \ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org once = FALSE; \ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf args; \ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap) 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_vprintf(_format, _ap) ((void)0) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Dump a blob in hex to the same place that debug_printf sends its 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * messages. 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_print_blob( const char *name, const void *blob, unsigned size ); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Print a message along with a prettified format string 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_print_format(const char *msg, unsigned fmt ); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_print_blob(_name, _blob, _size) ((void)0) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_print_format(_msg, _fmt) ((void)0) 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hard-coded breakpoint. 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_break() os_break() 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* !DEBUG */ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_break() ((void)0) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* !DEBUG */ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglong 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_num_option(const char *name, long dfault); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _debug_assert_fail(const char *expr, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *file, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned line, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *function); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Assert macro 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do not expect that the assert call terminates -- errors must be handled 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * regardless of assert behavior. 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For non debug builds the assert macro will expand to a no-op, so do not 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * call functions with side effects in the assert expression. 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__)) 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_assert(expr) do { } while (0 && (expr)) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Override standard assert macro */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef assert 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef assert 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define assert(expr) debug_assert(expr) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output the current function name. 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_checkpoint() \ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("%s\n", __FUNCTION__) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_checkpoint() \ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((void)0) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output the full source code position. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_checkpoint_full() \ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("%s:%u:%s\n", __FILE__, __LINE__, __FUNCTION__) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_checkpoint_full() \ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((void)0) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output a warning message. Muted on release version. 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_warning(__msg) \ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_warning(__msg) \ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((void)0) 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit a warning message, but only once. 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_warn_once(__msg) \ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static bool warned = FALSE; \ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!warned) { \ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("%s:%u:%s: one time warning: %s\n", \ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FILE__, __LINE__, __FUNCTION__, __msg); \ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org warned = TRUE; \ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_warn_once(__msg) \ 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((void)0) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output an error message. Not muted on release version. 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_error(__msg) \ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg) 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_error(__msg) \ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("error: %s\n", __msg) 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used by debug_dump_enum and debug_dump_flags to describe symbols. 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct debug_named_value 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long value; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *desc; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Some C pre-processor magic to simplify creating named values. 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Example: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @code 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * static const debug_named_value my_names[] = { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X), 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y), 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z), 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEBUG_NAMED_VALUE_END 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * }; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ... 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * debug_printf("%s = %s\n", 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * name, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * debug_dump_enum(my_names, my_value)); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ... 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @endcode 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_NAMED_VALUE(__symbol) DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, NULL) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, __desc) {#__symbol, (unsigned long)__symbol, __desc} 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_NAMED_VALUE_END {NULL, 0, NULL} 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a enum value to a string. 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_dump_enum(const struct debug_named_value *names, 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long value); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_dump_enum_noprefix(const struct debug_named_value *names, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *prefix, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long value); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert binary flags value to a string. 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_dump_flags(const struct debug_named_value *names, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long value); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Function enter exit loggers 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint debug_funclog_enter(const char* f, const int line, const char* file); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_funclog_exit(const char* f, const int line, const char* file); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_funclog_enter_exit(const char* f, const int line, const char* file); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_ENTER() \ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int __debug_decleration_work_around = \ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_funclog_enter(__FUNCTION__, __LINE__, __FILE__) 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_EXIT() \ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void)__debug_decleration_work_around; \ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_funclog_exit(__FUNCTION__, __LINE__, __FILE__); \ 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; \ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_EXIT_RET(ret) \ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void)__debug_decleration_work_around; \ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_funclog_exit(__FUNCTION__, __LINE__, __FILE__); \ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; \ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_ENTER_EXIT() \ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_funclog_enter_exit(__FUNCTION__, __LINE__, __FILE__) 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_ENTER() \ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int __debug_decleration_work_around 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_EXIT() \ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { (void)__debug_decleration_work_around; return; } while(0) 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_EXIT_RET(ret) \ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { (void)__debug_decleration_work_around; return ret; } while(0) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_FUNCLOG_ENTER_EXIT() 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get option. 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It is an alias for getenv on Linux. 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * On Windows it reads C:\gallium.cfg, which is a text file with CR+LF line 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * endings with one option per line as 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NAME=value 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This file must be terminated with an extra empty line. 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_option(const char *name, const char *dfault); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_bool_option(const char *name, boolean dfault); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglong 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_num_option(const char *name, long dfault); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned long 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_flags_option(const char *name, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct debug_named_value *flags, 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long dfault); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_GET_ONCE_BOOL_OPTION(sufix, name, dfault) \ 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean \ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_option_ ## sufix (void) \ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean first = TRUE; \ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean value; \ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first) { \ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first = FALSE; \ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = debug_get_bool_option(name, dfault); \ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value; \ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_GET_ONCE_NUM_OPTION(sufix, name, dfault) \ 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic long \ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_option_ ## sufix (void) \ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean first = TRUE; \ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static long value; \ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first) { \ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first = FALSE; \ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = debug_get_num_option(name, dfault); \ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value; \ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_GET_ONCE_FLAGS_OPTION(sufix, name, flags, dfault) \ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned long \ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_get_option_ ## sufix (void) \ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean first = TRUE; \ 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static unsigned long value; \ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first) { \ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first = FALSE; \ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = debug_get_flags_option(name, flags, dfault); \ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value; \ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned long 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_memory_begin(void); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdebug_memory_end(unsigned long beginning); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_context; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_surface; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_transfer; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_resource; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_image(const char *prefix, 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned format, unsigned cpp, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stride, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_surface(struct pipe_context *pipe, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *prefix, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *surface); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_texture(struct pipe_context *pipe, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *prefix, 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *texture); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_surface_bmp(struct pipe_context *pipe, 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *filename, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *surface); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_transfer_bmp(struct pipe_context *pipe, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *filename, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid debug_dump_float_rgba_bmp(const char *filename, 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *rgba, unsigned stride); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_dump_image(prefix, format, cpp, width, height, stride, data) ((void)0) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_dump_surface(pipe, prefix, surface) ((void)0) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_dump_surface_bmp(pipe, filename, surface) ((void)0) 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_dump_transfer_bmp(filename, transfer) ((void)0) 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define debug_dump_float_rgba_bmp(filename, width, height, rgba, stride) ((void)0) 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* U_DEBUG_H_ */ 455